kintone API

createDialogとshowConfirmDialogの使い分け

著者名: 村濱 一樹 (External link) (kintoneエバンジェリスト)

目次

はじめに

kintoneでは、ダイアログを表示するためのAPIとして、kintone.showConfirmDialogkintone.createDialogの2つが提供されています。

どちらもダイアログを表示するAPIですが、「どちらを使えばよいのか?」 と迷う方も多いのではないでしょうか。
この記事では、2つのAPIの違いと使い分けのポイントを解説します。

2つのAPIの基本的な違い

まず、2つのAPIの主な違いを表にまとめます。

項目 kintone.showConfirmDialog kintone.createDialog
本文の指定方法 文字列(\nで改行) Elementオブジェクト(HTML要素)
カスタマイズ性 シンプル(テキストのみ) 高い(自由にHTMLを構築可能)
戻り値 Promise(ユーザーの選択結果) Promise(ダイアログオブジェクト)
表示方法 関数呼び出しで直接表示 show()メソッドで表示
閉じる前の制御 不可 beforeClose関数で制御可能
プログラムから閉じる 不可 close()メソッドで可能
用途 シンプルな確認ダイアログ フォーム入力、複雑なUI

kintone.showConfirmDialogの使い方

kintone.showConfirmDialogは、シンプルなテキストベースの確認ダイアログを表示するAPIです。
ユーザーに「はい/いいえ」を問いかけるような、単純な確認に適しています。

基本的な使い方

次のコードは、レコード一覧画面にボタンを配置し、ボタンクリック時に確認ダイアログを表示する例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(() => {
  'use strict';

  kintone.events.on('app.record.index.show', (event) => {
    // ヘッダーメニュースペースにボタンを配置
    const header = kintone.app.getHeaderMenuSpaceElement();

    const button = document.createElement('button');
    button.textContent = 'データを削除';
    button.onclick = async () => {
      const result = await kintone.showConfirmDialog({
        title: '確認',
        body: 'すべてのデータを削除しますか?',
        showOkButton: true,
        showCancelButton: true,
        okButtonText: '削除',
        cancelButtonText: 'キャンセル',
        showCloseButton: true
      });

      if (result === 'OK') {
        console.log('削除を実行します');
        // 削除処理
      } else {
        console.log('削除をキャンセルしました');
      }
    };

    header.appendChild(button);
    return event;
  });
})();

このAPIは、関数を呼び出すとすぐにダイアログを表示し、ユーザーの選択結果('OK''CANCEL''CLOSE')をPromiseで返します。

kintone.createDialogが適しているケース

  • レコードの削除確認
  • レコード保存前の確認
  • シンプルな警告メッセージの表示
  • テキストのみで完結する確認ダイアログ

kintone.createDialogの使い方

kintone.createDialogは、ダイアログの本文にHTML要素を自由に配置できる、カスタマイズ性の高いAPIです。
フォーム入力やプログレス表示など、複雑なUIが必要な場合に適しています。

基本的な使い方

次のコードは、レコード詳細画面にボタンを配置し、クリック時にテキスト入力フォームを含むダイアログを表示する例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
(() => {
  'use strict';

  kintone.events.on('app.record.detail.show', (event) => {
    // ヘッダーメニュースペースにボタンを配置
    const header = kintone.app.record.getHeaderMenuSpaceElement();

    const button = document.createElement('button');
    button.textContent = 'コメントを追加';
    button.onclick = async () => {
      // ダイアログ本文の要素を作成
      const bodyElement = document.createElement('div');
      bodyElement.style.padding = '16px';
      bodyElement.style.display = 'flex';
      bodyElement.style.flexDirection = 'column';
      bodyElement.style.gap = '8px';
      const label = document.createElement('label');
      label.textContent = 'コメントを入力してください:';
      const input = document.createElement('input');
      input.type = 'text';

      bodyElement.appendChild(label);
      bodyElement.appendChild(input);

      // ダイアログを作成
      const dialog = await kintone.createDialog({
        title: 'コメント入力',
        body: bodyElement,
        showOkButton: true,
        okButtonText: '送信',
        showCancelButton: true,
        cancelButtonText: 'キャンセル',
        showCloseButton: true
      });

      // ダイアログを表示
      const result = await dialog.show();

      if (result === 'OK') {
        console.log('入力されたコメント:', input.value);
        // コメントを処理
      }
    };

    header.appendChild(button);
    return event;
  });
})();

このAPIは、まずダイアログオブジェクトを作成し、show()メソッドでダイアログを表示する2段階の方式です。

beforeClose関数で閉じる前の処理を制御する

kintone.createDialogの特徴的な機能として、beforeClose関数があります。
この関数を使うと、ダイアログを閉じる前にバリデーションを行い、条件を満たさない場合はダイアログを閉じないようにできます。
このコードでは、OKボタンが押されたときに入力値を検証し、未入力の場合はメッセージを表示して、falseを返すことでダイアログを閉じないようにしています。

基本的な使い方のコードにbeforeCloseオプションを追加すると、次のようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
const dialog = await kintone.createDialog({
  title: 'コメント入力',
  body: bodyElement,
  showOkButton: true,
  showCancelButton: true,
  beforeClose: (action) => {
    // OKボタンが押されたときにバリデーション
    if (action === 'OK') {
      if (!input.value.trim()) {
        alert('入力してください');
        return false; // falseを返すとダイアログを閉じない
      }
    }
    return true;
  }
});

beforeClose関数は、ユーザーが選択した操作('OK''CANCEL''CLOSE')を引数に受け取ります。
関数がfalseを返すと、ダイアログは閉じられません。

close()メソッドでプログラムから閉じる

kintone.createDialogでは、close()メソッドを使ってプログラムからダイアログを閉じることもできます。
これは、非同期処理の完了後に自動的にダイアログを閉じたい場合などに便利です。
このコードは、一覧画面にボタンを追加し、非同期処理が完了すると自動でダイアログを閉じます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
(() => {
  'use strict';

  kintone.events.on('app.record.index.show', (event) => {
    const header = kintone.app.getHeaderMenuSpaceElement();

    const button = document.createElement('button');
    button.textContent = 'データを同期';
    button.onclick = async () => {
      const bodyElement = document.createElement('div');
      bodyElement.style.padding = '16px';
      bodyElement.textContent = 'データを同期しています...';

      const dialog = await kintone.createDialog({
        title: '同期中',
        body: bodyElement,
        showOkButton: false,
        showCancelButton: false,
        showCloseButton: false
      });

      // ダイアログを表示(awaitしない)
      dialog.show();

      // 非同期処理をシミュレート
      await new Promise(resolve => setTimeout(resolve, 3000));

      // 処理完了後、プログラムからダイアログを閉じる
      dialog.close();

      alert('データの同期が完了しました');
    };

    header.appendChild(button);
    return event;
  });
})();

この例では、OKボタン、キャンセルボタン、閉じるボタンをすべて非表示とし、処理完了後はclose()で自動的に閉じています。

createDialogが適しているケース

  • フォーム入力が必要なダイアログ
  • 入力値のバリデーションが必要な場合
  • プログレスバーやローディング表示
  • リストやテーブルを表示するダイアログ
  • プログラムから任意のタイミングでダイアログを閉じたい場合

使い分けのポイント

どちらのAPIを使うべきか迷ったときは、次の表を参考にしてください。

やりたいこと 使用するAPI
テキストのみの確認ダイアログを表示したい showConfirmDialog
入力フォームを含むダイアログを表示したい createDialog
閉じる前にバリデーションしたい createDialog
プログラムからダイアログを閉じたい createDialog

基本的に、シンプルな確認ならkintone.showConfirmDialog、カスタマイズや細かい制御が必要な場合はkintone.createDialog と覚えておくとよいでしょう。

注意事項

セキュリティに関する注意

kintone.createDialogbodyパラメーターに指定したElementオブジェクトは、そのままダイアログ本文の要素として組み込まれます。 ユーザー入力を含む場合は、XSS(クロスサイトスクリプティング)攻撃を防ぐため、必要に応じてサニタイズ処理を行ってください。
詳しくは次のページを参照してください。
kintoneセキュアコーディングガイドライン | クロスサイトスクリプティングやCSSインジェクションを防ぐ

1
2
3
4
5
6
// 危険な例:ユーザー入力をそのまま表示
const userInput = record.ユーザー入力.value;
bodyElement.innerHTML = userInput; // XSSの危険性

// 安全な例:テキストとして表示
bodyElement.textContent = userInput; // HTMLとして解釈されない

非同期処理について

どちらのAPIも非同期なAPIです。
同期的に処理したい場合は、async/awaitを使用してください。
詳しくは次のページを参照してください。

まとめ

  • kintone.showConfirmDialogは、シンプルなテキストベースの確認ダイアログに適しています。
  • kintone.createDialogは、HTML要素を自由に配置でき、入力フォームや複雑なUIが必要な場合に適しています。
  • beforeClose関数を使うと、閉じる前のバリデーションや処理を実装できます。
  • close()メソッドを使うと、プログラムから任意のタイミングでダイアログを閉じられます。
  • ユーザー入力を表示する場合は、セキュリティに注意してサニタイズ処理を行いましょう。

おわりに

2つのダイアログAPIの違いと使い分けのポイントを解説しました。
用途に応じて適切なAPIを選択することで、より使いやすいkintoneカスタマイズを実現できます。
ダイアログを活用して、ユーザーフレンドリーなアプリを作成してください。

information

このTipsは、2025年1月版kintoneで動作を確認しています。