Refactor calendar rendering with RenderBuilder

Simplifies calendar rendering process by introducing a new RenderBuilder pattern

Improves flexibility and modularity of grouping renderer chain
Decouples rendering logic from specific grouping types
Enables dynamic column span calculation and recursive rendering

Reduces complexity in CalendarOrchestrator
Enhances type safety and simplifies renderer interfaces
This commit is contained in:
Janus C. H. Knudsen 2025-12-09 00:51:41 +01:00
parent 27561750f8
commit a3a1b9a421
9 changed files with 230 additions and 155 deletions

View file

@ -1,16 +1,37 @@
import { IGroupingRenderer } from '../../core/IGroupingRenderer';
import { RenderContext } from '../../core/RenderContext';
import { from, IEnumerable } from 'ts-linq-light';
import { IGroupingRenderer, RenderContext } from '../../core/IGroupingRenderer';
import { NextFunction, RenderData } from '../../core/RenderBuilder';
export class ResourceRenderer implements IGroupingRenderer {
interface Resource {
id: string;
name?: string;
}
export class ResourceRenderer implements IGroupingRenderer<Resource> {
readonly type = 'resource';
render(context: RenderContext): void {
for (const resourceId of context.values) {
render(
resources: IEnumerable<Resource>,
data: RenderData,
next: NextFunction,
context: RenderContext
): void {
const dates = data.dates || from([]);
for (const resource of resources) {
const colspan = next.count(dates);
const cell = document.createElement('swp-resource-header');
cell.dataset.resourceId = resourceId;
cell.textContent = resourceId;
if (context.colspan > 1) cell.style.gridColumn = `span ${context.colspan}`;
cell.dataset.resourceId = resource.id;
cell.textContent = resource.name || resource.id;
if (colspan > 1) {
cell.style.gridColumn = `span ${colspan}`;
}
context.headerContainer.appendChild(cell);
next.render(dates);
}
}
}