Skip to content

Commit d95b09f

Browse files
committed
fix(VCalendar): reset overlap for effective week start day
1 parent bfba6d7 commit d95b09f

File tree

3 files changed

+41
-35
lines changed

3 files changed

+41
-35
lines changed

packages/vuetify/src/labs/VCalendar/VCalendar.tsx

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ interface VCalendarRenderProps {
5151
end: CalendarTimestamp
5252
component: JSXComponent & { filterProps: <T>(props: T) => Partial<T> }
5353
maxDays: number
54-
weekdays: number[]
5554
categories: CalendarCategory[]
5655
}
5756

@@ -154,12 +153,6 @@ export const VCalendar = genericComponent<new (
154153
const lastStart = ref<CalendarTimestamp | null>(null)
155154
const lastEnd = ref<CalendarTimestamp | null>(null)
156155

157-
const parsedValue = computed((): CalendarTimestamp => {
158-
return (validateTimestamp(props.modelValue)
159-
? parseTimestamp(props.modelValue, true)
160-
: (base.parsedStart.value || base.times.today))
161-
})
162-
163156
const parsedCategoryDays = computed((): number => {
164157
return parseInt(String(props.categoryDays)) || 1
165158
})
@@ -169,10 +162,9 @@ export const VCalendar = genericComponent<new (
169162
})
170163

171164
const renderProps = computed((): VCalendarRenderProps => {
172-
const around = parsedValue.value
165+
const around = base.parsedValue.value
173166
let component: any = null
174167
let maxDays = props.maxDays
175-
let weekdays = base.parsedWeekdays.value
176168
let categories = parsedCategories.value
177169
let start = around
178170
let end = around
@@ -192,19 +184,12 @@ export const VCalendar = genericComponent<new (
192184
case 'day':
193185
component = VCalendarDaily
194186
maxDays = 1
195-
weekdays = [start.weekday]
196187
break
197188
case '4day':
198189
component = VCalendarDaily
199190
end = relativeDays(copyTimestamp(end), nextDay, 3)
200191
updateFormatted(end)
201192
maxDays = 4
202-
weekdays = [
203-
start.weekday,
204-
(start.weekday + 1) % 7,
205-
(start.weekday + 2) % 7,
206-
(start.weekday + 3) % 7,
207-
]
208193
break
209194
case 'custom-weekly':
210195
component = VCalendarWeekly
@@ -223,11 +208,6 @@ export const VCalendar = genericComponent<new (
223208
end = relativeDays(copyTimestamp(end), nextDay, days)
224209
updateFormatted(end)
225210
maxDays = days
226-
weekdays = []
227-
228-
for (let i = 0; i < days; i++) {
229-
weekdays.push((start.weekday + i) % 7)
230-
}
231211

232212
categories = getCategoryList(categories)
233213
break
@@ -236,11 +216,11 @@ export const VCalendar = genericComponent<new (
236216
throw new Error(`${type} is not a valid Calendar type`)
237217
}
238218

239-
return { component, start, end, maxDays, weekdays, categories }
219+
return { component, start, end, maxDays, categories }
240220
})
241221

242222
const eventWeekdays = computed((): number[] => {
243-
return renderProps.value.weekdays
223+
return base.effectiveWeekdays.value
244224
})
245225

246226
const categoryMode = computed((): boolean => {
@@ -287,7 +267,7 @@ export const VCalendar = genericComponent<new (
287267
}
288268

289269
function move (amount = 1): void {
290-
const moved = copyTimestamp(parsedValue.value)
270+
const moved = copyTimestamp(base.parsedValue.value)
291271
const forward = amount > 0
292272
const mover = forward ? nextDay : prevDay
293273
const limit = forward ? DAYS_IN_MONTH_MAX : DAY_MIN
@@ -402,7 +382,7 @@ export const VCalendar = genericComponent<new (
402382
})
403383

404384
useRender(() => {
405-
const { start, end, maxDays, component: Component, weekdays, categories } = renderProps.value
385+
const { start, end, maxDays, component: Component, categories } = renderProps.value
406386
return (
407387
<Component
408388
ref={ root }
@@ -413,7 +393,7 @@ export const VCalendar = genericComponent<new (
413393
start={ start.date }
414394
end={ end.date }
415395
maxDays={ maxDays }
416-
weekdays={ weekdays }
396+
weekdays={ base.effectiveWeekdays.value }
417397
categories={ categories }
418398
onClick:date={ (e: MouseEvent, day: CalendarTimestamp) => {
419399
if (attrs['onUpdate:modelValue']) emit('update:modelValue', day.date)
@@ -428,7 +408,6 @@ export const VCalendar = genericComponent<new (
428408
...base,
429409
lastStart,
430410
lastEnd,
431-
parsedValue,
432411
parsedCategoryDays,
433412
renderProps,
434413
eventWeekdays,

packages/vuetify/src/labs/VCalendar/composables/calendarBase.ts

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ export const makeCalendarBaseProps = propsFactory({
5959
}, 'VCalendar-base')
6060

6161
export interface CalendarBaseProps {
62+
modelValue?: string | number | Date
63+
categoryDays: string | number
6264
start: string | number | Date
6365
end: string | number | Date | undefined
6466
weekdays: string | number[]
@@ -73,21 +75,44 @@ export function useCalendarBase (props: CalendarBaseProps) {
7375
const { times } = useTimes({ now: props.now })
7476
const locale = provideLocale(props)
7577

78+
const parsedStart = computed((): CalendarTimestamp => {
79+
if (props.type === 'month') {
80+
return getStartOfMonth(parseTimestamp(props.start, true))
81+
}
82+
return parseTimestamp(props.start, true)
83+
})
84+
85+
const parsedValue = computed((): CalendarTimestamp => {
86+
return (validateTimestamp(props.modelValue)
87+
? parseTimestamp(props.modelValue, true)
88+
: (parsedStart.value || times.today))
89+
})
90+
7691
const parsedWeekdays = computed((): number[] => {
7792
return Array.isArray(props.weekdays)
7893
? props.weekdays
7994
: (props.weekdays || '').split(',').map(x => parseInt(x, 10))
8095
})
8196

82-
const weekdaySkips = computed((): number[] => {
83-
return getWeekdaySkips(parsedWeekdays.value)
97+
const effectiveWeekdays = computed((): number[] => {
98+
const start = parsedValue.value
99+
const days = parseInt(String(props.categoryDays)) || 1
100+
101+
switch (props.type) {
102+
case 'day': return [start.weekday]
103+
case '4day': return [
104+
start.weekday,
105+
(start.weekday + 1) % 7,
106+
(start.weekday + 2) % 7,
107+
(start.weekday + 3) % 7,
108+
]
109+
case 'category': return Array.from({ length: days }, (_, i) => (start.weekday + i) % 7)
110+
default: return parsedWeekdays.value
111+
}
84112
})
85113

86-
const parsedStart = computed((): CalendarTimestamp => {
87-
if (props.type === 'month') {
88-
return getStartOfMonth(parseTimestamp(props.start, true))
89-
}
90-
return parseTimestamp(props.start, true)
114+
const weekdaySkips = computed((): number[] => {
115+
return getWeekdaySkips(parsedWeekdays.value)
91116
})
92117

93118
const parsedEnd = computed((): CalendarTimestamp => {
@@ -160,7 +185,9 @@ export function useCalendarBase (props: CalendarBaseProps) {
160185
return {
161186
times,
162187
locale,
188+
parsedValue,
163189
parsedWeekdays,
190+
effectiveWeekdays,
164191
weekdaySkips,
165192
parsedStart,
166193
parsedEnd,

packages/vuetify/src/labs/VCalendar/composables/calendarWithEvents.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ export function useCalendarWithEvents (props: CalendarWithEventsProps, slots: an
204204
})
205205

206206
const eventWeekdays = computed((): number[] => {
207-
return base.parsedWeekdays.value
207+
return base.effectiveWeekdays.value
208208
})
209209

210210
function eventColorFunction (e: CalendarEvent): string | undefined {

0 commit comments

Comments
 (0)