From f94b74080195c67423eb3ff29666c19b0f809379 Mon Sep 17 00:00:00 2001 From: jensp Date: Thu, 14 Jun 2018 18:26:03 +0000 Subject: [PATCH] CCM NG: Publish button (not yet working) and publish status display for PageModelEditor git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5518 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: a7bdc427b98fe733c5f4bc2aa335745a8200553a --- .../scripts/create_ccm_cms_schema.sql | 1 + .../scripts/create_ccm_cms_schema.sql | 1 + .../org/libreccm/pagemodel/PageModel.java | 16 +++ .../libreccm/pagemodel/PageModelManager.java | 3 + .../pagemodel/PageModelRepository.java | 4 + .../org/libreccm/pagemodel/rs/PageModels.java | 100 +++++++++++---- .../pagemodel/rs/PublicationStatus.java | 9 ++ .../scripts/create_ccm_core_schema.sql | 1 + .../scripts/create_ccm_core_schema.sql | 1 + .../ccm-pagemodelseditor/PageModelsEditor.tsx | 117 +++++++++++------- .../ccm-pagemodelseditor/datatypes.ts | 11 +- .../scripts/create_ccm_shortcuts_schema.sql | 1 + .../scripts/create_ccm_shortcuts_schema.sql | 1 + 13 files changed, 197 insertions(+), 69 deletions(-) create mode 100644 ccm-core/src/main/java/org/libreccm/pagemodel/rs/PublicationStatus.java diff --git a/ccm-cms/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_cms_schema.sql b/ccm-cms/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_cms_schema.sql index e0303f4af..777877274 100644 --- a/ccm-cms/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_cms_schema.sql +++ b/ccm-cms/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_cms_schema.sql @@ -1331,6 +1331,7 @@ drop sequence if exists HIBERNATE_SEQUENCE; create table CCM_CORE.PAGE_MODELS ( PAGE_MODEL_ID bigint not null, + LAST_MODIFIED timestamp, MODEL_UUID varchar(255) not null, NAME varchar(255), TYPE varchar(255) not null, diff --git a/ccm-cms/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_cms_schema.sql b/ccm-cms/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_cms_schema.sql index d751e3fa7..e51e9e5e1 100644 --- a/ccm-cms/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_cms_schema.sql +++ b/ccm-cms/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_cms_schema.sql @@ -1332,6 +1332,7 @@ drop sequence if exists HIBERNATE_SEQUENCE; create table CCM_CORE.PAGE_MODELS ( PAGE_MODEL_ID int8 not null, + LAST_MODIFIED timestamp, MODEL_UUID varchar(255) not null, NAME varchar(255), TYPE varchar(255) not null, diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/PageModel.java b/ccm-core/src/main/java/org/libreccm/pagemodel/PageModel.java index 599d2f114..95ad6cf47 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/PageModel.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/PageModel.java @@ -22,11 +22,14 @@ import org.libreccm.core.CoreConstants; import org.libreccm.l10n.LocalizedString; import org.libreccm.web.CcmApplication; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Objects; @@ -202,6 +205,11 @@ public class PageModel implements Serializable { @Enumerated(EnumType.STRING) private PageModelVersion version; + + @Column(name = "LAST_MODIFIED") + @Temporal(TemporalType.TIMESTAMP) + private Date lastModified; + /** * The localised title of this {@code PageModel} (shown in the * administration UI), @@ -294,6 +302,14 @@ public class PageModel implements Serializable { this.version = version; } + public Date getLastModified() { + return lastModified; + } + + protected void setLastModified(final Date lastModified) { + this.lastModified = new Date(lastModified.getTime()); + } + public LocalizedString getTitle() { return title; } diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelManager.java b/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelManager.java index 59b3477f1..d27a36128 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelManager.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelManager.java @@ -47,6 +47,7 @@ import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -314,6 +315,8 @@ public class PageModelManager { .forEach(liveContainerModel -> addContainerModel(pageModel, liveContainerModel)); + liveModel.setLastModified(new Date()); + LOGGER.debug("Successfully published PageModel \"{}\".", liveModel.getName()); return liveModel; diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelRepository.java b/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelRepository.java index 51ce8d7ce..65434fbbd 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelRepository.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelRepository.java @@ -28,6 +28,7 @@ import javax.enterprise.context.RequestScoped; import javax.persistence.TypedQuery; import javax.transaction.Transactional; +import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -90,6 +91,9 @@ public class PageModelRepository extends AbstractEntityRepository liveModel = pageModelManager + .getLiveVersion(pageModel); + if (liveModel.isPresent() + && liveModel.get().getLastModified() != null) { + lastPublished = liveModel.get().getLastModified().getTime(); + } else { + lastPublished = 0; + } + return Json .createObjectBuilder() .add("description", @@ -265,7 +274,48 @@ public class PageModels { .add("type", pageModel.getType()) .add("uuid", pageModel.getUuid()) .add("version", pageModel.getVersion().toString()) + .add("publicationStatus", + getPublicationStatus(pageModel).toString()) + .add("lastPublished", lastPublished) .build(); } + /** + * Check if the {@link PublicationStatus} of the provided PageModel. + * + * @param pageModel + * + * @return + */ + private PublicationStatus getPublicationStatus(final PageModel pageModel) { + + final PageModel draftModel = pageModelManager + .getDraftVersion(pageModel); + final Optional liveModel = pageModelManager + .getLiveVersion(pageModel); + + final PublicationStatus publicationStatus; + if (liveModel.isPresent()) { + + // Fallback if one the last modified dates is null + if (draftModel.getLastModified() == null + || liveModel.get().getLastModified() == null) { + + return PublicationStatus.NEEDS_UPDATE; + } else if (liveModel + .get() + .getLastModified() + .before(draftModel.getLastModified())) { + + publicationStatus = PublicationStatus.PUBLISHED; + } else { + publicationStatus = PublicationStatus.NEEDS_UPDATE; + } + } else { + publicationStatus = PublicationStatus.NOT_PUBLISHED; + } + + return publicationStatus; + } + } diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/rs/PublicationStatus.java b/ccm-core/src/main/java/org/libreccm/pagemodel/rs/PublicationStatus.java new file mode 100644 index 000000000..ce1b19b15 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/rs/PublicationStatus.java @@ -0,0 +1,9 @@ +package org.libreccm.pagemodel.rs; + +public enum PublicationStatus { + + NOT_PUBLISHED, + PUBLISHED, + NEEDS_UPDATE, + +} diff --git a/ccm-core/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_core_schema.sql b/ccm-core/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_core_schema.sql index cb0f9fd11..dbe31ce69 100644 --- a/ccm-core/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_core_schema.sql +++ b/ccm-core/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_core_schema.sql @@ -427,6 +427,7 @@ drop sequence if exists HIBERNATE_SEQUENCE; create table CCM_CORE.PAGE_MODELS ( PAGE_MODEL_ID bigint not null, + LAST_MODIFIED timestamp, MODEL_UUID varchar(255) not null, NAME varchar(255), TYPE varchar(255) not null, diff --git a/ccm-core/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_core_schema.sql b/ccm-core/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_core_schema.sql index d139835a2..627cea365 100644 --- a/ccm-core/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_core_schema.sql +++ b/ccm-core/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_core_schema.sql @@ -428,6 +428,7 @@ drop sequence if exists HIBERNATE_SEQUENCE; create table CCM_CORE.PAGE_MODELS ( PAGE_MODEL_ID int8 not null, + LAST_MODIFIED timestamp, MODEL_UUID varchar(255) not null, NAME varchar(255), TYPE varchar(255) not null, diff --git a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx index f4cc6b2ee..5ffd4dee9 100644 --- a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx +++ b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx @@ -1,11 +1,11 @@ import * as React from "react"; -import { PageModel, PageModelVersion } from "./datatypes"; +import {PageModel, PageModelVersion, PublicationStatus} from "./datatypes"; -export { +export { PageModelEditor, PageModelEditorState, // PageModelEditorProps, - // PageModelEditorState, + // PageModelEditorState, }; /** @@ -123,15 +123,15 @@ class PageModelsList return
{this.props.pageModels.length > 0 && -
    - {this.props.pageModels - .map((pageModel: PageModel, index: number) => - , +
      + {this.props.pageModels + .map((pageModel: PageModel, index: number) => + , )} -
    +
}
; } @@ -153,14 +153,14 @@ class PageModelListItem public render(): React.ReactNode { return
  • { - event.preventDefault(); - // console.log("A PageModel has been selected"); - this.props.selectPageModel(this.props.pageModel); - } - }> + href="#" + onClick={ + (event) => { + event.preventDefault(); + // console.log("A PageModel has been selected"); + this.props.selectPageModel(this.props.pageModel); + } + }> {this.props.pageModel.title}
  • ; @@ -213,24 +213,24 @@ class PageModelComponent if (this.state.editMode) { return
    {this.state.errorMsg !== null && -
    - {this.state.errorMsg} -
    +
    + {this.state.errorMsg} +
    }
    + onSubmit={this.handleSubmit}> + value={this.state.form.name}/>