import { IRenderer, IRenderContext } from './IGroupingRenderer'; import { buildPipeline } from './RenderBuilder'; import { EventRenderer } from '../features/event/EventRenderer'; import { ViewConfig } from './ViewConfig'; export class CalendarOrchestrator { constructor( private allRenderers: IRenderer[], 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: IRenderContext = { headerContainer, columnContainer, filter }; // Clear headerContainer.innerHTML = ''; columnContainer.innerHTML = ''; // Sæt data-levels attribut for CSS grid-row styling const levels = viewConfig.groupings.map(g => g.type).join(' '); headerContainer.dataset.levels = levels; // 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); await pipeline.run(context); // Render events med hele filter (date + resource) await this.eventRenderer.render(container, filter); } private selectRenderers(viewConfig: ViewConfig): IRenderer[] { const types = viewConfig.groupings.map(g => g.type); // Sortér renderers i samme rækkefølge som viewConfig.groupings return types .map(type => this.allRenderers.find(r => r.type === type)) .filter((r): r is IRenderer => r !== undefined); } 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; } }