src/app/shared/widgets/widget.metadata.registry.ts
Widget inputs |
Widget outputs |
Properties |
|
Methods |
|
Private Static widgets |
widgets:
|
Type : literal type
|
Default value : {}
|
Static getOrCreateWidgetDescriptor | ||||||
getOrCreateWidgetDescriptor(target: any)
|
||||||
Parameters :
Returns :
WidgetMetadata
|
Static getWidgetDescriptor | ||||||
getWidgetDescriptor(id: string)
|
||||||
Parameters :
Returns :
WidgetMetadata
|
Static registerWidget | ||||||
registerWidget(target: any)
|
||||||
Parameters :
Returns :
void
|
import { WidgetMetadata } from "./index";
declare var window: any;
declare var Reflect: any;
const NM_WIDGET_DESCRIPTOR = "nm:widget-descriptor";
export function registerWidgetComponents(widgets: any | any[]) {
if (window.$widgets == null) {
window.$widgets = [];
}
if (Array.isArray(widgets)) {
window.$widgets.push(...widgets);
} else {
window.$widgets.push(widgets);
}
}
export class NmWidgetMetadataRegistry {
private static widgets: { [key: string]: WidgetMetadata } = {};
static getOrCreateWidgetDescriptor(target: any): WidgetMetadata {
if (!Reflect.hasOwnMetadata(NM_WIDGET_DESCRIPTOR, target)) {
let descriptor: WidgetMetadata;
// clone parent class's meta data configuration
if (Reflect.hasMetadata(NM_WIDGET_DESCRIPTOR, target)) {
let parent = Reflect.getMetadata(NM_WIDGET_DESCRIPTOR, target);
descriptor = Object.assign({}, parent);
descriptor.inputs = Object.assign({}, parent.inputs);
descriptor.outputs = Object.assign({}, parent.outputs);
} else {
descriptor = {
inputs: {},
outputs: {},
};
}
Reflect.defineMetadata(NM_WIDGET_DESCRIPTOR, descriptor, target);
}
return Reflect.getOwnMetadata(NM_WIDGET_DESCRIPTOR, target);
}
static registerWidget(target: any) {
let descriptor = NmWidgetMetadataRegistry.getOrCreateWidgetDescriptor(
target
);
if (!descriptor) {
throw new Error("no descriptor found for " + JSON.stringify(target));
}
NmWidgetMetadataRegistry.widgets[descriptor.widgetId] = descriptor;
}
static getWidgetDescriptor(id: string): WidgetMetadata {
return NmWidgetMetadataRegistry.widgets[id];
}
}