2025年1月28日火曜日

Font APEX 2.4に追加された国旗アイコンを表示する

Oracle APEXには、Font APEXというオープンソースのアイコン・ライブラリが含まれています。Oracle APEX 24.2にバンドルされているFont APEX 2.4に、各国の国旗のアイコンが追加されました。


これらの国旗のアイコンをAPEXアプリケーションに表示してみます。


先日の記事で作成した表EBAJ_COUNTRIESを作成します。
-- create tables
create table ebaj_countries (
    iso_code                      varchar2(2)    not null
                                                constraint ebaj_countries_pk primary key,
    country_name                  varchar2(255)  not null,
    capital_name                  varchar2(255),
    longitude                     number(9,6),
    latitude                      number(9,6) )
/
SQLワークショップSQLスクリプトを開き、作成をクリックします。


スクリプト名としてcountriesを入力し、上記のCREATE TABLE文を貼り付けて、実行をクリックします。


即時実行をクリックします


表EBAJ_COUNTRIESが作成されます。続けてアプリケーションの作成をクリックします。


確認画面が開きます。アプリケーションの作成をクリックします。


アプリケーション作成ウィザードが開きます。スクリプト名よりアプリケーションの名前Countriesとなっています。表EBAJ_COUNTRIESをソースとしたフォーム付き対話モード・レポートのページが追加されています。

このままアプリケーションの作成を実行します。


アプリケーションが作成されます。


表EBAJ_COUNTRIESにデータを投入します。Claude 3.5 Sonnetに以下の指示を与えました。

現在、国連に加盟している国名、ISO3166-1 Alpha-2コード、首都名、首都の位置の経度と緯度をCSV形式で出力してください。データは英語で一覧してください。ISO3166-1のコードは英子文字で出力してください。

アーティファクトとして作成されたので、クリップボードにコピーします。


APEXに戻り、SQLワークショップユーティリティに含まれるデータ・ワークショップを開きます。

データのロードをクリックします。


コピー・アンド・ペーストを選択し、先ほどコピーしたアーティファクトをペーストします。

へ進みます。


ロード先既存の表を選択し、として最初に作成したEBAJ_COUNTIRIESを選択します。列見出し最初の行にヘッダーが含まれるチェックを入れます。

データのロード先となる列をマッピングするため、構成をクリックします。


ソース列COUNTRYマップ先としてCOUNTRY_NAME(Varchar2)、ソース列CAPITALマップ先としてCAPITAL_NAME(Varchar2)を選択します。それ以外のすべてのソース列について、マップ先が設定されていることを確認します。

変更の保存をクリックします。


準備ができたので、データのロードをクリックします。


アプリケーションはすでに作成済みなので、データのロードが完了したら作業は終了です。


作成済みのAPEXアプリケーションCountriesを実行して、表EBAJ_COUNTRIESの内容を一覧する対話モード・レポートを表示します。


ISOコードの表示の前に国旗を表示させます。

Font APEXのリファレンスを開きアイコンを表示するHTMLを確認します。日本の国旗を検索し、そのHTML式をコピーします。


対話モード・レポートの列ISO_CODE列の書式HTML式に以下を記述します。日本の国旗のHTML式のjpの部分を、列ISO_CODEの値である#ISO_CODE#に置き換えます。

<span aria-hidden="true" class="fa fa-flag-#ISO_CODE#"></span>#ISO_CODE#

変更を保存します。


ページを実行します。列ISO Codeに国旗のアイコンが表示されています。


同様にしてマップ・リージョン上にポイントとして国旗を表示させようとしたのですが、国旗のアイコンのソースがSVGであるため表示はできませんでした。

日本の国旗のアイコンは、以下のように定義されています。SVGのバックグランド・イメージです。大抵のアイコンは、SVGではありません。
.fa-flag-jp {
  background-image: url(../images/flags/flag-jp.svg)
}
マップ・リージョンにSVGを表示するには、属性カスタムSVGスタイルに、表示する図形を登録します。

マップ・リージョンのページを作成し、日本の国旗を表示してみます。

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


マップを選択します。


ページの名前世界地図とします。データ・ソース表/ビューの名前EBAJ_COUNTRIESを指定します。

へ進みます。


マップ・スタイルとしてポイントを選択します。マップ属性ジオメトリ列タイプ2つの数値列を選択し、経度列LONGITUDE(Number)緯度列LATITUDE(Number)を指定します。ツールチップ列COUNTRY_NAME(Varchar2)とします。

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


マップ・リージョンのページが作成されます。


ページを実行してみます。各国の首都の位置にデフォルトのピンが立っています。


ポイント・オブジェクトスタイルアイコンに変更し、アイコン・ソースアイコン・クラスアイコンCSSクラスとしてfa-dot-circle-oを指定します。国旗のアイコン(SVGがソース)でなければ、ポイント・オブジェクトとしてアイコンが表示されます。


首都の位置にfa-dot-circle-oのアイコンが表示されます。


東京の位置に日本の国旗を表示してみます。

マップ・リージョンの属性カスタムSVGスタイルに以下を記述します。SVGをJSON形式で定義しています。SVGからJSONに書き換える作業が大変なので、日本の国旗だけを登録します。
[
  {
    "name": "fa-flag-jp",
    "width": 24,
    "height": 24,
    "paint-order": "stroke",
    "viewBox": "0 0 24 24",
    "fill": "none",
    "fill-rule": "evenodd",
    "elements": [
      {
        "type": "rect",
        "width": 24,
        "height": 18,
        "y": 3,
        "fill": "#fcfbfa",
        "rx": 2
      },
      {
        "type": "circle",
        "cx": 12,
        "cy": 12,
        "r": 5,
        "fill": "#e70a2d"
      },
      {
        "type": "rect",
        "width": 23,
        "height": 17,
        "x": 0.5,
        "y": 3.5,
        "stroke": "#100f0e",
        "opacity": 0.1,
        "rx": 2
      }
    ]
  }
]

マップ・リージョンに日本の国旗を表示します。日本に限定するため、レイヤー世界地図ソースWHERE句iso_code = 'jp'を記述します。

ポイント・オブジェクトスタイルとしてSVG形状fa-flag-jpを指定します。


以上の設定で、東京の位置に日本の国旗が表示されます。


もし、各国の国旗のアイコンがカスタムSVGスタイルに登録されていると、レイヤーのソースを以下のように変更し、形状&ICON.と設定することで、それぞれの国の首都の位置にその国の国旗を表示できます。
select ISO_CODE,
       COUNTRY_NAME,
       CAPITAL_NAME,
       LONGITUDE,
       LATITUDE,
       'fa-flag-' || iso_code icon
 from EBAJ_COUNTRIES

以下のような表示なります。日本以外はSVGスタイルが登録されていないため、デフォルトの形状が表示されています。


以上でアプリケーションの作成は完了です。

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

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