2021年10月26日火曜日

Oracle APEX 21.2新機能(1) - ドロワー

 Oracle APEX 21.2の新機能として、ページおよびリージョンのテンプレートとしてドロワーが追加されました。ドロワーはOracle Cloudのコンソールでよく見かける以下のような、画面の端から引き出されるようなインターフェースです。

サンプル・データセットのEMP/DEPTから作成したアプリケーションに含まれる表DEPTのレポートとフォームを、ドロワーを使うインターフェースに置き換えてみます。

ページのテンプレートを変更して対応する方法は以下になります。フォームのページ(サンプルではページ番号6)の外観ダイアログ・テンプレートをModal DialogからDrawerへ変更します。以上で対応完了です。

Inline Drawerのリージョンに置き換えるのは、かなり手間がかかります。それでも試してみましょう。

DEPT表の対話モード・レポートのページにドロワーのリージョンを追加します。元々の編集フォームは別ページとして実装されていますが、そのページはドロワーの実装後は使われないため削除できます。

レンダリング・ツリーBodyリージョンの作成を実行します。識別名前部門タイプとしてフォームを選択します。ソース表名としてDEPTを選択します。表DEPTを選択すると、その表に含まれる列が認識されます。Oracle APEX 21.2からは表を選択した時点で、主キーの判別、非表示設定、およびチェックサムによる保護を自動で行うようになりました。


外観テンプレートとしてInline Drawerを選択します。このリージョンをJavaScriptで扱うために、静的IDとしてREGION_FORM_DEPTを設定しておきます。必須ではありませんがリージョン表示セレクタの選択対象になることはないため、こちらはOFFにしておきます。

ドロワーの見え方を調整するために、テンプレート・オプションを開きます。


SizeNone(Auto)だと少々ドロワーが小さかったので、Mediumに変更します。OKをクリックしてテンプレート・オプションの画面を閉じます。


フォーム・リージョンを追加したときに、レンダリング前の実行ポイントにフォームを初期化するプロセス初期化フォーム部門が作成されています。ドロワー・リージョンの初期化はページが開くときではなくリージョンを開くときに行うので、このプロセスは不要です。削除します。


表DEPTのページ・アイテムP5_DEPTNOは主キーとして認識されているため、非表示かつ値の保護がデフォルトで有効になっています。今回は動的アクションでP5_DEPTNOの値を変更します。そのため、設定保護された値OFFにします。


ドロワー・リージョンにボタンを4つ追加します。識別ボタン名はそれぞれB_CANCELB_DELETEB_UPDATEB_CREATEとします。


ボタンB_CREATEから順番に設定していきます。ラベル作成とします。4つのボタンを横一列に並べるため、新規行の開始OFFにします。外観ホットONにします。動作データベース・アクションとしてSQL INSERT操作を選択します。詳細静的IDB_CREATEとします。ボタンの静的IDはJavaScriptでボタンを非表示にする際に使用します。


ボタンB_UPDATEはB_CREATEと似た設定になります。ラベル変更の適用データベース・アクションSQL UPDATE操作静的IDB_UPDATEとします。


ボタンB_DELETEは少し異なった設定になります。ラベル削除とします。テンプレート・オプションを開きTypeDangerを選択します。ボタンが赤く表示されるようになります。データベース・アクションSQL DELETE操作確認の要求ONにします。このように設定するとポップアップが開くようになります。ポップアップに表示される確認メッセージとして、本当に削除しますか?と記述します。スタイルには危険を選択します。詳細静的IDB_DELETEとします。


最後にボタンB_CANCELを設定します。識別ラベルキャンセルとします。キャンセルが一番左端に配置するボタンなので、新規行の開始ONのままです。キャンセルをクリックすると、すでに開いているドロワーを閉じます。この動作は動的アクションで定義するため、動作アクション動的アクションで定義を選択します。


ボタンB_CANCELに動的アクションを作成します。識別名前ドロワーのクローズタイミングはボタンのデフォルトである、イベントクリック選択タイプボタンボタンB_CANCELの設定になります。


TRUEアクションとして、リージョンを閉じるを選択し、影響を受ける要素選択タイプとしてリージョンを選び、リージョン部門を選択します。


すでに存在する作成(CREATE)ボタンをクリックしたときに、ダイアログを開く代わりにドロワーを開くようにします。ボタンCREATEを選択し、動作アクション動的アクションで定義に切り替えます。


ボタンCREATEに動的アクションを作成します。識別名前ドロワーのオープンとします。タイミングイベントクリック選択タイプボタンボタンCREATEになります。


TRUEアクションは5つ作成します。最初に作成をクリックしてドロワーを開く際に、リージョンにあるページ・アイテムをすべて空にします。識別アクションとして値の設定を選択し、設定タイプの設定Static Assignmentブランクにします。影響を受ける要素として選択タイプアイテムアイテムとしてP5_DEPTNOP5_DNAMEP5_LOCを指定します。


ボタンB_CREATE表示するアクションを作成します。


ボタンB_UPDATE非表示とするアクションを作成します。


ボタンB_DELETE非表示とするアクションを作成します。


準備が完了したので、ドロワーを開くアクションを作成します。識別アクションとしてリージョンを開くを選択し、影響を受ける要素選択タイプリージョンリージョンとして部門を選びます。


実際に更新処理を行うプロセスを作成します。プロセス・ビューを開き、プロセスの作成を行います。識別名前部門の処理とし、タイプとしてフォーム - 行の自動処理(DML)を選択します。フォーム・リージョン部門です。設定はデフォルトのまま変更しません。


対話モード・レポートの行にある編集アイコンをクリックしたときに、ダイアログの代わりにドロワーを開くようにします。ドロワーを開くJavaScriptのファンクションとして以下を記述します。ページ・プロパティJavaScript - ファンクションおよびグローバル変数の宣言に記述します。

function openDrawer(deptno, dname, loc) {
    $s("P5_DEPTNO", deptno);
    $s("P5_DNAME", dname);
    $s("P5_LOC", loc);
    $x_Hide("B_CREATE");
    $x_Show("B_UPDATE");
    $x_Show("B_DELETE");
    apex.theme.openRegion("REGION_FORM_DEPT");
}


編集アイコンをクリックしたときのターゲットをJavaScriptの呼び出しに変更します。ターゲットをクリックします。


リンク・ビルダー・ターゲットタイプURLURLとして以下を指定します。

javascript:openDrawer("#DEPTNO#","#DNAME#","#LOC#")


以上で完成です。アプリケーションを実行すると、最初のGIF動画のようになります。

作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/new212-drawer.sql

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