2021年10月28日木曜日

Oracle APEX 21.2新機能(5) - ダイアログを取り消した時のイベント

 ダイアログを単にクローズしたときのイベントによって、動的アクションが起動できるようになりました。ダイアログをクローズしたときのイベントは以前からあったのですが、このイベントは画面上のボタンを押した時に発生し、単にダイアログをクローズした場合(右上にある✖️をクリックしたときなど)には発生しませんでした。

以前からあったイベントの名前はダイアログのクローズ(英語ではDialog Closed)、新設されたイベントの名前は閉じられたか取り消されたダイアログ(英語ではDialog Closed or Canceled)です。

モーダル・ダイアログのページに動的アクションを設定するなどして、ダイアログを開いたままデータの更新を行うような実装をした場合、そのダイアログをキャンセル・ボタンのクリックで閉じたときに更新済みの変更を元に戻したい、といった要件はあるかと思います。その際にキャンセル・ボタンのクリックで元に戻す処理を実装すると、ダイアログの✖️をクリックしてダイアログを閉じられると元に戻す処理が実行されません

✖️をクリックさせないようにダイアログから消してしまう、という手段が取られることがあります。

サンプル・データセットのEMP/DEPTより作成されるアプリケーションを例にとって、実装について説明します。

ダイアログを開くベースとなるレポート(今回の例では表EMPのファセット検索)のページ・プロパティCSSインラインに以下の記述を加えます。

.no-close .ui-dialog-titlebar-close {display: none;}


従業員の情報を編集するフォームを含む、モーダル・ダイアログのページのダイアログCSSクラスとしてno-closeを指定します。


以上の設定を行いフォームを開くと、✖️が消えていることが確認できます。


✖️がなくなったので、ダイアログをクローズするには取消削除変更の適用または(上記のフォームでは表示されていませんが)作成のボタンを押す以外に方法がないように見えます。実際にはキーボードのEscを押すと、ダイアログをクローズすることができます。

Oracle APEX 21.2より、このような状況で閉じられたか取り消されたダイアログのイベントが発生するようになりました。

イベントの発生を確認してみます。(モーダル・ダイアログではなく)レポートのページを開き、左ペインに動的アクション・ビューを開きます。


イベント閉じられたか取り消されたダイアログで実行される動的アクションを作成します。

動的アクションの作成を実行します。識別名前閉じられたか取り消されたダイアログとします。タイミングイベントとして閉じられたか取り消されたダイアログ選択タイプリージョンリージョンとしてEmployees(モーダル・ダイアログを開くレポートのリージョン名)を選択します。


アクションとして、以下のJavaScriptを実行します。JavaScriptコンソールにEvent - 閉じられたか取り消されたダイアログと出力します。

console.log("Event - 閉じられたか取り消されたダイアログ - " + this.data.closeAction);

識別アクションとしてJavaScriptコードの実行を選択し、設定コードに上記を記述します。


アプリケーションを実行して、イベントの発生を確認します。

ブラウザのJavaScriptコンソールを開き、従業員のファセット検索のページより、任意の従業員の編集フォームを開きます。


キーボードのEscをクリックし、従業員の編集フォームを閉じます。JavaScriptのコンソールにEvent - 閉じられたか取り消されたダイアログ - cancelと出力されていることが確認できます。


取消ボタンを含むすべてのボタンをクリックによっても従業員の編集フォームは閉じるため、イベント閉じられたか取り消されたダイアログが発生します。

Esc取消ボタンを押してモーダル・ダイアログのページ(従業員のフォーム)が閉じられる時はthis.data.closeActionの値がcancelになっています。作成変更の適用および削除ボタンのクリックの結果、モーダル・ダイアログのページが閉じられるときはthis.data.closeActioncloseになっています。この値は補償となる処理の実行が必要かどうかの判別条件に使用できるでしょう。

取消もしくはキャンセル・ボタンのクリックで実行される処理は、フォームが存在するモーダル・ダイアログのページに実装しています。同様の処理を閉じられたか取り消されたダイアログで実行する場合、モーダル・ダイアログの呼び出し側であるレポートのページに実装することになります。処理を実装し直す場合、参照できるページ・アイテムが違うことに注意が必要です。


新たに追加されたイベント閉じられたか取り消されたダイアログの説明は以上です。

Oracle APEXのアプリケーション作成の参考になれば幸いです。