Fix weekly recurring events showing wrong date in edit dialog due to confusion about week start day.

This commit is contained in:
Leo Vasanko 2025-08-27 07:26:04 -06:00
parent d9352a9fb3
commit ecae48fd85

View File

@ -91,25 +91,27 @@ function getDateWeekly(event, n, timeZone = DEFAULT_TZ) {
let occ = n let occ = n
if (!baseCountsAsPattern) occ -= 1 if (!baseCountsAsPattern) occ -= 1
if (occ < 0) return null if (occ < 0) return null
const patternDays = [] // Build Monday-based offsets (0=Mon..6=Sun) for all active pattern days
for (let d = 0; d < 7; d++) if (pattern[d]) patternDays.push(d) const offsets = pattern
const firstWeekDates = [] .reduce((acc, active, i) => (active ? [...acc, (i + 6) % 7] : acc), [])
for (const d of patternDays) { .sort((a, b) => a - b)
if (d < baseDow) continue const dates = []
const date = dateFns.addDays(baseWeekMonday, d) const baseOffset = (baseDow + 6) % 7
if (date < baseStart) continue for (const off of offsets) {
firstWeekDates.push(date) if (off < baseOffset) continue
const d = dateFns.addDays(baseWeekMonday, off)
if (d < baseStart) continue
dates.push(d)
} }
const F = firstWeekDates.length const F = dates.length
if (occ < F) return toLocalString(firstWeekDates[occ], timeZone) if (occ < F) return toLocalString(dates[occ], timeZone)
const remaining = occ - F const remaining = occ - F
const P = patternDays.length const P = offsets.length
if (P === 0) return null if (P === 0) return null
const k = Math.floor(remaining / P) + 1 const k = Math.floor(remaining / P) + 1
const indexInWeek = remaining % P const indexInWeek = remaining % P
const dow = patternDays[indexInWeek] const date = dateFns.addDays(baseWeekMonday, k * interval * 7 + offsets[indexInWeek])
const occurrenceDate = dateFns.addDays(baseWeekMonday, k * interval * 7 + dow) return toLocalString(date, timeZone)
return toLocalString(occurrenceDate, timeZone)
} }
function getDateMonthly(event, n, timeZone = DEFAULT_TZ) { function getDateMonthly(event, n, timeZone = DEFAULT_TZ) {