From 4bd94d3be2557dca2ccb84f0ad4fbdd035d16553 Mon Sep 17 00:00:00 2001 From: "Janus C. H. Knudsen" Date: Tue, 14 Oct 2025 19:21:28 +0200 Subject: [PATCH] More cleanup --- src/managers/CalendarManager.ts | 230 ++++---------------------- src/renderers/EventRendererManager.ts | 1 + src/renderers/GridRenderer.ts | 10 +- src/types/ManagerTypes.ts | 12 -- 4 files changed, 36 insertions(+), 217 deletions(-) diff --git a/src/managers/CalendarManager.ts b/src/managers/CalendarManager.ts index 8119b0d..1777050 100644 --- a/src/managers/CalendarManager.ts +++ b/src/managers/CalendarManager.ts @@ -1,15 +1,10 @@ -import { EventBus } from '../core/EventBus'; import { CoreEvents } from '../constants/CoreEvents'; import { calendarConfig } from '../core/CalendarConfig'; -import { CalendarEvent, CalendarView, IEventBus } from '../types/CalendarTypes'; +import { CalendarView, IEventBus } from '../types/CalendarTypes'; import { EventManager } from './EventManager'; import { GridManager } from './GridManager'; -import { HeaderManager } from './HeaderManager'; import { EventRenderingService } from '../renderers/EventRendererManager'; import { ScrollManager } from './ScrollManager'; -import { DateService } from '../utils/DateService'; -import { EventFilterManager } from './EventFilterManager'; -import { InitializationReport } from '../types/ManagerTypes'; /** * CalendarManager - Main coordinator for all calendar managers @@ -19,11 +14,8 @@ export class CalendarManager { private eventBus: IEventBus; private eventManager: EventManager; private gridManager: GridManager; - private headerManager: HeaderManager; private eventRenderer: EventRenderingService; private scrollManager: ScrollManager; - private eventFilterManager: EventFilterManager; - private dateService: DateService; private currentView: CalendarView = 'week'; private currentDate: Date = new Date(); private isInitialized: boolean = false; @@ -38,12 +30,9 @@ export class CalendarManager { this.eventBus = eventBus; this.eventManager = eventManager; this.gridManager = gridManager; - this.headerManager = new HeaderManager(); this.eventRenderer = eventRenderer; this.scrollManager = scrollManager; - this.eventFilterManager = new EventFilterManager(); const timezone = calendarConfig.getTimezone?.(); - this.dateService = new DateService(timezone); this.setupEventListeners(); } @@ -55,55 +44,34 @@ export class CalendarManager { return; } - + try { // Debug: Check calendar type const calendarType = calendarConfig.getCalendarMode(); - + // Step 1: Load data await this.eventManager.loadData(); - + // Step 2: Pass data to GridManager and render grid structure if (calendarType === 'resource') { const resourceData = this.eventManager.getResourceData(); this.gridManager.setResourceData(this.eventManager.getRawData() as import('../types/CalendarTypes').ResourceCalendarData); } await this.gridManager.render(); - - // Step 2a: Setup header drag listeners after grid render (when DOM is available) - this.headerManager.setupHeaderDragListeners(); - - // Step 2b: Trigger event rendering now that data is loaded - // Re-emit GRID_RENDERED to trigger EventRendererManager - const gridContainer = document.querySelector('swp-calendar-container'); - if (gridContainer) { - const periodRange = this.gridManager.getDisplayDates(); - this.eventBus.emit(CoreEvents.GRID_RENDERED, { - container: gridContainer, - currentDate: new Date(), - startDate: periodRange[0], - endDate: periodRange[periodRange.length - 1], - columnCount: periodRange.length - }); - } - - // Step 3: Initialize scroll synchronization + this.scrollManager.initialize(); - - // Step 4: Set initial view and date BEFORE event rendering + this.setView(this.currentView); this.setCurrentDate(this.currentDate); - - // Step 5: Event rendering will be triggered by GRID_RENDERED event - + this.isInitialized = true; - + // Emit initialization complete event this.eventBus.emit(CoreEvents.INITIALIZED, { currentDate: this.currentDate, currentView: this.currentView }); - + } catch (error) { throw error; } @@ -128,109 +96,29 @@ export class CalendarManager { date: this.currentDate }); - // Grid re-rendering will trigger event rendering automatically via GRID_RENDERED event } /** * Sæt aktuel dato */ public setCurrentDate(date: Date): void { - // Validate input date - if (!date || !(date instanceof Date) || isNaN(date.getTime())) { - return; - } - + const previousDate = this.currentDate; this.currentDate = new Date(date); - // Validate that both dates are valid before logging - const prevDateStr = previousDate && !isNaN(previousDate.getTime()) ? previousDate.toISOString() : 'Invalid Date'; - const newDateStr = this.currentDate.toISOString(); - - // Emit date change event this.eventBus.emit(CoreEvents.DATE_CHANGED, { previousDate, currentDate: this.currentDate, view: this.currentView }); - - // Grid update for new date will trigger event rendering automatically via GRID_RENDERED event - } - - /** - * Naviger til i dag - */ - public goToToday(): void { - this.setCurrentDate(new Date()); - } - - /** - * Naviger til næste periode (dag/uge/måned afhængig af view) - */ - public goToNext(): void { - const nextDate = this.calculateNextDate(); - this.setCurrentDate(nextDate); - } - - /** - * Naviger til forrige periode (dag/uge/måned afhængig af view) - */ - public goToPrevious(): void { - const previousDate = this.calculatePreviousDate(); - this.setCurrentDate(previousDate); - } - - /** - * Hent aktuel view - */ - public getCurrentView(): CalendarView { - return this.currentView; - } - - /** - * Hent aktuel dato - */ - public getCurrentDate(): Date { - return new Date(this.currentDate); - } - - /** - * Hent calendar konfiguration - */ - public getConfig() { - return calendarConfig; - } - - /** - * Check om calendar er initialiseret - */ - public isCalendarInitialized(): boolean { - return this.isInitialized; - } - - /** - * Get initialization report for debugging - */ - public getInitializationReport(): InitializationReport { - return { - initialized: this.isInitialized, - timestamp: Date.now(), - managers: { - calendar: { initialized: this.isInitialized }, - event: { initialized: true }, - grid: { initialized: true }, - header: { initialized: true }, - scroll: { initialized: true } - } - }; } /** * Genindlæs calendar data */ public refresh(): void { - + this.eventBus.emit(CoreEvents.REFRESH_REQUESTED, { view: this.currentView, date: this.currentDate @@ -241,10 +129,10 @@ export class CalendarManager { * Ryd calendar og nulstil til standard tilstand */ public reset(): void { - + this.currentView = 'week'; this.currentDate = new Date(); - + this.eventBus.emit(CoreEvents.REFRESH_REQUESTED, { view: this.currentView, date: this.currentDate @@ -257,11 +145,10 @@ export class CalendarManager { private setupEventListeners(): void { // Listen for workweek changes only this.eventBus.on(CoreEvents.WORKWEEK_CHANGED, (event: Event) => { + const customEvent = event as CustomEvent; this.handleWorkweekChange(); - - // Also update week info display since workweek affects date range display - this.updateWeekInfoForWorkweekChange(); + }); } @@ -270,7 +157,7 @@ export class CalendarManager { */ private calculateNextDate(): Date { const nextDate = new Date(this.currentDate); - + switch (this.currentView) { case 'day': nextDate.setDate(nextDate.getDate() + 1); @@ -283,7 +170,7 @@ export class CalendarManager { nextDate.setMonth(nextDate.getMonth() + 1); break; } - + return nextDate; } @@ -292,7 +179,7 @@ export class CalendarManager { */ private calculatePreviousDate(): Date { const previousDate = new Date(this.currentDate); - + switch (this.currentView) { case 'day': previousDate.setDate(previousDate.getDate() - 1); @@ -305,7 +192,7 @@ export class CalendarManager { previousDate.setMonth(previousDate.getMonth() - 1); break; } - + return previousDate; } @@ -314,7 +201,7 @@ export class CalendarManager { */ private calculateCurrentPeriod(): { start: string; end: string } { const current = new Date(this.currentDate); - + switch (this.currentView) { case 'day': const dayStart = new Date(current); @@ -325,7 +212,7 @@ export class CalendarManager { start: dayStart.toISOString(), end: dayEnd.toISOString() }; - + case 'week': // Find start of week (Monday) const weekStart = new Date(current); @@ -333,17 +220,17 @@ export class CalendarManager { const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1; // Sunday = 0, so 6 days back to Monday weekStart.setDate(weekStart.getDate() - daysToMonday); weekStart.setHours(0, 0, 0, 0); - + // Find end of week (Sunday) const weekEnd = new Date(weekStart); weekEnd.setDate(weekEnd.getDate() + 6); weekEnd.setHours(23, 59, 59, 999); - + return { start: weekStart.toISOString(), end: weekEnd.toISOString() }; - + case 'month': const monthStart = new Date(current.getFullYear(), current.getMonth(), 1); const monthEnd = new Date(current.getFullYear(), current.getMonth() + 1, 0, 23, 59, 59, 999); @@ -351,7 +238,7 @@ export class CalendarManager { start: monthStart.toISOString(), end: monthEnd.toISOString() }; - + default: // Fallback to week view const fallbackStart = new Date(current); @@ -371,22 +258,22 @@ export class CalendarManager { * Handle workweek configuration changes */ private handleWorkweekChange(): void { - + // Force a complete grid rebuild by clearing existing structure const container = document.querySelector('swp-calendar-container'); if (container) { container.innerHTML = ''; // Clear everything to force full rebuild } - + // Re-render the grid with new workweek settings (will now rebuild everything) this.gridManager.render(); - + // Re-initialize scroll manager after grid rebuild this.scrollManager.initialize(); - + // Re-render events in the new grid structure this.rerenderEvents(); - + // Notify HeaderManager with correct current date after grid rebuild this.eventBus.emit('workweek:header-update', { currentDate: this.currentDate, @@ -399,71 +286,22 @@ export class CalendarManager { * Re-render events after grid structure changes */ private rerenderEvents(): void { - + // Get current period data to determine date range const periodData = this.calculateCurrentPeriod(); - + // Find the grid container to render events in const container = document.querySelector('swp-calendar-container'); if (!container) { return; } - + // Trigger event rendering for the current date range using correct method this.eventRenderer.renderEvents({ container: container as HTMLElement, - startDate: new Date(periodData.start), + startDate: new Date(periodData.start), endDate: new Date(periodData.end) }); } - /** - * Update week info display after workweek changes - */ - private updateWeekInfoForWorkweekChange(): void { - // Don't do anything here - let GRID_RENDERED event handle it - } - - /** - * Update week info based on actual rendered columns - */ - private updateWeekInfoFromRenderedColumns(): void { - - // Get actual dates from rendered columns - const columns = document.querySelectorAll('swp-day-column'); - if (columns.length === 0) { - return; - } - - // Get first and last column dates - const firstColumn = columns[0] as HTMLElement; - const lastColumn = columns[columns.length - 1] as HTMLElement; - - const firstDateStr = firstColumn.dataset.date; - const lastDateStr = lastColumn.dataset.date; - - if (!firstDateStr || !lastDateStr) { - return; - } - - // Parse dates - const firstDate = new Date(firstDateStr); - const lastDate = new Date(lastDateStr); - - // Calculate week number from first date - const weekNumber = this.dateService.getWeekNumber(firstDate); - - // Format date range - const dateRange = this.dateService.formatDateRange(firstDate, lastDate); - - // Emit week info update - this.eventBus.emit(CoreEvents.PERIOD_INFO_UPDATE, { - weekNumber, - dateRange, - weekStart: firstDate, - weekEnd: lastDate - }); - } - - } \ No newline at end of file diff --git a/src/renderers/EventRendererManager.ts b/src/renderers/EventRendererManager.ts index 5c73e6c..3d77c61 100644 --- a/src/renderers/EventRendererManager.ts +++ b/src/renderers/EventRendererManager.ts @@ -224,6 +224,7 @@ export class EventRenderingService { } private setupDragMouseLeaveHeaderListener(): void { + this.dragMouseLeaveHeaderListener = (event: Event) => { const { targetDate, mousePosition, originalElement, draggedClone: cloneElement } = (event as CustomEvent).detail; diff --git a/src/renderers/GridRenderer.ts b/src/renderers/GridRenderer.ts index 1774c98..0ffd50f 100644 --- a/src/renderers/GridRenderer.ts +++ b/src/renderers/GridRenderer.ts @@ -193,15 +193,7 @@ export class GridRenderer { parentContainer.appendChild(newGrid); console.log('Grid created using createOptimizedGridContainer:', newGrid); - console.log('Emitting GRID_RENDERED'); - - eventBus.emit(CoreEvents.GRID_RENDERED, { - container: newGrid, // Specific grid container, not parent - currentDate: weekStart, - startDate: weekStart, - endDate: weekEnd, - isNavigation: true // Flag to indicate this is navigation rendering - }); + console.log('Grid creation complete - caller will emit GRID_RENDERED'); console.groupEnd(); return newGrid; diff --git a/src/types/ManagerTypes.ts b/src/types/ManagerTypes.ts index e58bf9f..3ab080a 100644 --- a/src/types/ManagerTypes.ts +++ b/src/types/ManagerTypes.ts @@ -62,7 +62,6 @@ export interface ViewManager extends IManager { export interface CalendarManager extends IManager { setView(view: CalendarView): void; setCurrentDate(date: Date): void; - getInitializationReport(): InitializationReport; } export interface DragDropManager extends IManager { @@ -93,14 +92,3 @@ export interface ResourceAssignment { resourceId: string; eventId: string; } - -export interface InitializationReport { - initialized: boolean; - timestamp: number; - managers: { - [key: string]: { - initialized: boolean; - error?: string; - }; - }; -} \ No newline at end of file