import { Renderer, RenderContext } from './IGroupingRenderer'; import { buildPipeline } from './RenderBuilder'; import { EventRenderer } from '../features/event/EventRenderer'; import { ViewConfig } from './ViewConfig'; export class CalendarOrchestrator { constructor( private allRenderers: Renderer[], private eventRenderer: EventRenderer ) {} async render(viewConfig: ViewConfig, container: HTMLElement): Promise { const headerContainer = container.querySelector('swp-calendar-header') as HTMLElement; const columnContainer = container.querySelector('swp-day-columns') as HTMLElement; if (!headerContainer || !columnContainer) { throw new Error('Missing swp-calendar-header or swp-day-columns'); } // Byg filter fra viewConfig const filter: Record = {}; for (const grouping of viewConfig.groupings) { filter[grouping.type] = grouping.values; } const context: RenderContext = { headerContainer, columnContainer, filter }; // Clear headerContainer.innerHTML = ''; columnContainer.innerHTML = ''; // Vælg renderers baseret på groupings types const activeRenderers = this.selectRenderers(viewConfig); // Beregn total kolonner dynamisk const totalColumns = this.calculateTotalColumns(viewConfig); container.style.setProperty('--grid-columns', String(totalColumns)); // Byg og kør pipeline const pipeline = buildPipeline(activeRenderers); pipeline.run(context); // Events const dates = filter['date'] || []; await this.eventRenderer.render(container, dates); } private selectRenderers(viewConfig: ViewConfig): Renderer[] { const types = viewConfig.groupings.map(g => g.type); return this.allRenderers.filter(r => types.includes(r.type)); } private calculateTotalColumns(viewConfig: ViewConfig): number { const dateCount = viewConfig.groupings.find(g => g.type === 'date')?.values.length || 1; const resourceCount = viewConfig.groupings.find(g => g.type === 'resource')?.values.length || 1; return dateCount * resourceCount; } }