// Main entry point for Calendar Plantempus import { Container } from '@novadi/core'; import { eventBus } from './core/EventBus'; import { CalendarConfig } from './core/CalendarConfig'; import { URLManager } from './utils/URLManager'; import { IEventBus } from './types/CalendarTypes'; // Import all managers import { EventManager } from './managers/EventManager'; import { EventRenderingService } from './renderers/EventRendererManager'; import { GridManager } from './managers/GridManager'; import { ScrollManager } from './managers/ScrollManager'; import { NavigationManager } from './managers/NavigationManager'; import { ViewManager } from './managers/ViewManager'; import { CalendarManager } from './managers/CalendarManager'; import { DragDropManager } from './managers/DragDropManager'; import { AllDayManager } from './managers/AllDayManager'; import { ResizeHandleManager } from './managers/ResizeHandleManager'; import { EdgeScrollManager } from './managers/EdgeScrollManager'; import { DragHoverManager } from './managers/DragHoverManager'; import { HeaderManager } from './managers/HeaderManager'; // Import renderers import { DateHeaderRenderer, type HeaderRenderer } from './renderers/HeaderRenderer'; import { DateColumnRenderer, type ColumnRenderer } from './renderers/ColumnRenderer'; import { DateEventRenderer, type EventRendererStrategy } from './renderers/EventRenderer'; import { GridRenderer } from './renderers/GridRenderer'; import { DateService } from './utils/DateService'; /** * Handle deep linking functionality after managers are initialized */ async function handleDeepLinking(eventManager: EventManager): Promise { try { const urlManager = new URLManager(eventBus); const eventId = urlManager.parseEventIdFromURL(); if (eventId) { console.log(`Deep linking to event ID: ${eventId}`); // Wait a bit for managers to be fully ready setTimeout(() => { const success = eventManager.navigateToEvent(eventId); if (!success) { console.warn(`Deep linking failed: Event with ID ${eventId} not found`); } }, 500); } } catch (error) { console.warn('Deep linking failed:', error); } } /** * Initialize the calendar application using NovaDI */ async function initializeCalendar(): Promise { try { // Use the singleton calendar configuration // Create NovaDI container const container = new Container(); const builder = container.builder(); // Enable debug mode for development eventBus.setDebug(true); builder.registerType(CalendarConfig).as().singleInstance(); // Bind core services as instances builder.registerInstance(eventBus).as(); // Register renderers with keyed registration based on calendar mode // Date mode renderers builder.registerType(DateHeaderRenderer).as().keyed('date'); builder.registerType(DateColumnRenderer).as().keyed('date'); builder.registerType(DateEventRenderer).as().keyed('date'); // Resource mode renderers (using same renderers for now) builder.registerType(DateHeaderRenderer).as().keyed('resource'); builder.registerType(DateColumnRenderer).as().keyed('resource'); builder.registerType(DateEventRenderer).as().keyed('resource'); builder.registerType(DateService).as().singleInstance(); builder.registerType(EventRenderingService).as().singleInstance(); builder.registerType(GridRenderer).as().singleInstance(); builder.registerType(GridManager).as().singleInstance(); builder.registerType(ScrollManager).as().singleInstance(); builder.registerType(NavigationManager).as().singleInstance(); builder.registerType(ViewManager).as().singleInstance(); builder.registerType(DragDropManager).as().singleInstance(); builder.registerType(AllDayManager).as().singleInstance(); builder.registerType(ResizeHandleManager).as().singleInstance(); builder.registerType(EdgeScrollManager).as().singleInstance(); builder.registerType(DragHoverManager).as().singleInstance(); builder.registerType(HeaderManager).as().singleInstance(); builder.registerType(CalendarManager).as().singleInstance(); builder.registerType(EventManager).as().singleInstance(); // Build the container const app = builder.build(); // Get managers from container const eb = app.resolveType(); const calendarManager = app.resolveType(); const eventManager = app.resolveType(); const resizeHandleManager = app.resolveType(); const headerManager = app.resolveType(); const dragDropManager = app.resolveType(); const viewManager = app.resolveType(); const navigationManager = app.resolveType(); const edgeScrollManager = app.resolveType(); const dragHoverManager = app.resolveType(); const allDayManager = app.resolveType(); // Initialize managers await calendarManager.initialize?.(); await resizeHandleManager.initialize?.(); // Handle deep linking after managers are initialized await handleDeepLinking(eventManager); // Expose to window for debugging (with proper typing) (window as Window & { calendarDebug?: { eventBus: typeof eventBus; app: typeof app; calendarManager: typeof calendarManager; eventManager: typeof eventManager; }; }).calendarDebug = { eventBus, app, calendarManager, eventManager, }; } catch (error) { throw error; } } // Initialize when DOM is ready - now handles async properly if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { initializeCalendar().catch(error => { }); }); } else { initializeCalendar().catch(error => { }); }