日付範囲ピッカー
日付範囲ピッカーは、2つのDateInputとRangeCalendarポップオーバーを組み合わせて、ユーザーが日付と時間範囲を入力または選択できるようにします。
インストール
npx nextui-cli@latest add date-picker
上記のコマンドは、個別のインストール専用です。もし、 @nextui-org/react
がグローバルにインストール済みの場合は、このステップをスキップできます。
インポート
使い方
無効
読み取り専用
必須
もし、isRequired
プロパティを input に渡すと、ラベルの最後に danger
のアスタリスクが表示され、input は必須になります。
バリアント
表示月数
デフォルトでは、カレンダーポップオーバーは1ヶ月を表示します。visibleMonths
プロパティを使用すると、画面スペースが許す限り、一度に最大3ヶ月を表示できます。
ページ動作
デフォルトでは、次へまたは前のボタンを押すと、ページネーションは visibleMonths
の値だけ進みます。この動作は、pageBehavior
を single
に設定することで、代わりに1ヶ月ずつページを進むように変更できます。
ラベルの配置
labelPlacement
プロパティを inside
、outside
または outside-left
に設定することで、ラベルの位置を変更できます。
注意:
label
が渡されない場合、labelPlacement
プロパティはデフォルトでoutside
になります。
説明付き
description
プロパティを渡すことで、入力に説明を追加できます。
エラーメッセージ付き
isInvalid
プロパティとerrorMessage
プロパティを組み合わせることで、無効な入力を表示できます。
関数としてエラーメッセージを渡すこともできます。これにより、ValidationResultに基づいた動的なエラーメッセージ処理が可能になります。
時間フィールド付き
CalendarDateTime
またはZonedDateTime
オブジェクトが値として提供されると、DateRangePickerは自動的に時間フィールドを含めます。
セレクターアイコン
selector
を使用して、date-range-pickerの開始と終了にコンテンツを追加できます。
制御されたコンポーネント
value
プロパティとonChange
プロパティを使用して、入力値を制御できます。
タイムゾーン
ZonedDateTime
オブジェクトが値として提供されると、DateRangePickerはタイムゾーンを認識します。この場合、タイムゾーンの略語が表示され、値が操作される際に夏時間などのタイムゾーンに関する懸念が考慮されます。
@internationalized/dateには、複数の形式の文字列をZonedDateTime
オブジェクトに解析するための関数が含まれています。
npm install @internationalized/date
import {parseZonedDateTime} from "@internationalized/date";
粒度
granularityプロパティを使用すると、DateRangePickerによって表示される最小単位を制御できます。デフォルトでは、値は「日」の粒度(年、月、日)で表示され、CalendarDateTime
およびZonedDateTime
の値は「分」の粒度で表示されます。
@internationalized/dateには、複数の形式の文字列をZonedDateTime
オブジェクトに解析するための関数が含まれています。
npm install @internationalized/date @react-aria/i18n
import {DateValue, now, parseAbsoluteToLocal} from "@internationalized/date";import {useDateFormatter} from "@react-aria/i18n";
最小日付と最大日付
minValueプロパティとmaxValueプロパティを使用して、値が特定の範囲内にあることを確認することもできます。
@internationalized/dateには、複数の形式の文字列をZonedDateTime
オブジェクトに解析するための関数が含まれています。
npm install @internationalized/date
import {getLocalTimeZone, parseDate, today} from "@internationalized/date";
国際カレンダー
DateRangePickerは、グレゴリオ暦、ヘブライ暦、インド暦、イスラム暦、仏教暦など、世界中で使用されている多くの暦システムでの日付選択をサポートしています。日付は、ユーザーのロケールに適した暦システムで自動的に表示されます。暦システムは、Unicodeカレンダーロケール拡張を使用してオーバーライドできます。これは、I18nProviderコンポーネントに渡されます。
@internationalized/dateには、複数の形式の文字列をZonedDateTime
オブジェクトに解析するための関数が含まれています。
npm install @internationalized/date @react-aria/i18n
import {DateValue, now, parseAbsoluteToLocal} from "@internationalized/date";import {I18nProvider} from "@react-aria/i18n";
利用不可の日付
DateRangePickerは、特定の日付を利用不可としてマークすることをサポートしています。これらの日付はユーザーが選択できず、カレンダーでは取り消し線付きで表示されます。日付フィールドでは、ユーザーが利用不可の日付を入力した場合、無効な状態が表示されます。
@internationalized/dateには、複数の形式の文字列をZonedDateTime
オブジェクトに解析するための関数が含まれています。
npm install @internationalized/date @react-aria/i18n
import {today, isWeekend, getLocalTimeZone} from "@internationalized/date";import {useLocale} from "@react-aria/i18n";
非連続
allowsNonContiguousRanges プロパティを使用すると、範囲の中間に利用できない日付があっても、範囲を選択できます。onChange イベントで出力される値は、開始日と終了日のプロパティを持つ単一の範囲になりますが、利用できない日付は選択されたものとして表示されません。アプリケーションは、ビジネスロジックに必要な場合に、選択されたフル範囲を複数に分割する必要があります。
@internationalized/dateには、複数の形式の文字列をZonedDateTime
オブジェクトに解析するための関数が含まれています。
npm install @internationalized/date @react-aria/i18n
import {today, isWeekend, getLocalTimeZone} from "@internationalized/date";import {useLocale} from "@react-aria/i18n";
プリセット
@internationalized/dateには、複数の形式の文字列をZonedDateTime
オブジェクトに解析するための関数が含まれています。
npm install @internationalized/date @react-aria/i18n
import {DateValue,now,startOfWeek,startOfMonth,getLocalTimeZone,} from "@internationalized/date";import {useLocale, useDateFormatter} from "@react-aria/i18n";
スロット
- base: 基本要素。配置、位置、および一般的な外観を処理します。
- label: date-range-picker のラベル。日付入力の上、内側、または左側に表示されるものです。
- calendar: カレンダー要素。
- selectorButton: セレクターボタン要素。
- selectorIcon: セレクターアイコン要素。
- popoverContent: カレンダーポップオーバー要素。
- calendarContent: カレンダーのコンテンツ要素。
- inputWrapper:
label
(内側にある場合) とinnerWrapper
をラップします。 - input: 入力要素。
- segment: セグメント要素。
- separator: 区切り要素。
- bottomContent: 下部コンテンツ要素。
- timeInputWrapper: 入力要素のラッパー要素。
- helperWrapper:
description
とerrorMessage
をラップします。 - description: date-input の説明。
- errorMessage: date-input のエラーメッセージ。
データ属性
DateRangePicker
には、base
要素に次の属性があります。
- data-slot: すべてのスロットにこのプロパティがあります。要素が表すスロット (例:
canlendar
)。 - data-open: カレンダーポップオーバーが開いているかどうかを示します。
- data-invalid: date-range-picker が無効な場合。
isInvalid
プロパティに基づきます。 - data-required: date-range-picker が必須の場合。
isRequired
プロパティに基づきます。 - data-readonly: date-range-picker が読み取り専用の場合。
isReadOnly
プロパティに基づきます。 - data-disabled: date-range-picker が無効になっている場合。
isDisabled
プロパティに基づきます。 - data-has-start-content: date-range-picker に開始コンテンツがある場合。これらの
startContent
プロパティに基づきます。 - data-has-end-content: date-range-picker に終了コンテンツがある場合。これらの
endContent
プロパティに基づきます。 - data-has-multiple-months: date-range-picker の
visibleMonth
が 2 より大きい場合。
アクセシビリティ
- 各日付と時間の単位は、個別にフォーカス可能で編集可能なセグメントとして表示されるため、ユーザーはキーボードを使用して、任意の日付形式とロケールで日付を簡単に編集できます。
- ユーザーはカレンダーポップオーバーを開いて、標準の月グリッドで日付範囲を選択することもできます。選択範囲と表示される日付範囲が変更されたときにアナウンスする、ローカライズされたスクリーンリーダーメッセージが含まれています。
- 日付セグメントは、使いやすいテンキーを使用して編集できます。日付範囲は、タッチスクリーンを使用してカレンダーの日付をドラッグすることで選択できます。すべての操作は、タッチベースのスクリーンリーダーを使用してアクセスできます。
- HTML フォームと統合され、必須、最小値、最大値、利用できない日付、カスタム検証関数、リアルタイム検証、およびサーバーサイドの検証エラーをサポートします。
API
DateRangePicker のプロパティ
属性 | 型 | 説明 | デフォルト |
---|---|---|---|
label | ReactNode | ラベルとして表示するコンテンツ。 | - |
value | RangeValue<CalendarDate | CalendarDateTime | ZonedDateTime> | undefined | null | date-range-picker の現在の値 (制御付き)。 | - |
variant | flat | bordered | faded | underlined | 日付入力のバリアント。 | flat |
color | default | primary | secondary | success | warning | danger | 日付入力の色。 | default |
size | sm | md | lg | 日付入力のサイズ。 | md |
radius | none | sm | md | lg | full | 日付入力の半径。 | - |
minValue | RangeValue<CalendarDate | CalendarDateTime | ZonedDateTime> | undefined | null | date-range-picker の最小値。 | - |
maxValue | RangeValue<CalendarDate | CalendarDateTime | ZonedDateTime> | undefined | null | date-range-picker の最大値。 | - |
defaultValue | string | undefined | date-range-picker のデフォルト値 (非制御)。 | - |
placeholderValue | ZonedDateTime | CalendarDate | CalendarDateTime | undefined | null | 日付範囲ピッカーのプレースホルダー。 | - |
説明 | ReactNode | 日付範囲ピッカーの説明。選択する内容に関する具体的な要件などのヒントを提供します。 | - |
errorMessage | ReactNode | (v: ValidationResult) => ReactNode | 日付入力のエラーメッセージ。 | - |
validate | (value: RangeValue<MappedDateValue<DateValue>>) => ValidationError | true | null | undefined | コミット時(例:blur時)に入力値を検証し、無効な値に対してエラーメッセージを返します。validationBehavior が native に設定されている場合、フォーム送信時に検証エラーを表示します。リアルタイム検証には、isInvalid プロパティを使用します。 | - |
validationBehavior | native | aria | 値が欠落しているか無効な場合に、フォーム送信を防ぐためにネイティブHTMLフォーム検証を使用するか、ARIAを介してフィールドを必須または無効としてマークするかどうか。 | aria |
startContent | ReactNode | 日付範囲ピッカーの左側にレンダリングされる要素。 | - |
endContent | ReactNode | 日付範囲ピッカーの右側にレンダリングされる要素。 | - |
startName | string | HTMLフォームを送信する際に使用される、開始日入力要素の名前。 MDN を参照してください。 | - |
endName | string | HTMLフォームを送信する際に使用される、終了日入力要素の名前。 MDN を参照してください。 | - |
labelPlacement | inside | outside | outside-left | ラベルの位置。 | inside |
isOpen | boolean | 日付ピッカーのポップオーバーが開いているかどうか。 | - |
defaultOpen | boolean | デフォルトで日付ピッカーのポップオーバーが開いているかどうか。 | false |
isRequired | boolean | フォーム送信前に日付範囲ピッカーでユーザー入力が必要かどうか。 | false |
isReadOnly | boolean | 日付範囲ピッカーが選択可能であるが、ユーザーによって変更できないかどうか。 | |
isDisabled | boolean | 日付範囲ピッカーが無効になっているかどうか。 | false |
isInvalid | boolean | 日付範囲ピッカーが無効かどうか。 | false |
selectorIcon | ReactNode | 日付ピッカーのポップオーバーを切り替えるためのアイコン。通常はカレンダーアイコン。 | |
pageBehavior | single | visible | ページングの動作を制御します。ページングは、visibleDuration(デフォルト)またはvisibleDurationの1単位ずつ可視ページを進めることで機能します。 | visible |
visibleMonths | number | 一度に表示する月の数。最大3ヶ月までサポートされています。 | 1 |
autoFocus | boolean | レンダリング時に要素がフォーカスを受け取る必要があるかどうか。 | false |
hourCycle | 12 | 24 | 時間を12時間または24時間形式で表示するかどうか。これはユーザーのロケールによって決定されます。 | - |
granularity | day | hour | minute | second | 日付ピッカーに表示される最小単位を決定します。通常、日付の場合は「day」です。 | - |
hideTimeZone | boolean | タイムゾーンの省略形を非表示にするかどうか。 | false |
allowsNonContiguousRanges | boolean | isDateUnavailable と組み合わせて、利用できない日付を含む非連続範囲、つまり、利用できない日付を含む範囲を選択できるようにするかどうかを決定します。 | false |
shouldForceLeadingZeros | boolean | 月、日、時間フィールドに常に先頭のゼロを表示するかどうか。 | true |
calendarWidth | number | カレンダーコンポーネントに適用する幅。 | 256 |
CalendarTopContent | ReactNode | カレンダーコンポーネントにレンダリングする上部コンテンツ。 | |
CalendarBottomContent | ReactNode | カレンダーコンポーネントにレンダリングする下部コンテンツ。 | |
allowsNonContiguousRanges | boolean | 途中に利用できない日付がある場合でも範囲を選択できるようにします。 | false |
popoverProps | PopoverProps | ポップオーバーコンポーネントに渡すプロパティ。 | { placement: "bottom", triggerScaleOnOpen: false, offset: 13 } |
selectorButtonProps | ButtonProps | セレクターボタンコンポーネントに渡すプロパティ。 | { size: "sm", variant: "light", radius: "full", isIconOnly: true } |
calendarProps | CalendarProps | セレクターボタンコンポーネントに渡すプロパティ。 | { size: "sm", variant: "light", radius: "full", isIconOnly: true } |
timeInputProps | TimeInputProps | 時間入力コンポーネントに渡すプロパティ。 | { size: "sm", variant: "light", radius: "full", isIconOnly: true } |
disableAnimation | boolean | 日付ピッカー内のすべてのアニメーションを無効にするかどうか。DateInput、Button、Calendar、およびPopoverを含みます。 | false |
classNames | Record<"base" | "selectorButton" | "selectorIcon" | "popoverContent" | "calendar" | "calendarContent" | "timeInputLabel" | "timeInput", string> | 日付範囲ピッカーのスロットにカスタムクラス名を設定できます。 | - |
DateRangePicker Events
属性 | 型 | 説明 | |
---|---|---|---|
onChange | ((value: RangeValue<CalendarDate | CalendarDateTime | ZonedDateTime>) => void) | undefined | 日付範囲ピッカーの値が変更されたときに呼び出されるハンドラー。 | - |
onOpenChange | (isOpen: boolean) => void | 日付ピッカーのポップオーバーが開閉されたときに呼び出されるハンドラー。 | - |
onFocus | (e: FocusEvent<HTMLInputElement>) => void | 要素がフォーカスを受け取ったときに呼び出されるハンドラー。 | - |
onBlur | (e: FocusEvent<HTMLInputElement>) => void | 要素がフォーカスを失ったときに呼び出されるハンドラー。 | - |
onFocusChange | (isFocused: boolean) => void | 要素のフォーカス状態が変更されたときに呼び出されるハンドラー。 | - |
onKeyDown | (e: KeyboardEvent) => void | キーが押されたときに呼び出されるハンドラー。 | - |
onKeyUp | (e: KeyboardEvent) => void | キーが離されたときに呼び出されるハンドラー。 | - |