Implements FilterTemplate system for event matching

Introduces flexible key-based filtering for calendar events across different view configurations

Adds new FilterTemplate class to:
- Define event matching rules based on view configuration
- Support multi-level grouping (team/resource/date)
- Handle dynamic key generation for columns and events

Enhances view configuration with explicit id properties and derived fields
This commit is contained in:
Janus C. H. Knudsen 2025-12-15 00:33:27 +01:00
parent c2f7564f8e
commit dd647acab8
8 changed files with 331 additions and 41 deletions

View file

@ -4,13 +4,16 @@ import { EventRenderer } from '../features/event/EventRenderer';
import { ScheduleRenderer } from '../features/schedule/ScheduleRenderer';
import { HeaderDrawerRenderer } from '../features/headerdrawer/HeaderDrawerRenderer';
import { ViewConfig } from './ViewConfig';
import { FilterTemplate } from './FilterTemplate';
import { DateService } from './DateService';
export class CalendarOrchestrator {
constructor(
private allRenderers: IRenderer[],
private eventRenderer: EventRenderer,
private scheduleRenderer: ScheduleRenderer,
private headerDrawerRenderer: HeaderDrawerRenderer
private headerDrawerRenderer: HeaderDrawerRenderer,
private dateService: DateService
) {}
async render(viewConfig: ViewConfig, container: HTMLElement): Promise<void> {
@ -26,6 +29,12 @@ export class CalendarOrchestrator {
filter[grouping.type] = grouping.values;
}
// Byg FilterTemplate fra viewConfig groupings
const filterTemplate = new FilterTemplate(this.dateService);
for (const grouping of viewConfig.groupings) {
filterTemplate.addField(grouping.idProperty, grouping.derivedFrom);
}
const context: IRenderContext = { headerContainer, columnContainer, filter };
// Clear
@ -50,11 +59,11 @@ export class CalendarOrchestrator {
// Render schedule unavailable zones (før events)
await this.scheduleRenderer.render(container, filter);
// Render timed events in grid
await this.eventRenderer.render(container, filter);
// Render timed events in grid (med filterTemplate til matching)
await this.eventRenderer.render(container, filter, filterTemplate);
// Render allDay events in header drawer
await this.headerDrawerRenderer.render(container, filter);
// Render allDay events in header drawer (med filterTemplate til matching)
await this.headerDrawerRenderer.render(container, filter, filterTemplate);
}
private selectRenderers(viewConfig: ViewConfig): IRenderer[] {