2023年1月26日木曜日

カスタム属性data-parent-elementを使ったインライン・ポップアップの実装

 Philipp Hartenfellerさんが、彼のブログに以下の記事を載せています。

Oracle APEX anchored inline popups for data input

カスタム属性のdata-parent-elementを指定することにより、開いたボタンにインライン・ポップアップをくっつけることができます。

自分でも実装のサンプルを作ってみました。


data-parent-elementを指定してない場合、インライン・ポップアップは以下のように画面の真ん中に表示されます。


インライン・ポップアップの設定が出来ていれば、ボタンに静的IDを付加した後、インライン・ポップアップのリージョンのカスタム属性を設定するだけです。

data-parent-element="#ボタンの静的ID"


似たような設定を扱ったことがあったなと思ったのですが、ありました。カスタム属性data-menuを使った実装です。


data-parent-elementはユニバーサル・テーマのリファレンスに説明がありませんが、Philipp Hartnenfellerさんの記事によるとAPEX 19.2でも動作した、とのことです。

以下よりサンプル・アプリケーションの実装について紹介します。

サンプル・データセットのEMP/DEPTがインストール済み、空のAPEXアプリケーションを作成したところから作業を始めます。デフォルトで作成されるホーム・ページにインライン・ポップアップを実装します。

役職一覧となるLOVを作成します。共有コンポーネントを開きます。


LOVを開きます。


作成済みのLOVが一覧されます。作成をクリックします。


LOVの作成最初からを選択します。

へ進みます。


作成するLOVの名前LIST_OF_JOBSとします。タイプDynamicです。

へ進みます。


データ・ソースローカル・データベースソース・タイプとしてSQL Queryを選択します。SQL SELECT文を入力として、以下を記述します。表EMPの列JOBの個別の値を求めます。

select distinct job from emp


戻り列表示列ともにJOBを選択します。

作成をクリックします。


共有コンポーネントLOVとしてLIST_OF_JOBSが作成されました。


続けて、通常のインライン・ポップアップを実装します。

ページ・デザイナにてホーム・ページを開きます。

役職の値を保持するページ・アイテムP1_JOBを作成します。タイプ選択リストを選びます。ラベル役職とします。

LOVタイプ共有コンポーネントLOVとして先ほど作成したLIST_OF_LOBSを選択します。追加値の表示OFFにします。

このページ・アイテムP1_JOBの値は、インライン・ポップアップを開いて設定します。そのため、読取り専用常時にします。


このページ・アイテムはタイプが選択リストなので、わざわざインライン・ポップアップを実装する必要はありません。あくまで実装のサンプルです。

インライン・ポップアップを開くボタンSELECT_JOBを作成します。ラベル役職の選択とします。

動作アクションとして動的アクションで定義を選択します。


役職を選択するインライン・ポップアップを作成します。

リージョンを作成します。

識別タイトル役職の選択タイプ静的コンテンツとします。レイアウト位置としてDialogs, Drawers and Popupsを選択します。外観テンプレートとしてInline Popupを選択し、その後、テンプレート・オプションを開きます。


テンプレート・オプション共通一般Auto HeightRemove Page OverlayDisplay Popup Calloutにチェックを入れ、SizeNoneに変更します。


インライン・ポップアップのリージョンに、役職の選択を行なうページ・アイテムを作成します。

識別名前P1_JOB_SELECTタイプとしてラジオ・グループを選択します。ラベル役職一覧とします。

LOVタイプ共有コンポーネントLOVとしてLIST_OF_JOBSを選択します。追加値の表示OFFNULL値の表示ONで、NULL表示値未選択とします。


以上で画面として表示されるコンポーネントは作成できました。

続いてインライン・ポップアップを開く動的アクションと、それを閉じる動的アクションを作成します。

開く方の動的アクションは、ボタンSELECT_JOBに作成します。

作成した動的アクションの識別名前onClick SELECT_JOBとします。タイミングはデフォルトでイベントクリック選択タイプボタンボタンSELECT_JOBとなります。


2つのTRUEアクションを作成します。

最初にページ・アイテムP1_JOBの値を、インライン・ポップアップのページ・アイテムP1_JOB_SELECTに初期値として設定します。

識別名前P1_JOB -> P1_JOB_SELECTアクションとして値の設定を選択します。

設定タイプ設定JavaScript Expressionを選択し、JavaScript式として以下を記述します。

apex.items.P1_JOB.getValue()

影響を受ける要素選択タイプアイテムを選び、アイテムとしてP1_JOB_SELECTを指定します。以上で、設定で取得した影響を受ける要素アイテムに設定されます。

実行初期化時に実行OFFにします。


インライン・ポップアップを開くTRUEアクションを作成します。

識別名前ポップアップを開くアクションとしてリージョンを開くを選択します。

影響を受ける要素選択タイプとしてリージョンを選択し、リージョン役職の選択を選びます。このリージョンが開かれる対象になります。

実行初期化時に実行OFFです。


ポップアップを閉じる動的アクションは、ページ・アイテムP1_JOB_SELECTに作成します。

識別名前onChange P1_JOB_SELECTとします。タイミングはデフォルトで、イベントが変更選択タイプアイテムアイテムP1_JOB_SELECTになります。


TRUEアクションはポップアップを開いたときとは反対に、ページ・アイテムP1_JOB_SELECTの値をP1_JOBに設定します。

識別名前P1_JOB_SELECT -> P1_JOBとします。設定JavaScript式は以下に代わり、影響を受ける要素アイテムP1_JOBになります。

apex.items.P1_JOB_SELECT.getValue()


次のTRUEアクションで、インライン・ポップアップを閉じます。

識別名前ポップアップを閉じるアクションとしてリージョンを閉じるを選択します。


以上で、通常のインライン・ポップアップが実装できました。

動作は以下のようになります。


これからカスタム属性data-parent-elementを設定します。

ボタンSELECT_JOB静的IDを設定します。

静的IDSELECT_JOBとします。


インライン・ポップアップのリージョンの詳細カスタム属性として、以下を設定します。

data-parent-element="#SELECT_JOB"


以上でアプリケーションの実装は完了です。アプリケーションを実行すると、記事の先頭のGIF動画のように動作します。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/data-parent-element-sample.zip

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