CCM NG: PageModels Editor

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5615 8810af33-2d31-482b-a856-94f89814c4df

Former-commit-id: e3f0e3483e
pull/2/head
jensp 2018-07-23 18:19:15 +00:00
parent 113f986fe5
commit a78eb6e0a2
2 changed files with 94 additions and 12 deletions

View File

@ -6,21 +6,28 @@ import { AbstractComponentModelEditor,
ComponentModelEditorProps, ComponentModelEditorProps,
ComponentModelEditorState, ComponentModelEditorState,
PageModelEditor, PageModelEditor,
} from "ccm-pagemodelseditor"; } from "ccm-pagemodelseditor";
PageModelEditor.registerComponentModelEditor( PageModelEditor.registerComponentModelEditor(
"org.librecms.pagemodel.CategoryTreeComponent", "org.librecms.pagemodel.CategoryTreeComponent",
(categoryTree) => { (props: ComponentModelEditorProps<ComponentModel>) => {
return <CategoryTreeComponentEditor return <CategoryTreeComponentEditor
component={categoryTree as CategoryTreeComponent} /> ccmApplication={props.ccmApplication}
component={props.component as CategoryTreeComponent}
containerKey={props.containerKey}
dispatcherPrefix={props.dispatcherPrefix}
pageModelName={props.pageModelName} />
} }
); );
PageModelEditor.registerComponentModelEditor( PageModelEditor.registerComponentModelEditor(
"org.librecms.pagemodel.ItemListComponent", "org.librecms.pagemodel.ItemListComponent",
(itemList) => { (props: ComponentModelEditorProps<ComponentModel>) => {
return <ItemListComponentEditor return <ItemListComponentEditor
component={itemList as ItemListComponent} /> ccmApplication={props.ccmApplication}
component={props.component as ItemListComponent}
containerKey={props.containerKey}
dispatcherPrefix={props.dispatcherPrefix}
pageModelName={props.pageModelName} />
} }
); );

View File

@ -888,11 +888,22 @@ class ContainerModelComponent
if (PageModelEditor.getAvailableComponents()[component.type]) { if (PageModelEditor.getAvailableComponents()[component.type]) {
console.log(`Found a editor generator for ${component.type} `); console.log(`Found a editor generator for ${component.type} `);
return PageModelEditor return PageModelEditor
.getAvailableComponents()[component.type](component); .getAvailableComponents()[component.type]({
ccmApplication: this.props.ccmApplication,
component,
containerKey: this.props.container.key,
dispatcherPrefix: this.props.dispatcherPrefix,
pageModelName: this.props.pageModelName,
});
} else { } else {
console.warn(`No editor for type ${component.type} found. ` console.warn(`No editor for type ${component.type} found. `
+ `Using default editor.`); + `Using default editor.`);
return <DefaultComponentModelEditor component={component} />; return <DefaultComponentModelEditor
ccmApplication={this.props.ccmApplication}
component={component}
containerKey={this.props.container.key}
dispatcherPrefix={this.props.dispatcherPrefix}
pageModelName={this.props.pageModelName} />;
} }
} }
@ -908,14 +919,19 @@ class ContainerModelComponent
interface ComponentModelEditorProps<C extends ComponentModel> { interface ComponentModelEditorProps<C extends ComponentModel> {
ccmApplication: string;
component: C; component: C;
containerKey: string;
dispatcherPrefix: string;
pageModelName: string;
} }
interface ComponentModelEditorState { interface ComponentModelEditorState {
componentKey: string;
dialogExpanded: string; dialogExpanded: string;
dialogOpened: boolean | undefined; dialogOpened: boolean | undefined;
componentKey: string; errorMsg: string;
} }
abstract class AbstractComponentModelEditor< abstract class AbstractComponentModelEditor<
@ -933,6 +949,7 @@ abstract class AbstractComponentModelEditor<
...this.state as any, ...this.state as any,
dialogExpanded: "dialogClosed", dialogExpanded: "dialogClosed",
dialogOpened: false, dialogOpened: false,
errorMsg: null,
}; };
this.handleChange = this.handleChange.bind(this); this.handleChange = this.handleChange.bind(this);
@ -956,6 +973,50 @@ abstract class AbstractComponentModelEditor<
public handleSubmit(event: React.FormEvent<HTMLFormElement>): void { public handleSubmit(event: React.FormEvent<HTMLFormElement>): void {
const componentData: any = this.getComponentData();
const headers: Headers = new Headers();
headers.append("Content-Type", "application/json");
const init: RequestInit = {
body: JSON.stringify(componentData),
credentials: "same-origin",
headers,
method: "PUT",
};
const componentUrl = `${this.props.dispatcherPrefix}`
+ `/page-models/${this.props.ccmApplication}`
+ `/${this.props.pageModelName}`
+ `/containers/${this.props.containerKey}`
+ `/components/${this.state.componentKey}`;
fetch(componentUrl, init)
.then((response: Response) => {
if (response.ok) {
this.toggleEditorDialog();
} else {
this.setState({
...this.state as any,
errorMsg: `Failed to update/create ComponentModel: `
+ ` ${response.status} ${response.statusText}`,
});
}
})
.catch((error) => {
this.setState({
...this.state as any,
errorMsg: `Failed to update/create ComponentModel: `
+ `${error.message}`,
})
});
}
public getComponentData(): any {
return {
key: this.state.componentKey,
};
} }
public abstract renderPropertyList(): React.ReactFragment; public abstract renderPropertyList(): React.ReactFragment;
@ -999,8 +1060,19 @@ abstract class AbstractComponentModelEditor<
type="text" type="text"
value={this.state.componentKey} /> value={this.state.componentKey} />
{this.renderEditorDialog()} {this.renderEditorDialog()}
{this.state.errorMsg !== null &&
<div className="errorPanel">
{this.state.errorMsg}
</div>
}
<div className="dialogButtonBar">
<button type="submit">Save</button>
<button onClick={(event) => this.closeOnButton(event)}>
Cancel
</button>
</div>
</form> </form>
<div className="backdrop"></div>
</dialog> </dialog>
</li>; </li>;
} }
@ -1098,7 +1170,8 @@ class PageModelEditor
extends React.Component<{}, PageModelEditorState> { extends React.Component<{}, PageModelEditorState> {
public static getAvailableComponents(): { public static getAvailableComponents(): {
[type: string]: (component: ComponentModel) => React.ReactFragment} { [type: string]: (props: ComponentModelEditorProps<ComponentModel>)
=> React.ReactFragment} {
console.log("Available editors:"); console.log("Available editors:");
for(let key of Object.keys(PageModelEditor.componentModelEditors)) { for(let key of Object.keys(PageModelEditor.componentModelEditors)) {
@ -1113,7 +1186,8 @@ class PageModelEditor
public static registerComponentModelEditor( public static registerComponentModelEditor(
type: string, type: string,
generator: ((component: ComponentModel) => React.ReactFragment)): void { generator: ((props: ComponentModelEditorProps<ComponentModel>)
=> React.ReactFragment)): void {
console.log(`Registering editor for type ${type}...`); console.log(`Registering editor for type ${type}...`);
@ -1133,7 +1207,8 @@ class PageModelEditor
} }
private static componentModelEditors: { private static componentModelEditors: {
[type: string]: (component: ComponentModel) => React.ReactFragment; [type: string]: <C extends ComponentModel>(
props: ComponentModelEditorProps<C>) => React.ReactFragment;
}; };
private static getDispatcherPrefix(): string { private static getDispatcherPrefix(): string {