From a41c3414b887dec38f6b7af2dc5b9c72eab41e82 Mon Sep 17 00:00:00 2001 From: jensp Date: Sun, 3 Dec 2017 18:52:14 +0000 Subject: [PATCH] CCM NG: PageModel Admin UI for Vaadin Prototype git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5155 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: 3032773dc4f94cd7f37c5fe2acfb19f50099ef11 --- .../CategoryTreeComponentEditor.java | 15 ++- .../ui/pagemodel/ItemListComponentEditor.java | 9 +- .../ui/AbstractPageModelComponentEditor.java | 12 +- .../PageModelComponentEditorController.java | 31 ++++- ...eModelComponentModelTypesDataProvider.java | 52 ++++++-- ...ModelComponentModelsTableDataProvider.java | 33 ++++- .../libreccm/admin/ui/PageModelDetails.java | 49 ++++++-- .../org/libreccm/admin/ui/PageModelForm.java | 66 ++++++++-- .../admin/ui/PageModelsController.java | 16 +++ .../org/libreccm/admin/ui/PageModelsTab.java | 3 +- .../libreccm/l10n/GlobalizationHelper.java | 23 +++- .../l10n/ui/LocalizedStringEditor.java | 114 +++++++++++++++++- .../ui/admin/AdminResources.properties | 7 ++ .../ui/admin/AdminResources_de.properties | 7 ++ .../ui/admin/AdminResources_en.properties | 7 ++ .../ui/admin/AdminResources_fr.properties | 7 ++ 16 files changed, 393 insertions(+), 58 deletions(-) diff --git a/ccm-cms/src/main/java/org/librecms/ui/pagemodel/CategoryTreeComponentEditor.java b/ccm-cms/src/main/java/org/librecms/ui/pagemodel/CategoryTreeComponentEditor.java index 7f9011de6..9c7999401 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/pagemodel/CategoryTreeComponentEditor.java +++ b/ccm-cms/src/main/java/org/librecms/ui/pagemodel/CategoryTreeComponentEditor.java @@ -73,20 +73,23 @@ public class CategoryTreeComponentEditor showFullTreeCheckBox = new CheckBox(textsUtil .getText( "cms.ui.pagemodel.category_tree_component_form.show_full_tree.label")); + addComponent(showFullTreeCheckBox); } @Override protected void initWidgets() { - + final CategoryTreeComponent component = getComponentModel(); - - showFullTreeCheckBox.setValue(component.isShowFullTree()); + + if (component != null) { + showFullTreeCheckBox.setValue(component.isShowFullTree()); + } } @Override protected boolean validate() { - + //Nothing to validate here return true; } @@ -98,9 +101,9 @@ public class CategoryTreeComponentEditor @Override protected void updateComponentModel() { - + final CategoryTreeComponent component = getComponentModel(); - + component.setShowFullTree(showFullTreeCheckBox.getValue()); } diff --git a/ccm-cms/src/main/java/org/librecms/ui/pagemodel/ItemListComponentEditor.java b/ccm-cms/src/main/java/org/librecms/ui/pagemodel/ItemListComponentEditor.java index 23843adc4..6b4171b96 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/pagemodel/ItemListComponentEditor.java +++ b/ccm-cms/src/main/java/org/librecms/ui/pagemodel/ItemListComponentEditor.java @@ -92,6 +92,7 @@ public class ItemListComponentEditor pageSizeField = new TextField(textsUtil .getText("cms.ui.pagemodel.itemlist_component_form.page_size.label")); + pageSizeField.setValue("25"); addComponent(pageSizeField); listOrderArea = new TextArea(textsUtil @@ -106,9 +107,13 @@ public class ItemListComponentEditor if (itemListComponent != null) { descendingCheckBox.setValue(itemListComponent.isDescending()); + limitToTypeField.setValue(itemListComponent.getLimitToType()); + pageSizeField + .setValue(Integer.toString(itemListComponent.getPageSize())); + listOrderArea.setValue(String.join("\n", + itemListComponent.getListOrder())); + } - - 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/admin/ui/AbstractPageModelComponentEditor.java b/ccm-core/src/main/java/org/libreccm/admin/ui/AbstractPageModelComponentEditor.java index c0abd8e9c..1d844090c 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/AbstractPageModelComponentEditor.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/AbstractPageModelComponentEditor.java @@ -128,7 +128,7 @@ public abstract class AbstractPageModelComponentEditor .getText("ui.admin.pagemodels.components.key.error.not_empty"))); return; } - + if (!validate()) { return; } @@ -137,14 +137,16 @@ public abstract class AbstractPageModelComponentEditor componentModel = createComponentModel(); componentModel.setKey(key); updateComponentModel(); - controller.getPageModelManager().addComponentModel(pageModel, - componentModel); + controller + .getPageModelsController() + .addComponentModel(pageModel, componentModel); } else { - componentModel.setKey(key); updateComponentModel(); controller.getComponentModelRepository().save(componentModel); } + controller.refreshComponentModels(); + close(); } protected PageModelComponentEditorController getController() { @@ -167,7 +169,7 @@ public abstract class AbstractPageModelComponentEditor protected abstract void initWidgets(); /** - * + * * @return {@code true} if form is validate, {@code false} if not. */ protected abstract boolean validate(); diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentEditorController.java b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentEditorController.java index f97bfabf0..7ea6e3276 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentEditorController.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentEditorController.java @@ -31,26 +31,47 @@ import javax.inject.Inject; */ @RequestScoped public class PageModelComponentEditorController { - + @Inject private ComponentModelRepository componentModelRepository; - + @Inject private GlobalizationHelper globalizationHelper; + + @Inject + private PageModelsController pageModelsController; @Inject private PageModelManager pageModelManager; - + + @Inject + private PageModelsTableDataProvider pageModelsTableDataProvider; + + @Inject + private PageModelComponentModelsTableDataProvider pageModelComponentModelsTableDataProvider; + public ComponentModelRepository getComponentModelRepository() { return componentModelRepository; } - + public GlobalizationHelper getGlobalizationHelper() { return globalizationHelper; } + + public PageModelsController getPageModelsController() { + return pageModelsController; + } public PageModelManager getPageModelManager() { return pageModelManager; } - + + public void refreshPageModelsTable() { + pageModelsTableDataProvider.refreshAll(); + } + + public void refreshComponentModels() { + pageModelComponentModelsTableDataProvider.refreshAll(); + } + } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentModelTypesDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentModelTypesDataProvider.java index cc386ce03..24c0303c9 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentModelTypesDataProvider.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentModelTypesDataProvider.java @@ -21,9 +21,12 @@ package org.libreccm.admin.ui; import com.vaadin.cdi.ViewScoped; import com.vaadin.data.provider.AbstractDataProvider; import com.vaadin.data.provider.Query; +import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.l10n.LocalizedTextsUtil; import org.libreccm.pagemodel.ComponentModels; import org.libreccm.pagemodel.PageModelComponentModel; +import java.util.Optional; import java.util.stream.Stream; import javax.inject.Inject; @@ -41,6 +44,9 @@ class PageModelComponentModelTypesDataProvider @Inject private ComponentModels componentModels; + @Inject + private GlobalizationHelper globalizationHelper; + @Override public boolean isInMemory() { return true; @@ -49,18 +55,50 @@ class PageModelComponentModelTypesDataProvider @Override public int size(final Query query) { - return componentModels - .findAvailableComponentModels() - .size(); + final Optional filter = query.getFilter(); + + if (filter.isPresent()) { + return (int) componentModels + .findAvailableComponentModels() + .stream() + .filter(model -> filterModels(model, filter.get())) + .count(); + + } else { + return componentModels + .findAvailableComponentModels() + .size(); + } } @Override public Stream fetch( final Query query) { - - return componentModels - .findAvailableComponentModels() - .stream(); + + final Optional filter = query.getFilter(); + + if (filter.isPresent()) { + return componentModels + .findAvailableComponentModels() + .stream() + .filter(model -> filterModels(model, filter.get())); + } else { + return componentModels + .findAvailableComponentModels() + .stream(); + } + } + + private boolean filterModels(final PageModelComponentModel model, + final String filter) { + + final LocalizedTextsUtil textsUtil = globalizationHelper + .getLocalizedTextsUtil(model.descBundle()); + + final String title = textsUtil + .getText(textsUtil.getText(model.titleKey())); + + return title.startsWith(filter); } } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentModelsTableDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentModelsTableDataProvider.java index 8387cc401..bc65ff725 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentModelsTableDataProvider.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelComponentModelsTableDataProvider.java @@ -29,6 +29,10 @@ import java.util.Objects; import java.util.stream.Stream; import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import javax.transaction.Transactional; /** @@ -41,6 +45,9 @@ class PageModelComponentModelsTableDataProvider private static final long serialVersionUID = -8880329002442808769L; + @Inject + private EntityManager entityManager; + @Inject private PageModelRepository pageModelRepo; @@ -60,8 +67,16 @@ class PageModelComponentModelsTableDataProvider protected Stream fetchFromBackEnd( final Query query) { - return retrievePageModel() - .getComponents() + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = builder + .createQuery(ComponentModel.class); + final Root from = criteriaQuery + .from(ComponentModel.class); + criteriaQuery.where(builder.equal(from.get("pageModel"), pageModel)); + + return entityManager + .createQuery(criteriaQuery) + .getResultList() .stream(); } @@ -69,7 +84,19 @@ class PageModelComponentModelsTableDataProvider @Transactional(Transactional.TxType.REQUIRED) protected int sizeInBackEnd(final Query query) { - return retrievePageModel().getComponents().size(); + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = builder + .createQuery(Long.class); + final Root from = criteriaQuery + .from(ComponentModel.class); + criteriaQuery.select(builder.count(from)); + criteriaQuery.where(builder.equal(from.get("pageModel"), pageModel)); + + return entityManager + .createQuery(criteriaQuery) + .getSingleResult() + .intValue(); +// return retrievePageModel().getComponents().size(); } private PageModel retrievePageModel() { diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelDetails.java b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelDetails.java index 57633d92c..27d36e1f9 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelDetails.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelDetails.java @@ -23,18 +23,19 @@ import com.arsdigita.ui.admin.AdminUiConstants; import com.vaadin.icons.VaadinIcons; import com.vaadin.ui.Button; +import com.vaadin.ui.ComboBox; import com.vaadin.ui.Component; import com.vaadin.ui.FormLayout; import com.vaadin.ui.Grid; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; -import com.vaadin.ui.NativeSelect; import com.vaadin.ui.Notification; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.components.grid.HeaderCell; import com.vaadin.ui.components.grid.HeaderRow; +import com.vaadin.ui.themes.ValoTheme; import org.libreccm.configuration.ConfigurationManager; import org.libreccm.core.UnexpectedErrorException; import org.libreccm.l10n.GlobalizationHelper; @@ -68,7 +69,8 @@ class PageModelDetails extends Window { private final CcmApplication application; private final PageModel pageModel; - private final NativeSelect componentModelTypeSelect; +// private final NativeSelect componentModelTypeSelect; + private final ComboBox componentModelTypeSelect; PageModelDetails(final PageModel pageModel, final CcmApplication application, @@ -121,6 +123,8 @@ class PageModelDetails extends Window { editPropertiesButton.setIcon(VaadinIcons.EDIT); editPropertiesButton .addClickListener(this::editBasicPropertiesButtonClicked); + final HorizontalLayout buttonsLayout = new HorizontalLayout( + editPropertiesButton); final PageModelsController pageModelsController = controller .getPageModelsController(); @@ -154,16 +158,32 @@ class PageModelDetails extends Window { .setId(COL_DEL); componentsModelGrid.setWidth("100%"); - componentModelTypeSelect = new NativeSelect<>( - textsUtil.getText("ui.admin.pagemodels.add_new_component.type"), - pageModelsController.getComponentModelTypesDataProvider()); +// componentModelTypeSelect = new NativeSelect<>( +// textsUtil.getText("ui.admin.pagemodels.add_new_component.type"), +// pageModelsController.getComponentModelTypesDataProvider()); + componentModelTypeSelect = new ComboBox<>(); + componentModelTypeSelect.setTextInputAllowed(false); + componentModelTypeSelect.setEmptySelectionAllowed(false); + componentModelTypeSelect.setDescription(textsUtil + .getText("ui.admin.pagemodels.add_new_component.type")); + componentModelTypeSelect.setDataProvider(pageModelsController + .getComponentModelTypesDataProvider()); componentModelTypeSelect .setItemCaptionGenerator(this::generateComponentModelTypeCaption); + componentModelTypeSelect.addStyleName(ValoTheme.COMBOBOX_TINY); final Button addComponentModelButton = new Button(textsUtil .getText("ui.admin.pagemodels.add_new_component.submit")); + addComponentModelButton.addStyleName(ValoTheme.BUTTON_TINY); addComponentModelButton.setIcon(VaadinIcons.PLUS_CIRCLE_O); addComponentModelButton .addClickListener(this::addComponentButtonClicked); +// final Panel componentsPanel = new Panel( +// "Components", +// new VerticalLayout(new HorizontalLayout( +// new FormLayout(componentModelTypeSelect), +// addComponentModelButton), +// componentsModelGrid)); + final HeaderRow headerRow = componentsModelGrid.prependHeaderRow(); final HeaderCell headerCell = headerRow.join(COL_KEY, COL_TYPE, @@ -171,8 +191,12 @@ class PageModelDetails extends Window { COL_DEL); headerCell.setComponent(new HorizontalLayout(componentModelTypeSelect, addComponentModelButton)); - - super.setContent(new VerticalLayout(propertiesSheetLayout)); + super.setContent(new VerticalLayout(propertiesSheetLayout, + buttonsLayout, + componentsModelGrid)); +// super.setContent(new VerticalLayout(propertiesSheetLayout, +// buttonsLayout, +// componentsPanel)); } @SuppressWarnings("unchecked") @@ -222,6 +246,7 @@ class PageModelDetails extends Window { | InvocationTargetException ex) { throw new UnexpectedErrorException(ex); } + editor.initWidgets(); editor.setModal(true); editor.setWidth("50%"); @@ -270,6 +295,7 @@ class PageModelDetails extends Window { final Button editButton = new Button(textsUtil .getText("ui.admin.pagemodels.components.edit")); editButton.setIcon(VaadinIcons.EDIT); + editButton.addStyleName(ValoTheme.BUTTON_TINY); editButton.addClickListener(event -> editComponentModel(componentModel)); return editButton; @@ -315,8 +341,8 @@ class PageModelDetails extends Window { try { constructor = editorClass .getDeclaredConstructor(PageModel.class, - ComponentModel.class, - PageModelComponentEditorController.class + componentModelInfo.get().modelClass(), + PageModelComponentEditorController.class ); } catch (NoSuchMethodException ex) { throw new UnexpectedErrorException(ex); @@ -333,6 +359,7 @@ class PageModelDetails extends Window { | InvocationTargetException ex) { throw new UnexpectedErrorException(ex); } + editor.initWidgets(); editor.setModal(true); editor.setWidth("50%"); @@ -357,7 +384,9 @@ class PageModelDetails extends Window { final Button deleteButton = new Button(textsUtil .getText("ui.admin.pagemodels.components.delete")); - deleteButton.setIcon(VaadinIcons.EDIT); + deleteButton.setIcon(VaadinIcons.MINUS_CIRCLE_O); + deleteButton.addStyleNames(ValoTheme.BUTTON_TINY, + ValoTheme.BUTTON_DANGER); deleteButton.addClickListener(event -> { final ConfirmDialog confirmDialog = new ConfirmDialog(() -> { diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelForm.java b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelForm.java index 25fde1696..d899eccdb 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelForm.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelForm.java @@ -24,11 +24,13 @@ import com.vaadin.server.UserError; import com.vaadin.ui.Button; import com.vaadin.ui.FormLayout; import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Panel; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.l10n.LocalizedString; import org.libreccm.l10n.LocalizedTextsUtil; import org.libreccm.l10n.ui.LocalizedStringEditor; import org.libreccm.pagemodel.PageModel; @@ -36,6 +38,9 @@ import org.libreccm.pagemodel.PageModelManager; import org.libreccm.pagemodel.PageModelRepository; import org.libreccm.web.CcmApplication; +import java.util.Locale; +import java.util.Map; + /** * * @author Jens Pelzetter @@ -88,18 +93,39 @@ class PageModelForm extends Window { nameField = new TextField(textsUtil.getText("ui.admin.pagemodels.name")); nameField.setRequiredIndicatorVisible(true); - titleEditor = new LocalizedStringEditor(pageModel.getTitle(), - globalizationHelper); - titleEditor.setCaption(textsUtil.getText("ui.admin.pagemodels.title")); + if (pageModel == null) { + titleEditor = new LocalizedStringEditor(globalizationHelper); + } else { + titleEditor = new LocalizedStringEditor(pageModel.getTitle(), + globalizationHelper); + } +// titleEditor.setCaption(textsUtil.getText("ui.admin.pagemodels.title")); + titleEditor.setHeight("10em"); + final Panel titlePanel = new Panel( + textsUtil.getText("ui.admin.pagemodels.title"), + titleEditor); - descriptionEditor = new LocalizedStringEditor( - pageModel.getDescription(), globalizationHelper); - descriptionEditor - .setCaption(textsUtil.getText("ui.admin.pagemodels.desc")); + if (pageModel == null) { + descriptionEditor = new LocalizedStringEditor(globalizationHelper); + } else { + descriptionEditor = new LocalizedStringEditor( + pageModel.getDescription(), globalizationHelper); + } +// descriptionEditor +// .setCaption(textsUtil.getText("ui.admin.pagemodels.desc")); + descriptionEditor.setHeight("10em"); + final Panel descPanel = new Panel( + textsUtil.getText("ui.admin.pagemodels.desc"), + descriptionEditor); - final FormLayout formLayout = new FormLayout(nameField, - titleEditor, - descriptionEditor); + if (pageModel == null) { + setCaption(textsUtil.getText("ui.admin.pagemodels.caption.new")); + } else { + setCaption(textsUtil.getText("ui.admin.pagemodels.caption.edit", + new String[]{pageModel.getName()})); + } + + final FormLayout formLayout = new FormLayout(nameField); final Button saveButton = new Button(textsUtil .getText("ui.admin.pagemodels.buttons.save")); @@ -113,7 +139,10 @@ class PageModelForm extends Window { cancelButton); final VerticalLayout layout = new VerticalLayout(formLayout, + titlePanel, + descPanel, buttonsLayout); + layout.setMargin(true); setContent(layout); } @@ -140,15 +169,30 @@ class PageModelForm extends Window { } if (pageModel == null) { - pageModel = pageModelManager.createPageModel(name, application); + final LocalizedString title = titleEditor.getLocalizedString(); + for (final Map.Entry entry : title.getValues() + .entrySet()) { + pageModel.getTitle().addValue(entry.getKey(), entry.getValue()); + } + final LocalizedString desc = descriptionEditor.getLocalizedString(); + for (final Map.Entry entry : desc.getValues() + .entrySet()) { + pageModel.getDescription().addValue(entry.getKey(), + entry.getValue()); + } } + pageModel.setName(name); final PageModelRepository pageModelRepo = pageModelsController .getPageModelRepo(); pageModelRepo.save(pageModel); + controller + .getPageModelsController() + .getPageModelsTableDataProvider() + .refreshAll(); close(); } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsController.java b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsController.java index 9c5e9e078..21eab54e1 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsController.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsController.java @@ -134,6 +134,22 @@ class PageModelsController implements Serializable { pageModelsTableDataProvider.refreshAll(); } + @Transactional(Transactional.TxType.REQUIRED) + protected void addComponentModel(final PageModel pageModel, + final ComponentModel componentModel) { + + Objects.requireNonNull(pageModel); + Objects.requireNonNull(componentModel); + + final PageModel toPageModel = pageModelRepo + .findById(pageModel.getPageModelId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No PageModel with ID %d in the database.", + pageModel.getPageModelId()))); + + pageModelManager.addComponentModel(toPageModel, componentModel); + } + @Transactional(Transactional.TxType.REQUIRED) protected void removeComponentModel(final PageModel pageModel, final ComponentModel componentModel) { diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsTab.java b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsTab.java index 912555f5c..99ab80c98 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsTab.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsTab.java @@ -109,6 +109,7 @@ class PageModelsTab extends CustomComponent { final Button addPageModelButton = new Button(localizedTextsUtil .getText("ui.admin.pagemodels.create_new")); + addPageModelButton.addStyleName(ValoTheme.BUTTON_TINY); addPageModelButton.setIcon(VaadinIcons.PLUS_CIRCLE_O); addPageModelButton.addClickListener(event -> { final CcmApplication application @@ -118,7 +119,7 @@ class PageModelsTab extends CustomComponent { adminViewController, application); pageModelForm.setModal(true); pageModelForm.setWidth("40%"); - pageModelForm.setHeight("30%"); + pageModelForm.setHeight("60%"); UI.getCurrent().addWindow(pageModelForm); }); diff --git a/ccm-core/src/main/java/org/libreccm/l10n/GlobalizationHelper.java b/ccm-core/src/main/java/org/libreccm/l10n/GlobalizationHelper.java index 46ae8b84e..7097c025f 100644 --- a/ccm-core/src/main/java/org/libreccm/l10n/GlobalizationHelper.java +++ b/ccm-core/src/main/java/org/libreccm/l10n/GlobalizationHelper.java @@ -33,9 +33,11 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.util.Enumeration; +import java.util.List; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; +import java.util.stream.Collectors; /** * Provides the locale which has been selected based on the available languages @@ -130,7 +132,7 @@ public class GlobalizationHelper implements Serializable { } public Locale getNegotiatedLocale() { - + final KernelConfig kernelConfig = confManager.findConfiguration( KernelConfig.class); @@ -139,10 +141,10 @@ public class GlobalizationHelper implements Serializable { final Locale selectedLocale = getSelectedLocale(); if (selectedLocale == null || !kernelConfig.hasLanguage(selectedLocale.getLanguage())) { - + final Enumeration acceptedLocales = request.getLocales(); while (acceptedLocales.hasMoreElements()) { - + final Locale current = acceptedLocales.nextElement(); if (kernelConfig.hasLanguage(current.getLanguage())) { preferred = new Locale(current.getLanguage()); @@ -185,6 +187,21 @@ public class GlobalizationHelper implements Serializable { return selected; } + public List getAvailableLocales() { + + final KernelConfig kernelConfig = confManager + .findConfiguration(KernelConfig.class); + + return kernelConfig + .getSupportedLanguages() + .stream() + .map(lang -> new Locale(lang)) + .sorted((locale1, locale2) -> { + return locale1.toString().compareTo(locale2.toString()); + }) + .collect(Collectors.toList()); + } + public void setSelectedLocale(final Locale locale) { final HttpSession session = request.getSession(true); diff --git a/ccm-core/src/main/java/org/libreccm/l10n/ui/LocalizedStringEditor.java b/ccm-core/src/main/java/org/libreccm/l10n/ui/LocalizedStringEditor.java index 5d0fcda6d..fa2f56931 100644 --- a/ccm-core/src/main/java/org/libreccm/l10n/ui/LocalizedStringEditor.java +++ b/ccm-core/src/main/java/org/libreccm/l10n/ui/LocalizedStringEditor.java @@ -1,8 +1,18 @@ package org.libreccm.l10n.ui; +import com.vaadin.data.provider.ListDataProvider; import com.vaadin.data.provider.QuerySortOrder; +import com.vaadin.icons.VaadinIcons; +import com.vaadin.server.SerializableToIntFunction; +import com.vaadin.ui.Button; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.Component; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.components.grid.HeaderCell; +import com.vaadin.ui.components.grid.HeaderRow; +import com.vaadin.ui.themes.ValoTheme; import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.LocalizedString; @@ -10,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.stream.Collectors; import java.util.stream.Stream; /* @@ -74,7 +85,39 @@ public class LocalizedStringEditor extends CustomComponent { grid.addColumn(LocalizedStringValue::getLocaleLabel) .setCaption("Language") .setId(COL_LOCALE); + grid.addColumn(LocalizedStringValue::getValue) + .setCaption("Value") + .setId(COL_VALUE); + grid.addComponentColumn(this::buildEditButton) + .setCaption("Edit") + .setId(COL_EDIT); + grid.addComponentColumn(this::buildDeleteButton) + .setCaption("Delete") + .setId(COL_REMOVE); + final ComboBox localeSelect = new ComboBox<>(); + localeSelect.setDataProvider(this::fetchAvailableLocales, + this::countAvailableLocales); + localeSelect.setDescription("Select locale to add"); + localeSelect.addStyleName(ValoTheme.COMBOBOX_TINY); + localeSelect.setEmptySelectionAllowed(false); + localeSelect.setTextInputAllowed(false); + localeSelect.setItemCaptionGenerator(Locale::toString); + final Button addButton = new Button("Add value"); + addButton.addStyleName(ValoTheme.BUTTON_TINY); + addButton.setIcon(VaadinIcons.PLUS_CIRCLE_O); + addButton.addClickListener(event -> { + }); + + final HeaderRow headerRow = grid.prependHeaderRow(); + final HeaderCell headerCell = headerRow.join(COL_LOCALE, + COL_VALUE, + COL_EDIT, + COL_REMOVE); + headerCell.setComponent(new HorizontalLayout(localeSelect, addButton)); + + localizedString = new LocalizedString(); + super.setCompositionRoot(grid); } public LocalizedStringEditor(final LocalizedString localizedString, @@ -90,6 +133,7 @@ public class LocalizedStringEditor extends CustomComponent { final GlobalizationHelper globalizationHelper) { this(globalizationHelper); this.multiline = multiline; + localizedString = new LocalizedString(); } public LocalizedStringEditor(final LocalizedString localizedString, @@ -116,6 +160,58 @@ public class LocalizedStringEditor extends CustomComponent { this.localizedString = localizedString; } + private Stream fetchAvailableLocales(final String filter, + final int offset, + final int limit) { + + final List values = globalizationHelper + .getAvailableLocales() + .stream() + .filter(locale -> localizedString.hasValue(locale)) + .sorted((locale1, locale2) -> { + return locale1.toString().compareTo(locale2.toString()); + }) + .collect(Collectors.toList()); + + if (values.size() > limit) { + return values.subList(offset, offset + limit).stream(); + } else { + return values.stream(); + } + } + + private int countAvailableLocales(final String value) { + + return (int) globalizationHelper + .getAvailableLocales() + .stream() + .filter(locale -> localizedString.hasValue(locale)) + .count(); + } + + private Component buildEditButton(final LocalizedStringValue value) { + + final Button button = new Button("Edit"); + button.setIcon(VaadinIcons.EDIT); + button.addStyleName(ValoTheme.BUTTON_TINY); + button.addClickListener(event -> { + }); + + return button; + } + + private Component buildDeleteButton(final LocalizedStringValue value) { + + final Button button = new Button("Edit"); + button.setIcon(VaadinIcons.MINUS_CIRCLE_O); + button.addStyleNames(ValoTheme.BUTTON_TINY, + ValoTheme.BUTTON_DANGER); + button.addClickListener(event -> { + }); + + return button; + } + private class LocalizedStringValue { private Locale locale; @@ -176,11 +272,19 @@ public class LocalizedStringEditor extends CustomComponent { .compareTo(Objects.toString(locale2)); }); - return locales - .subList(offset, limit) - .stream() - .map(locale -> new LocalizedStringValue( - locale, localizedString.getValue(locale))); + if (locales.size() > limit) { + return locales + .subList(offset, limit) + .stream() + .map(locale -> new LocalizedStringValue( + locale, localizedString.getValue(locale))); + } else { + return locales + .subList(offset, locales.size()) + .stream() + .map(locale -> new LocalizedStringValue( + locale, localizedString.getValue(locale))); + } } } 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 da8c5bd72..0170123c2 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 @@ -690,3 +690,10 @@ ui.admin.pagemodels.table.columns.headers.islive=Is live? ui.admin.pagemodels.select_application=Please select an application ui.admin.pagemodels.table.columns.edit.label=Edit ui.admin.pagemodels.table.columns.delete.label=Delete +ui.admin.pagemodels.edit_basic_properties=Edit +ui.admin.pagemodels.components.save=Save +ui.admin.pagemodels.components.cancel=Cancel +ui.admin.pagemodels.buttons.save=Save +ui.admin.pagemodels.buttons.cancel=Cancel +ui.admin.pagemodels.caption.new=Create new PageModel +ui.admin.pagemodels.caption.edit=Edit PageModel {0} 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 995e9459a..b91bc4230 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 @@ -694,3 +694,10 @@ ui.admin.pagemodels.table.columns.headers.islive=Ist publiziert? ui.admin.pagemodels.select_application=Bitte eine Applikation ausw\u00e4hlen ui.admin.pagemodels.table.columns.edit.label=Bearbeiten ui.admin.pagemodels.table.columns.delete.label=L\u00f6schen +ui.admin.pagemodels.edit_basic_properties=Bearbeiten +ui.admin.pagemodels.components.save=Speichern +ui.admin.pagemodels.components.cancel=Abbrechen +ui.admin.pagemodels.buttons.save=Speichern +ui.admin.pagemodels.buttons.cancel=Abbrechen +ui.admin.pagemodels.caption.new=Neues PageModel erstellen +ui.admin.pagemodels.caption.edit=PageModel {0} bearbeiten 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 1a6e33e8a..593b7d626 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 @@ -687,3 +687,10 @@ ui.admin.pagemodels.table.columns.headers.islive=Is live? ui.admin.pagemodels.select_application=Please select an application ui.admin.pagemodels.table.columns.edit.label=Edit ui.admin.pagemodels.table.columns.delete.label=Delete +ui.admin.pagemodels.edit_basic_properties=Edit +ui.admin.pagemodels.components.save=Save +ui.admin.pagemodels.components.cancel=Cancel +ui.admin.pagemodels.buttons.save=Save +ui.admin.pagemodels.buttons.cancel=Cancel +ui.admin.pagemodels.caption.new=Create new PageModel +ui.admin.pagemodels.caption.edit=Edit PageModel {0} 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 f0230f4d0..4f06f0d84 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 @@ -678,3 +678,10 @@ ui.admin.pagemodels.table.columns.headers.islive=Is live? ui.admin.pagemodels.select_application=Please select an application ui.admin.pagemodels.table.columns.edit.label=Edit ui.admin.pagemodels.table.columns.delete.label=Delete +ui.admin.pagemodels.edit_basic_properties=Edit +ui.admin.pagemodels.components.save=Save +ui.admin.pagemodels.components.cancel=Cancel +ui.admin.pagemodels.buttons.save=Save +ui.admin.pagemodels.buttons.cancel=Cancel +ui.admin.pagemodels.caption.new=Create new PageModel +ui.admin.pagemodels.caption.edit=Edit PageModel {0}