From 1111e644c11661091587a54838bba1f161541035 Mon Sep 17 00:00:00 2001 From: jensp Date: Thu, 19 May 2016 13:12:33 +0000 Subject: [PATCH] CCM NG: Forms for editing categories for /ccm/admin git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4082 8810af33-2d31-482b-a856-94f89814c4df --- .../ui/admin/categories/CategoriesTab.java | 59 +++- .../categories/CategoryDescriptionForm.java | 175 +++++++++++ .../categories/CategoryDescriptionTable.java | 248 +++++++++++++++ .../ui/admin/categories/CategoryDetails.java | 293 ++++++++++++++++++ .../CategoryPropertySheetModel.java | 92 ++++++ .../CategoryPropertySheetModelBuilder.java | 67 ++++ .../admin/categories/CategoryTitleForm.java | 166 ++++++++++ .../admin/categories/CategoryTitleTable.java | 250 +++++++++++++++ .../categories/DomainDescriptionTable.java | 85 ++--- .../ui/admin/categories/DomainDetails.java | 104 +++---- .../ui/admin/categories/DomainTitleTable.java | 86 ++--- 11 files changed, 1491 insertions(+), 134 deletions(-) create mode 100644 ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDescriptionForm.java create mode 100644 ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDescriptionTable.java create mode 100644 ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDetails.java create mode 100644 ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryPropertySheetModel.java create mode 100644 ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryPropertySheetModelBuilder.java create mode 100644 ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryTitleForm.java create mode 100644 ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryTitleTable.java diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoriesTab.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoriesTab.java index 3dbda98e1..acea7ba64 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoriesTab.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoriesTab.java @@ -44,8 +44,12 @@ public class CategoriesTab extends LayoutPanel { protected static final String DOMAINS_FILTER = "domainsFilter"; private final StringParameter domainIdParameter; - private final StringParameter languageParameter; private final ParameterSingleSelectionModel selectedDomainId; + + private final StringParameter categoryIdParameter; + private final ParameterSingleSelectionModel selectedCategoryId; + + private final StringParameter languageParameter; private final ParameterSingleSelectionModel selectedLanguage; private final Label domainsFilterFormHeader; @@ -67,12 +71,16 @@ public class CategoriesTab extends LayoutPanel { setClassAttr("sidebarNavPanel"); domainIdParameter = new StringParameter("selected_domain_id"); - selectedDomainId - = new ParameterSingleSelectionModel<>(domainIdParameter); + selectedDomainId = new ParameterSingleSelectionModel<>( + domainIdParameter); + + categoryIdParameter = new StringParameter("selected_category_id"); + selectedCategoryId = new ParameterSingleSelectionModel<>( + categoryIdParameter); languageParameter = new StringParameter("selected_language"); - selectedLanguage - = new ParameterSingleSelectionModel<>(languageParameter); + selectedLanguage = new ParameterSingleSelectionModel<>( + languageParameter); final SegmentedPanel left = new SegmentedPanel(); @@ -104,7 +112,7 @@ public class CategoriesTab extends LayoutPanel { }); final ActionLink backToDomain = new ActionLink(new GlobalizedMessage( - "ui.admin.categories.tree.back", + "ui.admin.categories.tree.back", ADMIN_BUNDLE)); backToDomain.addActionListener(e -> { final PageState state = e.getPageState(); @@ -160,6 +168,7 @@ public class CategoriesTab extends LayoutPanel { super.register(page); page.addGlobalStateParam(domainIdParameter); + page.addGlobalStateParam(categoryIdParameter); page.addGlobalStateParam(languageParameter); page.setVisibleDefault(domainsFilterFormHeader, true); @@ -277,4 +286,42 @@ public class CategoriesTab extends LayoutPanel { showDomainDetails(state); } + protected void showCategoryDetails(final PageState state) { + + } + + protected void hideCategoryDetails(final PageState state) { + + } + + protected void showCategoryCreateForm(final PageState state) { + + } + + protected void hideCategoryCreateForm(final PageState state) { + + } + + protected void showCategoryEditForm(final PageState state) { + + } + + protected void hideCategoryEditForm(final PageState state) { + + } + + protected void showCategoryTitleForm(final PageState state) { + + } + + protected void hideCategoryTitleForm(final PageState state) { + + } + + protected void showCategoryDescriptionForm(final PageState state) { + + } + + protected void hideCategoryDescriptionForm(final PageState state) { + } } diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDescriptionForm.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDescriptionForm.java new file mode 100644 index 000000000..0339ab715 --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDescriptionForm.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2016 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.categories; + +import com.arsdigita.bebop.ActionLink; +import com.arsdigita.bebop.BoxPanel; +import com.arsdigita.bebop.Form; +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.SaveCancelSection; +import com.arsdigita.bebop.form.TextArea; +import com.arsdigita.globalization.GlobalizedMessage; + +import java.util.Locale; +import org.apache.logging.log4j.util.Strings; +import org.libreccm.categorization.Category; +import org.libreccm.categorization.CategoryRepository; +import org.libreccm.categorization.Domain; +import org.libreccm.categorization.DomainRepository; +import org.libreccm.cdi.utils.CdiUtil; + +import static com.arsdigita.ui.admin.AdminUiConstants.*; + +/** + * + * @author Jens Pelzetter + */ +public class CategoryDescriptionForm extends Form { + + private static final String LOCALIZED_CATEGORY_DESC = "description"; + + private final CategoriesTab categoriesTab; + + private final TextArea description; + private final SaveCancelSection saveCancelSection; + + public CategoryDescriptionForm( + final CategoriesTab categoriesTab, + final ParameterSingleSelectionModel selectedCategoryId, + final ParameterSingleSelectionModel selectedLanguage) { + + super("categoryDescriptionForm", new BoxPanel(BoxPanel.VERTICAL)); + + this.categoriesTab = categoriesTab; + + final ActionLink backLink = new ActionLink(new GlobalizedMessage( + "ui.admin.categories.category.description.edit.back", + ADMIN_BUNDLE)); + backLink.addActionListener(e -> { + categoriesTab.hideDomainTitleForm(e.getPageState()); + }); + add(backLink); + + final Label heading = new Label(e -> { + final PageState state = e.getPageState(); + + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil() + .findBean(CategoryRepository.class); + final Category selectedCategory = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey(state))); + + final Locale selectedLocale = new Locale(selectedLanguage + .getSelectedKey(state)); + + final Label target = (Label) e.getTarget(); + + if (selectedCategory.getTitle().hasValue(selectedLocale)) { + target.setLabel(new GlobalizedMessage( + "ui.admin.categories.category.description.edit_for_lang", + ADMIN_BUNDLE, + new String[]{selectedCategory.getName(), + selectedLocale.toString()})); + } else { + target.setLabel(new GlobalizedMessage( + "ui.admin.categories.category.description.add_for_lang", + ADMIN_BUNDLE, + new String[]{selectedCategory.getName(), + selectedLocale.toString()})); + } + }); + heading.setClassAttr("heading"); + add(heading); + + description = new TextArea(LOCALIZED_CATEGORY_DESC); + description.setLabel(new GlobalizedMessage( + "ui.admin.categories.domain.description.label", ADMIN_BUNDLE)); + description.setCols(60); + description.setRows(10); + add(description); + + saveCancelSection = new SaveCancelSection(); + add(saveCancelSection); + + addInitListener(e -> { + final PageState state = e.getPageState(); + + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + final Category selectedCategory = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey(state))); + + final Locale selectedLocale = new Locale(selectedLanguage + .getSelectedKey(state)); + + if (selectedCategory.getTitle().hasValue(selectedLocale)) { + description.setValue(state, selectedCategory.getDescription() + .getValue(selectedLocale)); + } + }); + + addValidationListener(e -> { + + if (saveCancelSection.getSaveButton().isSelected( + e.getPageState())) { + final FormData data = e.getFormData(); + + final String titleData = data.getString(LOCALIZED_CATEGORY_DESC); + + if (Strings.isBlank(titleData)) { + data.addError( + LOCALIZED_CATEGORY_DESC, + new GlobalizedMessage( + "ui.admin.categories.category.description.error.not_blank", + ADMIN_BUNDLE)); + } + } + }); + + addProcessListener(e -> { + final PageState state = e.getPageState(); + + if (saveCancelSection.getSaveButton().isSelected(state)) { + final CategoryRepository categoryRepository = CdiUtil + .createCdiUtil() + .findBean(CategoryRepository.class); + final Category selectedCategory = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey(state))); + + final Locale selectedLocale = new Locale(selectedLanguage + .getSelectedKey(state)); + + final String titleData = e.getFormData().getString( + LOCALIZED_CATEGORY_DESC); + + selectedCategory.getDescription().addValue(selectedLocale, + titleData); + categoryRepository.save(selectedCategory); + } + + categoriesTab.hideCategoryDescriptionForm(state); + + }); + + } + +} diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDescriptionTable.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDescriptionTable.java new file mode 100644 index 000000000..2018a1c06 --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDescriptionTable.java @@ -0,0 +1,248 @@ +/* + * Copyright (C) 2016 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.categories; + +import com.arsdigita.bebop.Component; +import com.arsdigita.bebop.ControlLink; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.Table; +import com.arsdigita.bebop.Text; +import com.arsdigita.bebop.event.TableActionEvent; +import com.arsdigita.bebop.event.TableActionListener; +import com.arsdigita.bebop.table.TableCellRenderer; +import com.arsdigita.bebop.table.TableColumn; +import com.arsdigita.bebop.table.TableColumnModel; +import com.arsdigita.bebop.table.TableModel; +import com.arsdigita.bebop.table.TableModelBuilder; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.util.LockableImpl; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import org.libreccm.categorization.Category; +import org.libreccm.categorization.CategoryRepository; +import org.libreccm.cdi.utils.CdiUtil; + +import static com.arsdigita.ui.admin.AdminUiConstants.*; + +/** + * + * @author Jens Pelzetter + */ +public class CategoryDescriptionTable extends Table { + + private static final int COL_LOCALE = 0; + private static final int COL_VALUE = 1; + private static final int COL_EDIT = 2; + private static final int COL_DEL = 3; + + private final CategoriesTab categoriesTab; + private final ParameterSingleSelectionModel selectedCategoryId; + private final ParameterSingleSelectionModel selectedLanguage; + + public CategoryDescriptionTable( + final CategoriesTab categoriesTab, + final ParameterSingleSelectionModel selectedCategoryId, + final ParameterSingleSelectionModel selectedLanguage) { + + super(); + + this.categoriesTab = categoriesTab; + this.selectedCategoryId = selectedCategoryId; + this.selectedLanguage = selectedLanguage; + + setIdAttr("categoryDescriptionTable"); + + setEmptyView(new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.description.none", + ADMIN_BUNDLE))); + + final TableColumnModel columnModel = getColumnModel(); + columnModel.add(new TableColumn( + COL_LOCALE, + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.description.col_lang", + ADMIN_BUNDLE)))); + columnModel.add(new TableColumn( + COL_VALUE, + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.description.col_value", + ADMIN_BUNDLE)))); + columnModel.add(new TableColumn( + COL_EDIT, + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.description.col_del", + ADMIN_BUNDLE)))); + columnModel.add(new TableColumn( + COL_DEL, + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.description.col_del", + ADMIN_BUNDLE)))); + + columnModel.get(COL_EDIT).setCellRenderer(new TableCellRenderer() { + + @Override + public Component getComponent(final Table table, + final PageState state, + final Object value, + final boolean isSelected, + final Object key, + final int row, + final int column) { + return new ControlLink((Component) value); + } + }); + + columnModel.get(COL_DEL).setCellRenderer(new TableCellRenderer() { + + @Override + public Component getComponent(final Table table, + final PageState state, + final Object value, + final boolean isSelected, + final Object key, + final int row, + final int column) { + if (value == null) { + return new Text(""); + } else { + final ControlLink link = new ControlLink((Component) value); + link.setConfirmation(new GlobalizedMessage( + "ui.admin.categories.category_details.description" + + ".del_confirm", + ADMIN_BUNDLE)); + return link; + } + } + }); + + addTableActionListener(new TableActionListener() { + @Override + public void cellSelected(final TableActionEvent event) { + final PageState state = event.getPageState(); + + switch (event.getColumn()) { + case COL_EDIT: + selectedLanguage.setSelectedKey(state, + event.getRowKey()); + categoriesTab.showCategoryDescriptionForm(state); + break; + case COL_DEL: + final Locale locale = new Locale((String) event + .getRowKey()); + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean( + CategoryRepository.class); + final Category category = categoryRepository.findById( + Long.parseLong(selectedCategoryId. + getSelectedKey(state))); + category.getDescription().removeValue(locale); + + categoryRepository.save(category); + + break; + } + } + + @Override + public void headSelected(final TableActionEvent event) { + //Nothing + } + }); + + setModelBuilder(new CategoryDescriptionTableModelBuilder()); + } + + private class CategoryDescriptionTableModelBuilder + extends LockableImpl + implements TableModelBuilder { + + @Override + public TableModel makeModel(final Table table, + final PageState state) { + table.getRowSelectionModel().clearSelection(state); + + return new CategoryDescriptionTableModel(state); + } + } + + private class CategoryDescriptionTableModel implements TableModel { + + private final Category selectedCategory; + private final List locales; + private int index = -1; + + public CategoryDescriptionTableModel(final PageState state) { + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + selectedCategory = categoryRepository.findById(Long.parseLong( + selectedCategoryId.getSelectedKey(state))); + + locales = new ArrayList<>(); + locales.addAll(selectedCategory.getDescription(). + getAvailableLocales()); + locales.sort((l1, l2) -> { + return l1.toString().compareTo(l2.toString()); + }); + + } + + @Override + public int getColumnCount() { + return 4; + } + + @Override + public boolean nextRow() { + index++; + return index < locales.size(); + } + + @Override + public Object getElementAt(final int columnIndex) { + final Locale locale = locales.get(index); + + switch (columnIndex) { + case COL_LOCALE: + return locale.toString(); + case COL_VALUE: + return selectedCategory.getDescription().getValue(locale); + case COL_EDIT: + return new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.description.edit", + ADMIN_BUNDLE)); + case COL_DEL: + return new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.description.del", + ADMIN_BUNDLE)); + default: + throw new IllegalArgumentException( + "Not a valid column index"); + } + } + + @Override + public Object getKeyAt(final int columnIndex) { + return locales.get(index); + } + + } +} diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDetails.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDetails.java new file mode 100644 index 000000000..3fc7d02a2 --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryDetails.java @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2016 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.categories; + +import com.arsdigita.bebop.ActionLink; +import com.arsdigita.bebop.BoxPanel; +import com.arsdigita.bebop.Form; +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.PropertySheet; +import com.arsdigita.bebop.SegmentedPanel; +import com.arsdigita.bebop.Text; +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.kernel.KernelConfig; +import com.arsdigita.util.UncheckedWrapperException; +import java.util.HashSet; +import java.util.Set; +import java.util.TooManyListenersException; +import org.libreccm.categorization.Category; +import org.libreccm.categorization.CategoryRepository; +import org.libreccm.cdi.utils.CdiUtil; + +import static com.arsdigita.ui.admin.AdminUiConstants.*; + +/** + * + * @author Jens Pelzetter + */ +class CategoryDetails extends SegmentedPanel { + + private final CategoriesTab categoriesTab; + private final ParameterSingleSelectionModel selectedDomainId; + private final ParameterSingleSelectionModel selectedCategoryId; + private final ParameterSingleSelectionModel selectedLanguage; + private final CategoryTitleAddForm categoryTitleAddForm; + private final CategoryDescriptionAddForm categoryDescriptionAddForm; + + public CategoryDetails( + final CategoriesTab categoriesTab, + final ParameterSingleSelectionModel selectedDomainId, + final ParameterSingleSelectionModel selectedCategoryId, + final ParameterSingleSelectionModel selectedLanguage) { + + this.categoriesTab = categoriesTab; + this.selectedDomainId = selectedDomainId; + this.selectedCategoryId = selectedCategoryId; + this.selectedLanguage = selectedLanguage; + + final ActionLink backLink = new ActionLink(new GlobalizedMessage( + "ui.admin.categories.category_details.back", ADMIN_BUNDLE)); + backLink.addActionListener(e -> { + final PageState state = e.getPageState(); + categoriesTab.hideCategoryDetails(state); + }); + addSegment("category-details-back", backLink); + + final BoxPanel propertiesPanel = new BoxPanel(BoxPanel.VERTICAL); + propertiesPanel.add(new PropertySheet( + new CategoryPropertySheetModelBuilder(selectedCategoryId))); + final ActionLink editBasicPropertiesLink = new ActionLink( + new GlobalizedMessage( + "ui.admin.categories.category_details.basic_properties.edit", + ADMIN_BUNDLE)); + editBasicPropertiesLink.addActionListener(e -> { + final PageState state = e.getPageState(); + categoriesTab.showCategoryEditForm(state); + }); + propertiesPanel.add(editBasicPropertiesLink); + addSegment( + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.basic_properties", + ADMIN_BUNDLE)), + propertiesPanel + ); + + final BoxPanel titlesPanel = new BoxPanel(BoxPanel.VERTICAL); + titlesPanel.add(new CategoryTitleTable(categoriesTab, + selectedDomainId, + selectedLanguage)); + categoryTitleAddForm = new CategoryTitleAddForm(); + titlesPanel.add(categoryTitleAddForm); + addSegment( + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.domain_title", + ADMIN_BUNDLE)), + titlesPanel); + + final BoxPanel descPanel = new BoxPanel(BoxPanel.VERTICAL); + descPanel.add(new CategoryDescriptionTable(categoriesTab, + selectedCategoryId, + selectedLanguage)); + categoryDescriptionAddForm = new CategoryDescriptionAddForm(); + descPanel.add(categoryDescriptionAddForm); + addSegment( + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.description", + ADMIN_BUNDLE)), + descPanel); + } + + private class CategoryTitleAddForm extends Form { + + private static final String TITLE_SELECT_LANG = "titleSelectLang"; + + public CategoryTitleAddForm() { + super("categoryTitleAddForm", new BoxPanel(BoxPanel.HORIZONTAL)); + + final SingleSelect titleSelectLang = new SingleSelect( + TITLE_SELECT_LANG); + titleSelectLang.setLabel(new GlobalizedMessage( + "ui.admin.categories.category_details.category_title.add.label", + ADMIN_BUNDLE)); + try { + titleSelectLang.addPrintListener(e -> { + final PageState state = e.getPageState(); + + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + final Category category = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey( + state))); + final KernelConfig kernelConfig = KernelConfig.getConfig(); + final Set supportedLanguages = kernelConfig. + getSupportedLanguages(); + final Set assignedLanguages = new HashSet<>(); + category.getTitle().getAvailableLocales().forEach(l -> { + assignedLanguages.add(l.toString()); + }); + + final SingleSelect target = (SingleSelect) e.getTarget(); + + target.clearOptions(); + + supportedLanguages.forEach(l -> { + if (!assignedLanguages.contains(l)) { + target.addOption(new Option(l, new Text(l))); + } + }); + }); + } catch (TooManyListenersException ex) { + throw new UncheckedWrapperException(ex); + } + + add(titleSelectLang); + add(new Submit(new GlobalizedMessage( + "ui.admin.categories.category_details.category_title.add.submit", + ADMIN_BUNDLE))); + + addProcessListener(e -> { + final PageState state = e.getPageState(); + final FormData data = e.getFormData(); + + final String language = data.getString(TITLE_SELECT_LANG); + selectedLanguage.setSelectedKey(state, language); + + categoriesTab.showCategoryTitleForm(state); + }); + } + + @Override + public boolean isVisible(final PageState state) { + if (super.isVisible(state)) { + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + final Category category = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey( + state))); + final KernelConfig kernelConfig = KernelConfig.getConfig(); + final Set supportedLanguages = kernelConfig. + getSupportedLanguages(); + final Set assignedLanguages = new HashSet<>(); + category.getTitle().getAvailableLocales().forEach(l -> { + assignedLanguages.add(l.toString()); + }); + + //If all supported languages are assigned the form is not + //visible + return !assignedLanguages.equals(supportedLanguages); + } else { + return false; + } + } + } + + private class CategoryDescriptionAddForm extends Form { + + private static final String DESC_SELECT_LANG = "descSelectLang"; + + public CategoryDescriptionAddForm() { + super("categoryAddDescLang", new BoxPanel(BoxPanel.HORIZONTAL)); + + final SingleSelect descSelectLang = new SingleSelect( + DESC_SELECT_LANG); + descSelectLang.setLabel(new GlobalizedMessage( + "ui.admin.categories.category_details.category_desc.add.label", + ADMIN_BUNDLE)); + try { + descSelectLang.addPrintListener(e -> { + final PageState state = e.getPageState(); + + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + final Category category = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey( + state))); + final KernelConfig kernelConfig = KernelConfig.getConfig(); + final Set supportedLanguages = kernelConfig. + getSupportedLanguages(); + final Set assignedLanguages = new HashSet<>(); + category.getDescription().getAvailableLocales().forEach( + l -> { + assignedLanguages.add(l.toString()); + }); + + final SingleSelect target = (SingleSelect) e.getTarget(); + + target.clearOptions(); + + supportedLanguages.forEach(l -> { + if (!assignedLanguages.contains(l)) { + target.addOption(new Option(l, new Text(l))); + } + }); + }); + + } catch (TooManyListenersException ex) { + throw new UncheckedWrapperException(ex); + } + + add(descSelectLang); + add(new Submit(new GlobalizedMessage( + "ui.admin.categories.category_details.category_desc.add.submit", + ADMIN_BUNDLE))); + + addProcessListener(e -> { + final PageState state = e.getPageState(); + final FormData data = e.getFormData(); + + final String language = data.getString(DESC_SELECT_LANG); + selectedLanguage.setSelectedKey(state, language); + + categoriesTab.showCategoryDescriptionForm(state); + }); + } + + @Override + public boolean isVisible(final PageState state) { + if (super.isVisible(state)) { + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + final Category category = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey( + state))); + final KernelConfig kernelConfig = KernelConfig.getConfig(); + final Set supportedLanguages = kernelConfig. + getSupportedLanguages(); + final Set assignedLanguages = new HashSet<>(); + category.getDescription().getAvailableLocales().forEach( + l -> { + assignedLanguages.add(l.toString()); + }); + + //If all supported languages are assigned the form is not + //visible + return !assignedLanguages.equals(supportedLanguages); + } else { + return false; + } + } + } + +} diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryPropertySheetModel.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryPropertySheetModel.java new file mode 100644 index 000000000..3541776d7 --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryPropertySheetModel.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2016 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.categories; + +import com.arsdigita.bebop.PropertySheetModel; +import com.arsdigita.globalization.GlobalizedMessage; +import java.util.Arrays; +import java.util.Iterator; +import org.libreccm.categorization.Category; + +import static com.arsdigita.ui.admin.AdminUiConstants.*; + +/** + * + * @author Jens Pelzetter + */ +public class CategoryPropertySheetModel implements PropertySheetModel { + + private static enum CategoryProperty { + NAME + } + + private final Category selectedCategory; + private final Iterator propertyIterator; + private CategoryProperty currentProperty; + + public CategoryPropertySheetModel(final Category selectedCategory) { + this.selectedCategory = selectedCategory; + propertyIterator = Arrays.asList(CategoryProperty.values()).iterator(); + } + + @Override + public boolean nextRow() { + if (selectedCategory == null) { + return false; + } + + if (propertyIterator.hasNext()) { + currentProperty = propertyIterator.next(); + return true; + } else { + return false; + } + } + + @Override + public String getLabel() { + return currentProperty.toString(); + } + + private GlobalizedMessage generatedGlobalizedLabel( + final CategoryProperty property) { + + final String key = String.join( + "", + "ui.admin.categories.category.property_sheet.", + property.toString().toLowerCase()); + return new GlobalizedMessage(key, ADMIN_BUNDLE); + } + + @Override + public GlobalizedMessage getGlobalizedLabel() { + return generatedGlobalizedLabel(currentProperty); + } + + @Override + public String getValue() { + switch (currentProperty) { + case NAME: + return selectedCategory.getName(); + default: + return ""; + } + } + +} diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryPropertySheetModelBuilder.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryPropertySheetModelBuilder.java new file mode 100644 index 000000000..fc6cb3030 --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryPropertySheetModelBuilder.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2016 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.categories; + +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.PropertySheet; +import com.arsdigita.bebop.PropertySheetModel; +import com.arsdigita.bebop.PropertySheetModelBuilder; +import com.arsdigita.util.LockableImpl; +import org.apache.logging.log4j.util.Strings; +import org.libreccm.categorization.Category; +import org.libreccm.categorization.CategoryRepository; +import org.libreccm.cdi.utils.CdiUtil; + +/** + * + * @author Jens Pelzetter + */ +public class CategoryPropertySheetModelBuilder + extends LockableImpl + implements PropertySheetModelBuilder { + + private final ParameterSingleSelectionModel selectedCategoryId; + + public CategoryPropertySheetModelBuilder( + final ParameterSingleSelectionModel selectedCategoryId) { + + this.selectedCategoryId = selectedCategoryId; + + } + + @Override + public PropertySheetModel makeModel(final PropertySheet sheet, + final PageState state) { + final String categoryIdStr = selectedCategoryId.getSelectedKey(state); + final Category selectedCategory; + + if (Strings.isBlank(categoryIdStr)) { + selectedCategory = null; + } else { + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + selectedCategory = categoryRepository.findById(Long.parseLong( + categoryIdStr)); + } + + return new CategoryPropertySheetModel(selectedCategory); + } + +} diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryTitleForm.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryTitleForm.java new file mode 100644 index 000000000..9310085cb --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryTitleForm.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2016 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.categories; + +import com.arsdigita.bebop.ActionLink; +import com.arsdigita.bebop.BoxPanel; +import com.arsdigita.bebop.Form; +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.SaveCancelSection; +import com.arsdigita.bebop.form.TextField; +import com.arsdigita.globalization.GlobalizedMessage; + +import java.util.Locale; +import org.apache.logging.log4j.util.Strings; +import org.libreccm.categorization.Category; +import org.libreccm.categorization.CategoryRepository; +import org.libreccm.cdi.utils.CdiUtil; + +import static com.arsdigita.ui.admin.AdminUiConstants.*; + +/** + * + * @author Jens Pelzetter + */ +public class CategoryTitleForm extends Form { + + private static final String LOCALIZED_CATEGORY_TITLE = "title"; + + private final CategoriesTab categoriesTab; + + private final TextField title; + private final SaveCancelSection saveCancelSection; + + public CategoryTitleForm( + final CategoriesTab categoriesTab, + final ParameterSingleSelectionModel selectedCategoryId, + final ParameterSingleSelectionModel selectedLanguage) { + + super("categoryTitleForm", new BoxPanel(BoxPanel.VERTICAL)); + + this.categoriesTab = categoriesTab; + + final ActionLink backLink = new ActionLink(new GlobalizedMessage( + "ui.admin.categories.category.title.edit.back", ADMIN_BUNDLE)); + backLink.addActionListener(e -> { + categoriesTab.hideDomainTitleForm(e.getPageState()); + }); + add(backLink); + + final Label heading = new Label(e -> { + final PageState state = e.getPageState(); + + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil() + .findBean(CategoryRepository.class); + final Category selectedCategory = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey(state))); + + final Locale selectedLocale = new Locale(selectedLanguage + .getSelectedKey(state)); + + final Label target = (Label) e.getTarget(); + + if (selectedCategory.getTitle().hasValue(selectedLocale)) { + target.setLabel(new GlobalizedMessage( + "ui.admin.categories.category.title.edit_for_lang", + ADMIN_BUNDLE, + new String[]{selectedCategory.getName(), + selectedLocale.toString()})); + } else { + target.setLabel(new GlobalizedMessage( + "ui.admin.categories.category.title.add_for_lang", + ADMIN_BUNDLE, + new String[]{selectedCategory.getName(), + selectedLocale.toString()})); + } + }); + heading.setClassAttr("heading"); + add(heading); + + title = new TextField(LOCALIZED_CATEGORY_TITLE); + title.setLabel(new GlobalizedMessage( + "ui.admin.categories.category.title.label", ADMIN_BUNDLE)); + add(title); + + saveCancelSection = new SaveCancelSection(); + add(saveCancelSection); + + addInitListener(e -> { + final PageState state = e.getPageState(); + + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + final Category selectedCategory = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey(state))); + + final Locale selectedLocale = new Locale(selectedLanguage + .getSelectedKey(state)); + + if (selectedCategory.getTitle().hasValue(selectedLocale)) { + title.setValue(state, selectedCategory.getTitle().getValue( + selectedLocale)); + } + }); + + addValidationListener(e -> { + if (saveCancelSection.getSaveButton().isSelected(e.getPageState())) { + final FormData data = e.getFormData(); + + final String titleData = data. + getString(LOCALIZED_CATEGORY_TITLE); + + if (Strings.isBlank(titleData)) { + data.addError( + LOCALIZED_CATEGORY_TITLE, + new GlobalizedMessage( + "ui.admin.categories.category.title.error.not_blank", + ADMIN_BUNDLE)); + } + } + }); + + addProcessListener(e -> { + final PageState state = e.getPageState(); + + if (saveCancelSection.getSaveButton().isSelected(state)) { + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + final Category selectedCategory = categoryRepository.findById( + Long.parseLong(selectedCategoryId.getSelectedKey(state))); + + final Locale selectedLocale = new Locale(selectedLanguage + .getSelectedKey(state)); + + final String titleData = e.getFormData().getString( + LOCALIZED_CATEGORY_TITLE); + + selectedCategory.getTitle().addValue(selectedLocale, titleData); + categoryRepository.save(selectedCategory); + } + + categoriesTab.hideCategoryTitleForm(state); + }); + + } + +} diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryTitleTable.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryTitleTable.java new file mode 100644 index 000000000..8cd2a4359 --- /dev/null +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/CategoryTitleTable.java @@ -0,0 +1,250 @@ +/* + * Copyright (C) 2016 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.categories; + +import com.arsdigita.bebop.Component; +import com.arsdigita.bebop.ControlLink; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.ParameterSingleSelectionModel; +import com.arsdigita.bebop.Table; +import com.arsdigita.bebop.Text; +import com.arsdigita.bebop.event.TableActionEvent; +import com.arsdigita.bebop.event.TableActionListener; +import com.arsdigita.bebop.table.TableCellRenderer; +import com.arsdigita.bebop.table.TableColumn; +import com.arsdigita.bebop.table.TableColumnModel; +import com.arsdigita.bebop.table.TableModel; +import com.arsdigita.bebop.table.TableModelBuilder; +import com.arsdigita.globalization.GlobalizedMessage; +import com.arsdigita.util.LockableImpl; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import org.libreccm.categorization.Category; +import org.libreccm.categorization.CategoryRepository; +import org.libreccm.cdi.utils.CdiUtil; + +import static com.arsdigita.ui.admin.AdminUiConstants.*; + +/** + * + * @author Jens Pelzetter + */ +public class CategoryTitleTable extends Table { + + private static final int COL_LOCALE = 0; + private static final int COL_VALUE = 1; + private static final int COL_EDIT = 2; + private static final int COL_DEL = 3; + + private final CategoriesTab categoriesTab; + private final ParameterSingleSelectionModel selectedCategoryId; + private final ParameterSingleSelectionModel selectedLanguage; + + public CategoryTitleTable( + final CategoriesTab categoriesTab, + final ParameterSingleSelectionModel selectedCategoryId, + final ParameterSingleSelectionModel selectedLanguage) { + + super(); + + this.categoriesTab = categoriesTab; + this.selectedCategoryId = selectedCategoryId; + this.selectedLanguage = selectedLanguage; + + setIdAttr("categoryTitleTable"); + + setEmptyView(new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.title.none", ADMIN_BUNDLE))); + + final TableColumnModel columnModel = getColumnModel(); + columnModel.add(new TableColumn( + COL_LOCALE, + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.title.col_lang", + ADMIN_BUNDLE)))); + columnModel.add(new TableColumn( + COL_VALUE, + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.title.col_value", + ADMIN_BUNDLE)))); + columnModel.add(new TableColumn( + COL_EDIT, + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.title.col_edit", + ADMIN_BUNDLE)))); + columnModel.add(new TableColumn( + COL_DEL, + new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.title.col_del", + ADMIN_BUNDLE)))); + + columnModel.get(COL_EDIT).setCellRenderer(new TableCellRenderer() { + + @Override + public Component getComponent(final Table table, + final PageState state, + final Object value, + final boolean isSelected, + final Object key, + final int row, + final int column) { + return new ControlLink((Component) value); + } + + }); + + columnModel.get(COL_DEL).setCellRenderer(new TableCellRenderer() { + + @Override + public Component getComponent(final Table table, + final PageState state, + final Object value, + final boolean isSelected, + final Object key, + final int row, + final int column) { + if (value == null) { + return new Text(""); + } else { + final ControlLink link = new ControlLink((Component) value); + link.setConfirmation(new GlobalizedMessage( + "ui.admin.categories.category_details.title.del_confirm", + ADMIN_BUNDLE)); + return link; + } + } + }); + + addTableActionListener(new TableActionListener() { + @Override + public void cellSelected(final TableActionEvent event) { + final PageState state = event.getPageState(); + + switch (event.getColumn()) { + case COL_EDIT: + selectedLanguage.setSelectedKey(state, + event.getRowKey()); + categoriesTab.showCategoryTitleForm(state); + break; + case COL_DEL: + final Locale locale = new Locale((String) event. + getRowKey()); + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean( + CategoryRepository.class); + final Category category = categoryRepository.findById( + Long.parseLong(selectedCategoryId. + getSelectedKey(state))); + category.getTitle().removeValue(locale); + + categoryRepository.save(category); + + break; + } + } + + @Override + public void headSelected(final TableActionEvent event) { + //Nothing + } + }); + + setModelBuilder(new CategoryTitleTableModelBuilder()); + + } + + private class CategoryTitleTableModelBuilder + extends LockableImpl + implements TableModelBuilder { + + @Override + public TableModel makeModel(final Table table, + final PageState state) { + table.getRowSelectionModel().clearSelection(state); + + return new CategoryTitleTableModel(state); + } + + } + + private class CategoryTitleTableModel implements TableModel { + + private final Category selectedCategory; + private final List locales; + private int index = -1; + + public CategoryTitleTableModel(final PageState state) { + final CategoryRepository categoryRepository = CdiUtil. + createCdiUtil().findBean(CategoryRepository.class); + selectedCategory = categoryRepository.findById(Long.parseLong( + selectedCategoryId.getSelectedKey(state))); + + locales = new ArrayList<>(); + locales.addAll(selectedCategory.getTitle().getAvailableLocales()); + locales.sort((l1, l2) -> { + return l1.toString().compareTo(l2.toString()); + }); + } + + @Override + public int getColumnCount() { + return 4; + } + + @Override + public boolean nextRow() { + index++; + return index < locales.size(); + } + + @Override + public Object getElementAt(final int columnIndex) { + final Locale locale = locales.get(index); + + switch (columnIndex) { + case COL_LOCALE: + return locale.toString(); + case COL_VALUE: + return selectedCategory.getTitle().getValue(locale); + case COL_EDIT: + return new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.title.edit", + ADMIN_BUNDLE + )); + case COL_DEL: + return new Label(new GlobalizedMessage( + "ui.admin.categories.category_details.title.del", + ADMIN_BUNDLE + )); + default: + throw new IllegalArgumentException( + "Not a valid column index"); + } + } + + @Override + public Object getKeyAt(final int columnIndex) { + return locales.get(index); + } + + } + +} diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainDescriptionTable.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainDescriptionTable.java index 6c45c8c50..2e8accaa5 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainDescriptionTable.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainDescriptionTable.java @@ -53,16 +53,17 @@ class DomainDescriptionTable extends Table { private static final int COL_LOCALE = 0; private static final int COL_VALUE = 1; - private static final int COL_DEL = 2; + private static final int COL_EDIT = 2; + private static final int COL_DEL = 3; private final CategoriesTab categoriesTab; private final ParameterSingleSelectionModel selectedDomainId; private final ParameterSingleSelectionModel selectedLanguage; public DomainDescriptionTable( - final CategoriesTab categoriesTab, - final ParameterSingleSelectionModel selectedDomainId, - final ParameterSingleSelectionModel selectedLanguage) { + final CategoriesTab categoriesTab, + final ParameterSingleSelectionModel selectedDomainId, + final ParameterSingleSelectionModel selectedLanguage) { super(); @@ -73,27 +74,32 @@ class DomainDescriptionTable extends Table { setIdAttr("domainDescriptionTable"); setEmptyView(new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.description.none", - ADMIN_BUNDLE))); + "ui.admin.categories.domain_details.description.none", + ADMIN_BUNDLE))); final TableColumnModel columnModel = getColumnModel(); columnModel.add(new TableColumn( - COL_LOCALE, - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.description.col_lang", - ADMIN_BUNDLE)))); + COL_LOCALE, + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.description.col_lang", + ADMIN_BUNDLE)))); columnModel.add(new TableColumn( - COL_VALUE, - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.description.col_value", - ADMIN_BUNDLE)))); + COL_VALUE, + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.description.col_value", + ADMIN_BUNDLE)))); columnModel.add(new TableColumn( - COL_DEL, - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.description.col_del", - ADMIN_BUNDLE)))); + COL_EDIT, + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.description.col_del", + ADMIN_BUNDLE)))); + columnModel.add(new TableColumn( + COL_DEL, + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.description.col_del", + ADMIN_BUNDLE)))); - columnModel.get(COL_LOCALE).setCellRenderer(new TableCellRenderer() { + columnModel.get(COL_EDIT).setCellRenderer(new TableCellRenderer() { @Override public Component getComponent(final Table table, @@ -103,7 +109,7 @@ class DomainDescriptionTable extends Table { final Object key, final int row, final int column) { - return new ControlLink((String) value); + return new ControlLink((Component) value); } }); @@ -123,9 +129,9 @@ class DomainDescriptionTable extends Table { } else { final ControlLink link = new ControlLink((Component) value); link.setConfirmation(new GlobalizedMessage( - "ui.admin.categories.domain_details.description" - + ".del_confirm", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_details.description" + + ".del_confirm", + ADMIN_BUNDLE)); return link; } } @@ -139,19 +145,20 @@ class DomainDescriptionTable extends Table { final PageState state = event.getPageState(); switch (event.getColumn()) { - case COL_LOCALE: + case COL_EDIT: selectedLanguage.setSelectedKey(state, event.getRowKey()); categoriesTab.showDomainDescriptionForm(state); break; case COL_DEL: final Locale locale = new Locale((String) event - .getRowKey()); + .getRowKey()); final DomainRepository domainRepository = CdiUtil - .createCdiUtil().findBean(DomainRepository.class); + .createCdiUtil(). + findBean(DomainRepository.class); final Domain domain = domainRepository.findById( - Long.parseLong(selectedDomainId - .getSelectedKey(state))); + Long.parseLong(selectedDomainId + .getSelectedKey(state))); domain.getDescription().removeValue(locale); domainRepository.save(domain); @@ -172,8 +179,8 @@ class DomainDescriptionTable extends Table { } private class DomainDescriptionTableModelBuilder - extends LockableImpl - implements TableModelBuilder { + extends LockableImpl + implements TableModelBuilder { @Override public TableModel makeModel(final Table table, @@ -193,13 +200,13 @@ class DomainDescriptionTable extends Table { public DomainDescriptionTableModel(final PageState state) { final DomainRepository domainRepository = CdiUtil.createCdiUtil() - .findBean(DomainRepository.class); + .findBean(DomainRepository.class); selectedDomain = domainRepository.findById( - Long.parseLong(selectedDomainId.getSelectedKey(state))); + Long.parseLong(selectedDomainId.getSelectedKey(state))); locales = new ArrayList<>(); locales.addAll(selectedDomain.getDescription() - .getAvailableLocales()); + .getAvailableLocales()); locales.sort((l1, l2) -> { return l1.toString().compareTo(l2.toString()); }); @@ -207,7 +214,7 @@ class DomainDescriptionTable extends Table { @Override public int getColumnCount() { - return 3; + return 4; } @Override @@ -225,13 +232,17 @@ class DomainDescriptionTable extends Table { return locale.toString(); case COL_VALUE: return selectedDomain.getDescription().getValue(locale); + case COL_EDIT: + return new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.description.edit", + ADMIN_BUNDLE)); case COL_DEL: return new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.description.del", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_details.description.del", + ADMIN_BUNDLE)); default: throw new IllegalArgumentException( - "Not a valid column index"); + "Not a valid column index"); } } diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainDetails.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainDetails.java index 849a64a3d..eeac4b853 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainDetails.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainDetails.java @@ -58,16 +58,16 @@ class DomainDetails extends SegmentedPanel { private final DomainDescriptionAddForm domainDescriptionAddForm; public DomainDetails( - final CategoriesTab categoriesTab, - final ParameterSingleSelectionModel selectedDomainId, - final ParameterSingleSelectionModel selectedLanguage) { + final CategoriesTab categoriesTab, + final ParameterSingleSelectionModel selectedDomainId, + final ParameterSingleSelectionModel selectedLanguage) { this.categoriesTab = categoriesTab; this.selectedDomainId = selectedDomainId; this.selectedLanguage = selectedLanguage; final ActionLink backLink = new ActionLink(new GlobalizedMessage( - "ui.admin.categories.domain_details.back", ADMIN_BUNDLE)); + "ui.admin.categories.domain_details.back", ADMIN_BUNDLE)); backLink.addActionListener(e -> { final PageState state = e.getPageState(); categoriesTab.hideDomainDetails(state); @@ -76,21 +76,21 @@ class DomainDetails extends SegmentedPanel { final BoxPanel propertiesPanel = new BoxPanel(BoxPanel.VERTICAL); propertiesPanel.add(new PropertySheet( - new DomainPropertySheetModelBuilder(selectedDomainId))); + new DomainPropertySheetModelBuilder(selectedDomainId))); final ActionLink editBasicPropertiesLink = new ActionLink( - new GlobalizedMessage( - "ui.admin.categories.domain_details.basic_properties.edit", - ADMIN_BUNDLE)); + new GlobalizedMessage( + "ui.admin.categories.domain_details.basic_properties.edit", + ADMIN_BUNDLE)); editBasicPropertiesLink.addActionListener(e -> { final PageState state = e.getPageState(); categoriesTab.showDomainForm(state); }); propertiesPanel.add(editBasicPropertiesLink); addSegment( - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.basic_properties", - ADMIN_BUNDLE)), - propertiesPanel); + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.basic_properties", + ADMIN_BUNDLE)), + propertiesPanel); final BoxPanel titlesPanel = new BoxPanel(BoxPanel.VERTICAL); titlesPanel.add(new DomainTitleTable(categoriesTab, @@ -99,10 +99,10 @@ class DomainDetails extends SegmentedPanel { domainTitleAddForm = new DomainTitleAddForm(); titlesPanel.add(domainTitleAddForm); addSegment( - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.domain_title", - ADMIN_BUNDLE)), - titlesPanel); + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.domain_title", + ADMIN_BUNDLE)), + titlesPanel); final BoxPanel descPanel = new BoxPanel(BoxPanel.VERTICAL); descPanel.add(new DomainDescriptionTable(categoriesTab, @@ -111,20 +111,20 @@ class DomainDetails extends SegmentedPanel { domainDescriptionAddForm = new DomainDescriptionAddForm(); descPanel.add(domainDescriptionAddForm); addSegment( - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.description", - ADMIN_BUNDLE)), - descPanel); + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.description", + ADMIN_BUNDLE)), + descPanel); final BoxPanel mappingsPanel = new BoxPanel(BoxPanel.VERTICAL); mappingsPanel.add(new DomainMappingsTable(categoriesTab, selectedDomainId)); mappingsPanel.add(new DomainMappingAddForm(selectedDomainId)); addSegment( - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.mappings", - ADMIN_BUNDLE)), - mappingsPanel); + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.mappings", + ADMIN_BUNDLE)), + mappingsPanel); } private class DomainTitleAddForm extends Form { @@ -135,22 +135,21 @@ class DomainDetails extends SegmentedPanel { super("domainAddTitleLang", new BoxPanel(BoxPanel.HORIZONTAL)); final SingleSelect titleSelectLang = new SingleSelect( - TITLE_SELECT_LANG); + TITLE_SELECT_LANG); titleSelectLang.setLabel(new GlobalizedMessage( - "ui.admin.categories.domain_details.domain_title.add.label", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_details.domain_title.add.label", + ADMIN_BUNDLE)); try { titleSelectLang.addPrintListener(e -> { final PageState state = e.getPageState(); final DomainRepository domainRepository = CdiUtil - .createCdiUtil().findBean(DomainRepository.class); + .createCdiUtil().findBean(DomainRepository.class); final Domain domain = domainRepository.findById(Long - .parseLong( - selectedDomainId.getSelectedKey(state))); + .parseLong(selectedDomainId.getSelectedKey(state))); final KernelConfig kernelConfig = KernelConfig.getConfig(); final Set supportedLanguages = kernelConfig - .getSupportedLanguages(); + .getSupportedLanguages(); final Set assignedLanguages = new HashSet<>(); domain.getTitle().getAvailableLocales().forEach(l -> { assignedLanguages.add(l.toString()); @@ -172,8 +171,8 @@ class DomainDetails extends SegmentedPanel { add(titleSelectLang); add(new Submit(new GlobalizedMessage( - "ui.admin.categories.domain_details.domain_title.add.submit", - ADMIN_BUNDLE))); + "ui.admin.categories.domain_details.domain_title.add.submit", + ADMIN_BUNDLE))); addProcessListener(e -> { final PageState state = e.getPageState(); @@ -189,15 +188,14 @@ class DomainDetails extends SegmentedPanel { @Override public boolean isVisible(final PageState state) { if (super.isVisible(state)) { - final DomainRepository domainRepository = CdiUtil - .createCdiUtil().findBean(DomainRepository.class); + .createCdiUtil().findBean(DomainRepository.class); final Domain domain = domainRepository.findById(Long - .parseLong( - selectedDomainId.getSelectedKey(state))); + .parseLong( + selectedDomainId.getSelectedKey(state))); final KernelConfig kernelConfig = KernelConfig.getConfig(); final Set supportedLanguages = kernelConfig - .getSupportedLanguages(); + .getSupportedLanguages(); final Set assignedLanguages = new HashSet<>(); domain.getTitle().getAvailableLocales().forEach(l -> { assignedLanguages.add(l.toString()); @@ -206,7 +204,6 @@ class DomainDetails extends SegmentedPanel { //If all supported languages are assigned the form is not //visible return !assignedLanguages.equals(supportedLanguages); - } else { return false; } @@ -222,22 +219,22 @@ class DomainDetails extends SegmentedPanel { super("domainAddDescLang", new BoxPanel(BoxPanel.HORIZONTAL)); final SingleSelect descSelectLang = new SingleSelect( - DESC_SELECT_LANG); + DESC_SELECT_LANG); descSelectLang.setLabel(new GlobalizedMessage( - "ui.admin.categories.domain_details.domain_desc.add.label", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_details.domain_desc.add.label", + ADMIN_BUNDLE)); try { descSelectLang.addPrintListener(e -> { final PageState state = e.getPageState(); final DomainRepository domainRepository = CdiUtil - .createCdiUtil().findBean(DomainRepository.class); + .createCdiUtil().findBean(DomainRepository.class); final Domain domain = domainRepository.findById(Long - .parseLong( - selectedDomainId.getSelectedKey(state))); + .parseLong( + selectedDomainId.getSelectedKey(state))); final KernelConfig kernelConfig = KernelConfig.getConfig(); final Set supportedLanguages = kernelConfig - .getSupportedLanguages(); + .getSupportedLanguages(); final Set assignedLanguages = new HashSet<>(); domain.getDescription().getAvailableLocales().forEach(l -> { assignedLanguages.add(l.toString()); @@ -259,8 +256,8 @@ class DomainDetails extends SegmentedPanel { add(descSelectLang); add(new Submit(new GlobalizedMessage( - "ui.admin.categories.domain_details.domain_desc.add.submit", - ADMIN_BUNDLE))); + "ui.admin.categories.domain_details.domain_desc.add.submit", + ADMIN_BUNDLE))); addProcessListener(e -> { final PageState state = e.getPageState(); @@ -273,19 +270,18 @@ class DomainDetails extends SegmentedPanel { }); } - + @Override public boolean isVisible(final PageState state) { if (super.isVisible(state)) { - final DomainRepository domainRepository = CdiUtil - .createCdiUtil().findBean(DomainRepository.class); + .createCdiUtil().findBean(DomainRepository.class); final Domain domain = domainRepository.findById(Long - .parseLong( - selectedDomainId.getSelectedKey(state))); + .parseLong( + selectedDomainId.getSelectedKey(state))); final KernelConfig kernelConfig = KernelConfig.getConfig(); final Set supportedLanguages = kernelConfig - .getSupportedLanguages(); + .getSupportedLanguages(); final Set assignedLanguages = new HashSet<>(); domain.getDescription().getAvailableLocales().forEach(l -> { assignedLanguages.add(l.toString()); diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainTitleTable.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainTitleTable.java index ecaa24106..7fb1c6ac6 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainTitleTable.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainTitleTable.java @@ -53,16 +53,17 @@ class DomainTitleTable extends Table { private static final int COL_LOCALE = 0; private static final int COL_VALUE = 1; - private static final int COL_DEL = 2; + private static final int COL_EDIT = 2; + private static final int COL_DEL = 3; private final CategoriesTab categoriesTab; private final ParameterSingleSelectionModel selectedDomainId; private final ParameterSingleSelectionModel selectedLanguage; public DomainTitleTable( - final CategoriesTab categoriesTab, - final ParameterSingleSelectionModel selectedDomainId, - final ParameterSingleSelectionModel selectedLanguage) { + final CategoriesTab categoriesTab, + final ParameterSingleSelectionModel selectedDomainId, + final ParameterSingleSelectionModel selectedLanguage) { super(); @@ -73,26 +74,31 @@ class DomainTitleTable extends Table { setIdAttr("domainTitleTable"); setEmptyView(new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.title.none", ADMIN_BUNDLE))); + "ui.admin.categories.domain_details.title.none", ADMIN_BUNDLE))); final TableColumnModel columnModel = getColumnModel(); columnModel.add(new TableColumn( - COL_LOCALE, - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.title.col_lang", - ADMIN_BUNDLE)))); + COL_LOCALE, + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.title.col_lang", + ADMIN_BUNDLE)))); columnModel.add(new TableColumn( - COL_VALUE, - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.title.col_value", - ADMIN_BUNDLE)))); + COL_VALUE, + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.title.col_value", + ADMIN_BUNDLE)))); columnModel.add(new TableColumn( - COL_DEL, - new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.title.col_del", - ADMIN_BUNDLE)))); + COL_EDIT, + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.title.col_edit", + ADMIN_BUNDLE)))); + columnModel.add(new TableColumn( + COL_DEL, + new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.title.col_del", + ADMIN_BUNDLE)))); - columnModel.get(COL_LOCALE).setCellRenderer(new TableCellRenderer() { + columnModel.get(COL_EDIT).setCellRenderer(new TableCellRenderer() { @Override public Component getComponent(final Table table, @@ -102,7 +108,7 @@ class DomainTitleTable extends Table { final Object key, final int row, final int column) { - return new ControlLink((String) value); + return new ControlLink((Component) value); } }); @@ -122,8 +128,8 @@ class DomainTitleTable extends Table { } else { final ControlLink link = new ControlLink((Component) value); link.setConfirmation(new GlobalizedMessage( - "ui.admin.categories.domain_details.title.del_confirm", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_details.title.del_confirm", + ADMIN_BUNDLE)); return link; } } @@ -137,23 +143,24 @@ class DomainTitleTable extends Table { final PageState state = event.getPageState(); switch (event.getColumn()) { - case COL_LOCALE: + case COL_EDIT: selectedLanguage.setSelectedKey(state, event.getRowKey()); categoriesTab.showDomainTitleForm(state); break; case COL_DEL: final Locale locale = new Locale((String) event - .getRowKey()); + .getRowKey()); final DomainRepository domainRepository = CdiUtil - .createCdiUtil().findBean(DomainRepository.class); + .createCdiUtil(). + findBean(DomainRepository.class); final Domain domain = domainRepository.findById( - Long.parseLong(selectedDomainId - .getSelectedKey(state))); + Long.parseLong(selectedDomainId + .getSelectedKey(state))); domain.getTitle().removeValue(locale); - + domainRepository.save(domain); - + break; } } @@ -169,8 +176,8 @@ class DomainTitleTable extends Table { } private class DomainTitleTableModelBuilder - extends LockableImpl - implements TableModelBuilder { + extends LockableImpl + implements TableModelBuilder { @Override public TableModel makeModel(final Table table, final PageState state) { @@ -189,9 +196,9 @@ class DomainTitleTable extends Table { public DomainTitleTableModel(final PageState state) { final DomainRepository domainRepository = CdiUtil.createCdiUtil() - .findBean(DomainRepository.class); + .findBean(DomainRepository.class); selectedDomain = domainRepository.findById( - Long.parseLong(selectedDomainId.getSelectedKey(state))); + Long.parseLong(selectedDomainId.getSelectedKey(state))); locales = new ArrayList<>(); locales.addAll(selectedDomain.getTitle().getAvailableLocales()); @@ -202,7 +209,7 @@ class DomainTitleTable extends Table { @Override public int getColumnCount() { - return 3; + return 4; } @Override @@ -214,20 +221,25 @@ class DomainTitleTable extends Table { @Override public Object getElementAt(final int columnIndex) { final Locale locale = locales.get(index); - + switch (columnIndex) { case COL_LOCALE: return locale.toString(); case COL_VALUE: return selectedDomain.getTitle().getValue(locale); + case COL_EDIT: + return new Label(new GlobalizedMessage( + "ui.admin.categories.domain_details.title.edit", + ADMIN_BUNDLE + )); case COL_DEL: return new Label(new GlobalizedMessage( - "ui.admin.categories.domain_details.title.del", - ADMIN_BUNDLE + "ui.admin.categories.domain_details.title.del", + ADMIN_BUNDLE )); default: throw new IllegalArgumentException( - "Not a valid column index"); + "Not a valid column index"); } }