CCM NG: Some work for the PageModelEditor
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5611 8810af33-2d31-482b-a856-94f89814c4df
Former-commit-id: 0af2170d81
pull/2/head
parent
95cef6009d
commit
be8f46f134
|
|
@ -1,9 +1,146 @@
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { render } from "react-dom";
|
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 <CategoryTreeComponentEditor
|
||||||
|
component={categoryTree as CategoryTreeComponent} />
|
||||||
|
}
|
||||||
|
);
|
||||||
|
PageModelEditor.registerComponentModelEditor(
|
||||||
|
"org.librecms.pagemodel.ItemListComponent",
|
||||||
|
(itemList) => {
|
||||||
|
return <ItemListComponentEditor
|
||||||
|
component={itemList as ItemListComponent} />
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
render(
|
render(
|
||||||
<PageModelEditor />,
|
<PageModelEditor />,
|
||||||
document.getElementById("cms-content"),
|
document.getElementById("cms-content"),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
interface CategoryTreeComponent extends ComponentModel {
|
||||||
|
|
||||||
|
showFullTree: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CategoryTreeComponentEditorProps
|
||||||
|
extends ComponentModelEditorProps<CategoryTreeComponent> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CategoryTreeComponentEditorState
|
||||||
|
extends ComponentModelEditorState {
|
||||||
|
|
||||||
|
showFullTree: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class CategoryTreeComponentEditor
|
||||||
|
extends AbstractComponentModelEditor<CategoryTreeComponent,
|
||||||
|
CategoryTreeComponentEditorProps,
|
||||||
|
CategoryTreeComponentEditorState> {
|
||||||
|
|
||||||
|
public constructor(props: CategoryTreeComponentEditorProps) {
|
||||||
|
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
...this.state as any,
|
||||||
|
dialogExpanded: "dialogClosed",
|
||||||
|
showFullTree: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public renderPropertyList(): React.ReactFragment {
|
||||||
|
|
||||||
|
return <React.Fragment>
|
||||||
|
<dt>Show full tree</dt>
|
||||||
|
<dd>{this.props.component.showFullTree}</dd>
|
||||||
|
</React.Fragment>;
|
||||||
|
}
|
||||||
|
|
||||||
|
public renderEditorDialog(): React.ReactFragment {
|
||||||
|
|
||||||
|
return <React.Fragment />;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ItemListComponent extends ComponentModel {
|
||||||
|
|
||||||
|
descending: boolean;
|
||||||
|
limitToType: string;
|
||||||
|
pageSize: number;
|
||||||
|
listOrder: string[],
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ItemListComponentEditorProps
|
||||||
|
extends ComponentModelEditorProps<ItemListComponent> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ItemListComponentEditorState
|
||||||
|
extends ComponentModelEditorState {
|
||||||
|
|
||||||
|
descending: boolean;
|
||||||
|
limitToType: string;
|
||||||
|
pageSize: number;
|
||||||
|
listOrder: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ItemListComponentEditor
|
||||||
|
extends AbstractComponentModelEditor<ItemListComponent,
|
||||||
|
ItemListComponentEditorProps,
|
||||||
|
ItemListComponentEditorState> {
|
||||||
|
|
||||||
|
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 <React.Fragment>
|
||||||
|
<dt>descending</dt>
|
||||||
|
<dd>{this.props.component.descending}</dd>
|
||||||
|
<dt>limitToType</dt>
|
||||||
|
<dd>{this.props.component.limitToType}</dd>
|
||||||
|
<dt>pageSize</dt>
|
||||||
|
<dd>{this.props.component.pageSize}</dd>
|
||||||
|
<dt>listOrder</dt>
|
||||||
|
<dd>
|
||||||
|
<ul>
|
||||||
|
{this.props.component.listOrder.map((order) => {
|
||||||
|
<li>
|
||||||
|
{order}
|
||||||
|
</li>
|
||||||
|
})}
|
||||||
|
</ul>
|
||||||
|
</dd>
|
||||||
|
</React.Fragment>
|
||||||
|
}
|
||||||
|
|
||||||
|
public renderEditorDialog(): React.ReactFragment {
|
||||||
|
|
||||||
|
return <React.Fragment />;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,9 @@ import {
|
||||||
|
|
||||||
export {
|
export {
|
||||||
AbstractComponentModelEditor,
|
AbstractComponentModelEditor,
|
||||||
|
ComponentModel,
|
||||||
ComponentModelEditorProps,
|
ComponentModelEditorProps,
|
||||||
|
ComponentModelEditorState,
|
||||||
ComponentInfo,
|
ComponentInfo,
|
||||||
PageModelEditor,
|
PageModelEditor,
|
||||||
PageModelEditorState,
|
PageModelEditorState,
|
||||||
|
|
@ -876,10 +878,10 @@ class ContainerModelComponent
|
||||||
private getComponentModelEditor(
|
private getComponentModelEditor(
|
||||||
component: ComponentModel): React.ReactNode {
|
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
|
return PageModelEditor
|
||||||
.getAvailableComponents()[component.type](component);
|
.getAvailableComponents()[component.type](component);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return <DefaultComponentModelEditor component={component} />;
|
return <DefaultComponentModelEditor component={component} />;
|
||||||
}
|
}
|
||||||
|
|
@ -895,17 +897,31 @@ class ContainerModelComponent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ComponentModelEditorProps {
|
interface ComponentModelEditorProps<C extends ComponentModel> {
|
||||||
|
|
||||||
component: ComponentModel;
|
component: C;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class AbstractComponentModelEditor
|
interface ComponentModelEditorState {
|
||||||
extends React.Component<ComponentModelEditorProps, {}> {
|
|
||||||
|
|
||||||
constructor(props: ComponentModelEditorProps) {
|
dialogExpanded: string;
|
||||||
|
}
|
||||||
|
|
||||||
super(props);
|
abstract class AbstractComponentModelEditor<
|
||||||
|
C extends ComponentModel,
|
||||||
|
P extends ComponentModelEditorProps<C>,
|
||||||
|
S extends ComponentModelEditorState>
|
||||||
|
|
||||||
|
extends React.Component<P, S> {
|
||||||
|
|
||||||
|
constructor(props: ComponentModelEditorProps<C>) {
|
||||||
|
|
||||||
|
super(props as any);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
...this.state as any,
|
||||||
|
dialogExpanded: "dialogClosed",
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract renderPropertyList(): React.ReactFragment;
|
public abstract renderPropertyList(): React.ReactFragment;
|
||||||
|
|
@ -914,7 +930,7 @@ abstract class AbstractComponentModelEditor
|
||||||
|
|
||||||
public render(): React.ReactNode {
|
public render(): React.ReactNode {
|
||||||
|
|
||||||
return <li>
|
return <li className="componentModelEditor">
|
||||||
<dl>
|
<dl>
|
||||||
<dt>Key</dt>
|
<dt>Key</dt>
|
||||||
<dd>{this.props.component.key}</dd>
|
<dd>{this.props.component.key}</dd>
|
||||||
|
|
@ -922,11 +938,46 @@ abstract class AbstractComponentModelEditor
|
||||||
<dd>{this.props.component.type}</dd>
|
<dd>{this.props.component.type}</dd>
|
||||||
{this.renderPropertyList}
|
{this.renderPropertyList}
|
||||||
</dl>
|
</dl>
|
||||||
|
<button onClick={this.toggleEditorDialog}>
|
||||||
|
Edit
|
||||||
|
</button>
|
||||||
|
<dialog className="{this.state.dialogExpanded}">
|
||||||
|
{this.renderEditorDialog}
|
||||||
|
</dialog>
|
||||||
</li>;
|
</li>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private toggleEditorDialog(
|
||||||
|
event: React.MouseEvent<HTMLButtonElement>): 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<ComponentModel>,
|
||||||
|
ComponentModelEditorState> {
|
||||||
|
|
||||||
|
constructor(props: ComponentModelEditorProps<ComponentModel>) {
|
||||||
|
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
dialogExpanded: "dialogClosed",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public renderPropertyList(): React.ReactFragment {
|
public renderPropertyList(): React.ReactFragment {
|
||||||
|
|
||||||
|
|
@ -974,6 +1025,9 @@ class PageModelEditor
|
||||||
public static getAvailableComponents(): {
|
public static getAvailableComponents(): {
|
||||||
[type: string]: (component: ComponentModel) => React.ReactFragment} {
|
[type: string]: (component: ComponentModel) => React.ReactFragment} {
|
||||||
|
|
||||||
|
console.log("Available editors:");
|
||||||
|
console.log(PageModelEditor.componentModelEditors.toString());
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...PageModelEditor.componentModelEditors,
|
...PageModelEditor.componentModelEditors,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2064,3 +2064,24 @@ div.errorPanel {
|
||||||
bottom: 5em;
|
bottom: 5em;
|
||||||
left: 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;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue