2025年1月24日金曜日

APEX 24.2のモーダル・ダイアログのサイズ変更を可能にする設定について

Oracle APEX 24.2では、モーダル・ダイアログのページにサイズ変更可能という設定が追加されています。この設定をオンにすることにより、アプリケーションのユーザーは表示されているモーダル・ダイアログのサイズを変更できるようになります。


サイズ変更可能オンにすると、以下のようにモーダル・ダイアログのサイズを変更できます。


APEX 24.2以前のバージョンでは、この設定はありません。今まではどのように実装していたのか調べてみました。

APEX 24.2以前での、モーダル・ダイアログのサイズ変更を可能にする実装について、以下より紹介します。

空のアプリケーションを作成します。名前Resizable Modal Dialogとします。

アプリケーションの作成をクリックします。


アプリケーションが作成されたら、対話モード・レポートのページを作成します。

ページの作成をクリックします。


対話モード・レポートを選択します。


対話モード・レポートのページの名前Employeesとし、フォーム・ページを含めるオンにします。

フォーム・ページ名Employee Detailとし、フォーム・ページ・モードとしてモーダル・ダイアログを選択します。サイズを変更できるのは、モーダル・ダイアログのみです。

データ・ソース表/ビューの名前としてEMPを選択します。表EMPは、サンプル・データセットEMP/DEPTに含まれています。

へ進みます。


主キー列1としてEMPNO(Number)を選択します。

ページの作成をクリックします。


対話モード・レポートとフォームのページが作成されます。


モーダル・ダイアログのページのサイズを変更可能にするには、JavaScriptでapex.navigation.dialogを呼び出して、ページを開く必要があります。呼び出し時の引数pOptionsresizabletrueを渡します。

ダイアログとして開くページのURLを引数pUrlに渡します。サーバーでapex_page.get_url(またはapex_util.prepare_url)を実行することで、チェックサムが付いたURLを生成できます。

サーバーで生成したURLをJavaScriptで取得できるよう、Ajaxコールバックを作成します。

Ajaxコールバック名前GET_URLソースPL/SQLコードとして以下を記述します。

declare
l_url varchar2(800);
l_response clob;
begin
l_url := apex_page.get_url(
p_page => '3'
,p_items => 'P3_EMPNO'
,p_values => apex_application.g_x01
,p_plain_url => true
/* p_triggering elementはapex.navigation.dialogで指定するので不要 */
);
l_response := apex_string.format('{ "url": "%s" }', l_url );
apex_debug.info(l_response);
htp.p(l_response);
end;
view raw get_url.sql hosted with ❤ by GitHub


JavaScriptでダイアログを開く処理は、APEXアクションで実装します。

ページ・プロパティJavaScriptページ・ロード時に実行に、以下を記述します。APEXアクションの名前はopen-employee-dialogです。

apex.actions.add([
{
name: "open-employee-dialog",
action: (event, element, args ) => {
apex.server.process(
"GET_URL",
{
x01: args.empno
},
{
success: (data) => {
console.log(data.url);
apex.navigation.dialog(
data.url,
{
title: "Employee Detail",
height: 600,
width: 800,
maxWidth: 1200,
modal: true,
resizable: true // 24.2以前はresizableはコードでのみ指定可
},
"a-Dialog--uiDialog",
"#EMP" // jQueryでの指定が必要なバージョンでは $("#EMP")
);
}
}
)
}
}
]);

対話モード・レポートのリージョンに静的IDとしてEMPを設定します。ダイアログを開くときに、対話モード・レポートをtriggering elementに指定するためです。この設定により、対話モード・レポートがダイアログ・クローズのイベントを受け付けます。


ボタンCREATEをクリックしたときに、APEXアクションopen-employee-dialogが実行されるように設定します。

アクション動作動的アクションで定義に変更し、詳細カスタム属性に以下を記述します。

data-action="open-employee-dialog?empno="


続いて、編集フォームを開くリンクを設定します。

対話モード・レポートの属性を開き、リンクターゲットを変更します。


ターゲットタイプURLに変更し、URLに以下を記述します。

#action$open-employee-dialog?empno=#EMPNO#


以上で作業は完了です。

Oracle APEX 24.2では、この実装をスイッチひとつで有効にできます。

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

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