diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/WorkspaceContextBar.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/WorkspaceContextBar.java index e29745f8a..1d8e9be84 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/WorkspaceContextBar.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/WorkspaceContextBar.java @@ -65,14 +65,13 @@ public class WorkspaceContextBar extends ContextBar { final ApplicationRepository appRepo = cdiUtil.findBean( ApplicationRepository.class); final List apps = appRepo.findByType( - CmsConstants.CONTENT_SECTION_APP_TYPE); + CmsConstants.CONTENT_CENTER_APP_TYPE); final String centerPath = apps.get(0).getPrimaryUrl(); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Got Url: " + centerPath); } final URL url = URL.there(state.getRequest(), centerPath); - entries.add(new Entry(centerTitle, url)); return entries; diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pages/PagesAdminPage.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pages/PagesAdminPage.java index 8a8b24f45..0f5fdfe06 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pages/PagesAdminPage.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pages/PagesAdminPage.java @@ -43,14 +43,12 @@ import com.arsdigita.cms.ui.CMSApplicationPage; import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.toolbox.ui.LayoutPanel; import com.arsdigita.ui.ReactApp; -import com.arsdigita.ui.admin.AdminUiConstants; import com.arsdigita.ui.admin.categories.CategoriesTreeModel; import com.arsdigita.util.LockableImpl; import org.libreccm.categorization.Category; import org.libreccm.categorization.CategoryRepository; import org.libreccm.cdi.utils.CdiUtil; -import org.libreccm.core.CoreConstants; import org.libreccm.core.UnexpectedErrorException; import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.pagemodel.PageModel; @@ -84,6 +82,7 @@ public class PagesAdminPage extends CMSApplicationPage { private final SaveCancelSection saveCancelSection; private Pages pagesInstance; + private PagesContextBar pagesContextBar; public PagesAdminPage() { @@ -160,8 +159,11 @@ public class PagesAdminPage extends CMSApplicationPage { // "admin:pageModelsManager", AdminUiConstants.ADMIN_XML_NS); // pageModelsManager.add(new Text("Placeholder page models editor")); final ReactApp pageModelsManager = new ReactApp( - "page-models-editor", "dist/ccm-pagemodelseditor.js"); + "page-models-editor", "scripts/dist/ccm-cms.js"); + pagesContextBar = new PagesContextBar(); + super.add(pagesContextBar); + final TabbedPane tabbedPane = new TabbedPane(); tabbedPane.addTab(new Label(new GlobalizedMessage( "cms.ui.pages.tab.pages", CmsConstants.CMS_BUNDLE)), @@ -183,6 +185,7 @@ public class PagesAdminPage extends CMSApplicationPage { public void setPagesInstance(final Pages pagesInstance) { this.pagesInstance = pagesInstance; + pagesContextBar.setPagesInstance(pagesInstance); } // @Override diff --git a/ccm-core/src/main/java/com/arsdigita/ui/ReactApp.java b/ccm-core/src/main/java/com/arsdigita/ui/ReactApp.java index a1082b8d6..129d5472a 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/ReactApp.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/ReactApp.java @@ -66,6 +66,9 @@ public class ReactApp extends SimpleComponent { reactAppElem .addAttribute("ccmApplication", primaryUrl); + + reactAppElem + .addAttribute("dispatcherPrefix", Web.getWebappContextPath()); } private String getPrimaryUrl() { diff --git a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx index 4ebdf6410..6b806c060 100644 --- a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx +++ b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/PageModelsEditor.tsx @@ -1,6 +1,11 @@ import * as React from "react"; +import { PageModel, PageModelVersion } from "./datatypes"; -export { PageModelEditor }; +export { + PageModelEditor, + // PageModelEditorProps, + // PageModelEditorState, +}; /** * To render the PageModelEditor create a Typescript file with the following @@ -17,34 +22,154 @@ export { PageModelEditor }; * ); */ -class PageModelEditor extends React.Component<{}, {}> { +interface PageModelsListProps { - private getCcmApplication(): string { + ccmApplication: string; + dispatcherPrefix: string; +} - const dataElem: HTMLElement | null = document - .querySelector("#page-models-editor.react-data"); +interface PageModelsListState { - if (dataElem === null) { - return "???"; - } else { - const value: string | null = dataElem.getAttribute("data-ccm-application"); - if (value === null) { - return "???"; - } else { - return value; - } - } + errorMsg: string | null; + pageModels: PageModel[]; +} + +class PageModelsList + extends React.Component { + + constructor(props: PageModelsListProps) { + super(props); + + this.state = { + errorMsg: null, + pageModels: [], + }; + } + + public componentDidMount() { + + const init: RequestInit = { + credentials: "same-origin", + method: "GET", + }; + + const url: string = `${this.props.dispatcherPrefix}` + + `/page-models/${this.props.ccmApplication}`; + + fetch(url, init) + .then((response: Response) => { + if (response.ok) { + response + .json() + .then((pageModels: PageModel[]) => { + this.setState({ + ...this.state, + pageModels, + }); + }) + .catch((error) => { + this.setState({ + ...this.state, + errorMsg: `Failed to retrieve PageModels from ` + + `${url}: ${error.message}`, + }); + }); + } else { + this.setState({ + ...this.state, + errorMsg: `Failed to retrieve PageModels from ` + + `\"${url}\": HTTP Status Code: ` + + `${response.status}; ` + + `message: ${response.statusText}`, + }); + } + }) + .catch((error) => { + this.setState({ + ...this.state, + errorMsg: `Failed to retrieve PageModels from ` + + `${url}: ${error.message}`, + }); + }); } public render() { + return
+ {this.state.errorMsg !== null && +
+ {this.state.errorMsg} +
+ } + {this.state.pageModels.length > 0 && +
    + {this.state.pageModels.map((pageModel: PageModel) => + , + )} +
+ } +
; + } +} +interface PageModelListItemProps { + pageModel: PageModel; +} + +// interface PageModelListItemState { +// +// } + +class PageModelListItem + extends React.Component { + + public render() { + return
  • + + {this.props.pageModel.title} + +
  • ; + } +} + +// interface PageModelEditorProps { +// +// } +// +// interface PageModelEditorState { +// +// } + +class PageModelEditor + extends React.Component<{}, {}> { + + public render() { return
    - List of available page models placeholder +
    +
    +
    +

    + Available PageModels +

    +
    + + + +
    +
    +
    +
    ; } + + private getDispatcherPrefix(): string { + + const dataElem: HTMLElement | null = document + .querySelector("#page-models-editor.react-data"); + + if (dataElem === null) { + return ""; + } else { + const value: string | null + = dataElem.getAttribute("data-dispatcher-prefix"); + if (value === null) { + return ""; + } else { + return value; + } + } + } + + private getCcmApplication(): string { + + const dataElem: HTMLElement | null = document + .querySelector("#page-models-editor.react-data"); + + if (dataElem === null) { + return "???"; + } else { + const value: string | null + = dataElem.getAttribute("data-ccm-application"); + if (value === null) { + return "???"; + } else { + return value; + } + } + } } diff --git a/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/datatypes.ts b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/datatypes.ts new file mode 100644 index 000000000..983d07fe6 --- /dev/null +++ b/ccm-pagemodelseditor/src/main/typescript/ccm-pagemodelseditor/datatypes.ts @@ -0,0 +1,19 @@ +export { PageModel, PageModelVersion }; + +interface PageModel { + + description: string; + modelUuid: string; + name: string; + pageModelId: number; + title: string; + type: string; + uuid: string; + version: PageModelVersion; +} + +enum PageModelVersion { + + DRAFT, + LIVE, +} diff --git a/ccm-pagemodelseditor/webpack.config.js b/ccm-pagemodelseditor/webpack.config.js deleted file mode 100644 index 4a9814765..000000000 --- a/ccm-pagemodelseditor/webpack.config.js +++ /dev/null @@ -1,26 +0,0 @@ -const path = require('path'); - -module.exports = { - - devtool: "inline-source-map", - - entry: { - pagemodeleditor: "./src/main/typescript/ccm-pagemodelseditor/index.tsx" - }, - - output: { - //path: path.resolve(__dirname, "src/main/resources/dist"), - path: path.resolve(__dirname, "target/generated-resources/dist"), - filename: "ccm-pagemodelseditor.js" - }, - - resolve: { - extensions: [".webpack.js", "web.js", ".ts", ".tsx", ".js"] - }, - - module: { - rules: [ - { test: /\.tsx?$/, loader: "ts-loader"} - ] - } -}; diff --git a/ccm-theme-foundry/src/main/resources/themes/foundry/foundry/lib/template-tags/admin/common.xsl b/ccm-theme-foundry/src/main/resources/themes/foundry/foundry/lib/template-tags/admin/common.xsl index 9e4f7d30e..723ec2905 100644 --- a/ccm-theme-foundry/src/main/resources/themes/foundry/foundry/lib/template-tags/admin/common.xsl +++ b/ccm-theme-foundry/src/main/resources/themes/foundry/foundry/lib/template-tags/admin/common.xsl @@ -167,11 +167,12 @@
    + id="{$data-tree//bebop:reactApp/@appId}" + data-ccm-application="{$data-tree//bebop:reactApp/@ccmApplication}" + data-dispatcher-prefix="{$data-tree//bebop:reactApp/@dispatcherPrefix}">
    - \ No newline at end of file + 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 98de86a39..ab7fe210b 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 @@ -1093,7 +1093,7 @@ div.bebop-segment { } #left div.bebop-segment-body { - padding-left: 10px; + padding: 10px; } div.bebop-left div.bebop-panel-row { @@ -1976,4 +1976,37 @@ span#quickLinksCascade { .preformatted-text { white-space: pre; +} + +button.pagemodels.addbutton { + + border: none; + border-radius: 0.25em; + + background-color: #383838; + + color: #fff; + + padding: 0.2em 0.33em; +} + +button.pagemodels.addbutton > span { + + border-right: 1px solid #eee; + + font-weight: bold; + + padding-right: 0.2em; + +} + +div.pageModelsList { + + margin-top: 0.66em; + margin-bottom: 0.66em; + border-top: 1px solid #0776A0; + padding-top: 0.66em; + border-bottom: 1px solid #0776A0; + padding-bottom: 0.66em; + } \ No newline at end of file