Refactors rendering pipeline with flexible data handling
Removes hardcoded data from render context, allowing more dynamic renderer implementation Changes include: - Decoupling data retrieval from render context - Simplifying renderer interface - Supporting more flexible data traversal strategies Prepares for more modular and adaptable rendering approach
This commit is contained in:
parent
a3a1b9a421
commit
c16e432b29
5 changed files with 517 additions and 22 deletions
|
|
@ -2,7 +2,7 @@ import { from } from 'ts-linq-light';
|
|||
import { ViewConfig } from './ViewConfig';
|
||||
import { IGroupingRenderer, RenderContext } from './IGroupingRenderer';
|
||||
import { IGroupingStore } from './IGroupingStore';
|
||||
import { RenderBuilder, RenderData } from './RenderBuilder';
|
||||
import { RenderBuilder } from './RenderBuilder';
|
||||
import { EventRenderer } from '../features/event/EventRenderer';
|
||||
|
||||
export class CalendarOrchestrator {
|
||||
|
|
@ -37,15 +37,8 @@ export class CalendarOrchestrator {
|
|||
const types = from(viewConfig.groupings).select(g => g.type).toArray();
|
||||
headerContainer.dataset.levels = types.join(' ');
|
||||
|
||||
// Hent alt data
|
||||
const data: RenderData = {
|
||||
teams: this.getItems('team', viewConfig),
|
||||
resources: this.getItems('resource', viewConfig),
|
||||
dates: this.getItems('date', viewConfig)
|
||||
};
|
||||
|
||||
// Byg renderer chain
|
||||
const builder = new RenderBuilder(context, data);
|
||||
const builder = new RenderBuilder(context);
|
||||
|
||||
for (const grouping of viewConfig.groupings) {
|
||||
const renderer = this.getRenderer(grouping.type);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { IEnumerable } from 'ts-linq-light';
|
||||
import { NextFunction, RenderData } from './RenderBuilder';
|
||||
import { NextFunction } from './RenderBuilder';
|
||||
|
||||
export interface RenderContext {
|
||||
headerContainer: HTMLElement;
|
||||
|
|
@ -10,7 +10,6 @@ export interface IGroupingRenderer<T = unknown> {
|
|||
readonly type: string;
|
||||
render(
|
||||
items: IEnumerable<T>,
|
||||
data: RenderData,
|
||||
next: NextFunction,
|
||||
context: RenderContext
|
||||
): void;
|
||||
|
|
|
|||
|
|
@ -6,12 +6,6 @@ export interface NextFunction {
|
|||
render(items: IEnumerable<unknown>): void;
|
||||
}
|
||||
|
||||
export interface RenderData {
|
||||
teams?: IEnumerable<unknown>;
|
||||
resources?: IEnumerable<unknown>;
|
||||
dates?: IEnumerable<unknown>;
|
||||
}
|
||||
|
||||
interface RenderLevel {
|
||||
renderer: IGroupingRenderer;
|
||||
items: IEnumerable<unknown>;
|
||||
|
|
@ -20,10 +14,7 @@ interface RenderLevel {
|
|||
export class RenderBuilder {
|
||||
private levels: RenderLevel[] = [];
|
||||
|
||||
constructor(
|
||||
private context: RenderContext,
|
||||
private data: RenderData
|
||||
) {}
|
||||
constructor(private context: RenderContext) {}
|
||||
|
||||
add(renderer: IGroupingRenderer, items: IEnumerable<unknown>): this {
|
||||
this.levels.push({ renderer, items });
|
||||
|
|
@ -66,7 +57,7 @@ export class RenderBuilder {
|
|||
return total || from(items).count();
|
||||
},
|
||||
render: (items) => {
|
||||
level.renderer.render(items, this.data, nextChain, this.context);
|
||||
level.renderer.render(items, nextChain, this.context);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue