@vuepic/vue-datepicker
Version:
Datepicker component for Vue 3
478 lines (457 loc) • 17 kB
TypeScript
import type {
ComponentOptionsMixin,
ComponentPropsOptions,
ComponentPublicInstance,
ComputedOptions,
ComputedRef,
DefineComponent,
MaybeRefOrGetter,
MethodOptions,
Ref,
} from 'vue';
import type { Locale } from 'date-fns';
export type EmitEvents =
| 'update:model-value'
| 'update:model-timezone-value'
| 'text-submit'
| 'closed'
| 'cleared'
| 'open'
| 'focus'
| 'blur'
| 'internal-model-change'
| 'recalculate-position'
| 'flow-step'
| 'update-month-year'
| 'invalid-select'
| 'tooltip-open'
| 'tooltip-close'
| 'invalid-fixed-range'
| 'time-picker-open'
| 'time-picker-close'
| 'am-pm-change'
| 'range-start'
| 'range-end'
| 'date-update'
| 'invalid-date'
| 'overlay-toggle'
| 'text-input';
export type WeekNumberType = 'iso' | 'local' | ((date: Date) => string | number);
export type TimeObj = { hours: number; minutes: number; seconds: number };
export type PartialTimeObj = { hours?: number | string; minutes?: number | string; seconds?: number | string };
export type TimeModel = {
hours: number | string;
minutes: number | string;
seconds?: number | string;
};
export type MenuView = 'month' | 'year' | 'calendar' | 'time';
export type TimeType = 'hours' | 'minutes' | 'seconds';
export type ModelValue =
| Date
| Date[]
| Array<Date[]>
| Array<string[]>
| string
| string[]
| number
| number[]
| TimeModel
| TimeModel[]
| { month: number | string; year: number | string }
| { month: number | string; year: number | string }[]
| null;
export interface DatePickerMarker {
date: Date | string;
type?: 'dot' | 'line';
tooltip?: { text?: string; html?: string; color?: string }[];
color?: string;
customPosition?: (el: HTMLElement) => Record<string, string | number>;
}
export interface DisabledTime {
hours: number | string;
minutes: number | string;
seconds?: number | string;
}
export interface CalendarWeek {
days: CalendarDay[];
}
export interface CalendarDay {
text: number | string;
value: Date;
current: boolean;
classData: Record<string, boolean>;
marker?: DatePickerMarker;
}
export interface Highlight {
dates: Date[];
years: number[];
months: { month: number; year: number }[];
quarters: { quarter: number; year: number }[];
weekdays: number[];
options: { highlightDisabled: boolean };
}
export type DpOptionEnabled = boolean | number | string;
export interface RangeConfig {
noDisabledRange?: boolean;
showLastInRange?: boolean;
minMaxRawRange?: boolean;
partialRange?: boolean;
disableTimeRangeValidation?: boolean;
fixedStart?: boolean;
fixedEnd?: boolean;
maxRange?: string | number;
minRange?: string | number;
autoRange?: string | number;
}
export type CustomClass = string | string[];
export interface UIOptions {
navBtnNext: CustomClass;
navBtnPrev: CustomClass;
calendar: CustomClass;
calendarCell: CustomClass;
menu: CustomClass;
input: CustomClass;
}
export interface GeneralConfig {
allowStopPropagation?: boolean;
closeOnScroll?: boolean;
modeHeight?: number;
allowPreventDefault?: boolean;
closeOnClearValue?: boolean;
closeOnAutoApply?: boolean;
noSwipe?: boolean;
keepActionRow?: boolean;
onClickOutside?: (validate: () => boolean, evt: PointerEvent) => void;
tabOutClosesMenu?: boolean;
arrowLeft?: string;
keepViewOnOffsetClick?: boolean;
timeArrowHoldThreshold?: boolean;
shadowDom?: boolean;
mobileBreakpoint?: number;
setDateOnMenuClose?: boolean;
}
export interface VueDatePickerProps {
uid?: string;
name?: string;
is24?: boolean;
enableTimePicker?: boolean;
range?: boolean | RangeConfig;
multiCalendars?: DpOptionEnabled | Partial<{ static: boolean; solo: boolean; count: number | string }>;
modelValue?: ModelValue;
locale?: string;
position?: 'left' | 'center' | 'right';
dark?: boolean;
placeholder?: string;
weekNumbers?: WeekNumberType | { type: WeekNumberType; hideOnOffsetDates?: boolean };
hoursIncrement?: number | string;
hoursGridIncrement?: number | string;
secondsGridIncrement?: number | string;
minutesGridIncrement?: number | string;
minutesIncrement?: number | string;
secondsIncrement?: number | string;
minDate?: Date | string;
maxDate?: Date | string;
minTime?: PartialTimeObj;
maxTime?: PartialTimeObj;
weekStart?: '0' | '1' | '2' | '3' | '4' | '5' | '6' | 0 | 1 | 2 | 3 | 4 | 5 | 6;
disabled?: boolean;
readonly?: boolean;
required?: boolean;
format?: string | ((date: Date) => string) | ((dates: Date[]) => string);
previewFormat?: string | ((date: Date) => string) | ((dates: Date[]) => string);
hideInputIcon?: boolean;
state?: boolean;
clearable?: boolean;
alwaysClearable?: boolean;
autoApply?: boolean;
filters?: {
months?: number[];
years?: number[];
times?: { hours?: number[]; minutes?: number[]; seconds?: number[] };
};
disableMonthYearSelect?: boolean;
yearRange?: number[];
disabledDates?: Date[] | string[] | ((date: Date) => boolean);
inline?: boolean | { input?: boolean };
selectText?: string;
cancelText?: string;
weekNumName?: string;
autoPosition?: boolean | 'top' | 'bottom';
monthPicker?: boolean;
timePicker?: boolean;
textInput?:
| boolean
| {
enterSubmit?: boolean;
tabSubmit?: boolean;
openMenu?: 'open' | 'toggle' | boolean;
rangeSeparator?: string;
selectOnFocus?: boolean;
format?: string | string[] | ((value: string) => Date | null);
escClose?: boolean;
};
monthNameFormat?: 'long' | 'short';
startDate?: string | Date;
startTime?: PartialTimeObj | PartialTimeObj[];
hideOffsetDates?: boolean;
noToday?: boolean;
noHoursOverlay?: boolean;
noMinutesOverlay?: boolean;
noSecondsOverlay?: boolean;
altPosition?: (el: HTMLElement | undefined) => Record<string, string | number>;
disabledWeekDays?: number[] | string[];
allowedDates?: string[] | Date[];
nowButtonLabel?: string;
monthChangeOnScroll?: boolean | 'inverse';
markers?: DatePickerMarker[];
transitions?:
| boolean
| {
menuAppearTop?: string;
menuAppearBottom?: string;
open?: string;
close?: string;
next?: string;
previous?: string;
vNext?: string;
vPrevious?: string;
};
enableSeconds?: boolean;
escClose?: boolean;
spaceConfirm?: boolean;
monthChangeOnArrows?: boolean;
formatLocale?: Locale;
autocomplete?: string;
multiDates?: boolean | { limit?: number | string; dragSelect?: boolean };
presetDates?: {
label: string;
value: MaybeRefOrGetter<Date[] | string[] | string | Date>;
style?: Record<string, string>;
slot?: string;
noTz?: boolean;
testId?: string;
}[];
flow?: ('month' | 'year' | 'calendar' | 'time' | 'minutes' | 'hours' | 'seconds')[];
partialFlow?: boolean;
preventMinMaxNavigation?: boolean;
utc?: boolean | 'preserve';
reverseYears?: boolean;
weekPicker?: boolean;
vertical?: boolean;
ariaLabels?: {
toggleOverlay?: string;
menu?: string;
input?: string;
calendarWrap?: string;
calendarDays?: string;
openTimePicker?: string;
closeTimePicker?: string;
incrementValue?: (type: TimeType) => string;
decrementValue?: (type: TimeType) => string;
openTpOverlay?: (type: TimeType) => string;
amPmButton?: string;
openYearsOverlay?: string;
openMonthsOverlay?: string;
nextMonth?: string;
prevMonth?: string;
nextYear?: string;
prevYear?: string;
day?: ({ value }: { value: Date }) => string;
weekDay?: (day: number) => string;
clearInput?: string;
calendarIcon?: string;
timePicker?: string;
monthPicker?: (overlay: boolean) => string;
yearPicker?: (overlay: boolean) => string;
timeOverlay?: (type: TimeType) => string;
};
arrowNavigation?: boolean;
yearPicker?: boolean;
dayNames?: ((lang: string, weekStart: number) => string[]) | string[];
modelType?: 'timestamp' | 'iso' | 'format' | string;
modelAuto?: boolean;
highlight?:
| ((date: Date[], disabled?: boolean) => boolean)
| ((month: { month: number; year: number }) => boolean)
| ((year: number) => boolean)
| ((quarter: { quarter: number; year: number }) => boolean)
| Partial<Highlight>;
offset?: string | number;
teleportCenter?: boolean;
teleport?: boolean | string | HTMLElement;
ignoreTimeValidation?: boolean;
dayClass?: (date: Date, internalModelValue: InternalTime) => string;
hideNavigation?: ('month' | 'year' | 'calendar' | 'time' | 'minutes' | 'hours' | 'seconds')[];
sixWeeks?: boolean | 'append' | 'prepend' | 'center' | 'fair';
timezone?:
| string
| { timezone?: string; exactMatch?: boolean; dateInTz?: string; emitTimezone?: string; convertModel?: boolean };
disableYearSelect?: boolean;
focusStartDate?: boolean;
disabledTimes?:
| ((time: TimeObj | (TimeObj | undefined)[]) => boolean)
| DisabledTime[]
| [DisabledTime[], DisabledTime[]];
timePickerInline?: boolean;
calendar?: (weeks: CalendarWeek[]) => CalendarWeek[];
config?: GeneralConfig;
quarterPicker?: boolean;
yearFirst?: boolean;
loading?: boolean;
onInternalModelChange?: (...args: any[]) => void;
enableMinutes?: boolean;
ui?: Partial<UIOptions>;
}
export type DatePickerInstance = ComponentPublicInstance<PublicMethods> | null;
export interface PublicMethods extends MethodOptions {
selectDate: () => void;
closeMenu: () => void;
openMenu: () => void;
clearValue: () => void;
onScroll: () => void;
updateInternalModelValue: (value: Date | Date[] | null) => void;
setMonthYear: (value: { month?: number | string; year?: number | string }) => void;
parseModel: (value?: ModelValue) => void;
switchView: (view: MenuView, instance?: number) => void;
toggleMenu: () => void;
handleFlow: (step?: number) => void;
getDpWrapMenuRef: () => Ref<HTMLElement | null>;
}
type InternalModelValue = Date | Date[] | null;
export interface InternalTime {
hours: number | number[];
minutes: number | number[];
seconds: number | number[];
}
interface MonthYearOverlay {
month: number;
year: number;
items: { text: string; value: number }[];
updateMonthYear: (month: number, year: number) => void;
instance: number;
toggle: () => void;
}
interface SidebarSlotProps {
modelValue: InternalModelValue;
month?: ComputedRef<(instance: number) => number>;
year?: ComputedRef<(instance: number) => number>;
time?: InternalTime;
updateTime?: (value: number | number[], isHours?: boolean, isSeconds?: boolean) => void;
updateMonthYear?: (instance: number, val: { month: number; year: number; fromNav?: boolean }) => void;
selectDate?: (day: { value: Date }, isNext?: boolean) => void;
presetDate?: (value: Date[] | string[] | Date | string, noTz?: boolean) => void;
getModelMonthYear?: () => { month: number | null; year: number | null }[];
selectMonth?: (month: number, instance: number) => void;
selectYear?: (year: number, instance: number) => void;
handleYear?: (instance: number, increment?: boolean) => void;
selectQuarter?: (date: Date, instance: number, disabled: boolean) => void;
handleYearSelect?: (year: number, instance: number) => void;
}
export interface Slots {
'clock-icon'(): any;
'arrow-left'(): any;
'arrow-right'(): any;
'arrow-up'(): any;
'arrow-down'(): any;
'calendar-icon'(): any;
day(props: { date: Date; day: number }): any;
'month-overlay-value'(props: { text: string; value: number }): any;
'year-overlay-value'(props: { text: string; value: number }): any;
'year-overlay'(props: MonthYearOverlay): any;
'month-overlay'(props: MonthYearOverlay): any;
'month-overlay-header'(props: { toggle: () => void }): any;
'year-overlay-header'(props: { toggle: () => void }): any;
'hours-overlay-value'(props: { text: string; value: number }): any;
'minutes-overlay-value'(props: { text: string; value: number }): any;
'seconds-overlay-value'(props: { text: string; value: number }): any;
hours(props: { text: string; value: number }): any;
minutes(props: { text: string; value: number }): any;
month(props: { text: string; value: number }): any;
year(props: { text: string; value: number }): any;
'action-buttons'(props: { value: InternalModelValue }): any;
'action-preview'(props: { value: InternalModelValue }): any;
'calendar-header'(props: { day: string; index: number }): any;
'marker-tooltip'(props: { day: Date; tooltip: { text?: string; html?: string; color?: string } }): any;
'action-extra'(props: { selectCurrentDate: () => void }): any;
'time-picker-overlay'(props: {
hours: number | number[];
minutes: number | number[];
seconds: number | number[];
setHours: (hours: number | number[]) => void;
setMinutes: (minutes: number | number[]) => void;
setSeconds: (seconds: number | number[]) => void;
}): any;
'am-pm-button'(props: { toggle: () => void; value: string }): any;
'left-sidebar'(props: SidebarSlotProps): any;
'right-sidebar'(props: SidebarSlotProps): any;
'month-year'(props: {
year: number;
month?: number;
months?: { value: number; text: string; className?: Record<string, boolean> }[];
years?: { value: number; text: string; className?: Record<string, boolean> }[];
updateMonthYear?: (month: number, year: number, fromNav: boolean) => void;
handleMonthYearChange?: (isNext: boolean, fromNav?: boolean) => void;
instance?: number;
selectMonth?: (month: number, instance: number) => void;
selectYear?: (year: number, instance: number) => void;
isDisabled?: (next: boolean) => boolean;
}): any;
'time-picker'(props: {
time: InternalTime;
updateTime: (value: number | number[], isHours?: boolean, isSeconds?: boolean) => void;
}): any;
'action-row'(props: {
internalModelValue: InternalModelValue;
disabled: boolean;
selectDate: () => void;
closePicker: () => void;
}): any;
marker(props: { marker: DatePickerMarker; day: number; date: Date }): any;
quarter(props: { value: Date; text: string }): any;
'top-extra'(props: { value: InternalModelValue }): any;
trigger(): any;
'input-icon'(): any;
'clear-icon'(props: { clear: (ev?: Event) => void }): any;
'dp-input'(props: {
value: string;
isMenuOpen: boolean;
onInput: (ev: string | Event) => void;
onEnter: (ev: KeyboardEvent) => void;
onTab: (ev: KeyboardEvent) => void;
onClear: (ev?: Event | undefined) => void;
onBlur: () => void;
onFocus: () => void;
onKeypress: (ev: KeyboardEvent) => void;
onPaste: () => void;
openMenu: () => void;
closeMenu: () => void;
toggleMenu: () => void;
}): any;
'hours-overlay-header'(props: { toggle: () => void }): any;
'minutes-overlay-header'(props: { toggle: () => void }): any;
'seconds-overlay-header'(props: { toggle: () => void }): any;
'tp-inline-arrow-up'(): any;
'tp-inline-arrow-down'(): any;
'menu-header'(): any;
}
type __VLS_WithTemplateSlots<T, S> = T & {
new (): {
$slots: S;
};
};
declare const _default: __VLS_WithTemplateSlots<
DefineComponent<
ComponentPropsOptions<VueDatePickerProps>,
{},
{},
ComputedOptions,
PublicMethods,
ComponentOptionsMixin,
ComponentOptionsMixin,
EmitEvents[],
EmitEvents,
VueDatePickerProps
>,
Readonly<Slots> & Slots
>;
export default _default;