diff --git a/src/di/container.ts b/src/di/container.ts index ca851e1..848d540 100644 --- a/src/di/container.ts +++ b/src/di/container.ts @@ -3,7 +3,7 @@ * Configures all bindings with proper dependency resolution */ -import { Container } from 'brandi'; +import { Container, injected } from 'brandi'; import { TOKENS } from './tokens'; import { eventBus } from '../core/EventBus'; import { calendarConfig } from '../core/CalendarConfig'; @@ -57,57 +57,103 @@ export function createContainer(): Container { container.bind(TOKENS.eventRendererStrategy).toConstant(new DateEventRenderer()); } - // Create instances manually and bind as constants (singletons) - // This is simpler than using decorators or complex factory setup + // Proper Brandi DI bindings with injected() declarations - const eventManager = new EventManager(eventBus); - container.bind(TOKENS.eventManager).toConstant(eventManager); + // EventManager + injected(EventManager, TOKENS.eventBus); + container + .bind(TOKENS.eventManager) + .toInstance(EventManager) + .inSingletonScope(); - const eventRenderer = new EventRenderingService(eventBus, eventManager, container.get(TOKENS.eventRendererStrategy)); - container.bind(TOKENS.eventRenderer).toConstant(eventRenderer); + // EventRenderingService + injected(EventRenderingService, TOKENS.eventBus, TOKENS.eventManager, TOKENS.eventRendererStrategy); + container + .bind(TOKENS.eventRenderer) + .toInstance(EventRenderingService) + .inSingletonScope(); - const gridRenderer = new GridRenderer(container.get(TOKENS.columnRenderer)); - container.bind(TOKENS.gridRenderer).toConstant(gridRenderer); + // GridRenderer + injected(GridRenderer, TOKENS.columnRenderer); + container + .bind(TOKENS.gridRenderer) + .toInstance(GridRenderer) + .inSingletonScope(); - const gridManager = new GridManager(gridRenderer); - container.bind(TOKENS.gridManager).toConstant(gridManager); + // GridManager + injected(GridManager, TOKENS.gridRenderer); + container + .bind(TOKENS.gridManager) + .toInstance(GridManager) + .inSingletonScope(); - const scrollManager = new ScrollManager(); - container.bind(TOKENS.scrollManager).toConstant(scrollManager); + // ScrollManager (no dependencies) + container + .bind(TOKENS.scrollManager) + .toInstance(ScrollManager) + .inSingletonScope(); - const navigationManager = new NavigationManager(eventBus, eventRenderer, gridRenderer); - container.bind(TOKENS.navigationManager).toConstant(navigationManager); + // NavigationManager + injected(NavigationManager, TOKENS.eventBus, TOKENS.eventRenderer, TOKENS.gridRenderer); + container + .bind(TOKENS.navigationManager) + .toInstance(NavigationManager) + .inSingletonScope(); - const viewManager = new ViewManager(eventBus); - container.bind(TOKENS.viewManager).toConstant(viewManager); + // ViewManager + injected(ViewManager, TOKENS.eventBus); + container + .bind(TOKENS.viewManager) + .toInstance(ViewManager) + .inSingletonScope(); - const dragDropManager = new DragDropManager(eventBus); - container.bind(TOKENS.dragDropManager).toConstant(dragDropManager); + // DragDropManager + injected(DragDropManager, TOKENS.eventBus); + container + .bind(TOKENS.dragDropManager) + .toInstance(DragDropManager) + .inSingletonScope(); - const allDayManager = new AllDayManager(eventManager); - container.bind(TOKENS.allDayManager).toConstant(allDayManager); + // AllDayManager + injected(AllDayManager, TOKENS.eventManager); + container + .bind(TOKENS.allDayManager) + .toInstance(AllDayManager) + .inSingletonScope(); - const resizeHandleManager = new ResizeHandleManager(); - container.bind(TOKENS.resizeHandleManager).toConstant(resizeHandleManager); + // ResizeHandleManager (no dependencies) + container + .bind(TOKENS.resizeHandleManager) + .toInstance(ResizeHandleManager) + .inSingletonScope(); - const edgeScrollManager = new EdgeScrollManager(eventBus); - container.bind(TOKENS.edgeScrollManager).toConstant(edgeScrollManager); + // EdgeScrollManager + injected(EdgeScrollManager, TOKENS.eventBus); + container + .bind(TOKENS.edgeScrollManager) + .toInstance(EdgeScrollManager) + .inSingletonScope(); - const dragHoverManager = new DragHoverManager(eventBus); - container.bind(TOKENS.dragHoverManager).toConstant(dragHoverManager); + // DragHoverManager + injected(DragHoverManager, TOKENS.eventBus); + container + .bind(TOKENS.dragHoverManager) + .toInstance(DragHoverManager) + .inSingletonScope(); - const headerManager = new HeaderManager(container.get(TOKENS.headerRenderer)); - container.bind(TOKENS.headerManager).toConstant(headerManager); + // HeaderManager + injected(HeaderManager, TOKENS.headerRenderer); + container + .bind(TOKENS.headerManager) + .toInstance(HeaderManager) + .inSingletonScope(); - // CalendarManager depends on multiple managers - const calendarManager = new CalendarManager( - eventBus, - eventManager, - gridManager, - eventRenderer, - scrollManager - ); - container.bind(TOKENS.calendarManager).toConstant(calendarManager); + // CalendarManager + injected(CalendarManager, TOKENS.eventBus, TOKENS.eventManager, TOKENS.gridManager, TOKENS.eventRenderer, TOKENS.scrollManager); + container + .bind(TOKENS.calendarManager) + .toInstance(CalendarManager) + .inSingletonScope(); return container; } diff --git a/src/factories/ManagerFactory.ts b/src/factories/ManagerFactory.ts deleted file mode 100644 index 858b010..0000000 --- a/src/factories/ManagerFactory.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { IEventBus } from '../types/CalendarTypes'; -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 { CalendarManagers } from '../types/ManagerTypes'; -import { HeaderManager } from '../managers/HeaderManager'; - -/** - * Factory for creating and managing calendar managers with proper dependency injection - */ -export class ManagerFactory { - private static instance: ManagerFactory; - - private constructor() {} - - public static getInstance(): ManagerFactory { - if (!ManagerFactory.instance) { - ManagerFactory.instance = new ManagerFactory(); - } - return ManagerFactory.instance; - } - - /** - * Create all managers with proper dependency injection - */ - public createManagers(eventBus: IEventBus): CalendarManagers { - - // Create managers in dependency order - const eventManager = new EventManager(eventBus); - const eventRenderer = new EventRenderingService(eventBus, eventManager); - const gridManager = new GridManager(); - const scrollManager = new ScrollManager(); - const navigationManager = new NavigationManager(eventBus, eventRenderer); - const viewManager = new ViewManager(eventBus); - const dragDropManager = new DragDropManager(eventBus); - const allDayManager = new AllDayManager(eventManager); - const resizeHandleManager = new ResizeHandleManager(); - const edgeScrollManager = new EdgeScrollManager(eventBus); - const dragHoverManager = new DragHoverManager(eventBus); - // HeaderManager now requires HeaderRenderer via DI - will be created in Brandi container - // const headerManager = new HeaderManager(); - - // CalendarManager depends on all other managers - const calendarManager = new CalendarManager( - eventBus, - eventManager, - gridManager, - eventRenderer, - scrollManager - ); - - - return { - eventManager, - eventRenderer, - gridManager, - scrollManager, - navigationManager, - viewManager, - calendarManager, - dragDropManager, - allDayManager, - resizeHandleManager, - edgeScrollManager, - dragHoverManager, - headerManager: null as any // HeaderManager created in Brandi container - }; - } - - /** - * Initialize all managers in the correct order - */ - public async initializeManagers(managers: CalendarManagers): Promise { - - try { - await managers.calendarManager.initialize?.(); - await managers.resizeHandleManager.initialize?.(); - - } catch (error) { - throw error; - } - } -} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 83d6b39..e1d5354 100644 --- a/src/index.ts +++ b/src/index.ts @@ -52,6 +52,13 @@ async function initializeCalendar(): Promise { const calendarManager = container.get(TOKENS.calendarManager); const eventManager = container.get(TOKENS.eventManager); const resizeHandleManager = container.get(TOKENS.resizeHandleManager); + const headerManager = container.get(TOKENS.headerManager); + const dragDropManager = container.get(TOKENS.dragDropManager); + const viewManager = container.get(TOKENS.viewManager); + const navigationManager = container.get(TOKENS.navigationManager); + const edgeScrollManager = container.get(TOKENS.edgeScrollManager); + const dragHoverManager = container.get(TOKENS.dragHoverManager); + const allDayManager = container.get(TOKENS.allDayManager); // Initialize managers await calendarManager.initialize?.(); @@ -84,7 +91,7 @@ async function initializeCalendar(): Promise { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { initializeCalendar().catch(error => { - }); + }); }); } else { initializeCalendar().catch(error => { diff --git a/src/renderers/GridRenderer.ts b/src/renderers/GridRenderer.ts index 887a33b..5658ae0 100644 --- a/src/renderers/GridRenderer.ts +++ b/src/renderers/GridRenderer.ts @@ -1,7 +1,7 @@ import { calendarConfig } from '../core/CalendarConfig'; import { ResourceCalendarData, CalendarView } from '../types/CalendarTypes'; import { CalendarTypeFactory } from '../factories/CalendarTypeFactory'; -import { ColumnRenderContext } from './ColumnRenderer'; +import { ColumnRenderer, ColumnRenderContext } from './ColumnRenderer'; import { eventBus } from '../core/EventBus'; import { DateService } from '../utils/DateService'; import { CoreEvents } from '../constants/CoreEvents';