From a5d7865c674bfbb596c7adfa3053d868c3d53236 Mon Sep 17 00:00:00 2001 From: jensp Date: Mon, 16 Jul 2018 18:33:08 +0000 Subject: [PATCH] CCM NG: Some work for the PageModelEditor git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5611 8810af33-2d31-482b-a856-94f89814c4df --- .../ccm-cms/ccm-cms-pagemodelseditor.tsx | 139 +++++++++++++++++- .../ccm-pagemodelseditor/PageModelsEditor.tsx | 74 ++++++++-- .../themes/foundry/foundry/styles/admin.css | 21 +++ 3 files changed, 223 insertions(+), 11 deletions(-) diff --git a/ccm-cms-js/src/main/typescript/ccm-cms/ccm-cms-pagemodelseditor.tsx b/ccm-cms-js/src/main/typescript/ccm-cms/ccm-cms-pagemodelseditor.tsx index e89f83255..e5b15ff5f 100644 --- a/ccm-cms-js/src/main/typescript/ccm-cms/ccm-cms-pagemodelseditor.tsx +++ b/ccm-cms-js/src/main/typescript/ccm-cms/ccm-cms-pagemodelseditor.tsx @@ -1,9 +1,146 @@ import * as React from "react"; import { render } from "react-dom"; -import { PageModelEditor } from "ccm-pagemodelseditor"; +import { AbstractComponentModelEditor, + ComponentModel, + ComponentModelEditorProps, + ComponentModelEditorState, + PageModelEditor, + +} from "ccm-pagemodelseditor"; + +PageModelEditor.registerComponentModelEditor( + "org.librecms.pagemodel.CategoryTreeComponent", + (categoryTree) => { + return + } +); +PageModelEditor.registerComponentModelEditor( + "org.librecms.pagemodel.ItemListComponent", + (itemList) => { + return + } +); render( , document.getElementById("cms-content"), ); + +interface CategoryTreeComponent extends ComponentModel { + + showFullTree: boolean; +} + +interface CategoryTreeComponentEditorProps + extends ComponentModelEditorProps { + +} + +interface CategoryTreeComponentEditorState + extends ComponentModelEditorState { + + showFullTree: boolean; +} + + +class CategoryTreeComponentEditor + extends AbstractComponentModelEditor { + + public constructor(props: CategoryTreeComponentEditorProps) { + + super(props); + + this.setState({ + ...this.state as any, + dialogExpanded: "dialogClosed", + showFullTree: false, + }); + } + + public renderPropertyList(): React.ReactFragment { + + return +
Show full tree
+
{this.props.component.showFullTree}
+
; + } + + public renderEditorDialog(): React.ReactFragment { + + return ; + } +} + +interface ItemListComponent extends ComponentModel { + + descending: boolean; + limitToType: string; + pageSize: number; + listOrder: string[], +} + +interface ItemListComponentEditorProps + extends ComponentModelEditorProps { + +} + +interface ItemListComponentEditorState + extends ComponentModelEditorState { + + descending: boolean; + limitToType: string; + pageSize: number; + listOrder: string[]; +} + +class ItemListComponentEditor + extends AbstractComponentModelEditor { + + public constructor(props: ItemListComponentEditorProps) { + + super(props as any); + + this.setState({ + ...this.state, + dialogExpanded: "dialogClosed", + descending: false, + limitToType: "", + pageSize: 30, + listOrder: [ "objectId", ], + }); + } + + public renderPropertyList(): React.ReactFragment { + + return +
descending
+
{this.props.component.descending}
+
limitToType
+
{this.props.component.limitToType}
+
pageSize
+
{this.props.component.pageSize}
+
listOrder
+
+
    + {this.props.component.listOrder.map((order) => { +
  • + {order} +
  • + })} +
+
+
+ } + + public renderEditorDialog(): React.ReactFragment { + + return ; + } +} diff --git a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx index 9892eb0ca..f460d8ccd 100644 --- a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx +++ b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx @@ -10,7 +10,9 @@ import { export { AbstractComponentModelEditor, + ComponentModel, ComponentModelEditorProps, + ComponentModelEditorState, ComponentInfo, PageModelEditor, PageModelEditorState, @@ -876,10 +878,10 @@ class ContainerModelComponent private getComponentModelEditor( component: ComponentModel): React.ReactNode { - if (PageModelEditor.getAvailableComponents()[component.type] === null) { + if (PageModelEditor.getAvailableComponents()[component.type]) { + console.log(`Found editor generator: ${PageModelEditor.getAvailableComponents()[component.type]}`); return PageModelEditor .getAvailableComponents()[component.type](component); - } else { return ; } @@ -895,17 +897,31 @@ class ContainerModelComponent } } -interface ComponentModelEditorProps { +interface ComponentModelEditorProps { - component: ComponentModel; + component: C; } -abstract class AbstractComponentModelEditor - extends React.Component { +interface ComponentModelEditorState { - constructor(props: ComponentModelEditorProps) { + dialogExpanded: string; +} - super(props); +abstract class AbstractComponentModelEditor< + C extends ComponentModel, + P extends ComponentModelEditorProps, + S extends ComponentModelEditorState> + + extends React.Component { + + constructor(props: ComponentModelEditorProps) { + + super(props as any); + + this.setState({ + ...this.state as any, + dialogExpanded: "dialogClosed", + }); } public abstract renderPropertyList(): React.ReactFragment; @@ -914,7 +930,7 @@ abstract class AbstractComponentModelEditor public render(): React.ReactNode { - return
  • + return
  • Key
    {this.props.component.key}
    @@ -922,11 +938,46 @@ abstract class AbstractComponentModelEditor
    {this.props.component.type}
    {this.renderPropertyList}
    + + + {this.renderEditorDialog} +
  • ; } + + private toggleEditorDialog( + event: React.MouseEvent): void { + + if (this.state.dialogExpanded === "dialogExpanded") { + this.setState({ + ...this.state as any, + dialogExpanded: "dialogClosed", + }); + } else { + this.setState({ + ...this.state as any, + dialogExpanded: "dialogExpanded", + }); + } + } } -class DefaultComponentModelEditor extends AbstractComponentModelEditor { +class DefaultComponentModelEditor + extends AbstractComponentModelEditor< + ComponentModel, + ComponentModelEditorProps, + ComponentModelEditorState> { + + constructor(props: ComponentModelEditorProps) { + + super(props); + + this.setState({ + dialogExpanded: "dialogClosed", + }); + } public renderPropertyList(): React.ReactFragment { @@ -974,6 +1025,9 @@ class PageModelEditor public static getAvailableComponents(): { [type: string]: (component: ComponentModel) => React.ReactFragment} { + console.log("Available editors:"); + console.log(PageModelEditor.componentModelEditors.toString()); + return { ...PageModelEditor.componentModelEditors, }; diff --git a/ccm-theme-foundry/src/main/resources/themes/foundry/foundry/styles/admin.css b/ccm-theme-foundry/src/main/resources/themes/foundry/foundry/styles/admin.css index 040de0a63..da7e1f1c6 100644 --- a/ccm-theme-foundry/src/main/resources/themes/foundry/foundry/styles/admin.css +++ b/ccm-theme-foundry/src/main/resources/themes/foundry/foundry/styles/admin.css @@ -2064,3 +2064,24 @@ div.errorPanel { bottom: 5em; left: 5em; } */ + +li.componentModelEditor dialog.closed { + display: none; +} + +li.componentModelEditor dialog.closed { + + border: 2px solid #ccc; + border-radius: 3em; + + display: block; + + position: fixed; + top: 10vh; + right: 10vw; + bottom: 10vh; + left: 10vw; + + width: 80vw; + height: 80vh; +}