2024年9月5日木曜日

APEX 24.1で追加されたアイテム・タイプ「1つ選択」と「複数選択」について

Oracle APEX 24.1では新しいアイテム・タイプとして、「1つ選択」(英語ではSelect One)および「複数選択」(英語ではSelect Many)が追加されています。この新しいアイテム・タイプについては、APEX Office Hoursの以下の回で、開発者のAlexis Galdamezさんが説明されています。

APEX Office HourのWhat's new in Oracle APEX 24.1 - Part 2
https://youtu.be/i4y0BzPOfrs?si=jB9kA6Wp_BuM2n5Z&t=1587

アイテム・タイプ「1つ選択」はその名前の通り、LOVから単一の値を選択するアイテム・タイプ、「複数選択」は、LOVから複数の値を選択するアイテム・タイプです。

LOVをソースとして、値をひとつまたは複数の値を選択するページ・アイテムとして、「選択リスト」と「ポップアップLOV」があります。新しく追加された「1つ選択」と「複数選択」との違いを確認してみます。

確認には以下のAPEXアプリケーションを使用しました。
https://github.com/ujnak/apexapps/blob/master/exports/select-one-select-many-component.zip

値をひとつ選択するページ・アイテムとして、選択リストポップアップLOV表示形式インライン・ポップアップ)、24.1で新しく追加された1つ選択の3つのページ・アイテムを横並びに配置しています。

その下に、値を複数選択するページ・アイテムとして、選択リストポップアップLOV、24.1で新しく追加された複数選択を配置しています。


すべてのページ・アイテムで、同じLOVソースとして設定しています。

共有コンポーネントLOVとして、サンプル・データセットのEMP/DEPTに含まれるビューEMP_DEPT_VをソースとしたLOVを、LOV_EMPとして作成しています。

ソースSQL問合せは以下です。
select
    empno
  , ename
  , job
  , mgr
  , hiredate
  , sal
  , comm
  , deptno
  , dname
  , loc
  , case deptno
    when 10 then 'fa-table-user'
    when 20 then 'fa-database-user'
    when 30 then 'fa-calendar-user'
    when 40 then 'fa-folder-user'
    else 'fa-lock-user'
    end icon 
from emp_dept_v

列のマッピング戻り値EMPNO表示値ENAMEです。その他にグループとしてJOBアイコンとしてICONを割り当てています。

追加表示列としてDNAMEEMPNOENAMELOCJOBICONを設定しています。



選択リスト(複数の値のタイプがいいえ)と「1つ選択」の比較



アイテム・タイプ選択リストは、ほぼHTMLのSELECT要素としてそのまま生成されています。そのため、選択リストの画面上の表示はデバイスに依存します。

macOS上のChromeブラウザ上では以下のように表示されます。


iOSのSafariでは以下のように表示されます。


Android上のChromeでは以下のように表示されます。


アイテム・タイプ1つ選択は、異なるデバイスでもほぼ同じ見かけになっています。

macOS上のChromeです。


iOS上のSafariです。


Android上のChromeです。


アイテム・タイプが選択リストの出力を確認してみます。

LOVとして選択できるすべての値がoptionの値として出力されていることが確認できます。モバイル・デバイス上での操作の一貫性という意味で、デバイス・ネイティブのユーザー・インターフェースが提供される選択リストは良い面もあります。しかし、選択肢となるLOVの値が多数の場合に向いているコンポーネントとは言えなさそうです。

LOVの値がすべて静的にHTML(のoption要素)として生成されるため、値の操作時にサーバーとの通信が発生しません。LOVの選択肢が少なく、かつ、その選択肢の更新頻度が高く無い場合に向いています。


アイテム・タイプの1つ選択は、a-selectというカスタム要素として実装されています。このコンポーネントはブラウザ上のJavaScriptにより描画されています。




ポップアップLOV(複数の値のタイプがいいえ)と「1つ選択」の比較



アイテム・タイプポップアップLOV表示形式モーダル・ダイアログであれば、値の選択画面がダイアログとして開くため、新しいアイテム・タイプ「1つ選択」とは異なるユーザー体験を提供しています。そのため、これは「1つ選択」で置き換えることはできません。

ポップアップLOV表示形式インライン・ポップアップの場合は、追加出力の機能を除いて、「1つ選択」の方がより良いユーザー体験を提供しているように思います。追加出力が不要であれば、アイテム・タイプ「1つ選択」が常に優先される選択肢になるでしょう。

ポップアップLOVの設定項目です。


ポップアップLOVの表示例です。値を入力するフィールドと検索フィールドは別に存在します。


1つ選択の設定項目です。


1つ選択の表示例です。値の入力フィールドへの入力でLOVの検索が行われます。また、入力した値をキャンセルするXボタンが追加されました。


選択リストおよびポップアップLOVでは、設定値を空白に戻すためにはNULL表示値として設定した文字列が表示されている領域を選択する必要がありました。NULL表示値として- Select Employee -といった値の選択を促するメッセージが設定されている場合、直感的には分からない操作になってしまいます。


1つ選択」の検索では、一致タイプとして次を含む次から始まるを選択できます。大/小文字を区別オン/オフの切り替えと最小文字数を設定できます。


ポップアップLOVでは入力時に検索オンにし、最小文字数を設定すると「1つ選択」と同様に、キー入力に従ってLOVの検索が行われます。入力は検索フィールドに行います。

入力時に検索オフにすると、検索フィールドに値を入力しEnterを押してLOVを検索できます。この動作は「1つ選択」のアイテムには実装されていませんが、最小文字数を超えると検索は実行されるため、無くても不便ではありません。サーバーの負荷の軽減という意味では有効ですが、「1つ選択」ではサーバーから取得した選択肢をブラウザでキャッシュすることにより、サーバーの負荷を軽減できます。


ポップアップLOVの設定に初期フェッチの設定があります。設定できる値はユーザー・リクエスト時自動自動(現在の値を使用) です。この設定により、LOVから値を選択する際に発生するデータベースへのリクエストを抑制することができます。


1つ選択」では設定検索時にフェッチおよびキャッシュの使用によって、データベースへのリクエストを制御します。また、リスト内の最大値を設定することにより、一回のリクエストで取得するLOVのエントリ数を制限することもできます。


リスト内の最大値は一度に表示されるLOVの選択肢の数を設定します。例えば、以下は5の場合です。


ポップアップLOVでは、ポップアップの高さを設定することはできますが、表示件数を制限することはできません。以下は高さを400ピクセルに設定した結果です。5件の選択肢が表示されていますが、スクロールすることで全ての選択肢を参照することができます。


1つ選択」では設定値HTML式にHTMLを記述することにより、選択リストの表示を変更することができます。HTML式にはテンプレート・ディレクティブを使用できます。


ポップアップLOVでも表示形式の変更は可能ですが、それは初期化JavaScriptにてオプションのrecordTemplateを設定する、という手間のかかる方法でした。

総じていうと、ポップアップLOVの欠点を補うように作られたのがアイテム・コンポーネントの「1つ選択」になっています。


選択リスト(複数の値のタイプが区切りリストまたはJSON配列)と「複数選択」の比較



複数の値を選択可能な選択リストは、multiple属性が設定されたSELECT要素として生成されています。選択肢が1つの場合と同様に、画面上の表示はデバイスに依存します。

macOS上のChromeブラウザ上では以下のように表示されます。


iOSのSafariでは以下のように表示されます。


Android上のChromeでは以下のように表示されます。


アイテム・タイプ複数選択では、異なるデバイスでも同じ見かけになります。


1つ選択の場合と同様に、選択肢が少なく、デバイス・ネィティブのユーザー・インターフェースが望ましいケースでは選択リストを使用し、それ以外の場合は「複数選択」が向いているでしょう。


ポップアップLOV(複数の値のタイプが区切りリストまたはJSON配列)と「複数選択」の比較



1つ選択と同様に、追加出力が不要であれば、アイテム・タイプ「複数選択」が常に優先される選択肢になるでしょう。

設定できる項目の比較は概ね1つ選択と同様です。

アイテム・タイプ複数選択では、選択肢を開いたままチェックボックスにより値の選択と解除が可能です。


ポップアップLOVでは、値をひとつ選択するたびにポップアップLOVを開く必要があります。また、値の削除は入力フィールドから削除する必要があります。


新しい複数選択のコンポーネントの方が使いやすいのは明らかなので、これからは複数選択のコンポーネントが優先して使用されるでしょう。

コンポーネント複数選択設定として、値の表示形式というものがあります。チップカンマ区切りリストを選択できます。


チップを選択すると、選択された値は以下のように表示されます。


カンマ区切りリストを選択すると、以下のように表示されます。ただし、ページ・アイテムにフォーカスが当たると、表示はチップに変わります。


設定にはデフォルトの使用があり、これをオフにすると値の表示形式を選択できるようになります。

デフォルトの使用の設定は、共有コンポーネントコンポーネント設定に含まれる複数選択から行います。


値の表示形式のデフォルトは、ここで設定されています。


アイテム・タイプ「1つ選択」と「複数選択」の説明は以上になります。

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

apex.oracle.comの新機能紹介ではSelect Oneを「単一選択」と訳出しているため、製品の翻訳も「1つ選択」ではなく「単一選択」としてほしかったと思います。