diff --git a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx index 3e6d389e2..9892eb0ca 100644 --- a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx +++ b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx @@ -9,6 +9,9 @@ import { } from "./datatypes"; export { + AbstractComponentModelEditor, + ComponentModelEditorProps, + ComponentInfo, PageModelEditor, PageModelEditorState, // PageModelEditorProps, @@ -696,16 +699,8 @@ class ContainerListComponent }); } - // private deleteContainer(event: React.MouseEvent): void { private deleteContainer(containerKey: string): void { - // event.preventDefault(); - - // const deleteButton: HTMLButtonElement - // = event.target as HTMLButtonElement; - // const containerKey: string = deleteButton - // .getAttribute("data-containerKey") as string; - const init: RequestInit = { body: JSON.stringify({}), @@ -807,13 +802,11 @@ class ContainerModelComponent
- + ; } private fetchComponents(): void { @@ -845,8 +838,8 @@ class ContainerModelComponent .catch((error) => { const errorMessages: string[] = this .state.errorMessages; - errorMessages.push(`Failed to retrieve PageModels ` + - `from ${componentsUrl}: ${error.message}`); + errorMessages.push(`Failed to retrieve PageModels ` + + `from ${componentsUrl}: ${error.message}`); this.setState({ ...this.state, @@ -880,6 +873,18 @@ class ContainerModelComponent }); } + private getComponentModelEditor( + component: ComponentModel): React.ReactNode { + + if (PageModelEditor.getAvailableComponents()[component.type] === null) { + return PageModelEditor + .getAvailableComponents()[component.type](component); + + } else { + return ; + } + } + private deleteContainer( event: React.MouseEvent, containerKey: string): void { @@ -890,6 +895,55 @@ class ContainerModelComponent } } +interface ComponentModelEditorProps { + + component: ComponentModel; +} + +abstract class AbstractComponentModelEditor + extends React.Component { + + constructor(props: ComponentModelEditorProps) { + + super(props); + } + + public abstract renderPropertyList(): React.ReactFragment; + + public abstract renderEditorDialog(): React.ReactFragment; + + public render(): React.ReactNode { + + return
  • +
    +
    Key
    +
    {this.props.component.key}
    +
    Type
    +
    {this.props.component.type}
    + {this.renderPropertyList} +
    +
  • ; + } +} + +class DefaultComponentModelEditor extends AbstractComponentModelEditor { + + public renderPropertyList(): React.ReactFragment { + + return ; + } + + public renderEditorDialog(): React.ReactFragment { + + return ; + } + + public render(): React.ReactNode { + return super.render(); + } + +} + // interface PageModelEditorProps { // // } @@ -917,7 +971,27 @@ interface ComponentInfo { class PageModelEditor extends React.Component<{}, PageModelEditorState> { - private static components: ComponentInfo[]; + public static getAvailableComponents(): { + [type: string]: (component: ComponentModel) => React.ReactFragment} { + + return { + ...PageModelEditor.componentModelEditors, + }; + } + + public static registerComponentModelEditor( + type: string, + generator: ((component: ComponentModel) => React.ReactFragment)): void { + + PageModelEditor.componentModelEditors = { + ...PageModelEditor.componentModelEditors, + type: generator, + }; + } + + private static componentModelEditors: { + [type: string]: (component: ComponentModel) => React.ReactFragment; + }; private static getDispatcherPrefix(): string { @@ -955,25 +1029,6 @@ class PageModelEditor } } - private static registerComponent(component: ComponentInfo): void { - - PageModelEditor.components = [ - ...PageModelEditor.components, - component, - ]; - - PageModelEditor.components.sort((component1, component2) => { - - if (component1.label < component2.label) { - return -1; - } else if (component1.label > component2.label) { - return 1; - } else { - return 0; - } - }); - } - constructor(props: any) { super(props); diff --git a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/datatypes.ts b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/datatypes.ts index a2a002f33..f8dab5139 100644 --- a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/datatypes.ts +++ b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/datatypes.ts @@ -3,7 +3,7 @@ export { ContainerModel, PageModel, PageModelVersion, - PublicationStatus + PublicationStatus, }; interface ComponentModel { @@ -14,6 +14,7 @@ interface ComponentModel { key: string; modelUuid: string; styleAttribute: string; + type: string; uuid: string; }