Calendar/src/v2/core/CalendarOrchestrator.ts

64 lines
2.4 KiB
TypeScript
Raw Normal View History

import { IRenderer, IRenderContext } from './IGroupingRenderer';
2025-12-09 21:02:44 +01:00
import { buildPipeline } from './RenderBuilder';
2025-12-08 20:05:32 +01:00
import { EventRenderer } from '../features/event/EventRenderer';
2025-12-09 21:02:44 +01:00
import { ViewConfig } from './ViewConfig';
2025-12-06 01:22:04 +01:00
export class CalendarOrchestrator {
constructor(
private allRenderers: IRenderer[],
2025-12-08 20:05:32 +01:00
private eventRenderer: EventRenderer
2025-12-06 01:22:04 +01:00
) {}
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');
}
2025-12-09 21:02:44 +01:00
// Byg filter fra viewConfig
const filter: Record<string, string[]> = {};
for (const grouping of viewConfig.groupings) {
filter[grouping.type] = grouping.values;
}
const context: IRenderContext = { headerContainer, columnContainer, filter };
2025-12-06 01:22:04 +01:00
2025-12-09 21:02:44 +01:00
// Clear
headerContainer.innerHTML = '';
columnContainer.innerHTML = '';
2025-12-06 01:22:04 +01:00
2025-12-09 21:24:17 +01:00
// Sæt data-levels attribut for CSS grid-row styling
const levels = viewConfig.groupings.map(g => g.type).join(' ');
headerContainer.dataset.levels = levels;
2025-12-09 21:02:44 +01:00
// Vælg renderers baseret på groupings types
const activeRenderers = this.selectRenderers(viewConfig);
2025-12-06 01:22:04 +01:00
2025-12-09 21:02:44 +01:00
// Beregn total kolonner dynamisk
const totalColumns = this.calculateTotalColumns(viewConfig);
container.style.setProperty('--grid-columns', String(totalColumns));
2025-12-09 21:02:44 +01:00
// Byg og kør pipeline
const pipeline = buildPipeline(activeRenderers);
await pipeline.run(context);
2025-12-06 01:22:04 +01:00
// Render events med hele filter (date + resource)
await this.eventRenderer.render(container, filter);
2025-12-08 20:05:32 +01:00
}
private selectRenderers(viewConfig: ViewConfig): IRenderer[] {
2025-12-09 21:02:44 +01:00
const types = viewConfig.groupings.map(g => g.type);
2025-12-09 21:24:17 +01:00
// 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);
2025-12-06 01:22:04 +01:00
}
2025-12-09 21:02:44 +01:00
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;
2025-12-06 01:22:04 +01:00
}
}