Calendar/src/v2/core/CalendarOrchestrator.ts
Janus C. H. Knudsen f39e38986c wip
2025-12-09 21:24:17 +01:00

64 lines
2.4 KiB
TypeScript

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<void> {
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<string, string[]> = {};
for (const grouping of viewConfig.groupings) {
filter[grouping.type] = grouping.values;
}
const context: RenderContext = { 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);
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);
// 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 Renderer => 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;
}
}