2024年1月16日火曜日

国民の祝日・休日をFullCalendar v6のmultiMonthYearおよびdayGridYearビューで表示する

フランスのパリ在住のLouis Moreauxさんが、彼のブログでFullCalendar v6で追加されたmultiMonthYearとdayGridYearビューの紹介記事を書いています。このような機能がOracle APEX 23.2から使えるようになっていたとは知りませんでした。

Oracle APEX 23.2 - Calendar region enhancements

FullCalendar v6で追加されたmultiMonthYearとdayGridYearビューは、ひとつのカレンダー・リージョンに複数の月を一度に表示します。

自分でも、実装サンプルとして以下のように動作するAPEXアプリケーションを作成してみました。


カレンダーに表示しているデータとして、内閣府「国民の祝日」についてのページからダウンロードした「昭和30年(1955年)から令和6年(2024年)国民の祝日(csv形式:20KB)」を使っています。

内閣府「国民の祝日」について

そもそもmultiMonthYearおよびdayGridYearビューはFullCalendarの新機能なので、Oracle APEXの新機能として説明されていません。リリース・ノートに以下のように記載されているだけです。
JavaScript Library Upgrades
We've updated several JavaScript libraries to newer releases including Oracle JET 15.0.0, jQuery 3.6.4, jQuery Migrate 3.4.1, FullCalendar 6.1.8, MarkedJS 5.1.2, DOMPurify 3.0.5, Terser 5.19.2, and TinyMCE 6.6.1.

 Oracle APEX 23.1に含まれているFullCalendarのバージョンは5.11.3なので、メジャー・バージョンが上がっています。multiMonthYearおよびdayGridYearビューは、このバージョンアップで導入された新機能になります。

FullCalendarのドキュメント(https://fullcalendar.io/docs)のViewsの、DayGridMulti-Month StackMulti-Month GridおよびCustom Viewsにあたります。


これらの新設されたビューは、Oracle APEXのページ・デザイナでは宣言的には扱えないため、初期化JavaScriptファンクションで定義します。

以下よりサンプル・アプリケーションの作成方法を紹介します。

クイックSQLの以下のモデルより表CAL_NATIONAL_HOLIDAYSを作成します。
#prefix: cal
national_holidays
    holiday_date
    holiday_name
レビューおよび実行をクリックし、生成されたSQLスクリプトを実行します。


SQLスクリプトの画面が開きます。スクリプト名を指定し、実行をクリックします。確認画面が開くので、即時実行をクリックします。


CAL_NATIONAL_HOLIDAYSが作成されます。


内閣府のWebページより、祝日のCSVファイルshukujitsu.csvがダウンロード済みとします。このCSVファイルを表CAL_NATIONAL_HOLIDAYSにロードします。

SQLワークショップユーティリティデータ・ワークショップを開きます。

データのロードを開きます。


ファイルの選択をクリックし、shukujitsu.csvを選択します。


ロード先として既存の表を選択し、に先ほど作成したCAL_NATIONAL_HOLIDAYSを選びます。ファイル・エンコーディングとして日本語(Shift JIS)を選択します。

このCSVには列見出しとして国民の祝日・休日月日国民の祝日・休日名称が含まれているため、最初の行にヘッダーが含まれるチェックが入ったままにします。CSVやExcelのデータをインポートする際に列見出しが日本語になっていると、ロード先新規表を選んでいると列名が日本語になってしまいます。一般に日本語の列名はSQLで扱いにくいため、データ・ワークショップを使って日本語データをロードする際は、あらかじめ表を作成しておくことを推奨します。

構成をクリックします。


ソース列国民の祝日_休日月日マップ先としてHOLIDAY_DATE(Date)国民の祝日_休日名称マップ先としてHOLIDAY_NAME(Varchar2)を設定します。

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


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


データのロードが完了します。

取消をクリックし、データ・ワークショップのロード処理を終了します。


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

名前Sample FullCalendar v6 New Viewsとします。

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


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

最初に標準の実装によるカレンダのページを作成します。

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


カレンダを選択します。


ページの名前Standardデータ・ソース表/ビューの名前CAL_NATIONAL_HOLIDAYSを選択します。

へ進みます。


表示列HOLIDAY_NAME開始日列HOLIDAY_DATEを選択します。終了日列は選択しない(- 選択 -のまま)、時間の表示いいえです。

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


カレンダのページが作成されます。


ページを実行すると以下のように表示されます。


ナビゲーション予定リストは、カレンダの属性タブの設定追加のカレンダ・ビューリストナビゲーションチェックによって表示/非表示が制御されます。この設定に限りませんが、初期化JavaScriptファンクションの記述によって、これらの設定が上書きされることがあります。


最初にMulti-Month Gridの表示を実装します。Standardのページをコピーします。

ページの作成をクリックし、コピーとしてのページの作成をクリックします。


次のコピーとしてのページを作成このアプリケーションのページです。

へ進みます。


コピー元ページ2. Standard新規ページ名Multi-Month Gridとします。ブレッドクラムを作成し、エントリ名Multi-Month Gridとします。

へ進みます。


ナビゲーションのプリファレンスとして新規ナビゲーション・メニュー・エントリの作成を選択します。新規ナビゲーション・メニュー・エントリMulti-Month Gridとします。

へ進みます。


リージョンStandard新しい値Multi-Month Gridに設定します。

コピーをクリックします。


カレンダのページMulti-Month Gridが作成されます。

リージョンMulti-Month Gridを選択し、プロパティ・エディタ属性タブを開きます。

詳細JavaScriptファンクションに以下を記述します。



カレンダのinitialViewとしてmultiMonthYearmultiMonthMaxColumns4(デフォルトは3)を設定しているため、一列に最大4つの月がカレンダに表示されるようになります。

ページを実行し、カレンダの表示を確認します。

手順によっては、初期化JavaScriptファンクションに記述した変更が反映されないことがあります。初期化JavaScriptファンクションにコードを記述する前にページを実行していると、ブラウザのセッション・ストレージにカレンダの状態が保存されるようです。そのためセッション・ストレージの記録をリセットするため、ブラウザのタブまたはウィンドウを一旦閉じ、再度、アプリケーションを実行します


カレンダを新しいタブまたはウィンドウで開くと、初期化JavaScriptファンクションでの設定が反映されます。

headerToolbar.endに空白を設定しているため、設定追加のカレンダ・ビューリストチェックが入っていても、予定リストのボタンは表示されません。

また、multiMonthMaxColumns4にしていても画面幅が十分で無い場合は、一列に表示される月の数は少なくなります。

Multi-Month Gridに切り替えた後の初回表示では、1年分のデータが表示されていない場合があります。


この現象には、パフォーマンス遅延ロードオンに変更して対処します。


遅延ロードオンにすると初回表示でも、1年分の祝日と休日が表示されます。


できるだけカレンダをスクロールしない設定などは、FullCalendarのDocumentのSizingの項目ににあるheightを調整します。

初期化JavaScriptファンクションにconfig.height = 'auto'を追加すると、表示は以下のようにできるだけスクロールせずに全ての月を表示しようとします。



画面に十分な横幅があれば、祝日の名前もカレンダに表示されます。


次にMulti-Month Stackの表示を実装します。Standardのページをコピーし、Multi-Month Stackのページを作成します。コピー手順はMulti-Month Gridと同じで、名称をMulti-Month Stackに置き換えて実行します。

作成したページのJavaScript初期化ファンクションに以下を記述します。Multi-Month StackはmultiMonthMaxColumnsを設定した、multiMonthYearビューです。



Multi-Month Stackでは、カレンダが縦方向にスクロールします。


続いてStandardのページをコピーし、Custom Viewsを実装します。

コピーしたページの初期化JavaScriptファンクションとして以下を記述します。multiMonthFourMOnthとしてヶ月分を表示するビューを定義し、それをmultiMonthMaxColumns2で表示しているため、2 x 2でカレンダが表示されます。



Custom Viewsの表示です。


最後にStandardのページをコピーし、Day Grid(dayGridYearビュー)を実装します。

コピーしたページの初期化JavaScriptファンクションとして以下を記述します。


 

dayGridYearビューでは、カレンダが月で分割されず、例えば1月31日の後に2月1日が続いて表示されます。


今回の記事は以上になります。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。今回は表CAL_NATIONAL_HOLIDAYSを作成するDDLとその表に投入する初期データをエクスポートに含んでいるため、APEXアプリケーションをインストールするだけで、アプリケーションの動作を確認することができます。
https://github.com/ujnak/apexapps/blob/master/exports/sample-fullcalendar-v6-new-views.zip

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