@react-types/datepicker
Version:
Spectrum UI components in React
185 lines (168 loc) • 8.61 kB
TypeScript
/*
* Copyright 2020 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
import {
AriaLabelingProps,
DOMProps,
FocusableProps,
HelpTextProps,
InputBase,
InputDOMProps,
LabelableProps,
RangeValue,
SpectrumFieldValidation,
SpectrumLabelableProps,
StyleProps,
Validation,
ValueBase
} from '@react-types/shared';
import {CalendarDate, CalendarDateTime, CalendarIdentifier, Calendar as ICalendar, Time, ZonedDateTime} from '@internationalized/date';
import {OverlayTriggerProps} from '@react-types/overlays';
import {PageBehavior} from '@react-types/calendar';
export type DateValue = CalendarDate | CalendarDateTime | ZonedDateTime;
type MappedDateValue<T> =
T extends ZonedDateTime ? ZonedDateTime :
T extends CalendarDateTime ? CalendarDateTime :
T extends CalendarDate ? CalendarDate :
never;
export type Granularity = 'day' | 'hour' | 'minute' | 'second';
interface DateFieldBase<T extends DateValue> extends InputBase, Validation<MappedDateValue<T>>, FocusableProps, LabelableProps, HelpTextProps {
/** The minimum allowed date that a user may select. */
minValue?: DateValue | null,
/** The maximum allowed date that a user may select. */
maxValue?: DateValue | null,
/** Callback that is called for each date of the calendar. If it returns true, then the date is unavailable. */
isDateUnavailable?: (date: DateValue) => boolean,
/** A placeholder date that influences the format of the placeholder shown when no value is selected. Defaults to today's date at midnight. */
placeholderValue?: T | null,
/** Whether to display the time in 12 or 24 hour format. By default, this is determined by the user's locale. */
hourCycle?: 12 | 24,
/** Determines the smallest unit that is displayed in the date picker. By default, this is `"day"` for dates, and `"minute"` for times. */
granularity?: Granularity,
/**
* Whether to hide the time zone abbreviation.
* @default false
*/
hideTimeZone?: boolean,
/**
* Whether to always show leading zeros in the month, day, and hour fields.
* By default, this is determined by the user's locale.
*/
shouldForceLeadingZeros?: boolean
}
interface AriaDateFieldBaseProps<T extends DateValue> extends DateFieldBase<T>, AriaLabelingProps, DOMProps {}
export interface DateFieldProps<T extends DateValue> extends DateFieldBase<T>, ValueBase<T | null, MappedDateValue<T> | null> {}
export interface AriaDateFieldProps<T extends DateValue> extends DateFieldProps<T>, AriaDateFieldBaseProps<T>, InputDOMProps {}
interface DatePickerBase<T extends DateValue> extends DateFieldBase<T>, OverlayTriggerProps {
/**
* Controls the behavior of paging. Pagination either works by advancing the visible page by visibleDuration (default) or one unit of visibleDuration.
* @default visible
*/
pageBehavior?: PageBehavior,
/**
* The day that starts the week.
*/
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
}
export interface AriaDatePickerBaseProps<T extends DateValue> extends DatePickerBase<T>, AriaLabelingProps, DOMProps {}
export interface DatePickerProps<T extends DateValue> extends DatePickerBase<T>, ValueBase<T | null, MappedDateValue<T> | null> {}
export interface AriaDatePickerProps<T extends DateValue> extends DatePickerProps<T>, AriaDatePickerBaseProps<T>, InputDOMProps {}
export type DateRange = RangeValue<DateValue>;
export interface DateRangePickerProps<T extends DateValue> extends Omit<DatePickerBase<T>, 'validate'>, Validation<RangeValue<MappedDateValue<T>>>, ValueBase<RangeValue<T> | null, RangeValue<MappedDateValue<T>> | null> {
/**
* When combined with `isDateUnavailable`, determines whether non-contiguous ranges,
* i.e. ranges containing unavailable dates, may be selected.
*/
allowsNonContiguousRanges?: boolean,
/**
* The name of the start date input element, used when submitting an HTML form. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#htmlattrdefname).
*/
startName?: string,
/**
* The name of the end date input element, used when submitting an HTML form. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#htmlattrdefname).
*/
endName?: string
}
export interface AriaDateRangePickerProps<T extends DateValue> extends Omit<AriaDatePickerBaseProps<T>, 'validate'>, DateRangePickerProps<T> {}
interface SpectrumDateFieldBase<T extends DateValue> extends SpectrumLabelableProps, HelpTextProps, SpectrumFieldValidation<MappedDateValue<T>>, StyleProps {
/**
* Whether the date picker should be displayed with a quiet style.
* @default false
*/
isQuiet?: boolean,
/**
* Whether to show the localized date format as help text below the field.
* @default false
*/
showFormatHelpText?: boolean
}
interface SpectrumDatePickerBase<T extends DateValue> extends SpectrumDateFieldBase<T>, SpectrumLabelableProps, StyleProps {
/**
* The maximum number of months to display at once in the calendar popover, if screen space permits.
* @default 1
*/
maxVisibleMonths?: number,
/**
* Whether the calendar popover should automatically flip direction when space is limited.
* @default true
*/
shouldFlip?: boolean,
/**
* A function to create a new [Calendar](https://react-spectrum.adobe.com/internationalized/date/Calendar.html)
* object for a given calendar identifier. This will be used for the popover calendar. If not provided, the
* `createCalendar` function from `@internationalized/date` will be used.
*/
createCalendar?: (identifier: CalendarIdentifier) => ICalendar
}
export interface SpectrumDatePickerProps<T extends DateValue> extends Omit<AriaDatePickerProps<T>, 'isInvalid' | 'validationState'>, SpectrumDatePickerBase<T> {}
export interface SpectrumDateRangePickerProps<T extends DateValue> extends Omit<AriaDateRangePickerProps<T>, 'isInvalid' | 'validationState'>, Omit<SpectrumDatePickerBase<T>, 'validate'> {}
export interface SpectrumDateFieldProps<T extends DateValue> extends Omit<AriaDateFieldProps<T>, 'isInvalid' | 'validationState'>, SpectrumDateFieldBase<T> {}
export type TimeValue = Time | CalendarDateTime | ZonedDateTime;
type MappedTimeValue<T> =
T extends ZonedDateTime ? ZonedDateTime :
T extends CalendarDateTime ? CalendarDateTime :
T extends Time ? Time :
never;
export interface TimePickerProps<T extends TimeValue> extends InputBase, Validation<MappedTimeValue<T>>, FocusableProps, LabelableProps, HelpTextProps, ValueBase<T | null, MappedTimeValue<T> | null> {
/** Whether to display the time in 12 or 24 hour format. By default, this is determined by the user's locale. */
hourCycle?: 12 | 24,
/**
* Determines the smallest unit that is displayed in the time picker.
* @default 'minute'
*/
granularity?: 'hour' | 'minute' | 'second',
/** Whether to hide the time zone abbreviation. */
hideTimeZone?: boolean,
/**
* Whether to always show leading zeros in the hour field.
* By default, this is determined by the user's locale.
*/
shouldForceLeadingZeros?: boolean,
/**
* A placeholder time that influences the format of the placeholder shown when no value is selected.
* Defaults to 12:00 AM or 00:00 depending on the hour cycle.
*/
placeholderValue?: T,
/** The minimum allowed time that a user may select. */
minValue?: TimeValue | null,
/** The maximum allowed time that a user may select. */
maxValue?: TimeValue | null
}
export interface AriaTimeFieldProps<T extends TimeValue> extends TimePickerProps<T>, AriaLabelingProps, DOMProps, InputDOMProps {}
export interface SpectrumTimeFieldProps<T extends TimeValue> extends Omit<AriaTimeFieldProps<T>, 'isInvalid' | 'validationState'>, SpectrumFieldValidation<MappedTimeValue<T>>, SpectrumLabelableProps, StyleProps, InputDOMProps {
/**
* Whether the time field should be displayed with a quiet style.
* @default false
*/
isQuiet?: boolean
}
// backward compatibility
export type SpectrumTimePickerProps<T extends TimeValue> = SpectrumTimeFieldProps<T>;