From 24c53d02e407a0d5ef148d9c39ac42bd9fed57e8 Mon Sep 17 00:00:00 2001 From: John Leider Date: Fri, 29 Mar 2024 23:38:55 -0500 Subject: [PATCH] fix(VDatePicker): add missing transition between months --- .../VDatePicker/VDatePickerMonth.tsx | 155 ++++++++++-------- .../vuetify/src/labs/VPicker/VPicker.sass | 2 + .../src/styles/generic/_transitions.scss | 8 +- 3 files changed, 95 insertions(+), 70 deletions(-) diff --git a/packages/vuetify/src/components/VDatePicker/VDatePickerMonth.tsx b/packages/vuetify/src/components/VDatePicker/VDatePickerMonth.tsx index d29d8893202..96493124781 100644 --- a/packages/vuetify/src/components/VDatePicker/VDatePickerMonth.tsx +++ b/packages/vuetify/src/components/VDatePicker/VDatePickerMonth.tsx @@ -8,9 +8,10 @@ import { VDefaultsProvider } from '@/components/VDefaultsProvider' // Composables import { makeCalendarProps, useCalendar } from '@/composables/calendar' import { useDate } from '@/composables/date/date' +import { MaybeTransition } from '@/composables/transition' // Utilities -import { computed, ref, shallowRef } from 'vue' +import { computed, ref, shallowRef, watch } from 'vue' import { genericComponent, propsFactory } from '@/util' // Types @@ -31,6 +32,14 @@ export const makeVDatePickerMonthProps = propsFactory({ hideWeekdays: Boolean, multiple: [Boolean, Number, String] as PropType, showWeek: Boolean, + transition: { + type: String, + default: 'picker-transition', + }, + reverseTransition: { + type: String, + default: 'picker-reverse-transition', + }, ...makeCalendarProps(), }, 'VDatePickerMonth') @@ -54,6 +63,11 @@ export const VDatePickerMonth = genericComponent()({ const rangeStart = shallowRef() const rangeStop = shallowRef() + const isReverse = shallowRef(false) + + const transition = computed(() => { + return !isReverse.value ? props.transition : props.reverseTransition + }) if (props.multiple === 'range' && model.value.length > 0) { rangeStart.value = model.value[0] @@ -68,6 +82,12 @@ export const VDatePickerMonth = genericComponent()({ return model.value.length >= max }) + watch(daysInMonth, (val, oldVal) => { + if (!oldVal) return + + isReverse.value = adapter.isBefore(val[0].date, oldVal[0].date) + }) + function onRangeClick (value: unknown) { const _value = adapter.startOfDay(value) @@ -144,75 +164,78 @@ export const VDatePickerMonth = genericComponent()({ )} -
- { !props.hideWeekdays && adapter.getWeekdays().map(weekDay => ( -
{ weekDay }
- ))} - - { daysInMonth.value.map((item, i) => { - const slotProps = { - props: { - onClick: () => onClick(item.date), - }, - item, - i, - } as const - - if (atMax.value && !item.isSelected) { - item.isDisabled = true - } - - return ( + +
+ { !props.hideWeekdays && adapter.getWeekdays().map(weekDay => (
- - { (props.showAdjacentMonths || !item.isAdjacent) && ( - onClick(item.date), - }, - }} - > - { slots.day?.(slotProps) ?? ( - - )} - - )} -
- ) - })} -
+ >{ weekDay }
+ ))} + + { daysInMonth.value.map((item, i) => { + const slotProps = { + props: { + onClick: () => onClick(item.date), + }, + item, + i, + } as const + + if (atMax.value && !item.isSelected) { + item.isDisabled = true + } + + return ( +
+ + { (props.showAdjacentMonths || !item.isAdjacent) && ( + onClick(item.date), + }, + }} + > + { slots.day?.(slotProps) ?? ( + + )} + + )} +
+ ) + })} + + ) }, diff --git a/packages/vuetify/src/labs/VPicker/VPicker.sass b/packages/vuetify/src/labs/VPicker/VPicker.sass index c2047f8405d..ae877a2f4c4 100644 --- a/packages/vuetify/src/labs/VPicker/VPicker.sass +++ b/packages/vuetify/src/labs/VPicker/VPicker.sass @@ -16,6 +16,8 @@ .v-picker__body grid-area: body + overflow: hidden + position: relative .v-picker__header grid-area: header diff --git a/packages/vuetify/src/styles/generic/_transitions.scss b/packages/vuetify/src/styles/generic/_transitions.scss index 9f0bc6e9345..0b1f08e53e2 100644 --- a/packages/vuetify/src/styles/generic/_transitions.scss +++ b/packages/vuetify/src/styles/generic/_transitions.scss @@ -95,11 +95,11 @@ @include transition-default(); &-enter-from { - transform: translate(0, 100%); + transform: translate(100%, 0); } &-leave-to { - transform: translate(0, -100%); + transform: translate(-100%, 0); } } @@ -107,11 +107,11 @@ @include transition-default(); &-enter-from { - transform: translate(0, -100%); + transform: translate(-100%, 0); } &-leave-to { - transform: translate(0, 100%); + transform: translate(100%, 0); } }