diff --git a/apps/calendar/apps/web/package.json b/apps/calendar/apps/web/package.json index f9f78a82f..bd75e50f6 100644 --- a/apps/calendar/apps/web/package.json +++ b/apps/calendar/apps/web/package.json @@ -32,6 +32,7 @@ "dependencies": { "@calendar/shared": "workspace:*", "@manacore/shared-auth": "workspace:*", + "@manacore/shared-splitscreen": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", "@manacore/shared-feedback-service": "workspace:*", diff --git a/apps/calendar/apps/web/src/lib/components/calendar/MultiDayView.svelte b/apps/calendar/apps/web/src/lib/components/calendar/MultiDayView.svelte index 24d10f077..74386f63d 100644 --- a/apps/calendar/apps/web/src/lib/components/calendar/MultiDayView.svelte +++ b/apps/calendar/apps/web/src/lib/components/calendar/MultiDayView.svelte @@ -136,7 +136,61 @@ let daysContainerEl: HTMLDivElement; function getEventsForDay(day: Date) { - return eventsStore.getEventsForDay(day).filter((e) => !e.isAllDay); + const allEvents = eventsStore.getEventsForDay(day).filter((e) => !e.isAllDay); + + // If hour filtering is enabled, only show events that overlap with visible range + if (settingsStore.filterHoursEnabled) { + const visibleStartMinutes = settingsStore.dayStartHour * 60; + const visibleEndMinutes = settingsStore.dayEndHour * 60; + + return allEvents.filter((event) => { + const start = + typeof event.startTime === 'string' ? parseISO(event.startTime) : event.startTime; + const end = typeof event.endTime === 'string' ? parseISO(event.endTime) : event.endTime; + + const eventStartMinutes = start.getHours() * 60 + start.getMinutes(); + const eventEndMinutes = end.getHours() * 60 + end.getMinutes(); + + // Event overlaps with visible range + return eventStartMinutes < visibleEndMinutes && eventEndMinutes > visibleStartMinutes; + }); + } + + return allEvents; + } + + // Get events that are completely outside the visible time range + function getOverflowEventsForDay(day: Date): { before: CalendarEvent[]; after: CalendarEvent[] } { + if (!settingsStore.filterHoursEnabled) { + return { before: [], after: [] }; + } + + const allEvents = eventsStore.getEventsForDay(day).filter((e) => !e.isAllDay); + const before: CalendarEvent[] = []; + const after: CalendarEvent[] = []; + + const visibleStartMinutes = settingsStore.dayStartHour * 60; + const visibleEndMinutes = settingsStore.dayEndHour * 60; + + for (const event of allEvents) { + const start = + typeof event.startTime === 'string' ? parseISO(event.startTime) : event.startTime; + const end = typeof event.endTime === 'string' ? parseISO(event.endTime) : event.endTime; + + const eventStartMinutes = start.getHours() * 60 + start.getMinutes(); + const eventEndMinutes = end.getHours() * 60 + end.getMinutes(); + + // Event ends before visible range starts + if (eventEndMinutes <= visibleStartMinutes) { + before.push(event); + } + // Event starts after visible range ends + else if (eventStartMinutes >= visibleEndMinutes) { + after.push(event); + } + } + + return { before, after }; } function getAllDayEventsForDay(day: Date) { @@ -961,6 +1015,36 @@ {/if} + + {#if true} + {@const overflow = getOverflowEventsForDay(day)} + {#if overflow.before.length > 0} +