import { EventBus } from '../core/EventBus'; import { CalendarView, IEventBus } from '../types/CalendarTypes'; import { calendarConfig } from '../core/CalendarConfig'; import { EventTypes } from '../constants/EventTypes'; /** * ViewManager - Håndterer skift mellem dag/uge/måned visninger * Arbejder med custom tags fra POC design */ export class ViewManager { private eventBus: IEventBus; private currentView: CalendarView = 'week'; constructor(eventBus: IEventBus) { this.eventBus = eventBus; this.setupEventListeners(); } private setupEventListeners(): void { this.eventBus.on(EventTypes.CALENDAR_INITIALIZED, () => { this.initializeView(); }); this.eventBus.on(EventTypes.VIEW_CHANGE_REQUESTED, (event: Event) => { const customEvent = event as CustomEvent; const { currentView } = customEvent.detail; this.changeView(currentView); }); this.eventBus.on(EventTypes.DATE_CHANGED, () => { this.refreshCurrentView(); }); // Setup view button handlers this.setupViewButtonHandlers(); } private setupViewButtonHandlers(): void { const viewButtons = document.querySelectorAll('swp-view-button[data-view]'); viewButtons.forEach(button => { button.addEventListener('click', (event) => { event.preventDefault(); const view = button.getAttribute('data-view') as CalendarView; if (view && this.isValidView(view)) { this.changeView(view); } }); }); } private initializeView(): void { this.updateViewButtons(); this.eventBus.emit(EventTypes.VIEW_RENDERED, { view: this.currentView }); } private changeView(newView: CalendarView): void { if (newView === this.currentView) return; const previousView = this.currentView; this.currentView = newView; console.log(`ViewManager: Changing view from ${previousView} to ${newView}`); this.updateViewButtons(); this.eventBus.emit(EventTypes.VIEW_CHANGED, { previousView, currentView: newView }); } private updateViewButtons(): void { const viewButtons = document.querySelectorAll('swp-view-button[data-view]'); viewButtons.forEach(button => { const buttonView = button.getAttribute('data-view') as CalendarView; if (buttonView === this.currentView) { button.setAttribute('data-active', 'true'); } else { button.removeAttribute('data-active'); } }); } private refreshCurrentView(): void { this.eventBus.emit(EventTypes.VIEW_RENDERED, { view: this.currentView }); } private isValidView(view: string): view is CalendarView { return ['day', 'week', 'month'].includes(view); } public getCurrentView(): CalendarView { return this.currentView; } public refresh(): void { this.refreshCurrentView(); } public destroy(): void { // Event listeners bliver automatisk fjernet af EventBus } }