2021年9月7日火曜日

Universal Themeの安全なカスタマイズ方法について

 Oracle APEXのArchitectであるShakeeb Rahmanさんが、先日のOffice Hour - Deep Dive: Universal Theme in APEX 21.1にて、Universal Themeのカスタマイズ方法について紹介しています。

Recommended Approach - 推奨する方法 - として、以下を挙げています。

  • Theme Roller - テーマ・ローラー
  • Template Options - テンプレート・オプション
  • Overriding CSS variables - CSS変数の上書き
  • Scoped CSS snippets where necessary - スコープ付きCSSスニペット - 必要に応じて
テーマ・ローラーおよびテンプレート・オプションはOracle APEXの標準機能であり、サポートされる変更手順です。CSS変数の上書きやCSSスニペットの記述(テーマ・ローラーのカスタムCSSとしての記述を含め)は、開発者によって書かれたコードになります。ですので、そのコード自体はサポートの対象にはなりません。それらの方法によるUIのカスタマイズは、Oracle APEXのバージョンアップの影響が最小限である(もしくはほとんどない)ため、カスタマイズ手順として推奨されています。

推奨されている手順について、Tim Kimberlさんがビデオの中で説明しています。サンプル・データセットのEMP/DEPTから作成されるアプリケーションを使って、ビデオで紹介されている手順を確認してみます。

Oracle APEX 21.1からHTML要素のclass属性としてpage-ページ番号およびapp-アプリケーション別名が指定されるようになりました。

例えば以下のページ番号3、ファセット検索のページのHTML要素は以下から始まります。

<html class="page-3 app-DEMO-EMP-DEPT">


テーマ・ローラーを開いてカスタムCSSとして以下のコードを設定します。ヘッダーのバックバウラウンド色を定義しているCSS変数を赤に変更します。

.page-3 {
--ut-header-background-color: red;
}

.page-3クラスの定義とすることで、ページ番号3に適用範囲を限定しています。


部門ページを開いてみます。部門ページはページ番号5なので、この設定による影響はありません。


また、CSS変数の設定では、他のCSS変数を参照することができます。--ut-palette-successをヘッダーのバックラウンド色に設定します。

.page-3 {
--ut-header-background-color: var(--ut-palette-success);
}

ヘッダーの色が緑になります。


続いて、レポートとして表示される文字の色を変更してみます。ページ・デザイナを開いて、レポート・リージョンのEmployee外観CSSクラスmy-regionを設定します。


テーマ・ローラーのカスタムCSSに以下の記述を追加します。.page-3と.my-regionクラスに設定することにより、ページ番号3およびEmployeeのリージョンに適用範囲を限定しています。

.page-3 .my-region {
--ut-region-text-color: var(--ut-palette-success);
}

リージョンの文字の色が緑になっています。


CSS変数の上書きとスコープ付きCSSスニペットの例は以上になります。

Office HourではOracle APEX 21.1の新しい機能である行CSSクラスについても紹介されていました。

ダッシュボードのチャートが次のように配置されています。


行CSSクラスを定義して、以下のようなレイアウトにしてみます。


最初に開発者ツール・バーよりクイック編集を実行し、4つのチャート・リージョンすべてでライブ・テンプレート・オプションを呼び出し、Body Heightを320pxからAuto - Defaultに変更します。


部署ごとの総給与のリージョンの、レイアウト新規行の開始OFFに変更します。すべてのチャート・リージョンが横一列に並びます。


ページ・プロパティCSSインラインに以下を記述します。同じ行に並んでいるリージョンの高さを一致させます。

.equal-row-height .col {
display: flex;
}

.equal-row-height .t-Region {
flex-grow: 1;
}

定義したCSSクラスequal-row-heightを、行の先頭となるリージョン部門ごとの従業員レイアウト行CSSクラスとして設定します。同じ行に配置される4つのリージョンの高さが同じになります。


以上で行CSSクラスの設定はできました。設定結果の表示は以下になります。

もともとBody Heightはすべて320pxとして設定されていたので、リージョンの高さは一致していました。ここでチャートの職種ごとの合計給与の棒グラフを縦方向に広げてみます。

チャートのAttributesレイアウト高さ500ピクセルとします。


チャートは以下の表示になります。職種ごとの合計給与のチャートは縦長になりますが、同じ行のすべての(チャート)リージョンも同じ高さに変更されます。そのため、Body Heightをそれぞれのリージョンで個別に設定する必要がありません。


行CSSクラスはフォーム上のページ・アイテムの配置でも活用できます。従業員の編集フォームのSalaryとCommisionのページ・アイテムを以下のように強調してみます。


Employeeのフォーム・ページのCSSインラインに以下を記述します。パディングとして20ピクセル、バックグラウンド色を警告色にしています。

.highlight-form-row {
padding: 20px;
background-color: var(--ut-palette-warning-shade);
}


フォームの作成直後は、ページ・アイテムP4_COMMはP4_SALの右隣には配置されていません。ページ・アイテムP4_COMMレイアウト新規行の開始OFFにします。


ページ・アイテムP4_SALレイアウト行CSSクラスとして、highlight-form-rowを設定します。


以上でSalaryとCommissionの入力項目を強調することができました。行CSSクラスが導入される前はサブリージョンを使うなど、非常に手間がかかりました。

Tim Kimberlさんがデモで使用していたアプリケーションを以下からアクセスできるようにしています。
https://apex.oracle.com/pls/apex/japancommunity/r/ut211-demo/generic-component-styles

Universal Themeにて定義されているCSS変数の一部が記載されていますが、リファレンスとして使えるようになるまでは、まだ時間がかかるようです。

以上で今回の記事は終了です。

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