diff --git a/src/plugins/virtualWeeks.js b/src/plugins/virtualWeeks.js index 817228f..6ea0550 100644 --- a/src/plugins/virtualWeeks.js +++ b/src/plugins/virtualWeeks.js @@ -84,38 +84,42 @@ export function createVirtualWeekManager({ } const dayEvents = [...storedEvents] for (const base of repeatingBases) { - const baseEnd = toLocalString( - addDays(fromLocalString(base.startDate, DEFAULT_TZ), (base.days || 1) - 1), - DEFAULT_TZ, - ) - if (dateStr >= base.startDate && dateStr <= baseEnd) { - dayEvents.push({ ...base, endDate: baseEnd, _recurrenceIndex: 0, _baseId: base.id }) - continue - } const spanDays = (base.days || 1) - 1 const currentDate = curDateObj - let occurrenceFound = false - for (let offset = 0; offset <= spanDays && !occurrenceFound; offset++) { + const baseEnd = toLocalString( + addDays(fromLocalString(base.startDate, DEFAULT_TZ), spanDays), + DEFAULT_TZ, + ) + for (let offset = 0; offset <= spanDays; offset++) { const candidateStart = addDays(currentDate, -offset) const candidateStartStr = toLocalString(candidateStart, DEFAULT_TZ) - const occurrenceIndex = getOccurrenceIndex(base, candidateStartStr, DEFAULT_TZ) - if (occurrenceIndex !== null) { - const virtualEndDate = getVirtualOccurrenceEndDate(base, candidateStartStr, DEFAULT_TZ) - if (dateStr >= candidateStartStr && dateStr <= virtualEndDate) { - const virtualId = base.id + '_v_' + candidateStartStr - const alreadyExists = dayEvents.some((ev) => ev.id === virtualId) - if (!alreadyExists) { + if (candidateStartStr === base.startDate) { + if (dateStr >= base.startDate && dateStr <= baseEnd) { + if (!dayEvents.some((ev) => ev.id === base.id)) { dayEvents.push({ ...base, - id: virtualId, - startDate: candidateStartStr, - endDate: virtualEndDate, - _recurrenceIndex: occurrenceIndex, + endDate: baseEnd, + _recurrenceIndex: 0, _baseId: base.id, }) } - occurrenceFound = true } + continue + } + const occurrenceIndex = getOccurrenceIndex(base, candidateStartStr, DEFAULT_TZ) + if (occurrenceIndex === null) continue + const virtualEndDate = getVirtualOccurrenceEndDate(base, candidateStartStr, DEFAULT_TZ) + if (dateStr < candidateStartStr || dateStr > virtualEndDate) continue + const virtualId = base.id + '_v_' + candidateStartStr + if (!dayEvents.some((ev) => ev.id === virtualId)) { + dayEvents.push({ + ...base, + id: virtualId, + startDate: candidateStartStr, + endDate: virtualEndDate, + _recurrenceIndex: occurrenceIndex, + _baseId: base.id, + }) } } } @@ -323,42 +327,42 @@ export function createVirtualWeekManager({ } const dayEvents = [...storedEvents] for (const base of repeatingBases) { - const baseEndStr = toLocalString( - addDays(fromLocalString(base.startDate, DEFAULT_TZ), (base.days || 1) - 1), - DEFAULT_TZ, - ) - if (dateStr >= base.startDate && dateStr <= baseEndStr) { - dayEvents.push({ ...base, endDate: baseEndStr, _recurrenceIndex: 0, _baseId: base.id }) - continue - } const spanDays = (base.days || 1) - 1 const currentDate = fromLocalString(dateStr, DEFAULT_TZ) - let occurrenceFound = false - for (let offset = 0; offset <= spanDays && !occurrenceFound; offset++) { + const baseEndStr = toLocalString( + addDays(fromLocalString(base.startDate, DEFAULT_TZ), spanDays), + DEFAULT_TZ, + ) + for (let offset = 0; offset <= spanDays; offset++) { const candidateStart = addDays(currentDate, -offset) const candidateStartStr = toLocalString(candidateStart, DEFAULT_TZ) - const occurrenceIndex = getOccurrenceIndex(base, candidateStartStr, DEFAULT_TZ) - if (occurrenceIndex !== null) { - const virtualEndDate = getVirtualOccurrenceEndDate( - base, - candidateStartStr, - DEFAULT_TZ, - ) - if (dateStr >= candidateStartStr && dateStr <= virtualEndDate) { - const virtualId = base.id + '_v_' + candidateStartStr - const alreadyExists = dayEvents.some((ev) => ev.id === virtualId) - if (!alreadyExists) { + if (candidateStartStr === base.startDate) { + if (dateStr >= base.startDate && dateStr <= baseEndStr) { + if (!dayEvents.some((ev) => ev.id === base.id)) { dayEvents.push({ ...base, - id: virtualId, - startDate: candidateStartStr, - endDate: virtualEndDate, - _recurrenceIndex: occurrenceIndex, + endDate: baseEndStr, + _recurrenceIndex: 0, _baseId: base.id, }) } - occurrenceFound = true } + continue + } + const occurrenceIndex = getOccurrenceIndex(base, candidateStartStr, DEFAULT_TZ) + if (occurrenceIndex === null) continue + const virtualEndDate = getVirtualOccurrenceEndDate(base, candidateStartStr, DEFAULT_TZ) + if (dateStr < candidateStartStr || dateStr > virtualEndDate) continue + const virtualId = base.id + '_v_' + candidateStartStr + if (!dayEvents.some((ev) => ev.id === virtualId)) { + dayEvents.push({ + ...base, + id: virtualId, + startDate: candidateStartStr, + endDate: virtualEndDate, + _recurrenceIndex: occurrenceIndex, + _baseId: base.id, + }) } } }