ラベル 日付ピッカー の投稿を表示しています。 すべての投稿を表示
ラベル 日付ピッカー の投稿を表示しています。 すべての投稿を表示

2023年3月3日金曜日

日付範囲ピッカーを実装する

 OracleのSteve Muenchさんが彼のブログに、APEX 22.2から使用できる新しい日付ピッカーをカスタマイズして、範囲を指定をする方法を紹介されています。


Designer Collab for Date Ranges
https://diveintoapex.com/2023/02/07/designer-collab-for-date-ranges/

記事からダウンロードできるサンプル・アプリケーションに含まれる静的アプリケーション・ファイル、dateRangePicker.jsdateRangePicker.cssを取り出し、自分のアプリケーションに取り込むことで簡単に再利用できるようになっています。

色々な技が使われていて再利用が容易になっているのですが、実装を理解するにはスキルが必要です。もう少し実装を分かりやすくするため、動的アクションによる実装に変更してみました。dateRangePicker.cssはそのまま流用し、日付ピッカーのdayFormatterについてもほぼ同じ実装を流用します。

実装した日付範囲ピッカーは以下のように動作します。日付範囲ピッカーは表示形式Inlineにした日付ピッカーで、開始日終了日はそれぞれ異なるページ・アイテムに設定しています。


以下より実装について説明します。

ページ・アイテムとして開始日を保存するP1_DATE_START終了日を保存するP1_DATE_ENDを作成します。上のGIF動画では、これらのページ・アイテムの値が画面に表示されていますが、一般的には非表示にすると思います。

日付範囲ピッカーですが、ページ・アイテムP1_DATE_RANGEとして作成しています。

タイプ日付ピッカーです。設定表示形式としてInlineを選択します。外観と動作Show Clear Buttonチェックを入れます。表示形式がInlineの場合、ページ・アイテムの値をクリアするためにこのボタンが必要です。

詳細CSSクラスdate-range-pickerを設定します。これはdateRangePicker.cssで定義されているCSSクラスを適用するために必要です。


ページ・アイテムP1_DATE_RANGE動的アクションを作成します。

タイミングイベント変更選択タイプアイテムアイテムとしてP1_DATE_RANGEを指定します。日付範囲ピッカー上で日付を選択(変更)したときに、動的アクションが実行されます。


TRUEアクションJavaScriptコードの実行設定コードとして以下を記述します。クリックしたときの状態に応じて、選択された日付を開始日または終了日として設定しています。最後に日付範囲ピッカーをリフレッシュし、設定された開始日と終了日の間に色を付けます。


影響を受ける要素選択タイプアイテムを選び、アイテムとしてP1_DATE_STARTP1_DATE_ENDの2つのページ・アイテムを設定します。開始日を保持するページ・アイテムを先頭に配置します。


開始日から終了日の間に色をつける処理は、日付範囲ピッカーに実装するdayFormatterが行います。

ページ・プロパティJavaScriptファンクションおよびグローバル変数の宣言に以下を記述します。

const DATE_FORMAT = "yyyy/mm/dd";

ページ・ロード時に実行dayFormatterを定義します。開始日にCSSクラスdateRangeStart終了日dateRangeEnd開始日終了日の間の日付にはdateRangeMiddleを設定しています。開始日と終了日が同じ場合はCSSクラスとしてdateRangeSingleDayを設定しています。


CSSファイルURLに以下を記述します。CSSファイルはこちらから、または英語の元記事よりサンプル・アプリケーションをダウンロードし、dateRangePicker.cssを取り出して静的アプリケーション・ファイルとして保存しておきます。

#APP_FILES#dateRangePicker#MIN#.css


以上で実装は完了です。

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

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

2023年2月9日木曜日

APEX 22.2の日付ピッカーに日本の休日を設定する

 Oracle APEX 22.2より、新たに開発された日付ピッカーのコンポーネントが採用されています。この日付ピッカーについて、開発者のRonny WeissさんがAPEX Office Hourで解説されています。

すでにアプリに組み込まれている日付ピッカーが置き換わることはないようです。

以前はOracle JETが提供しているDate Pickerのコンポーネントを使っていました。それ以前はjQueryのDate Pickerでした。Oracle JETのDate PickerはAPEXにあまり合っていなかったようで、APEXのチームが専用の日付ピッカーを開発した、という経緯みたいです。

コンポーネントが完全に置き換わっているため、以前に確認した休日の設定方法が新しい日付ピッカーでは使えなくなりました。

新しい日付ピッカーでの日本の休日の設定方法を確認しました。

最新のサンプル・アプリケーションのSample Calendarには、米国の休日の設定が含まれています。

ギャラリからSample Calendarインストールして確認してみます。


サンプル・アプリケーションを実行し、Date PickerDay Formatting (Plug-in)を開きます。

Plug-inにある日付ピッカーには、米国の休日が設定されています。


ページ・デザイナで設定を確認します。

ページ・ロード時に、休日を設定する動的アクション・プラグインを実行しています。

設定Load fromとしてICS File(他にSQL Queryを選択できます)、URL for ICS fileに休日が設定されたiCal(ics)ファイルを指定しています。

適用する日付ピッカーのページ・アイテムは、影響を受ける要素に指定します。


この動的アクション・プラグインはapex.oracle.comのソリューションのアプリケーションとプラグインからダウンロードできます。


プラグインのダウンロードは、GitHubから行います。GitHubで表示をクリックして開きます。


Format Date Picker DaysDownload Plug-Inをクリックし、表示されたコードを保存します。プラグインとしてロードするには、ファイルの拡張子を.sqlにする必要があります。


このプラグインもそうですが、GitHubから提供されているアプリケーションやプラグインはOracle APEXの製品サポートの対象外です

このプラグインを使った、簡単なアプリケーションを作ってみます。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。

名前日本の休日とします。

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


プラグインを導入します。

共有コンポーネントプラグインを開きます。


インポートをクリックします。


ダウンロードしたプラグインのSQLファイルを選択します。ファイル・タイプはデフォルトでプラグインが選択されています。

へ進みます。


確認画面に移ります。へ進みます。


インストールするアプリケーションを確認し、プラグインのインストールをクリックします。


プラグインFormat Date Picker Daysがインストールされました。


最新のSample Calendarサンプル・アプリケーションがインストールされていれば、プラグインの作成を実行し、既存のプラグインのコピーを行うことにより、Sample CalendarからプラグインFormat Date Picker Daysをコピーすることもできます。


ページ・デザイナでホーム・ページを開き、ページ・アイテムを作成します。

識別名前P1_DATEタイプ日付ピッカーを選択します。ラベル日本の休日とします。


左ペインで動的アクション・ビューを開きます。

ページのロード動的アクションの作成を実行します。

作成された動的アクションの識別名前日付ピッカーの初期化とします。タイミングイベントページのロードになります。


TRUEアクションとして、先ほど作成したFormat Date Picker Days[プラグイン]を選択します。設定Load fromICS Fileを選択し、URL for ICS fileとして表示される米国の休日のICSファイルのen.usaの部分をja.japaneseに変更します。

https://calendar.google.com/calendar/ical/ja.japanese%23holiday@group.v.calendar.google.com/public/basic.ics

影響を受ける要素選択タイプアイテムアイテムとしてP1_DATEを指定します。

休日の選択を禁止する場合は、設定CSS Classis-disabledを追加します。(ただし、こうすると選択は禁止されますが、tooltipとして祝日名が表示されなくなります。- この点について記事に追記しました。)


以上で日付ピッカーに日本の祝日が設定されました。


SQLを試してみます。

内閣府のサイトから、国民の祝日をCSV形式でダウンロードします。


syukujitsu.csvがダウンロードされます。


SQLワークショップデータ・ワークショップを使って、CSVを表にロードします。

データのロードを選択します。


ダウンロードしたsyukujitsu.csvを、アップロードするファイルとして選択します。


ロード先新規表とし、表名SYUKUJISTUとします。

CSVファイルは日本語Shift-JISでエンコードされています。ファイル・エンコーディングとして日本語(Shift JIS)を選択し、プレビューの表示が日本語になることを確認します。

祝日の日付をDATE型で読み込むために、構成を開きます。


列名国民の祝日_休日月日列タイプDATEに変更し、書式マスクYYYY/MM/DDを設定します。

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


以上でデータのロードを実行します。


データのロードが完了したら、準備は完了です。


ページ・アイテムP1_DATE2を作成し、動的アクションのTRUEアクションも新たに作成します。初期化に使用するプラグインの設定Load fromSQL Queryに設定します。

SQL Sourceは以下になります。



国民の祝日休日以外に選択不可の日付を設定する場合は、この設定が使えます。残念なことに、is_disabledを1とするとツールチップ(休日名称)が表示されないようです。


Sample Calendarにて紹介されていますが、プラグインを使わずJavaScriptでコーディングして制御することも可能です。

日付ピッカーのdayFormatterとして、ファンクションを定義します。日付ピッカーが扱う日付の数だけ、dayFormatterが呼び出されます。


ページ・アイテムとしてP1_DATE3を作成し、日本の休日を表示するdayFormatterを定義してみます。

AjaxコールバックGET_HOLIDAYSを作成します。ソースPL/SQLコードは以下になります。



ページ・プロパティのページ・ロード時に実行に以下を記述します。



同じ動作をするdayFormatterの実装ができました。


APEX 22.2の新しい日付ピッカーの説明は以上になります。

dayFormatterについて説明するためにJavaScriptのコードを書いてみましたが、Oracle APEXのプラグインのコードは参照することができます。

プラグインのソースにサーバー側のPL/SQLコードが記述されています。


クライアントにロードするJavaScriptなどは、ファイルとして作成されます。


内容を見た上で、使うかどうか判断できます。サポートはありませんが、オラクル社の公式のGitHubから提供されているプラグインで、自分の方が良いものが作れる思えるようなものは無いと思います。

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

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

追記

CSSクラスis-disabledは以下のように定義されています。
.a-DatePicker-calendar td.is-disabled {
  --a-datepicker-calendar-day-pointer: var(--a-datepicker-calendar-day-disabled-pointer, not-allowed);
  --a-datepicker-calendar-day-opacity: var(--a-datepicker-calendar-day-disabled-opacity, .5);
  --a-datepicker-calendar-day-font-weight: var(--a-datepicker-calendar-day-disabled-font-weight, 400);
  pointer-events: none;
}
pointer-eventsとしてnoneが設定されているため、日付の(休日として)選択を無効化するとツールチップも表示されません。ツールチップ(つまり祝日名)を表示するにはpointer-eventsをautoに変更します。

具体的にはページ・プロパティCSSインラインに、以下を記述します。
.a-DatePicker-calendar td.is-disabled {
  pointer-events: auto;
}

CSSの定義を変更することにより、日付を選択不可にしてもツールチップが表示されます。