UNPKG

vuetify

Version:

Vue Material Component Framework

286 lines (282 loc) 10.9 kB
import { createVNode as _createVNode, mergeProps as _mergeProps, Fragment as _Fragment } from "vue"; // Styles import "./VDatePicker.css"; // Components import { makeVDatePickerControlsProps, VDatePickerControls } from "./VDatePickerControls.js"; import { VDatePickerHeader } from "./VDatePickerHeader.js"; import { makeVDatePickerMonthProps, VDatePickerMonth } from "./VDatePickerMonth.js"; import { makeVDatePickerMonthsProps, VDatePickerMonths } from "./VDatePickerMonths.js"; import { makeVDatePickerYearsProps, VDatePickerYears } from "./VDatePickerYears.js"; import { VFadeTransition } from "../transitions/index.js"; import { VDefaultsProvider } from "../VDefaultsProvider/index.js"; import { makeVPickerProps, VPicker } from "../../labs/VPicker/VPicker.js"; // Composables import { useDate } from "../../composables/date/index.js"; import { useLocale, useRtl } from "../../composables/locale.js"; import { useProxiedModel } from "../../composables/proxiedModel.js"; // Utilities import { computed, ref, shallowRef, toRef, watch } from 'vue'; import { genericComponent, omit, propsFactory, useRender, wrapInArray } from "../../util/index.js"; // Types // Types export const makeVDatePickerProps = propsFactory({ // TODO: implement in v3.5 // calendarIcon: { // type: String, // default: '$calendar', // }, // keyboardIcon: { // type: String, // default: '$edit', // }, // inputMode: { // type: String as PropType<'calendar' | 'keyboard'>, // default: 'calendar', // }, // inputText: { // type: String, // default: '$vuetify.datePicker.input.placeholder', // }, // inputPlaceholder: { // type: String, // default: 'dd/mm/yyyy', // }, header: { type: String, default: '$vuetify.datePicker.header' }, headerColor: String, ...makeVDatePickerControlsProps(), ...makeVDatePickerMonthProps({ weeksInMonth: 'static' }), ...omit(makeVDatePickerMonthsProps(), ['modelValue']), ...omit(makeVDatePickerYearsProps(), ['modelValue']), ...makeVPickerProps({ title: '$vuetify.datePicker.title' }), modelValue: null }, 'VDatePicker'); export const VDatePicker = genericComponent()({ name: 'VDatePicker', props: makeVDatePickerProps(), emits: { 'update:modelValue': date => true, 'update:month': date => true, 'update:year': date => true, // 'update:inputMode': (date: any) => true, 'update:viewMode': date => true }, setup(props, _ref) { let { emit, slots } = _ref; const adapter = useDate(); const { t } = useLocale(); const { rtlClasses } = useRtl(); const model = useProxiedModel(props, 'modelValue', undefined, v => wrapInArray(v).map(i => adapter.date(i)), v => props.multiple ? v : v[0]); const viewMode = useProxiedModel(props, 'viewMode'); // const inputMode = useProxiedModel(props, 'inputMode') const minDate = computed(() => { const date = adapter.date(props.min); return props.min && adapter.isValid(date) ? date : null; }); const maxDate = computed(() => { const date = adapter.date(props.max); return props.max && adapter.isValid(date) ? date : null; }); const internal = computed(() => { const today = adapter.date(); let value = today; if (model.value?.[0]) { value = adapter.date(model.value[0]); } else if (minDate.value && adapter.isBefore(today, minDate.value)) { value = minDate.value; } else if (maxDate.value && adapter.isAfter(today, maxDate.value)) { value = maxDate.value; } return value && adapter.isValid(value) ? value : today; }); const headerColor = toRef(() => props.headerColor ?? props.color); const month = ref(Number(props.month ?? adapter.getMonth(adapter.startOfMonth(internal.value)))); const year = ref(Number(props.year ?? adapter.getYear(adapter.startOfYear(adapter.setMonth(internal.value, month.value))))); const isReversing = shallowRef(false); const header = computed(() => { if (props.multiple && model.value.length > 1) { return t('$vuetify.datePicker.itemsSelected', model.value.length); } return model.value[0] && adapter.isValid(model.value[0]) ? adapter.format(adapter.date(model.value[0]), 'normalDateWithWeekday') : t(props.header); }); const text = computed(() => { let date = adapter.date(); date = adapter.setDate(date, 1); date = adapter.setMonth(date, month.value); date = adapter.setYear(date, year.value); return adapter.format(date, 'monthAndYear'); }); // const headerIcon = toRef(() => props.inputMode === 'calendar' ? props.keyboardIcon : props.calendarIcon) const headerTransition = toRef(() => `date-picker-header${isReversing.value ? '-reverse' : ''}-transition`); const disabled = computed(() => { if (props.disabled) return true; const targets = []; if (viewMode.value !== 'month') { targets.push(...['prev', 'next']); } else { let _date = adapter.date(); _date = adapter.startOfMonth(_date); _date = adapter.setMonth(_date, month.value); _date = adapter.setYear(_date, year.value); if (minDate.value) { const date = adapter.addDays(adapter.startOfMonth(_date), -1); adapter.isAfter(minDate.value, date) && targets.push('prev'); } if (maxDate.value) { const date = adapter.addDays(adapter.endOfMonth(_date), 1); adapter.isAfter(date, maxDate.value) && targets.push('next'); } } return targets; }); // function onClickAppend () { // inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar' // } function onClickNext() { if (month.value < 11) { month.value++; } else { year.value++; month.value = 0; onUpdateYear(year.value); } onUpdateMonth(month.value); } function onClickPrev() { if (month.value > 0) { month.value--; } else { year.value--; month.value = 11; onUpdateYear(year.value); } onUpdateMonth(month.value); } function onClickDate() { viewMode.value = 'month'; } function onClickMonth() { viewMode.value = viewMode.value === 'months' ? 'month' : 'months'; } function onClickYear() { viewMode.value = viewMode.value === 'year' ? 'month' : 'year'; } function onUpdateMonth(value) { if (viewMode.value === 'months') onClickMonth(); emit('update:month', value); } function onUpdateYear(value) { if (viewMode.value === 'year') onClickYear(); emit('update:year', value); } watch(model, (val, oldVal) => { const arrBefore = wrapInArray(oldVal); const arrAfter = wrapInArray(val); if (!arrAfter.length) return; const before = adapter.date(arrBefore[arrBefore.length - 1]); const after = adapter.date(arrAfter[arrAfter.length - 1]); const newMonth = adapter.getMonth(after); const newYear = adapter.getYear(after); if (newMonth !== month.value) { month.value = newMonth; onUpdateMonth(month.value); } if (newYear !== year.value) { year.value = newYear; onUpdateYear(year.value); } isReversing.value = adapter.isBefore(before, after); }); useRender(() => { const pickerProps = VPicker.filterProps(props); const datePickerControlsProps = VDatePickerControls.filterProps(props); const datePickerHeaderProps = VDatePickerHeader.filterProps(props); const datePickerMonthProps = VDatePickerMonth.filterProps(props); const datePickerMonthsProps = omit(VDatePickerMonths.filterProps(props), ['modelValue']); const datePickerYearsProps = omit(VDatePickerYears.filterProps(props), ['modelValue']); const headerProps = { color: headerColor.value, header: header.value, transition: headerTransition.value }; return _createVNode(VPicker, _mergeProps(pickerProps, { "color": headerColor.value, "class": ['v-date-picker', `v-date-picker--${viewMode.value}`, { 'v-date-picker--show-week': props.showWeek }, rtlClasses.value, props.class], "style": props.style }), { title: () => slots.title?.() ?? _createVNode("div", { "class": "v-date-picker__title" }, [t(props.title)]), header: () => slots.header ? _createVNode(VDefaultsProvider, { "defaults": { VDatePickerHeader: { ...headerProps } } }, { default: () => [slots.header?.(headerProps)] }) : _createVNode(VDatePickerHeader, _mergeProps({ "key": "header" }, datePickerHeaderProps, headerProps, { "onClick": viewMode.value !== 'month' ? onClickDate : undefined }), { ...slots, default: undefined }), default: () => _createVNode(_Fragment, null, [_createVNode(VDatePickerControls, _mergeProps(datePickerControlsProps, { "disabled": disabled.value, "text": text.value, "onClick:next": onClickNext, "onClick:prev": onClickPrev, "onClick:month": onClickMonth, "onClick:year": onClickYear }), null), _createVNode(VFadeTransition, { "hideOnLeave": true }, { default: () => [viewMode.value === 'months' ? _createVNode(VDatePickerMonths, _mergeProps({ "key": "date-picker-months" }, datePickerMonthsProps, { "modelValue": month.value, "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth], "min": minDate.value, "max": maxDate.value, "year": year.value }), null) : viewMode.value === 'year' ? _createVNode(VDatePickerYears, _mergeProps({ "key": "date-picker-years" }, datePickerYearsProps, { "modelValue": year.value, "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear], "min": minDate.value, "max": maxDate.value }), null) : _createVNode(VDatePickerMonth, _mergeProps({ "key": "date-picker-month" }, datePickerMonthProps, { "modelValue": model.value, "onUpdate:modelValue": $event => model.value = $event, "month": month.value, "onUpdate:month": [$event => month.value = $event, onUpdateMonth], "year": year.value, "onUpdate:year": [$event => year.value = $event, onUpdateYear], "min": minDate.value, "max": maxDate.value }), null)] })]), actions: slots.actions }); }); return {}; } }); //# sourceMappingURL=VDatePicker.js.map