123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- import { Fragment as _Fragment, mergeProps as _mergeProps, resolveDirective as _resolveDirective, createVNode as _createVNode } from "vue";
- // Styles
- import "./VDatePicker.css";
- // Components
- import { makeVDatePickerControlsProps, VDatePickerControls } from "./VDatePickerControls.mjs";
- import { VDatePickerHeader } from "./VDatePickerHeader.mjs";
- import { makeVDatePickerMonthProps, VDatePickerMonth } from "./VDatePickerMonth.mjs";
- import { makeVDatePickerMonthsProps, VDatePickerMonths } from "./VDatePickerMonths.mjs";
- import { makeVDatePickerYearsProps, VDatePickerYears } from "./VDatePickerYears.mjs";
- import { VFadeTransition } from "../transitions/index.mjs";
- import { VDefaultsProvider } from "../VDefaultsProvider/index.mjs";
- import { makeVPickerProps, VPicker } from "../../labs/VPicker/VPicker.mjs"; // Composables
- import { useDate } from "../../composables/date/index.mjs";
- import { useLocale } from "../../composables/locale.mjs";
- import { useProxiedModel } from "../../composables/proxiedModel.mjs"; // Utilities
- import { computed, ref, shallowRef, watch } from 'vue';
- import { genericComponent, omit, propsFactory, useRender, wrapInArray } from "../../util/index.mjs"; // 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'
- },
- ...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 model = useProxiedModel(props, 'modelValue', undefined, v => wrapInArray(v), v => props.multiple ? v : v[0]);
- const viewMode = useProxiedModel(props, 'viewMode');
- // const inputMode = useProxiedModel(props, 'inputMode')
- const internal = computed(() => {
- const value = adapter.date(model.value?.[0]);
- return value && adapter.isValid(value) ? value : adapter.date();
- });
- 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 = computed(() => props.inputMode === 'calendar' ? props.keyboardIcon : props.calendarIcon)
- const headerTransition = computed(() => `date-picker-header${isReversing.value ? '-reverse' : ''}-transition`);
- 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 disabled = computed(() => {
- if (props.disabled) return true;
- const targets = [];
- if (viewMode.value !== 'month') {
- targets.push(...['prev', 'next']);
- } else {
- let _date = adapter.date();
- _date = adapter.setYear(_date, year.value);
- _date = adapter.setMonth(_date, month.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 = {
- header: header.value,
- transition: headerTransition.value
- };
- return _createVNode(VPicker, _mergeProps(pickerProps, {
- "class": ['v-date-picker', `v-date-picker--${viewMode.value}`, {
- 'v-date-picker--show-week': props.showWeek
- }, 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.mjs.map
|