From 0735255e6ea9db31cb89f6eb89b0b9badbeb712b Mon Sep 17 00:00:00 2001 From: jensp Date: Tue, 21 Nov 2017 16:27:45 +0000 Subject: [PATCH] CCM NG: Next part of admin UI for PageModels git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5126 8810af33-2d31-482b-a856-94f89814c4df --- .../AbstractContentItemComponentForm.java | 87 ++++++ .../CategorizedItemComponentForm.java | 49 +++ .../pagemodel/CategoryTreeComponentForm.java | 110 +++++++ .../FixedContentItemComponentForm.java | 120 ++++++++ .../pagemodel/GreetingItemComponentForm.java | 49 +++ .../ui/pagemodel/ItemListComponentForm.java | 189 ++++++++++++ ccm-cms/src/main/java/org/librecms/Cms.java | 54 ++++ .../org/librecms/CmsResources.properties | 9 + .../org/librecms/CmsResources_de.properties | 9 + .../org/librecms/CmsResources_fr.properties | 9 + .../com/arsdigita/ui/admin/AdminServlet.java | 16 +- .../AbstractComponentModelForm.java | 286 ++++++++++++++++++ .../ui/admin/pagemodels/ComponentsTable.java | 12 +- .../ui/admin/pagemodels/PageModelDetails.java | 107 +++++-- .../ui/admin/pagemodels/PageModelForm.java | 22 +- .../pagemodels/PageModelsController.java | 7 +- .../ui/admin/pagemodels/PageModelsTable.java | 2 - .../libreccm/pagemodel/PageModelManager.java | 14 +- .../ui/admin/AdminResources.properties | 24 ++ .../ui/admin/AdminResources_de.properties | 24 ++ .../ui/admin/AdminResources_en.properties | 24 ++ .../ui/admin/AdminResources_fr.properties | 24 ++ 22 files changed, 1202 insertions(+), 45 deletions(-) create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/AbstractContentItemComponentForm.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/CategorizedItemComponentForm.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/CategoryTreeComponentForm.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/FixedContentItemComponentForm.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/GreetingItemComponentForm.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/ItemListComponentForm.java create mode 100644 ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/AbstractComponentModelForm.java diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/AbstractContentItemComponentForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/AbstractContentItemComponentForm.java new file mode 100644 index 000000000..fe56e87f3 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/AbstractContentItemComponentForm.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2017 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package com.arsdigita.cms.ui.pagemodel; + +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.form.TextField; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.ui.admin.pagemodels.AbstractComponentModelForm; +import com.arsdigita.ui.admin.pagemodels.PageModelTab; + +import org.librecms.CmsConstants; +import org.librecms.pagemodel.ContentItemComponent; + +/** + * @param + * + * @author Jens Pelzetter + * + */ +public abstract class AbstractContentItemComponentForm + extends AbstractComponentModelForm { + + private static final String ITEM_MODE = "itemMode"; + + private TextField modeField; + + public AbstractContentItemComponentForm( + final String name, + final PageModelTab pageModelTab, + final ParameterSingleSelectionModel selectedModelId, + final ParameterSingleSelectionModel selectedComponentId) { + + super(name, pageModelTab, selectedModelId, selectedComponentId); + } + + @Override + protected void addWidgets() { + + modeField = new TextField(ITEM_MODE); + modeField.setLabel(new GlobalizedMessage( + "cms.ui.pagemodel.contentitem_component_form.mode.label", + CmsConstants.CMS_BUNDLE)); + add(modeField); + } + + @Override + public void updateComponentModel(final ContentItemComponent componentModel, + final PageState state, + final FormData data) { + + final String modeValue = data.getString(ITEM_MODE); + componentModel.setMode(modeValue); + } + + @Override + public void init(final FormSectionEvent event) + throws FormProcessException { + + super.init(event); + + final PageState state = event.getPageState(); + final ContentItemComponent component = getComponentModel(); + + modeField.setValue(state, component.getMode()); + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/CategorizedItemComponentForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/CategorizedItemComponentForm.java new file mode 100644 index 000000000..24357dbd0 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/CategorizedItemComponentForm.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2017 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package com.arsdigita.cms.ui.pagemodel; + +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.ui.admin.pagemodels.PageModelTab; + +import org.librecms.pagemodel.CategorizedItemComponent; + +/** + * + * @author Jens Pelzetter + */ +public class CategorizedItemComponentForm + extends AbstractContentItemComponentForm { + + public CategorizedItemComponentForm( + final PageModelTab pageModelTab, + final ParameterSingleSelectionModel selectedModelId, + final ParameterSingleSelectionModel selectedComponentId) { + + super("CategorizedItemComponentForm", + pageModelTab, + selectedModelId, + selectedComponentId); + } + + @Override + public CategorizedItemComponent createComponentModel() { + return new CategorizedItemComponent(); + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/CategoryTreeComponentForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/CategoryTreeComponentForm.java new file mode 100644 index 000000000..1fc2f75b4 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/CategoryTreeComponentForm.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2017 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package com.arsdigita.cms.ui.pagemodel; + +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.form.CheckboxGroup; +import com.arsdigita.bebop.form.Option; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.ui.admin.pagemodels.AbstractComponentModelForm; +import com.arsdigita.ui.admin.pagemodels.PageModelTab; + +import org.librecms.CmsConstants; +import org.librecms.pagemodel.CategoryTreeComponent; + +/** + * + * @author Jens Pelzetter + */ +public class CategoryTreeComponentForm extends AbstractComponentModelForm { + + private final static String SHOW_FULL_TREE_BOX = "showFullTreeBox"; + private final static String SHOW_FULL_TREE = "showFullTree"; + + private CheckboxGroup showFullTreeCheckbox; + + public CategoryTreeComponentForm( + final PageModelTab pageModelTab, + final ParameterSingleSelectionModel selectedModelId, + final ParameterSingleSelectionModel selectedComponentId) { + + super("CategoryTreeComponentForm", pageModelTab, selectedModelId, + selectedComponentId); + } + + @Override + protected void addWidgets() { + + showFullTreeCheckbox = new CheckboxGroup(SHOW_FULL_TREE_BOX); + showFullTreeCheckbox.addOption(new Option( + SHOW_FULL_TREE, + new Label(new GlobalizedMessage( + "cms.ui.pagemodel.category_tree_component.show_full_tree.label", + CmsConstants.CMS_BUNDLE)))); + add(showFullTreeCheckbox); + } + + @Override + protected CategoryTreeComponent createComponentModel() { + return new CategoryTreeComponent(); + } + + @Override + protected void updateComponentModel( + final CategoryTreeComponent componentModel, + final PageState state, + final FormData data) { + + final Object[] value = (Object[]) data.get(SHOW_FULL_TREE_BOX); + if (value != null + && value.length != 0 + && SHOW_FULL_TREE.equals(value[0])) { + + componentModel.setShowFullTree(true); + } else { + componentModel.setShowFullTree(false); + } + } + + @Override + public void init(final FormSectionEvent event) + throws FormProcessException { + + super.init(event); + + final PageState state = event.getPageState(); + + final CategoryTreeComponent component = getComponentModel(); + + final Object[] showFullTreeValue; + if (component.isShowFullTree()) { + showFullTreeValue = new Object[]{SHOW_FULL_TREE}; + } else { + showFullTreeValue = new Object[]{}; + } + + showFullTreeCheckbox.setValue(state, showFullTreeValue); + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/FixedContentItemComponentForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/FixedContentItemComponentForm.java new file mode 100644 index 000000000..7639a9abf --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/FixedContentItemComponentForm.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2017 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package com.arsdigita.cms.ui.pagemodel; + +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.cms.ui.assets.ItemSearchWidget; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.ui.admin.pagemodels.PageModelTab; + +import org.libreccm.cdi.utils.CdiUtil; +import org.librecms.CmsConstants; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentItemRepository; +import org.librecms.pagemodel.FixedContentItemComponent; + +/** + * + * @author Jens Pelzetter + */ +public class FixedContentItemComponentForm + extends AbstractContentItemComponentForm { + + private final static String ITEM_SEARCH = "itemSearch"; + + private ItemSearchWidget itemSearchWidget; + + public FixedContentItemComponentForm( + final PageModelTab pageModelTab, + final ParameterSingleSelectionModel selectedModelId, + final ParameterSingleSelectionModel selectedComponentId) { + + super("FixedContentItemComponentForm", + pageModelTab, + selectedModelId, + selectedComponentId); + } + + @Override + protected void addWidgets() { + + itemSearchWidget = new ItemSearchWidget(ITEM_SEARCH); + itemSearchWidget.setLabel(new GlobalizedMessage( + "cms.ui.pagemodel.fixed_contentitem_component_form.itemsearch.label", + CmsConstants.CMS_BUNDLE)); + add(itemSearchWidget); + } + + @Override + protected FixedContentItemComponent createComponentModel() { + return new FixedContentItemComponent(); + } + + @Override + protected void updateComponentModel( + final FixedContentItemComponent component, + final PageState state, + final FormData data) { + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ContentItemRepository itemRepo = cdiUtil + .findBean(ContentItemRepository.class); + + final long itemId = (long) itemSearchWidget.getValue(state); + + final ContentItem item = itemRepo + .findById(itemId) + .orElseThrow(() -> new IllegalArgumentException()); + + component.setContentItem(item); + } + + @Override + public void init(final FormSectionEvent event) + throws FormProcessException { + + super.init(event); + + final PageState state = event.getPageState(); + final FixedContentItemComponent component = getComponentModel(); + + itemSearchWidget.setValue(state, component.getContentItem()); + } + + @Override + public void validate(final FormSectionEvent event) + throws FormProcessException { + + super.validate(event); + + final FormData data = event.getFormData(); + final Object value = data.get(ITEM_SEARCH); + + if (value == null) { + data.addError(new GlobalizedMessage( + "cms.ui.pagemodel.fixed_contentitem_component_form.error.no_item_selected", + CmsConstants.CMS_BUNDLE)); + } + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/GreetingItemComponentForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/GreetingItemComponentForm.java new file mode 100644 index 000000000..31fb08281 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/GreetingItemComponentForm.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2017 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package com.arsdigita.cms.ui.pagemodel; + +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.ui.admin.pagemodels.PageModelTab; + +import org.librecms.pagemodel.GreetingItemComponent; + +/** + * + * @author Jens Pelzetter + */ +public class GreetingItemComponentForm + extends AbstractContentItemComponentForm { + + public GreetingItemComponentForm( + final PageModelTab pageModelTab, + final ParameterSingleSelectionModel selectedModelId, + final ParameterSingleSelectionModel selectedComponentId) { + + super("GreetingItemComponentForm", + pageModelTab, + selectedModelId, + selectedComponentId); + } + + @Override + public GreetingItemComponent createComponentModel() { + return new GreetingItemComponent(); + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/ItemListComponentForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/ItemListComponentForm.java new file mode 100644 index 000000000..c441a9295 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/ItemListComponentForm.java @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2017 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package com.arsdigita.cms.ui.pagemodel; + +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.form.CheckboxGroup; +import com.arsdigita.bebop.form.Option; +import com.arsdigita.bebop.form.TextArea; +import com.arsdigita.bebop.form.TextField; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.ui.admin.pagemodels.AbstractComponentModelForm; +import com.arsdigita.ui.admin.pagemodels.PageModelTab; + +import org.librecms.CmsConstants; +import org.librecms.pagemodel.ItemListComponent; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * + * @author Jens Pelzetter + */ +public class ItemListComponentForm + extends AbstractComponentModelForm { + + private static final String DESCENDING_BOX = "descendingBox"; + private static final String DESCENDING = "descending"; + private static final String LIMIT_TO_TYPE = "limitToType"; + private static final String PAGE_SIZE = "pageSize"; + private static final String LIST_ORDER = "listOrder"; + + private CheckboxGroup descendingBox; + private TextField limitToTypeField; + private TextField pageSizeField; + private TextArea listOrderArea; + + public ItemListComponentForm( + final PageModelTab pageModelTab, + final ParameterSingleSelectionModel selectedModelId, + final ParameterSingleSelectionModel selectedComponentId) { + + super("ItemListComponentForm", + pageModelTab, + selectedModelId, + selectedComponentId); + } + + @Override + protected void addWidgets() { + + descendingBox = new CheckboxGroup(DESCENDING_BOX); + descendingBox.addOption(new Option( + DESCENDING, new Label( + new GlobalizedMessage( + "cms.ui.pagemodel.itemlist_component_form.descending.label", + CmsConstants.CMS_BUNDLE)))); + add(descendingBox); + + limitToTypeField = new TextField(LIMIT_TO_TYPE); + limitToTypeField.setLabel(new GlobalizedMessage( + "cms.ui.pagemodel.itemlist_component_form.limit_to_type.label", + CmsConstants.CMS_BUNDLE)); + add(limitToTypeField); + + pageSizeField = new TextField(PAGE_SIZE); + pageSizeField.setLabel(new GlobalizedMessage( + "cms.ui.pagemodel.itemlist_component_form.page_size.label", + CmsConstants.CMS_BUNDLE)); + add(pageSizeField); + + listOrderArea = new TextArea(LIST_ORDER); + listOrderArea.setLabel(new GlobalizedMessage( + "cms.ui.pagemodel.itemlist_component_form.list_order.label", + CmsConstants.CMS_BUNDLE)); + add(listOrderArea); + } + + @Override + protected ItemListComponent createComponentModel() { + return new ItemListComponent(); + } + + @Override + protected void updateComponentModel(final ItemListComponent componentModel, + final PageState state, + final FormData data) { + + final Object[] descendingValues = (Object[]) data.get(DESCENDING); + final String limitToTypeValue = data.getString(LIMIT_TO_TYPE); + final String pageSizeValue = data.getString(PAGE_SIZE); + final String listOrderValue = data.getString(LIST_ORDER); + + final boolean descendingValue; + if (descendingValues != null + && descendingValues.length != 0 + && DESCENDING.equals(descendingValues[0])) { + + descendingValue = true; + } else { + descendingValue = false; + } + + final List listOrder = Arrays + .stream(listOrderValue.split("\n")) + .collect(Collectors.toList()); + + componentModel.setDescending(descendingValue); + componentModel.setLimitToTypes(limitToTypeValue); + componentModel.setPageSize(Integer.parseInt(pageSizeValue)); + + componentModel.setListOrder(listOrder); + } + + @Override + public void init(final FormSectionEvent event) + throws FormProcessException { + + super.init(event); + + final PageState state = event.getPageState(); + + final ItemListComponent component = getComponentModel(); + + final Object[] descendingValue; + if (component.isDescending()) { + descendingValue = new Object[]{DESCENDING}; + } else { + descendingValue = new Object[]{}; + } + descendingBox.setValue(state, descendingValue); + + limitToTypeField.setValue(state, component.getLimitToType()); + + pageSizeField.setValue(state, Integer.toString(component.getPageSize())); + + listOrderArea.setValue(state, + String.join("\n", component.getListOrder())); + + } + + @Override + public void validate(final FormSectionEvent event) + throws FormProcessException { + + super.validate(event); + + final PageState state = event.getPageState(); + final FormData data = event.getFormData(); + + if (getSaveCancelSection().getSaveButton().isSelected(state)) { + + final String pageSizeValue = data.getString(PAGE_SIZE); + if (pageSizeValue != null + && !pageSizeValue.isEmpty() + && !pageSizeValue.matches("\\d*")) { + + data.addError( + PAGE_SIZE, + new GlobalizedMessage( + "cms.ui.pagemodel.itemlist_component_form.page_size.error.not_a_number", + CmsConstants.CMS_BUNDLE)); + } + } + } +} diff --git a/ccm-cms/src/main/java/org/librecms/Cms.java b/ccm-cms/src/main/java/org/librecms/Cms.java index ee233e82a..cd3549c2a 100644 --- a/ccm-cms/src/main/java/org/librecms/Cms.java +++ b/ccm-cms/src/main/java/org/librecms/Cms.java @@ -6,6 +6,12 @@ package org.librecms; import com.arsdigita.cms.ContentCenterAppCreator; import com.arsdigita.cms.ContentCenterServlet; import com.arsdigita.cms.ContentCenterSetup; +import com.arsdigita.cms.ui.authoring.ItemCategoryForm; +import com.arsdigita.cms.ui.pagemodel.CategorizedItemComponentForm; +import com.arsdigita.cms.ui.pagemodel.CategoryTreeComponentForm; +import com.arsdigita.cms.ui.pagemodel.FixedContentItemComponentForm; +import com.arsdigita.cms.ui.pagemodel.GreetingItemComponentForm; +import com.arsdigita.cms.ui.pagemodel.ItemListComponentForm; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -17,6 +23,7 @@ import org.libreccm.modules.Module; import org.libreccm.modules.RequiredModule; import org.libreccm.modules.ShutdownEvent; import org.libreccm.modules.UnInstallEvent; +import org.libreccm.pagemodel.PageModelComponentModel; import org.libreccm.web.ApplicationType; import org.libreccm.web.CcmApplication; import org.librecms.assets.*; @@ -30,6 +37,11 @@ import org.librecms.contenttypes.ContentTypes; import org.librecms.contenttypes.Event; import org.librecms.contenttypes.MultiPartArticle; import org.librecms.contenttypes.News; +import org.librecms.pagemodel.CategorizedItemComponent; +import org.librecms.pagemodel.CategoryTreeComponent; +import org.librecms.pagemodel.FixedContentItemComponent; +import org.librecms.pagemodel.GreetingItemComponent; +import org.librecms.pagemodel.ItemListComponent; import java.io.IOException; import java.io.InputStream; @@ -57,6 +69,48 @@ import java.util.Properties; creator = ContentSectionCreator.class, servletPath = "/templates/servlet/content-section" ) + }, + pageModelComponentModels = { + @PageModelComponentModel( + modelClass = CategorizedItemComponent.class, + editor = CategorizedItemComponentForm.class, + descBundle = CmsConstants.CMS_BUNDLE, + titleKey + = "cms.ui.pagemodel.components.categorized_item_component.title", + descKey + = "cms.ui.pagemodel.components.categorized_item_component.desc") + , + @PageModelComponentModel( + modelClass = CategoryTreeComponent.class, + editor = CategoryTreeComponentForm.class, + descBundle = CmsConstants.CMS_BUNDLE, + titleKey + = "cms.ui.pagemodel.components.category_tree_component.title", + descKey = "cms.ui.pagemodel.components.category_tree_component.desc") + , + @PageModelComponentModel( + modelClass = FixedContentItemComponent.class, + editor = FixedContentItemComponentForm.class, + descBundle = CmsConstants.CMS_BUNDLE, + titleKey + = "cms.ui.pagemodel.components.fixed_contentitem_component.title", + descKey + = "cms.ui.pagemodel.components.fixed_contentitem_component.desc") + , + @PageModelComponentModel( + modelClass = GreetingItemComponent.class, + editor = GreetingItemComponentForm.class, + descBundle = CmsConstants.CMS_BUNDLE, + titleKey + = "cms.ui.pagemodel.components.greetingitem_component.title", + descKey = "cms.ui.pagemodel.components.greetingitem_component.desc") + , + @PageModelComponentModel( + modelClass = ItemListComponent.class, + editor = ItemListComponentForm.class, + descBundle = CmsConstants.CMS_BUNDLE, + titleKey = "cms.ui.pagemodel.components.itemlist_component.title", + descKey = "cms.ui.pagemodel.components.itemlist_component.desc") } ) @ContentTypes({Article.class, diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties index aeea05001..6850329bd 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties @@ -457,3 +457,12 @@ cms.ui.item.notification_period=Notify in advance cms.ui.item.days=days cms.ui.item.hours=hours cms.ui.item.lifecycle.publish=Publish content item +cms.ui.pagemodel.contentitem_component_form.mode.label=Mode +cms.ui.pagemodel.fixed_contentitem_component_form.itemsearch.label=Content Item +cms.ui.pagemodel.fixed_contentitem_component_form.error.no_item_selected=No item selected. +cms.ui.pagemodel.category_tree_component_form.show_full_tree.label=Show full tree? +cms.ui.pagemodel.itemlist_component_form.descending.label=Descending? +cms.ui.pagemodel.itemlist_component_form.limit_to_type.label=Limit to type +cms.ui.pagemodel.itemlist_component_form.page_size.label=Number of items per page +cms.ui.pagemodel.itemlist_component_form.list_order.label=Order list using these properties +cms.ui.pagemodel.itemlist_component_form.page_size.error.not_a_number=Number of items per page is not a number diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties index 2f277a76d..a333d6034 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties @@ -454,3 +454,12 @@ cms.ui.item.notification_period=Vorab Benachrichtigung cms.ui.item.days=Tage cms.ui.item.hours=Stunden cms.ui.item.lifecycle.publish=Dokument ver\u00f6ffentlichen +cms.ui.pagemodel.contentitem_component_form.mode.label=Modus +cms.ui.pagemodel.fixed_contentitem_component_form.itemsearch.label=Content Item +cms.ui.pagemodel.fixed_contentitem_component_form.error.no_item_selected=Es wurde keine ContentItem ausgew\u00e4hlt. +cms.ui.pagemodel.category_tree_component_form.show_full_tree.label=Vollst\u00e4ndigen Baum anzeigen? +cms.ui.pagemodel.itemlist_component_form.descending.label=Absteigend? +cms.ui.pagemodel.itemlist_component_form.limit_to_type.label=Auf Typ beschr\u00e4nken +cms.ui.pagemodel.itemlist_component_form.page_size.label=Anzahl von Objekten pro Seite +cms.ui.pagemodel.itemlist_component_form.list_order.label=List nach diesen Eigenschaften sortieren +cms.ui.pagemodel.itemlist_component_form.page_size.error.not_a_number=Die Anzahl der Objekte pro Seite ist keine Zahl. diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties index eb5d0ec46..f5eeadb13 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties @@ -413,3 +413,12 @@ cms.ui.item.notification_period=Notify in advance cms.ui.item.days=days cms.ui.item.hours=hours cms.ui.item.lifecycle.publish=Publish content item +cms.ui.pagemodel.contentitem_component_form.mode.label=Mode +cms.ui.pagemodel.fixed_contentitem_component_form.itemsearch.label=Content Item +cms.ui.pagemodel.fixed_contentitem_component_form.error.no_item_selected=No item selected. +cms.ui.pagemodel.category_tree_component_form.show_full_tree.label=Show full tree? +cms.ui.pagemodel.itemlist_component_form.descending.label=Descending? +cms.ui.pagemodel.itemlist_component_form.limit_to_type.label=Limit to type +cms.ui.pagemodel.itemlist_component_form.page_size.label=Number of items per page +cms.ui.pagemodel.itemlist_component_form.list_order.label=Order list using these properties +cms.ui.pagemodel.itemlist_component_form.page_size.error.not_a_number=Number of items per page is not a number diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java index 5d1aed30e..e8e4ab404 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/AdminServlet.java @@ -33,6 +33,7 @@ import com.arsdigita.ui.admin.applications.ApplicationsTab; import com.arsdigita.ui.admin.categories.CategoriesTab; import com.arsdigita.ui.admin.configuration.ConfigurationTab; import com.arsdigita.ui.admin.importexport.ImportExportTab; +import com.arsdigita.ui.admin.pagemodels.PageModelTab; import com.arsdigita.ui.admin.sites.SitesTab; import com.arsdigita.web.BaseApplicationServlet; import com.arsdigita.web.LoginSignal; @@ -120,6 +121,16 @@ public class AdminServlet extends BaseApplicationServlet { ADMIN_BUNDLE)), new ApplicationsTab()); + tabbedPane.addTab( + new Label(new GlobalizedMessage("ui.admin.tab.sites.title", + ADMIN_BUNDLE)), + new SitesTab()); + + tabbedPane.addTab( + new Label(new GlobalizedMessage("ui.admin.tab.pagemodels.title", + ADMIN_BUNDLE)), + new PageModelTab()); + tabbedPane.addTab( new Label(new GlobalizedMessage( "ui.admin.tab.users_groups_roles.title", @@ -136,11 +147,6 @@ public class AdminServlet extends BaseApplicationServlet { ADMIN_BUNDLE)), new ConfigurationTab()); - tabbedPane.addTab( - new Label(new GlobalizedMessage("ui.admin.tab.sites.title", - ADMIN_BUNDLE)), - new SitesTab()); - tabbedPane.addTab( new Label(new GlobalizedMessage("ui.admin.tab.workflows.title", ADMIN_BUNDLE)), diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/AbstractComponentModelForm.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/AbstractComponentModelForm.java new file mode 100644 index 000000000..b16eedfa9 --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/AbstractComponentModelForm.java @@ -0,0 +1,286 @@ +/* + * Copyright (C) 2017 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package com.arsdigita.ui.admin.pagemodels; + +import com.arsdigita.bebop.Form; +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.SaveCancelSection; +import com.arsdigita.bebop.event.FormInitListener; +import com.arsdigita.bebop.event.FormProcessListener; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.event.FormValidationListener; +import com.arsdigita.bebop.form.TextField; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.ui.admin.AdminUiConstants; + +import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.pagemodel.ComponentModel; +import org.libreccm.pagemodel.ComponentModelRepository; +import org.libreccm.pagemodel.PageModel; +import org.libreccm.pagemodel.PageModelManager; +import org.libreccm.pagemodel.PageModelRepository; + +/** + * Base form for creating forms for editing/creating components of a + * {@link PageModel}. + * + * @param + * + * @author Jens Pelzetter + */ +public abstract class AbstractComponentModelForm + extends Form + implements FormInitListener, + FormValidationListener, + FormProcessListener { + + /** + * Constant for identifying the key text field. + */ + private static final String COMPONENT_KEY = "componentKey"; + + /** + * The {@link PageModelTab} in which the form is used + */ + private final PageModelTab pageModelTab; + /** + * ID of the selected {@link PageModel}. + */ + private final ParameterSingleSelectionModel selectedModelId; + /** + * ID of the selected {@link ComponentModel}. {@code null} of empty if a new + * component is added. + */ + private final ParameterSingleSelectionModel selectedComponentId; + + /** + * Text field for the component's key in the page model. + */ + private TextField keyField; + + private SaveCancelSection saveCancelSection; + + /** + * The selected component model. + */ + private T componentModel; + + public AbstractComponentModelForm( + final String name, + final PageModelTab pageModelTab, + final ParameterSingleSelectionModel selectedModelId, + final ParameterSingleSelectionModel selectedComponentId) { + + super(name); + + this.pageModelTab = pageModelTab; + this.selectedModelId = selectedModelId; + this.selectedComponentId = selectedComponentId; + + keyField = new TextField(COMPONENT_KEY); + keyField.setLabel(new GlobalizedMessage( + "ui.admin.pagemodels.components.key.label", + AdminUiConstants.ADMIN_BUNDLE)); + super.add(keyField); + + addBasicWidgets(); + } + + private void addBasicWidgets() { + keyField = new TextField("componentModelKey"); + keyField.setLabel(new GlobalizedMessage( + "ui.admin.pagemodels.components.key.label", + AdminUiConstants.ADMIN_BUNDLE)); + super.add(keyField); + + addWidgets(); + + saveCancelSection = new SaveCancelSection(); + super.add(saveCancelSection); + } + + protected final PageModelTab getPageModelTab() { + return pageModelTab; + } + + protected final ParameterSingleSelectionModel getSelectedComponentId() { + return selectedComponentId; + } + + protected final ParameterSingleSelectionModel getSelectedModelId() { + return selectedModelId; + } + + protected final SaveCancelSection getSaveCancelSection() { + return saveCancelSection; + } + + protected final T getComponentModel() { + return componentModel; + } + + /** + * Subclasses have to override this method to add the widgets specific for a + * component model. + */ + protected abstract void addWidgets(); + + /** + * Creates a new {@link ComponentModel} of a specific type. This method is + * only a wrapper around the constructor. An implementation should not add + * the component to a {@link PageModel} or save the {@link ComponentModel} + * in the database. This class takes care of that. + * + * @return A new {@link ComponentModel}. + */ + protected abstract T createComponentModel(); + + /** + * Updates the current component model with data from the form. + * + * @param componentModel + * @param state + * @param data + */ + protected abstract void updateComponentModel(T componentModel, + PageState state, + FormData data); + + @Override + public void init(final FormSectionEvent event) throws FormProcessException { + + final PageState state = event.getPageState(); + final String selectedComponentIdStr = selectedComponentId + .getSelectedKey(state); + + if (selectedComponentIdStr != null + && !selectedComponentIdStr.isEmpty()) { + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ComponentModelRepository componentModelRepo = cdiUtil + .findBean(ComponentModelRepository.class); + + final ComponentModel model = componentModelRepo + .findById(Long.parseLong(selectedComponentIdStr)) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No ComponentModel with ID %s in the database.", + selectedComponentIdStr))); + + keyField.setValue(state, model.getKey()); + } + } + + @Override + public void validate(final FormSectionEvent event) + throws FormProcessException { + + final PageState state = event.getPageState(); + + if (saveCancelSection.getSaveButton().isSelected(state)) { + + final FormData data = event.getFormData(); + final String keyValue = data.getString(COMPONENT_KEY); + + if (keyValue == null + || keyValue.isEmpty() + || keyValue.matches("\\s*")) { + + data.addError(COMPONENT_KEY, + new GlobalizedMessage( + "ui.admin.pagemodels.components.key.error.not_empty", + AdminUiConstants.ADMIN_BUNDLE)); + } + } + } + + @Override + public void process(final FormSectionEvent event) + throws FormProcessException { + + final PageState state = event.getPageState(); + + if (saveCancelSection.getSaveButton().isSelected(state)) { + + final String selectedModelIdStr = selectedModelId + .getSelectedKey(state); + final String selectedComponentIdStr = selectedComponentId + .getSelectedKey(state); + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final PageModelRepository pageModelRepo = cdiUtil + .findBean(PageModelRepository.class); + final PageModelManager pageModelManager = cdiUtil + .findBean(PageModelManager.class); + + final FormData data = event.getFormData(); + final String keyValue = data.getString(COMPONENT_KEY); + + if (selectedComponentIdStr == null + || selectedComponentIdStr.isEmpty()) { + + componentModel = createComponentModel(); + componentModel.setKey(keyValue); + updateComponentModel(componentModel, state, data); + + final PageModel pageModel = pageModelRepo + .findById(Long.parseLong(selectedModelIdStr)) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No PageModel with ID %s in the database.", + selectedModelIdStr))); + + pageModelManager.addComponentModel(pageModel, componentModel); + } else { + + componentModel = retrieveComponentModel(selectedComponentIdStr); + componentModel.setKey(keyValue); + + updateComponentModel(componentModel, state, data); + + final ComponentModelRepository componentModelRepo = cdiUtil + .findBean(ComponentModelRepository.class); + componentModelRepo.save(componentModel); + } + + } + + selectedComponentId.clearSelection(state); + pageModelTab.showPageModelDetails(state); + + } + + @SuppressWarnings("unchecked") + private T retrieveComponentModel(final String componentModelId) { + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + + final ComponentModelRepository componentModelRepo = cdiUtil + .findBean(ComponentModelRepository.class); + + return (T) componentModelRepo + .findById(Long.parseLong(componentModelId)) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No ComponentModel with ID %s in the database", + componentModelId))); + + } + +} diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/ComponentsTable.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/ComponentsTable.java index 6eacc8dca..daf9a35be 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/ComponentsTable.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/ComponentsTable.java @@ -163,17 +163,17 @@ class ComponentsTable extends Table { }); - super.setModelBuilder(new PageModelComponentsTableModelBuilder( + super.setModelBuilder(new ComponentsTableModelBuilder( selectedModelId)); } - private class PageModelComponentsTableModelBuilder + private class ComponentsTableModelBuilder extends LockableImpl implements TableModelBuilder { private final ParameterSingleSelectionModel selectedModelId; - public PageModelComponentsTableModelBuilder( + public ComponentsTableModelBuilder( final ParameterSingleSelectionModel selectedModelId) { this.selectedModelId = selectedModelId; @@ -193,17 +193,17 @@ class ComponentsTable extends Table { final List components = controller .retrieveComponents(Long.parseLong(selectedModelIdStr)); - return new PageModelComponentsTableModel(components); + return new ComponentsTableModel(components); } } - private class PageModelComponentsTableModel implements TableModel { + private class ComponentsTableModel implements TableModel { private final Iterator iterator; private ComponentModel currentComponent; - public PageModelComponentsTableModel( + public ComponentsTableModel( final List components) { iterator = components.iterator(); diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelDetails.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelDetails.java index 44359b592..1d437b8a0 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelDetails.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelDetails.java @@ -21,21 +21,30 @@ package com.arsdigita.ui.admin.pagemodels; import com.arsdigita.bebop.ActionLink; import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.Form; +import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.Label; import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.ParameterSingleSelectionModel; import com.arsdigita.bebop.PropertySheet; +import com.arsdigita.bebop.event.FormProcessListener; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.event.PrintEvent; +import com.arsdigita.bebop.event.PrintListener; +import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.form.SingleSelect; +import com.arsdigita.bebop.form.Submit; import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.ui.admin.AdminUiConstants; import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.core.UnexpectedErrorException; -import org.libreccm.modules.ModuleManager; +import org.libreccm.pagemodel.ComponentModel; import org.libreccm.pagemodel.ComponentModels; import org.libreccm.pagemodel.PageModel; +import org.libreccm.pagemodel.PageModelComponentModel; import org.libreccm.pagemodel.PageModelRepository; +import java.util.List; import java.util.TooManyListenersException; /** @@ -91,13 +100,9 @@ class PageModelDetails extends BoxPanel { }); super.add(editProperties); - final ActionLink addComponent = new ActionLink(new GlobalizedMessage( - "ui.admin.pagemodels.details.add_component", - AdminUiConstants.ADMIN_BUNDLE)); - addComponent.addActionListener(event -> { - //pageModelTab.showNewComponentForm(state, componentModelClass); - }); - super.add(addComponent); + final AddComponentForm addComponentForm = new AddComponentForm( + pageModelTab); + super.add(addComponentForm); final ComponentsTable componentsTable = new ComponentsTable( @@ -105,27 +110,91 @@ class PageModelDetails extends BoxPanel { super.add(componentsTable); } - private class AddComponentForm extends Form { + private class AddComponentForm + extends Form + implements FormProcessListener { + private final PageModelTab pageModelTab; private final SingleSelect selectType; - public AddComponentForm() { - super("pagemodel_add_component_form"); + public AddComponentForm(final PageModelTab pageModelTab) { + + super("pagemodel_add_component_form", + new BoxPanel(BoxPanel.HORIZONTAL)); + + this.pageModelTab = pageModelTab; + + final Label formLabel = new Label(new GlobalizedMessage( + "ui.admin.pagemodels.add_new_component", + AdminUiConstants.ADMIN_BUNDLE)); + super.add(formLabel); selectType = new SingleSelect("select_component_type"); + selectType.setLabel(new GlobalizedMessage( + "ui.admin.pagemodels.add_new_component.type", + AdminUiConstants.ADMIN_BUNDLE)); try { - selectType.addPrintListener(event -> { - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final ComponentModels componentModels = cdiUtil - .findBean(ComponentModels.class); - - - - }); + selectType + .addPrintListener(new ComponentModelSelectPrintListener()); } catch (TooManyListenersException ex) { throw new UnexpectedErrorException(ex); } + super.add(selectType); + final Submit submit = new Submit(new GlobalizedMessage( + "ui.admin.pagemodels.add_new_component.submit", + AdminUiConstants.ADMIN_BUNDLE)); + super.add(submit); + } + + @Override + public void process(final FormSectionEvent event) + throws FormProcessException { + + final PageState state = event.getPageState(); + final String type = (String) selectType.getValue(state); + final Class clazz = getClass(type); + + pageModelTab.showNewComponentForm(state, clazz); + } + + @SuppressWarnings("unchecked") + private Class getClass(final String type) { + try { + return (Class) Class.forName(type); + } catch (ClassNotFoundException ex) { + throw new UnexpectedErrorException(ex); + } + } + + } + + private class ComponentModelSelectPrintListener implements PrintListener { + + @Override + public void prepare(final PrintEvent event) { + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ComponentModels componentModels = cdiUtil + .findBean(ComponentModels.class); + + final SingleSelect target = (SingleSelect) event.getTarget(); + target.clearOptions(); + + final List models = componentModels + .findAvailableComponentModels(); + for (final PageModelComponentModel model : models) { + target.addOption(createOption(model)); + } + } + + private Option createOption(final PageModelComponentModel model) { + + final GlobalizedMessage title = new GlobalizedMessage( + model.titleKey(), model.descBundle()); + + return new Option(model.modelClass().getName(), + new Label(title)); } } diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelForm.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelForm.java index 1cd36d3c8..d74cf8e14 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelForm.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelForm.java @@ -123,7 +123,6 @@ class PageModelForm extends Form { applicationSelect.setLabel(new GlobalizedMessage( "ui.admin.pagemodels.application", AdminUiConstants.ADMIN_BUNDLE)); - super.add(applicationSelect); try { applicationSelect.addPrintListener(event -> { @@ -324,6 +323,8 @@ class PageModelForm extends Form { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final PageModelRepository pageModelRepo = cdiUtil .findBean(PageModelRepository.class); + final PageModelManager pageModelManager = cdiUtil + .findBean(PageModelManager.class); final ConfigurationManager confManager = cdiUtil .findBean(ConfigurationManager.class); final ApplicationRepository appRepo = cdiUtil @@ -335,9 +336,17 @@ class PageModelForm extends Form { final String selectedModelIdStr = selectedModelId .getSelectedKey(state); + final CcmApplication application = appRepo + .retrieveApplicationForPath(appValue) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No CcmApplication with primary URL \"%s\" in the " + + "database.", + appValue))); + final PageModel pageModel; if (selectedModelIdStr == null || selectedModelIdStr.isEmpty()) { - pageModel = new PageModel(); + pageModel = pageModelManager.createPageModel(nameValue, + application); } else { pageModel = pageModelRepo .findById(Long.parseLong(selectedModelIdStr)) @@ -350,20 +359,13 @@ class PageModelForm extends Form { pageModel.getTitle().addValue(defaultLocale, titleValue); pageModel.getDescription().addValue(defaultLocale, descValue); - - final CcmApplication application = appRepo - .retrieveApplicationForPath(appValue) - .orElseThrow(() -> new IllegalArgumentException(String - .format("No CcmApplication with primary URL \"%s\" in the " - + "database.", - appValue))); pageModel.setApplication(application); pageModelRepo.save(pageModel); } - pageModelTab.showPageModelDetails(state); + pageModelTab.showPageModelsTable(state); } } diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelsController.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelsController.java index f52a194b9..5ec72ac38 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelsController.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelsController.java @@ -31,6 +31,7 @@ import org.libreccm.web.ApplicationRepository; import org.libreccm.web.CcmApplication; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -154,7 +155,11 @@ class PageModelsController implements Serializable { .format("No PageModel with ID %d in the database.", pageModelId))); - return model.getComponents(); + final List components = new ArrayList<>(); + for(final ComponentModel component : model.getComponents()) { + components.add(component); + } + return components; } @Transactional(Transactional.TxType.REQUIRED) diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelsTable.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelsTable.java index b035f2410..e39bee99a 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelsTable.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/pagemodels/PageModelsTable.java @@ -168,8 +168,6 @@ class PageModelsTable extends Table { throw new IllegalArgumentException( "Invalid value for column."); } - - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override 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 1768960d4..83240e126 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelManager.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/PageModelManager.java @@ -102,11 +102,21 @@ public class PageModelManager { components.size()); } + @Transactional(Transactional.TxType.REQUIRED) + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + public PageModel createPageModel(final String name, + final CcmApplication application) { + + return createPageModel(name, application, ""); + } + /** * Creates a new {@link PageModel} for the provided application. The method - * tries to retrieve the appropriate page model by using + * tries to retrieve the appropriate application by using * {@link PageModelRepository#findByApplicationAndName(org.libreccm.web.CcmApplication, java.lang.String)}. - * Please note that this method will always return the live + * Please note that this method will always return the + * draft * version of the page model. * * @param name The name of the new page model. Must be unique for the diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties index 6d9151634..7e0591d34 100644 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties @@ -655,3 +655,27 @@ ui.admin.pagemodels.componentmodels.cols.delete.heading=Delete ui.admin.pagemodels.components.edit=Edit ui.admin.pagemodels.components.delete=Delete ui.admin.pagemodels.details.add_component=Add Component +ui.admin.pagemodels.add_new_component=Add new component +ui.admin.pagemodels.add_new_component.type=Type +ui.admin.pagemodels.add_new_component.submit=Create +ui.admin.tab.pagemodels.title=PageModels +ui.admin.pagemodels.add_new_pagemodel_link=Create new PageModel +ui.admin.pagemodels.table.empty_view=No PageModels available +ui.admin.pagemodels.create_new=Create new PageModel +ui.admin.pagemodels.name=Name +ui.admin.pagemodels.title=Title +ui.admin.pagemodels.desc=Description +ui.admin.pagemodels.application=Application +ui.admin.pagemodels.table.columns.headers.application=Application +ui.admin.pagemodels.table.columns.headers.name=Name +ui.admin.pagemodels.table.columns.headers.title=Title +ui.admin.pagemodels.table.columns.headers.desc=Description +ui.admin.pagemodels.table.columns.headers.remove=Delete +\ \tui.admin.pagemodels.table.columns.remove.label=Delete +ui.admin.pagemodels.details.model_name=Name +ui.admin.pagemodels.details.model_title=Titel +ui.admin.pagemodels.details.model_application=Application +ui.admin.pagemodels.details.model_desc=Description +ui.admin.pagemodels.details.edit_properties=Edit properties +ui.admin.pagemodels.components.key.label=ID +ui.admin.pagemodels.components.key.error.not_empty=The ID of a component can't be empty. diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties index 1ed53072f..d7a58acc7 100644 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties @@ -659,3 +659,27 @@ ui.admin.pagemodels.componentmodels.cols.delete.heading=Delete ui.admin.pagemodels.components.edit=Bearbeiten ui.admin.pagemodels.components.delete=L\u00f6schen ui.admin.pagemodels.details.add_component=Komponente hinzuf\u00fcgen +ui.admin.pagemodels.add_new_component=Neue Komponente hinzuf\u00fcgen +ui.admin.pagemodels.add_new_component.type=Typ +ui.admin.pagemodels.add_new_component.submit=Hinzuf\u00fcgen +ui.admin.tab.pagemodels.title=PageModels +ui.admin.pagemodels.add_new_pagemodel_link=Neues PageModel anlegen +ui.admin.pagemodels.table.empty_view=Keine PageModels verf\u00fcgbar +ui.admin.pagemodels.create_new=Neues PageModel anlegen +ui.admin.pagemodels.name=Name +ui.admin.pagemodels.title=Titel +ui.admin.pagemodels.desc=Beschreibung +ui.admin.pagemodels.application=Applikation +ui.admin.pagemodels.table.columns.headers.application=Applikation +ui.admin.pagemodels.table.columns.headers.name=Name +ui.admin.pagemodels.table.columns.headers.title=Titel +ui.admin.pagemodels.table.columns.headers.desc=Description +ui.admin.pagemodels.table.columns.headers.remove=L\u00f6schen +\ \tui.admin.pagemodels.table.columns.remove.label=L\u00f6schen +ui.admin.pagemodels.details.model_name=Name +ui.admin.pagemodels.details.model_title=Titel +ui.admin.pagemodels.details.model_application=Applikation +ui.admin.pagemodels.details.model_desc=Beschreibung +ui.admin.pagemodels.details.edit_properties=Bearbeiten +ui.admin.pagemodels.components.key.label=ID +ui.admin.pagemodels.components.key.error.not_empty=Die ID einer Komponente darf nicht leer sein. diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties index 1995b1cf8..ee3cde28a 100755 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties @@ -652,3 +652,27 @@ ui.admin.pagemodels.componentmodels.cols.delete.heading=Delete ui.admin.pagemodels.components.edit=Edit ui.admin.pagemodels.components.delete=Delete ui.admin.pagemodels.details.add_component=Add Component +ui.admin.pagemodels.add_new_component=Add new component +ui.admin.pagemodels.add_new_component.type=Type +ui.admin.pagemodels.add_new_component.submit=Create +ui.admin.tab.pagemodels.title=PageModels +ui.admin.pagemodels.add_new_pagemodel_link=Create new PageModel +ui.admin.pagemodels.table.empty_view=No PageModels available +ui.admin.pagemodels.create_new=Create new PageModel +ui.admin.pagemodels.name=Name +ui.admin.pagemodels.title=Title +ui.admin.pagemodels.desc=Description +ui.admin.pagemodels.application=Application +ui.admin.pagemodels.table.columns.headers.application=Application +ui.admin.pagemodels.table.columns.headers.name=Name +ui.admin.pagemodels.table.columns.headers.title=Title +ui.admin.pagemodels.table.columns.headers.desc=Description +ui.admin.pagemodels.table.columns.headers.remove=Delete +\ \tui.admin.pagemodels.table.columns.remove.label=Delete +ui.admin.pagemodels.details.model_name=Name +ui.admin.pagemodels.details.model_title=Titel +ui.admin.pagemodels.details.model_application=Application +ui.admin.pagemodels.details.model_desc=Description +ui.admin.pagemodels.details.edit_properties=Edit properties +ui.admin.pagemodels.components.key.label=ID +ui.admin.pagemodels.components.key.error.not_empty=The ID of a component can't be empty. diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties index 27aa0a203..8eb17d51a 100755 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties @@ -643,3 +643,27 @@ ui.admin.pagemodels.componentmodels.cols.delete.heading=Delete ui.admin.pagemodels.components.edit=Edit ui.admin.pagemodels.components.delete=Delete ui.admin.pagemodels.details.add_component=Add Component +ui.admin.pagemodels.add_new_component=Add new component +ui.admin.pagemodels.add_new_component.type=Type +ui.admin.pagemodels.add_new_component.submit=Create +ui.admin.tab.pagemodels.title=PageModels +ui.admin.pagemodels.add_new_pagemodel_link=Create new PageModel +ui.admin.pagemodels.table.empty_view=No PageModels available +ui.admin.pagemodels.create_new=Create new PageModel +ui.admin.pagemodels.name=Name +ui.admin.pagemodels.title=Title +ui.admin.pagemodels.desc=Description +ui.admin.pagemodels.application=Application +ui.admin.pagemodels.table.columns.headers.application=Application +ui.admin.pagemodels.table.columns.headers.name=Name +ui.admin.pagemodels.table.columns.headers.title=Title +ui.admin.pagemodels.table.columns.headers.desc=Description +ui.admin.pagemodels.table.columns.headers.remove=Delete +\ \tui.admin.pagemodels.table.columns.remove.label=Delete +ui.admin.pagemodels.details.model_name=Name +ui.admin.pagemodels.details.model_title=Titel +ui.admin.pagemodels.details.model_application=Application +ui.admin.pagemodels.details.model_desc=Description +ui.admin.pagemodels.details.edit_properties=Edit properties +ui.admin.pagemodels.components.key.label=ID +ui.admin.pagemodels.components.key.error.not_empty=The ID of a component can't be empty.