2025-12-09 21:02:44 +01:00
|
|
|
import { Renderer, RenderContext } from './IGroupingRenderer';
|
|
|
|
|
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(
|
2025-12-09 21:02:44 +01:00
|
|
|
private allRenderers: Renderer[],
|
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: RenderContext = { headerContainer, columnContainer, filter };
|
2025-12-06 01:22:04 +01:00
|
|
|
|
2025-12-09 21:02:44 +01:00
|
|
|
// Clear
|
2025-12-09 00:51:41 +01:00
|
|
|
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);
|
2025-12-09 00:51:41 +01:00
|
|
|
container.style.setProperty('--grid-columns', String(totalColumns));
|
|
|
|
|
|
2025-12-09 21:02:44 +01:00
|
|
|
// Byg og kør pipeline
|
|
|
|
|
const pipeline = buildPipeline(activeRenderers);
|
|
|
|
|
pipeline.run(context);
|
2025-12-06 01:22:04 +01:00
|
|
|
|
2025-12-09 21:02:44 +01:00
|
|
|
// Events
|
|
|
|
|
const dates = filter['date'] || [];
|
|
|
|
|
await this.eventRenderer.render(container, dates);
|
2025-12-08 20:05:32 +01:00
|
|
|
}
|
|
|
|
|
|
2025-12-09 21:02:44 +01:00
|
|
|
private selectRenderers(viewConfig: ViewConfig): Renderer[] {
|
|
|
|
|
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 Renderer => 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
|
|
|
}
|
|
|
|
|
}
|