diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/rs/PageModels.java b/ccm-core/src/main/java/org/libreccm/pagemodel/rs/PageModels.java
index b71433ff5..1e3d15c05 100644
--- a/ccm-core/src/main/java/org/libreccm/pagemodel/rs/PageModels.java
+++ b/ccm-core/src/main/java/org/libreccm/pagemodel/rs/PageModels.java
@@ -26,6 +26,7 @@ import org.libreccm.security.AuthorizationRequired;
import org.libreccm.security.RequiresPrivilege;
import org.libreccm.web.CcmApplication;
+import java.util.Locale;
import java.util.Objects;
import javax.enterprise.context.RequestScoped;
@@ -84,7 +85,7 @@ public class PageModels {
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
public JsonArray getAllPageModels(
@PathParam(PageModelsApp.APP_NAME) String appPath) {
-
+
Objects.requireNonNull(appPath);
final CcmApplication app = controller
@@ -129,7 +130,7 @@ public class PageModels {
public JsonObject getPageModel(
@PathParam(PageModelsApp.APP_NAME) final String appPath,
@PathParam(PageModelsApp.PAGE_MODEL_NAME) final String pageModelName) {
-
+
Objects.requireNonNull(appPath);
Objects.requireNonNull(pageModelName);
@@ -169,7 +170,7 @@ public class PageModels {
@PathParam(PageModelsApp.APP_NAME) final String appPath,
@PathParam(PageModelsApp.PAGE_MODEL_NAME) final String pageModelName,
final JsonObject pageModelData) {
-
+
Objects.requireNonNull(appPath);
Objects.requireNonNull(pageModelName);
@@ -184,6 +185,16 @@ public class PageModels {
pageModel.setApplication(app);
}
pageModel.setName(pageModelName);
+ if (pageModelData.containsKey("title")) {
+ pageModel.getTitle().addValue(Locale.ROOT,
+ pageModelData.getString("title"));
+ }
+ if (pageModelData.containsKey("description")) {
+ pageModel
+ .getDescription()
+ .addValue(Locale.ROOT,
+ pageModelData.getString("description"));
+ }
controller.savePageModel(pageModel);
@@ -205,7 +216,7 @@ public class PageModels {
public void deletePageModel(
@PathParam(PageModelsApp.APP_NAME) final String appPath,
@PathParam(PageModelsApp.PAGE_MODEL_NAME) final String pageModelName) {
-
+
Objects.requireNonNull(appPath);
Objects.requireNonNull(pageModelName);
diff --git a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx
index 1d4b5d3df..b4d7e7ed5 100644
--- a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx
+++ b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx
@@ -167,12 +167,22 @@ class PageModelListItem
interface PageModelComponentProps {
+ ccmApplication: string;
+ dispatcherPrefix: string;
pageModel: PageModel;
}
interface PageModelComponentState {
editMode: boolean;
+
+ errorMsg: string | null;
+
+ form: {
+ name: string;
+ title: string;
+ description: string;
+ }
}
class PageModelComponent
@@ -182,39 +192,70 @@ class PageModelComponent
super(props);
this.state = {
- editMode: false
+ editMode: false,
+ errorMsg: null,
+ form: {
+ name: this.props.pageModel.name,
+ title: this.props.pageModel.title,
+ description: this.props.pageModel.description
+ }
};
+
+ this.handleChange = this.handleChange.bind(this);
+ this.handleSubmit = this.handleSubmit.bind(this);
}
public render(): React.ReactNode {
if (this.state.editMode) {
return
} else {
@@ -236,23 +277,122 @@ class PageModelComponent
event.preventDefault();
this.setState({
- editMode: true
+ editMode: true,
});
}}>Edit
;
}
- // return
- // - Name
- // - {this.props.pageModel.name}
- // - Title
- // - {this.props.pageModel.title}
- // - Type
- // - {this.props.pageModel.type}
- // - Version
- // - {this.props.pageModel.version}
- // - Description
- // - {this.props.pageModel.description}
- //
;
+ }
+
+ private discardChanges(event: React.MouseEvent): void {
+
+ event.preventDefault();
+
+ this.setState({
+ ...this.state,
+ editMode: false,
+ form: {
+ name: this.props.pageModel.name,
+ title: this.props.pageModel.title,
+ description: this.props.pageModel.description,
+ }
+ });
+ }
+
+ private handleChange(event: React.ChangeEvent): void {
+
+ const target: HTMLElement = event.target as HTMLElement;
+
+ switch (target.id) {
+ case "pageModelName": {
+ const targetInput: HTMLInputElement
+ = target as HTMLInputElement;
+ this.setState({
+ editMode: this.state.editMode,
+ form: {
+ name: targetInput.value,
+ title: this.state.form.title,
+ description: this.state.form.description,
+ }
+ });
+ break;
+ }
+ case "pageModelTitle": {
+ const targetInput: HTMLInputElement
+ = target as HTMLInputElement;
+ this.setState({
+ editMode: this.state.editMode,
+ form: {
+ name: this.state.form.name,
+ title: targetInput.value,
+ description: this.state.form.description,
+ }
+ });
+ break;
+ }
+ case "pageModelDescription": {
+ const targetArea: HTMLTextAreaElement
+ = target as HTMLTextAreaElement;
+ this.setState({
+ editMode: this.state.editMode,
+ form: {
+ name: this.state.form.name,
+ title: this.state.form.title,
+ description: targetArea.value,
+ }
+ });
+ break;
+ }
+ }
+ }
+
+ private handleSubmit(event: React.FormEvent): void {
+
+ event.preventDefault();
+
+ this.props.pageModel.name = this.state.form.name;
+ this.props.pageModel.title = this.state.form.title;
+ this.props.pageModel.description = this.state.form.description;
+
+ const headers: Headers = new Headers();
+ headers.append("Content-Type", "application/json");
+
+ const init: RequestInit = {
+ body: JSON.stringify({
+ title: this.state.form.title,
+ description: this.state.form.description,
+ }),
+ credentials: "same-origin",
+ headers,
+ method: "PUT",
+ }
+
+ const url: string = `${this.props.dispatcherPrefix}`
+ + `/page-models/${this.props.ccmApplication}/`
+ + `${this.props.pageModel.name}`
+
+ fetch(url, init)
+ .then((response: Response) => {
+
+ if (response.ok) {
+ this.setState({
+ ...this.state,
+ editMode: false,
+ });
+ } else {
+ this.setState({
+ ...this.state,
+ errorMsg: `Failed to update/create PageModel: `
+ + ` ${response.status} ${response.statusText}`,
+ });
+ }
+ })
+ .catch((error) => {
+ this.setState({
+ ...this.state,
+ errorMsg: `Failed to update/create PageModel: ${error.message}`,
+ });
+ });
}
}
@@ -267,6 +407,12 @@ class PageModelComponent
//
// }
+interface PageModelEditorState {
+
+ pageModels: PageModel[];
+ selectedPageModelIndex: number;
+}
+
class PageModelEditor
extends React.Component<{}, any> {
@@ -333,7 +479,10 @@ class PageModelEditor
{(context) =>
{context.pageModelSelected &&
-
+
}
//
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 f817384ce..fd55d2e2a 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
@@ -2035,3 +2035,9 @@ dl.pagemodeleditor.pagemodel.propertiesForm label {
font-weight: bold;
}
+
+form.pagemodeleditor.propertiesForm {
+
+ display: flex;
+ flex-direction: column;
+}