phase-6: add registry-driven dynamic page-section-widget rendering engine
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
import { SectionConfig } from '../../shared/models/config';
|
||||
import { WidgetRenderNode } from '../widget-host/widget-host.model';
|
||||
|
||||
export interface SectionRenderNode {
|
||||
id: string;
|
||||
type: string;
|
||||
order: number;
|
||||
featureFlag?: string;
|
||||
visible?: boolean;
|
||||
widgets: WidgetRenderNode[];
|
||||
source: SectionConfig;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { SectionConfig } from '../../shared/models/config';
|
||||
import { SectionRenderNode } from './section-renderer.model';
|
||||
import { WidgetRenderNode } from '../widget-host/widget-host.model';
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class SectionRendererService {
|
||||
toRenderNode(section: SectionConfig): SectionRenderNode {
|
||||
const widgets = (section.widgets ?? [])
|
||||
.filter(widget => widget.visible !== false)
|
||||
.map<WidgetRenderNode>(widget => ({
|
||||
id: widget.id,
|
||||
type: widget.type,
|
||||
version: widget.version,
|
||||
props: widget.props ?? {},
|
||||
featureFlag: widget.featureFlag,
|
||||
visible: widget.visible,
|
||||
source: widget
|
||||
}));
|
||||
|
||||
return {
|
||||
id: section.id,
|
||||
type: section.type,
|
||||
order: section.order,
|
||||
featureFlag: section.featureFlag,
|
||||
visible: section.visible,
|
||||
widgets,
|
||||
source: section
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user