This commit is contained in:
Janus C. H. Knudsen 2025-10-15 00:58:29 +02:00
parent bf4b9b5064
commit b3b930c1f9
6 changed files with 21 additions and 19 deletions

View file

@ -27,6 +27,7 @@ import { HeaderManager } from '../managers/HeaderManager';
import { DateHeaderRenderer, ResourceHeaderRenderer } from '../renderers/HeaderRenderer'; import { DateHeaderRenderer, ResourceHeaderRenderer } from '../renderers/HeaderRenderer';
import { DateColumnRenderer, ResourceColumnRenderer } from '../renderers/ColumnRenderer'; import { DateColumnRenderer, ResourceColumnRenderer } from '../renderers/ColumnRenderer';
import { DateEventRenderer } from '../renderers/EventRenderer'; import { DateEventRenderer } from '../renderers/EventRenderer';
import { GridRenderer } from '../renderers/GridRenderer';
/** /**
* Create and configure the DI container * Create and configure the DI container
@ -62,16 +63,19 @@ export function createContainer(): Container {
const eventManager = new EventManager(eventBus); const eventManager = new EventManager(eventBus);
container.bind(TOKENS.eventManager).toConstant(eventManager); container.bind(TOKENS.eventManager).toConstant(eventManager);
const eventRenderer = new EventRenderingService(eventBus, eventManager); const eventRenderer = new EventRenderingService(eventBus, eventManager, container.get(TOKENS.eventRendererStrategy));
container.bind(TOKENS.eventRenderer).toConstant(eventRenderer); container.bind(TOKENS.eventRenderer).toConstant(eventRenderer);
const gridManager = new GridManager(); const gridRenderer = new GridRenderer(container.get(TOKENS.columnRenderer));
container.bind(TOKENS.gridRenderer).toConstant(gridRenderer);
const gridManager = new GridManager(gridRenderer);
container.bind(TOKENS.gridManager).toConstant(gridManager); container.bind(TOKENS.gridManager).toConstant(gridManager);
const scrollManager = new ScrollManager(); const scrollManager = new ScrollManager();
container.bind(TOKENS.scrollManager).toConstant(scrollManager); container.bind(TOKENS.scrollManager).toConstant(scrollManager);
const navigationManager = new NavigationManager(eventBus, eventRenderer); const navigationManager = new NavigationManager(eventBus, eventRenderer, gridRenderer);
container.bind(TOKENS.navigationManager).toConstant(navigationManager); container.bind(TOKENS.navigationManager).toConstant(navigationManager);
const viewManager = new ViewManager(eventBus); const viewManager = new ViewManager(eventBus);

View file

@ -21,6 +21,7 @@ import { HeaderManager } from '../managers/HeaderManager';
import { HeaderRenderer } from '../renderers/HeaderRenderer'; import { HeaderRenderer } from '../renderers/HeaderRenderer';
import { ColumnRenderer } from '../renderers/ColumnRenderer'; import { ColumnRenderer } from '../renderers/ColumnRenderer';
import { EventRendererStrategy } from '../renderers/EventRenderer'; import { EventRendererStrategy } from '../renderers/EventRenderer';
import { GridRenderer } from '../renderers/GridRenderer';
/** /**
* DI Tokens - Type-safe identifiers for dependency injection * DI Tokens - Type-safe identifiers for dependency injection
@ -33,6 +34,7 @@ export const TOKENS = {
headerRenderer: token<HeaderRenderer>('headerRenderer'), headerRenderer: token<HeaderRenderer>('headerRenderer'),
columnRenderer: token<ColumnRenderer>('columnRenderer'), columnRenderer: token<ColumnRenderer>('columnRenderer'),
eventRendererStrategy: token<EventRendererStrategy>('eventRendererStrategy'), eventRendererStrategy: token<EventRendererStrategy>('eventRendererStrategy'),
gridRenderer: token<GridRenderer>('gridRenderer'),
// Managers // Managers
eventManager: token<EventManager>('eventManager'), eventManager: token<EventManager>('eventManager'),

View file

@ -22,10 +22,10 @@ export class GridManager {
private gridRenderer: GridRenderer; private gridRenderer: GridRenderer;
private styleManager: GridStyleManager; private styleManager: GridStyleManager;
private dateService: DateService; private dateService: DateService;
constructor() { constructor(gridRenderer: GridRenderer) {
// Initialize GridRenderer and StyleManager with config // Inject GridRenderer via DI
this.gridRenderer = new GridRenderer(); this.gridRenderer = gridRenderer;
this.styleManager = new GridStyleManager(); this.styleManager = new GridStyleManager();
this.dateService = new DateService('Europe/Copenhagen'); this.dateService = new DateService('Europe/Copenhagen');
this.init(); this.init();

View file

@ -19,11 +19,11 @@ export class NavigationManager {
private targetWeek: Date; private targetWeek: Date;
private animationQueue: number = 0; private animationQueue: number = 0;
constructor(eventBus: IEventBus, eventRenderer: EventRenderingService) { constructor(eventBus: IEventBus, eventRenderer: EventRenderingService, gridRenderer: GridRenderer) {
this.eventBus = eventBus; this.eventBus = eventBus;
this.dateService = new DateService('Europe/Copenhagen'); this.dateService = new DateService('Europe/Copenhagen');
this.navigationRenderer = new NavigationRenderer(eventBus, eventRenderer); this.navigationRenderer = new NavigationRenderer(eventBus, eventRenderer);
this.gridRenderer = new GridRenderer(); this.gridRenderer = gridRenderer;
this.currentWeek = this.getISOWeekStart(new Date()); this.currentWeek = this.getISOWeekStart(new Date());
this.targetWeek = new Date(this.currentWeek); this.targetWeek = new Date(this.currentWeek);
this.init(); this.init();

View file

@ -21,13 +21,10 @@ export class EventRenderingService {
private dragMouseLeaveHeaderListener: ((event: Event) => void) | null = null; private dragMouseLeaveHeaderListener: ((event: Event) => void) | null = null;
constructor(eventBus: IEventBus, eventManager: EventManager) { constructor(eventBus: IEventBus, eventManager: EventManager, strategy: EventRendererStrategy) {
this.eventBus = eventBus; this.eventBus = eventBus;
this.eventManager = eventManager; this.eventManager = eventManager;
this.strategy = strategy;
// Cache strategy at initialization
const calendarType = calendarConfig.getCalendarMode();
this.strategy = CalendarTypeFactory.getEventRenderer(calendarType);
// Initialize DateService // Initialize DateService
const timezone = calendarConfig.getTimezone?.(); const timezone = calendarConfig.getTimezone?.();

View file

@ -15,10 +15,12 @@ export class GridRenderer {
private cachedGridContainer: HTMLElement | null = null; private cachedGridContainer: HTMLElement | null = null;
private cachedTimeAxis: HTMLElement | null = null; private cachedTimeAxis: HTMLElement | null = null;
private dateService: DateService; private dateService: DateService;
private columnRenderer: ColumnRenderer;
constructor() { constructor(columnRenderer: ColumnRenderer) {
const timezone = calendarConfig.getTimezone?.(); const timezone = calendarConfig.getTimezone?.();
this.dateService = new DateService(timezone); this.dateService = new DateService(timezone);
this.columnRenderer = columnRenderer;
} }
public renderGrid( public renderGrid(
@ -139,16 +141,13 @@ export class GridRenderer {
resourceData: ResourceCalendarData | null, resourceData: ResourceCalendarData | null,
view: CalendarView view: CalendarView
): void { ): void {
const calendarType = calendarConfig.getCalendarMode();
const columnRenderer = CalendarTypeFactory.getColumnRenderer(calendarType);
const context: ColumnRenderContext = { const context: ColumnRenderContext = {
currentWeek: currentDate, // ColumnRenderer expects currentWeek property currentWeek: currentDate, // ColumnRenderer expects currentWeek property
config: calendarConfig, config: calendarConfig,
resourceData: resourceData resourceData: resourceData
}; };
columnRenderer.render(columnContainer, context); this.columnRenderer.render(columnContainer, context);
} }
/** /**