CCM NG: Category Tab in Content Center now basically works (#2731).
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5213 8810af33-2d31-482b-a856-94f89814c4df
Former-commit-id: c411b7404a
pull/2/head
parent
1cd53d163e
commit
eab4cd95d3
|
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
package com.arsdigita.cms.ui.category;
|
||||
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
|
|
@ -48,19 +49,10 @@ import java.util.Collection;
|
|||
* @author Stanislav Freidin <sfreidin@redhat.com>
|
||||
* @author Justin Ross <jross@redhat.com>
|
||||
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
class BaseCategoryForm extends BaseForm {
|
||||
|
||||
final CategoryRequestLocal m_parent;
|
||||
final TextField m_name;
|
||||
final TextArea m_description;
|
||||
final RadioGroup m_isAbstract;
|
||||
final RadioGroup m_isVisible;
|
||||
final RadioGroup m_isEnabled;
|
||||
private Label m_script = new Label(new GlobalizedMessage(String.format(
|
||||
"<script language=\"javascript\" src=\"%s/javascript/manipulate-input.js\"></script>",
|
||||
Web.getWebappContextPath())),
|
||||
false);
|
||||
private final static String NAME = "name";
|
||||
private final static String DESCRIPTION = "description";
|
||||
private final static String URL = "url";
|
||||
|
|
@ -68,64 +60,116 @@ class BaseCategoryForm extends BaseForm {
|
|||
private final static String IS_VISIBLE = "isVisible";
|
||||
private final static String IS_ENABLED = "isEnabled";
|
||||
|
||||
private final CategoryRequestLocal categoryRequestLocal;
|
||||
private final TextField nameField;
|
||||
private final TextArea descriptionArea;
|
||||
private final RadioGroup isAbstractRadioGroup;
|
||||
private final RadioGroup isVisibleRadioGroup;
|
||||
private final RadioGroup isEnabledRadioGroup;
|
||||
private Label script = new Label(new GlobalizedMessage(String
|
||||
.format("<script src=\"%s/javascript/manipulate-input.js\"></script>",
|
||||
Web.getWebappContextPath())),
|
||||
false);
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
BaseCategoryForm(final String key,
|
||||
final GlobalizedMessage heading,
|
||||
final CategoryRequestLocal parent) {
|
||||
protected BaseCategoryForm(final String key,
|
||||
final GlobalizedMessage heading,
|
||||
final CategoryRequestLocal parent) {
|
||||
|
||||
super(key, heading);
|
||||
|
||||
m_parent = parent;
|
||||
categoryRequestLocal = parent;
|
||||
|
||||
m_name = new TextField(new TrimmedStringParameter(NAME));
|
||||
addField(gz("cms.ui.name"), m_name);
|
||||
nameField = new TextField(new TrimmedStringParameter(NAME));
|
||||
addField(gz("cms.ui.name"), nameField);
|
||||
|
||||
m_name.setSize(30);
|
||||
m_name.setMaxLength(200);
|
||||
m_name.addValidationListener(new NotNullValidationListener());
|
||||
m_name.setOnFocus("if (this.form." + URL + ".value == '') { "
|
||||
+ " defaulting = true; this.form." + URL
|
||||
+ ".value = urlize(this.value); }");
|
||||
m_name.setOnKeyUp("if (defaulting) { this.form." + URL
|
||||
+ ".value = urlize(this.value) }");
|
||||
nameField.setSize(30);
|
||||
nameField.setMaxLength(200);
|
||||
nameField.addValidationListener(new NotNullValidationListener());
|
||||
nameField.setOnFocus(String.format(
|
||||
""
|
||||
+ "if (this.form.%1$s.value == '') {"
|
||||
+ " defaulting = true;"
|
||||
+ " this.form.%1$s.value = urlize(this.value);"
|
||||
+ "}",
|
||||
URL));
|
||||
nameField.setOnFocus(String.format(
|
||||
""
|
||||
+ "if (defaulting) {"
|
||||
+ " this.form.%1$s.value = urlize(this.value)"
|
||||
+ "}",
|
||||
URL
|
||||
));
|
||||
|
||||
// is abstract?
|
||||
m_isAbstract = new RadioGroup(IS_ABSTRACT);
|
||||
m_isAbstract.addOption(new Option("no", new Label(gz("cms.ui.no"))));
|
||||
m_isAbstract.addOption(new Option("yes", new Label(gz("cms.ui.yes"))));
|
||||
addField(gz("cms.ui.category.is_not_abstract"), m_isAbstract);
|
||||
isAbstractRadioGroup = new RadioGroup(IS_ABSTRACT);
|
||||
isAbstractRadioGroup.addOption(new Option("no", new Label(
|
||||
gz("cms.ui.no"))));
|
||||
isAbstractRadioGroup.addOption(new Option("yes", new Label(gz(
|
||||
"cms.ui.yes"))));
|
||||
addField(gz("cms.ui.category.is_not_abstract"), isAbstractRadioGroup);
|
||||
|
||||
// is visible
|
||||
m_isVisible = new RadioGroup(IS_VISIBLE);
|
||||
m_isVisible.addOption(new Option("no", new Label(gz("cms.ui.no"))));
|
||||
m_isVisible.addOption(new Option("yes", new Label(gz("cms.ui.yes"))));
|
||||
addField(gz("cms.ui.category.is_visible"), m_isVisible);
|
||||
isVisibleRadioGroup = new RadioGroup(IS_VISIBLE);
|
||||
isVisibleRadioGroup.addOption(new Option("no",
|
||||
new Label(gz("cms.ui.no"))));
|
||||
isVisibleRadioGroup.addOption(new Option("yes", new Label(gz(
|
||||
"cms.ui.yes"))));
|
||||
addField(gz("cms.ui.category.is_visible"), isVisibleRadioGroup);
|
||||
|
||||
// is enabled?
|
||||
m_isEnabled = new RadioGroup(IS_ENABLED);
|
||||
m_isEnabled.addOption(new Option("no", new Label(gz("cms.ui.no"))));
|
||||
m_isEnabled.addOption(new Option("yes", new Label(gz("cms.ui.yes"))));
|
||||
addField(gz("cms.ui.category.is_enabled"), m_isEnabled);
|
||||
isEnabledRadioGroup = new RadioGroup(IS_ENABLED);
|
||||
isEnabledRadioGroup.addOption(new Option("no",
|
||||
new Label(gz("cms.ui.no"))));
|
||||
isEnabledRadioGroup.addOption(new Option("yes", new Label(gz(
|
||||
"cms.ui.yes"))));
|
||||
addField(gz("cms.ui.category.is_enabled"), isEnabledRadioGroup);
|
||||
|
||||
m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
||||
addField(gz("cms.ui.description"), m_description);
|
||||
descriptionArea = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
||||
addField(gz("cms.ui.description"), descriptionArea);
|
||||
|
||||
m_description.setWrap(TextArea.SOFT);
|
||||
m_description.setRows(5);
|
||||
m_description.setCols(40);
|
||||
descriptionArea.setWrap(TextArea.SOFT);
|
||||
descriptionArea.setRows(5);
|
||||
descriptionArea.setCols(40);
|
||||
|
||||
addAction(new Finish());
|
||||
addAction(new Cancel());
|
||||
}
|
||||
|
||||
protected CategoryRequestLocal getCategoryRequestLocal() {
|
||||
return categoryRequestLocal;
|
||||
}
|
||||
|
||||
protected TextField getNameField() {
|
||||
return nameField;
|
||||
}
|
||||
|
||||
protected TextArea getDescriptionArea() {
|
||||
return descriptionArea;
|
||||
}
|
||||
|
||||
protected RadioGroup getIsAbstractRadioGroup() {
|
||||
return isAbstractRadioGroup;
|
||||
}
|
||||
|
||||
protected RadioGroup getIsVisibleRadioGroup() {
|
||||
return isVisibleRadioGroup;
|
||||
}
|
||||
|
||||
protected RadioGroup getIsEnabledRadioGroup() {
|
||||
return isEnabledRadioGroup;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void generateXML(PageState ps, Element parent) {
|
||||
m_script.generateXML(ps, parent);
|
||||
script.generateXML(ps, parent);
|
||||
super.generateXML(ps, parent);
|
||||
}
|
||||
|
||||
class NameUniqueListener implements ParameterListener {
|
||||
private class NameUniqueListener implements ParameterListener {
|
||||
|
||||
private final CategoryRequestLocal m_category;
|
||||
private final Widget m_widget;
|
||||
|
|
@ -133,7 +177,7 @@ class BaseCategoryForm extends BaseForm {
|
|||
final static int NAME_FIELD = 1;
|
||||
|
||||
NameUniqueListener(final CategoryRequestLocal category) {
|
||||
this(category, m_name, NAME_FIELD);
|
||||
this(category, nameField, NAME_FIELD);
|
||||
}
|
||||
|
||||
NameUniqueListener(final CategoryRequestLocal category,
|
||||
|
|
@ -149,7 +193,7 @@ class BaseCategoryForm extends BaseForm {
|
|||
final PageState state = e.getPageState();
|
||||
final String title = (String) m_widget.getValue(state);
|
||||
|
||||
final Category parent = m_parent.getCategory(state);
|
||||
final Category parent = categoryRequestLocal.getCategory(state);
|
||||
|
||||
final Collection<Category> children = parent.getSubCategories();
|
||||
|
||||
|
|
|
|||
|
|
@ -24,97 +24,94 @@ import com.arsdigita.bebop.SingleSelectionModel;
|
|||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.dispatcher.AccessDeniedException;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
import com.arsdigita.util.Assert;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.categorization.Category;
|
||||
import org.libreccm.categorization.CategoryManager;
|
||||
import org.libreccm.categorization.CategoryRepository;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||
|
||||
|
||||
/**
|
||||
* TODO Needs a description.
|
||||
*
|
||||
* @author Justin Ross <jross@redhat.com>
|
||||
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
final class CategoryAddForm extends BaseCategoryForm {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger
|
||||
(CategoryAddForm.class);
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
CategoryAddForm.class);
|
||||
|
||||
private final SingleSelectionModel m_model;
|
||||
private final SingleSelectionModel<String> categorySelectionModel;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public CategoryAddForm(final CategoryRequestLocal parent,
|
||||
final SingleSelectionModel model) {
|
||||
final SingleSelectionModel<String> model) {
|
||||
|
||||
super("AddSubcategories", gz("cms.ui.category.add"), parent);
|
||||
|
||||
m_model = model;
|
||||
categorySelectionModel = model;
|
||||
|
||||
addProcessListener(new ProcessListener());
|
||||
}
|
||||
|
||||
private final class ProcessListener implements FormProcessListener {
|
||||
|
||||
public final void process(final FormSectionEvent e)
|
||||
throws FormProcessException {
|
||||
@Override
|
||||
public final void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
LOGGER.debug("Adding a category");
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final CategoryRepository categoryRepository = cdiUtil.findBean(CategoryRepository.class);
|
||||
final CategoryManager categoryManager = cdiUtil.findBean(CategoryManager.class);
|
||||
final PermissionChecker permissionChecker = cdiUtil.findBean(PermissionChecker.class);
|
||||
final ConfigurationManager manager = cdiUtil.findBean(ConfigurationManager.class);
|
||||
final KernelConfig config = manager.findConfiguration(KernelConfig.class);
|
||||
final PermissionChecker permissionChecker = cdiUtil
|
||||
.findBean(PermissionChecker.class);
|
||||
final CategoryController controller = cdiUtil
|
||||
.findBean(CategoryController.class);
|
||||
|
||||
final PageState state = e.getPageState();
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final Category parent = m_parent.getCategory(state);
|
||||
final String name = (String) m_name.getValue(state);
|
||||
final String description = (String) m_description.getValue(state);
|
||||
final String isAbstract = (String) m_isAbstract.getValue(state);
|
||||
final Category parent = getCategoryRequestLocal()
|
||||
.getCategory(state);
|
||||
final String name = (String) getNameField().getValue(state);
|
||||
final String description = (String) getDescriptionArea()
|
||||
.getValue(state);
|
||||
// this seems anti-intuitive but the question is "can you place
|
||||
// items in this category. If the user says "yes" then the
|
||||
// category is not abstract
|
||||
final boolean isAbstract = !"yes"
|
||||
.equals(getIsAbstractRadioGroup().getValue(state));
|
||||
|
||||
Assert.exists(parent, "Category parent");
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Using parent category " + parent + " to " +
|
||||
"create new category");
|
||||
LOGGER.debug("Using parent category " + parent + " to "
|
||||
+ "create new category");
|
||||
}
|
||||
|
||||
if (permissionChecker.isPermitted(AdminPrivileges.ADMINISTER_CATEGORIES, parent)) {
|
||||
final Category category = new Category();
|
||||
category.setName(name);
|
||||
final LocalizedString localizedDescription = new LocalizedString();
|
||||
localizedDescription.addValue(config.getDefaultLocale(), description);
|
||||
category.setDescription(localizedDescription);
|
||||
// this seems anti-intuitive but the question is "can you place
|
||||
// items in this category. If the user says "yes" then the
|
||||
// category is not abstract
|
||||
if ("yes".equals(isAbstract)) {
|
||||
category.setAbstractCategory(false);
|
||||
} else if ("no".equals(isAbstract)) {
|
||||
category.setAbstractCategory(true);
|
||||
}
|
||||
if (permissionChecker
|
||||
.isPermitted(AdminPrivileges.ADMINISTER_CATEGORIES, parent)) {
|
||||
|
||||
categoryRepository.save(category);
|
||||
final Category category = controller.createCategory(parent,
|
||||
name,
|
||||
description,
|
||||
isAbstract);
|
||||
|
||||
categoryManager.addSubCategoryToCategory(category, parent);
|
||||
|
||||
m_model.setSelectedKey(state, category.getUniqueId());
|
||||
categorySelectionModel.setSelectedKey(state,
|
||||
category.getUniqueId());
|
||||
} else {
|
||||
// XXX user a better exception here.
|
||||
// PermissionException doesn't work for this case.
|
||||
throw new AccessDeniedException();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
* Copyright (C) 2018 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.category;
|
||||
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.libreccm.categorization.Category;
|
||||
import org.libreccm.categorization.CategoryManager;
|
||||
import org.libreccm.categorization.CategoryRepository;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
/**
|
||||
* Service methods for the Category Admin Tab in the Content Center.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
class CategoryController {
|
||||
|
||||
@Inject
|
||||
private CategoryManager categoryManager;
|
||||
|
||||
@Inject
|
||||
private CategoryRepository categoryRepo;
|
||||
|
||||
@Inject
|
||||
private ConfigurationManager confManager;
|
||||
|
||||
/**
|
||||
* Creates a new category.
|
||||
*
|
||||
* @param parentCategory The parent category of the new category.
|
||||
* @param name The name of the new category (URL fragment).
|
||||
* @param description A description of the new category-
|
||||
* @param isAbstract Is the new category abstract?
|
||||
* @return The new category.
|
||||
*/
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected Category createCategory(final Category parentCategory,
|
||||
final String name,
|
||||
final String description,
|
||||
final boolean isAbstract) {
|
||||
|
||||
Objects.requireNonNull(parentCategory);
|
||||
Objects.requireNonNull(name);
|
||||
|
||||
if (name.isEmpty() || name.matches("\\s*")) {
|
||||
throw new IllegalArgumentException(
|
||||
"The name of a category can't be empty.");
|
||||
}
|
||||
|
||||
final KernelConfig kernelConfig = confManager
|
||||
.findConfiguration(KernelConfig.class);
|
||||
|
||||
final Category category = new Category();
|
||||
category.setName(name);
|
||||
final LocalizedString localizedDescription = new LocalizedString();
|
||||
localizedDescription.addValue(kernelConfig.getDefaultLocale(),
|
||||
description);
|
||||
category.setDescription(localizedDescription);
|
||||
category.setAbstractCategory(isAbstract);
|
||||
|
||||
categoryRepo.save(category);
|
||||
categoryManager.addSubCategoryToCategory(category, parentCategory);
|
||||
|
||||
return category;
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected Optional<Category> getParentCategory(final Category forCategory) {
|
||||
|
||||
Objects.requireNonNull(forCategory);
|
||||
|
||||
final Category category = categoryRepo
|
||||
.findById(forCategory.getObjectId())
|
||||
.orElseThrow(() -> new IllegalArgumentException(String
|
||||
.format("No category with ID %d in the database.",
|
||||
forCategory.getObjectId())));
|
||||
|
||||
if (category.getParentCategory() == null) {
|
||||
return Optional.empty();
|
||||
} else {
|
||||
return categoryRepo
|
||||
.findById(category.getParentCategory().getObjectId());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -32,6 +32,7 @@ import org.libreccm.categorization.Category;
|
|||
import org.libreccm.categorization.CategoryRepository;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||
|
|
@ -49,52 +50,57 @@ final class CategoryEditForm extends BaseCategoryForm {
|
|||
|
||||
private static final String NO = "no";
|
||||
private static final String YES = "yes";
|
||||
private final CategoryRequestLocal m_category;
|
||||
|
||||
private final CategoryRequestLocal selectedCategory;
|
||||
|
||||
public CategoryEditForm(final CategoryRequestLocal parent,
|
||||
final CategoryRequestLocal category) {
|
||||
final CategoryRequestLocal selectedCategory) {
|
||||
super("EditCategory", gz("cms.ui.category.edit"), parent);
|
||||
|
||||
m_category = category;
|
||||
this.selectedCategory = selectedCategory;
|
||||
|
||||
addInitListener(new InitListener());
|
||||
addProcessListener(new ProcessListener());
|
||||
super.addInitListener(new InitListener());
|
||||
super.addProcessListener(new ProcessListener());
|
||||
}
|
||||
|
||||
private class InitListener implements FormInitListener {
|
||||
|
||||
@Override
|
||||
public final void init(final FormSectionEvent e)
|
||||
public final void init(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
final PageState state = e.getPageState();
|
||||
final Category category = m_category.getCategory(state);
|
||||
|
||||
// Quasimodo:
|
||||
// Modified to ensure that the value is read from Category (and not the
|
||||
// localized version). This is necessary because we are in the admin GUI,
|
||||
// a localized version would be confusing.
|
||||
m_name.setValue(state, category.getName());
|
||||
m_description.setValue(state, category.getDescription());
|
||||
//m_url.setValue(state, category.getURL(""));
|
||||
final PageState state = event.getPageState();
|
||||
final Category category = selectedCategory.getCategory(state);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final GlobalizationHelper globalizationHelper = cdiUtil
|
||||
.findBean(GlobalizationHelper.class);
|
||||
|
||||
getNameField().setValue(state, category.getName());
|
||||
final LocalizedString description = category.getDescription();
|
||||
getDescriptionArea()
|
||||
.setValue(state,
|
||||
globalizationHelper
|
||||
.getValueFromLocalizedString(description));
|
||||
// this seems anti-intuitive but the question is "can you place
|
||||
// items in this category. If the user says "yes" then the
|
||||
// category is not abstract
|
||||
if (category.isAbstractCategory()) {
|
||||
m_isAbstract.setValue(state, NO);
|
||||
getIsAbstractRadioGroup().setValue(state, NO);
|
||||
} else {
|
||||
m_isAbstract.setValue(state, YES);
|
||||
getIsAbstractRadioGroup().setValue(state, YES);
|
||||
}
|
||||
|
||||
if (category.isVisible()) {
|
||||
m_isVisible.setValue(state, YES);
|
||||
getIsVisibleRadioGroup().setValue(state, YES);
|
||||
} else {
|
||||
m_isVisible.setValue(state, NO);
|
||||
getIsVisibleRadioGroup().setValue(state, NO);
|
||||
}
|
||||
|
||||
if (category.isEnabled()) {
|
||||
m_isEnabled.setValue(state, YES);
|
||||
getIsEnabledRadioGroup().setValue(state, YES);
|
||||
} else {
|
||||
m_isEnabled.setValue(state, NO);
|
||||
getIsEnabledRadioGroup().setValue(state, NO);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -103,8 +109,9 @@ final class CategoryEditForm extends BaseCategoryForm {
|
|||
private class ProcessListener implements FormProcessListener {
|
||||
|
||||
@Override
|
||||
public final void process(final FormSectionEvent e)
|
||||
public final void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final PermissionChecker permissionChecker = cdiUtil.findBean(
|
||||
PermissionChecker.class);
|
||||
|
|
@ -115,20 +122,21 @@ final class CategoryEditForm extends BaseCategoryForm {
|
|||
final CategoryRepository categoryRepository = cdiUtil.findBean(
|
||||
CategoryRepository.class);
|
||||
|
||||
final PageState state = e.getPageState();
|
||||
final Category category = m_category.getCategory(state);
|
||||
final PageState state = event.getPageState();
|
||||
final Category category = selectedCategory.getCategory(state);
|
||||
|
||||
if (permissionChecker.isPermitted(
|
||||
AdminPrivileges.ADMINISTER_CATEGORIES, category)) {
|
||||
category.setName((String) m_name.getValue(state));
|
||||
category.setName((String) getNameField().getValue(state));
|
||||
final LocalizedString localizedDescription
|
||||
= new LocalizedString();
|
||||
localizedDescription.addValue(config.getDefaultLocale(),
|
||||
(String) m_description.getValue(
|
||||
state));
|
||||
= new LocalizedString();
|
||||
localizedDescription
|
||||
.addValue(config.getDefaultLocale(),
|
||||
(String) getDescriptionArea().getValue(state));
|
||||
category.setDescription(localizedDescription);
|
||||
|
||||
final String isAbstract = (String) m_isAbstract.getValue(state);
|
||||
final String isAbstract = (String) getIsAbstractRadioGroup()
|
||||
.getValue(state);
|
||||
// this seems anti-intuitive but the question is "can you place
|
||||
// items in this category. If the user says "yes" then the
|
||||
// category is not abstract
|
||||
|
|
@ -138,14 +146,16 @@ final class CategoryEditForm extends BaseCategoryForm {
|
|||
category.setAbstractCategory(true);
|
||||
}
|
||||
|
||||
final String isVisible = (String) m_isVisible.getValue(state);
|
||||
final String isVisible = (String) getIsVisibleRadioGroup()
|
||||
.getValue(state);
|
||||
if (YES.equals(isVisible)) {
|
||||
category.setVisible(true);
|
||||
} else {
|
||||
category.setVisible(false);
|
||||
}
|
||||
|
||||
final String isEnabled = (String) m_isEnabled.getValue(state);
|
||||
final String isEnabled = (String) getIsEnabledRadioGroup()
|
||||
.getValue(state);
|
||||
if (YES.equals(isEnabled)) {
|
||||
category.setEnabled(true);
|
||||
} else if (NO.equals(isEnabled)) {
|
||||
|
|
@ -153,6 +163,7 @@ final class CategoryEditForm extends BaseCategoryForm {
|
|||
}
|
||||
|
||||
categoryRepository.save(category);
|
||||
|
||||
} else {
|
||||
throw new AccessDeniedException();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -315,10 +315,12 @@ class CategoryItemPane extends BaseItemPane {
|
|||
|
||||
final String itemTitle;
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final GlobalizationHelper globalizationHelper = cdiUtil
|
||||
.findBean(GlobalizationHelper.class);
|
||||
if (category == null) {
|
||||
itemTitle = "None";
|
||||
} else {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final CategoryManager categoryManager = cdiUtil
|
||||
.findBean(CategoryManager.class);
|
||||
final List<CcmObject> indexObjects = categoryManager
|
||||
|
|
@ -331,15 +333,13 @@ class CategoryItemPane extends BaseItemPane {
|
|||
.findFirst();
|
||||
|
||||
if (indexItem.isPresent()) {
|
||||
final GlobalizationHelper globalizationHelper = cdiUtil
|
||||
.findBean(GlobalizationHelper.class);
|
||||
|
||||
final ContentItem item = indexItem.get();
|
||||
itemTitle = globalizationHelper
|
||||
.getValueFromLocalizedString(item.getTitle(),
|
||||
item::getDisplayName);
|
||||
|
||||
} else if (indexObjects.isEmpty()){
|
||||
} else if (indexObjects.isEmpty()) {
|
||||
itemTitle = "None";
|
||||
} else {
|
||||
final CcmObject indexObj = indexObjects.get(0);
|
||||
|
|
@ -349,8 +349,10 @@ class CategoryItemPane extends BaseItemPane {
|
|||
|
||||
properties.add(new Property(gz("cms.ui.name"),
|
||||
category.getName()));
|
||||
properties.add(new Property(gz("cms.ui.description"),
|
||||
category.getDescription().getValue()));
|
||||
properties.add(new Property(
|
||||
gz("cms.ui.description"),
|
||||
globalizationHelper
|
||||
.getValueFromLocalizedString(category.getDescription())));
|
||||
properties.add(new Property(
|
||||
gz("cms.ui.category.is_not_abstract"),
|
||||
category.isAbstractCategory()
|
||||
|
|
@ -443,10 +445,15 @@ class CategoryItemPane extends BaseItemPane {
|
|||
public final boolean isVisible(final PageState state) {
|
||||
|
||||
final Category category = m_category.getCategory(state);
|
||||
if (category.getParentCategory() == null) {
|
||||
return false;
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final CategoryController controller = cdiUtil
|
||||
.findBean(CategoryController.class);
|
||||
final Optional<Category> parentCategory = controller
|
||||
.getParentCategory(category);
|
||||
if (parentCategory.isPresent()) {
|
||||
return parentCategory.get().isVisible();
|
||||
} else {
|
||||
return category.getParentCategory().isVisible();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,11 +29,13 @@ import com.arsdigita.bebop.list.ListModel;
|
|||
import com.arsdigita.bebop.list.ListModelBuilder;
|
||||
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
||||
import com.arsdigita.bebop.util.GlobalizationUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.libreccm.categorization.Category;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
|
@ -45,6 +47,7 @@ import java.util.ArrayList;
|
|||
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
|
||||
*/
|
||||
public class CategoryLinks extends List {
|
||||
|
||||
public final static String SUB_CATEGORY = "sc";
|
||||
|
||||
private final CategoryRequestLocal m_parent;
|
||||
|
|
@ -52,8 +55,8 @@ public class CategoryLinks extends List {
|
|||
|
||||
public CategoryLinks(final CategoryRequestLocal parent,
|
||||
final SingleSelectionModel model) {
|
||||
super(new ParameterSingleSelectionModel
|
||||
(new BigDecimalParameter(SUB_CATEGORY)));
|
||||
super(new ParameterSingleSelectionModel(new BigDecimalParameter(
|
||||
SUB_CATEGORY)));
|
||||
setIdAttr("category_links_list");
|
||||
|
||||
m_parent = parent;
|
||||
|
|
@ -64,25 +67,28 @@ public class CategoryLinks extends List {
|
|||
// Select the category in the main tree when the
|
||||
// user selects it here
|
||||
addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
final PageState state = e.getPageState();
|
||||
final String id = (String) getSelectedKey(state);
|
||||
|
||||
if (id != null) {
|
||||
m_model.setSelectedKey(state, id);
|
||||
}
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
final PageState state = e.getPageState();
|
||||
final String id = (String) getSelectedKey(state);
|
||||
|
||||
if (id != null) {
|
||||
m_model.setSelectedKey(state, id);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
final Label label = new Label
|
||||
(GlobalizationUtil.globalize("cms.ui.category.linked_none"));
|
||||
});
|
||||
|
||||
final Label label = new Label(new GlobalizedMessage(
|
||||
"cms.ui.category.linked_none",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
label.setFontWeight(Label.ITALIC);
|
||||
setEmptyView(label);
|
||||
}
|
||||
|
||||
// Since this part is for non default parents, but there is only one... this is not needed anymore, i guess
|
||||
private class LinkedCategoryModelBuilder extends LockableImpl
|
||||
implements ListModelBuilder {
|
||||
implements ListModelBuilder {
|
||||
|
||||
@Override
|
||||
public ListModel makeModel(List list, PageState state) {
|
||||
|
|
@ -91,27 +97,38 @@ public class CategoryLinks extends List {
|
|||
if (category != null && category.getParentCategory() != null) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final GlobalizationHelper globalizationHelper =cdiUtil
|
||||
.findBean(GlobalizationHelper.class);
|
||||
final Category parent = category.getParentCategory();
|
||||
final CategoryController controller = cdiUtil
|
||||
.findBean(CategoryController.class);
|
||||
final GlobalizationHelper globalizationHelper = cdiUtil
|
||||
.findBean(GlobalizationHelper.class);
|
||||
final Category parent = controller
|
||||
.getParentCategory(category).get();
|
||||
|
||||
java.util.List<CategoryListItem> categories = new ArrayList<>();
|
||||
final CategoryListItem parentItem = new CategoryListItem();
|
||||
parentItem.setCategoryId(parent.getObjectId());
|
||||
final String label = globalizationHelper
|
||||
.getValueFromLocalizedString(parent.getTitle(),
|
||||
parent::getName);
|
||||
.getValueFromLocalizedString(parent.getTitle(),
|
||||
parent::getName);
|
||||
parentItem.setLabel(label);
|
||||
|
||||
categories.add(parentItem);
|
||||
|
||||
return new CategoryListModel
|
||||
(categories,
|
||||
category.getParentCategory() == null ? null : Long.parseLong(category.getParentCategory().getUniqueId()));
|
||||
return new CategoryListModel(
|
||||
categories,
|
||||
parent.getObjectId());
|
||||
|
||||
// return new CategoryListModel(categories,
|
||||
// category.getParentCategory()
|
||||
// == null ? null : Long
|
||||
// .parseLong(
|
||||
// parent
|
||||
// .getUniqueId()));
|
||||
} else {
|
||||
return List.EMPTY_MODEL;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,14 +18,19 @@
|
|||
*/
|
||||
package com.arsdigita.cms.ui.category;
|
||||
|
||||
import com.arsdigita.bebop.*;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Text;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.util.GlobalizationUtil;
|
||||
import com.arsdigita.dispatcher.AccessDeniedException;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.categorization.Category;
|
||||
|
|
@ -33,6 +38,7 @@ import org.libreccm.categorization.CategoryRepository;
|
|||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||
|
||||
import java.util.Collection;
|
||||
|
|
@ -41,8 +47,8 @@ import java.util.Locale;
|
|||
/**
|
||||
* Generates a form for creating new localisations for the given category.
|
||||
*
|
||||
* This class is part of the admin GUI of CCM and extends the standard form
|
||||
* in order to present forms for managing the multi-language categories.
|
||||
* This class is part of the admin GUI of CCM and extends the standard form in
|
||||
* order to present forms for managing the multi-language categories.
|
||||
*
|
||||
* @author Sören Bernstein <quasi@quasiweb.de>
|
||||
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
|
||||
|
|
@ -50,16 +56,18 @@ import java.util.Locale;
|
|||
public class CategoryLocalizationAddForm extends CategoryLocalizationForm {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
CategoryLocalizationAddForm.class);
|
||||
CategoryLocalizationAddForm.class);
|
||||
|
||||
/** Creates a new instance of CategoryLocalizationAddForm */
|
||||
/**
|
||||
* Creates a new instance of CategoryLocalizationAddForm
|
||||
*/
|
||||
public CategoryLocalizationAddForm(final CategoryRequestLocal category) {
|
||||
|
||||
super("AddCategoryLocalization",
|
||||
gz("cms.ui.category.localization_add"), category);
|
||||
gz("cms.ui.category.localization_add"), category);
|
||||
|
||||
addInitListener(new InitListener());
|
||||
addProcessListener(new ProcessListener());
|
||||
super.addInitListener(new InitListener());
|
||||
super.addProcessListener(new ProcessListener());
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -70,40 +78,48 @@ public class CategoryLocalizationAddForm extends CategoryLocalizationForm {
|
|||
private class InitListener implements FormInitListener {
|
||||
|
||||
public final void init(final FormSectionEvent e)
|
||||
throws FormProcessException {
|
||||
throws FormProcessException {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager manager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
ConfigurationManager.class);
|
||||
final KernelConfig config = manager.findConfiguration(
|
||||
KernelConfig.class);
|
||||
KernelConfig.class);
|
||||
|
||||
final PageState state = e.getPageState();
|
||||
final Category category = m_category.getCategory(state);
|
||||
|
||||
// Select one entry
|
||||
m_locale.addOption(new Option("",
|
||||
new Label(GlobalizationUtil.globalize(
|
||||
"cms.ui.select_one"))), state);
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.ui.select_one",
|
||||
CmsConstants.CMS_BUNDLE))),
|
||||
state);
|
||||
final Collection<String> locales = config.getSupportedLanguages();
|
||||
if (locales != null) {
|
||||
for (String locale : locales) {
|
||||
m_locale.addOption(new Option(locale,
|
||||
new Text(new Locale(locale).getDisplayLanguage())), state);
|
||||
new Text(new Locale(locale)
|
||||
.getDisplayLanguage())),
|
||||
state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final class ProcessListener implements FormProcessListener {
|
||||
|
||||
public final void process(final FormSectionEvent e)
|
||||
throws FormProcessException {
|
||||
LOGGER.debug("Adding a categoryLocalization to category " + m_category);
|
||||
throws FormProcessException {
|
||||
LOGGER.debug("Adding a categoryLocalization to category "
|
||||
+ m_category);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final PermissionChecker permissionChecker = cdiUtil.findBean(PermissionChecker.class);
|
||||
final CategoryRepository categoryRepository = cdiUtil.findBean(CategoryRepository.class);
|
||||
final PermissionChecker permissionChecker = cdiUtil.findBean(
|
||||
PermissionChecker.class);
|
||||
final CategoryRepository categoryRepository = cdiUtil.findBean(
|
||||
CategoryRepository.class);
|
||||
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
|
|
@ -111,18 +127,19 @@ public class CategoryLocalizationAddForm extends CategoryLocalizationForm {
|
|||
final Locale locale = new Locale((String) m_locale.getValue(state));
|
||||
final String title = (String) m_title.getValue(state);
|
||||
final String description = (String) m_description.getValue(state);
|
||||
final String url = (String) m_url.getValue(state);
|
||||
final String isEnabled = (String) m_isEnabled.getValue(state);
|
||||
// final String url = (String) m_url.getValue(state);
|
||||
// final String isEnabled = (String) m_isEnabled.getValue(state);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Adding localization for locale " + locale
|
||||
+ " to category " + category);
|
||||
+ " to category " + category);
|
||||
}
|
||||
|
||||
if (permissionChecker.isPermitted(AdminPrivileges.ADMINISTER_CATEGORIES, category)) {
|
||||
if (permissionChecker.isPermitted(
|
||||
AdminPrivileges.ADMINISTER_CATEGORIES, category)) {
|
||||
category.getTitle().addValue(locale, title);
|
||||
category.getDescription().addValue(locale, description);
|
||||
category.setEnabled(isEnabled.equals("yes"));
|
||||
// category.setEnabled(isEnabled.equals("yes"));
|
||||
categoryRepository.save(category);
|
||||
|
||||
} else {
|
||||
|
|
@ -131,5 +148,7 @@ public class CategoryLocalizationAddForm extends CategoryLocalizationForm {
|
|||
throw new AccessDeniedException();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,13 +89,13 @@ public class CategoryLocalizationEditForm extends CategoryLocalizationForm {
|
|||
|
||||
m_title.setValue(state, category.getTitle().getValue(locale));
|
||||
m_description.setValue(state, category.getDescription().getValue(locale));
|
||||
m_url.setValue(state, category.getName());
|
||||
// m_url.setValue(state, category.getName());
|
||||
|
||||
if (category.isEnabled()) {
|
||||
m_isEnabled.setValue(state, "yes");
|
||||
} else {
|
||||
m_isEnabled.setValue(state, "no");
|
||||
}
|
||||
// if (category.isEnabled()) {
|
||||
// m_isEnabled.setValue(state, "yes");
|
||||
// } else {
|
||||
// m_isEnabled.setValue(state, "no");
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -122,8 +122,8 @@ public class CategoryLocalizationEditForm extends CategoryLocalizationForm {
|
|||
final Locale locale = new Locale((String) m_locale.getValue(state));
|
||||
category.getTitle().addValue(locale, (String) m_title.getValue(state));
|
||||
category.getDescription().addValue(locale, (String) m_description.getValue(state));
|
||||
category.setName((String) m_url.getValue(state));
|
||||
category.setEnabled("yes".equals(m_isEnabled.getValue(state)));
|
||||
// category.setName((String) m_url.getValue(state));
|
||||
// category.setEnabled("yes".equals(m_isEnabled.getValue(state)));
|
||||
categoryRepository.save(category);
|
||||
} else {
|
||||
throw new AccessDeniedException();
|
||||
|
|
|
|||
|
|
@ -69,12 +69,12 @@ public class CategoryLocalizationForm extends BaseForm {
|
|||
final TextField m_title;
|
||||
final TextArea m_description;
|
||||
//final TextField m_url;
|
||||
final Hidden m_url;
|
||||
final RadioGroup m_isEnabled;
|
||||
private Embedded m_script = new Embedded(String.format(
|
||||
"<script language=\"javascript\" src=\"%s/javascript/manipulate-input.js\">" + "</script>",
|
||||
Web.getWebappContextPath()),
|
||||
false);
|
||||
// final Hidden m_url;
|
||||
// final RadioGroup m_isEnabled;
|
||||
// private Embedded m_script = new Embedded(String.format(
|
||||
// "<script language=\"javascript\" src=\"%s/javascript/manipulate-input.js\">" + "</script>",
|
||||
// Web.getWebappContextPath()),
|
||||
// false);
|
||||
|
||||
private final static String LOCALE = "locale";
|
||||
private final static String TITLE = "title";
|
||||
|
|
@ -117,7 +117,7 @@ public class CategoryLocalizationForm extends BaseForm {
|
|||
addField(gz("cms.ui.category.localization_locale"), m_locale);
|
||||
|
||||
m_title = new TextField(new TrimmedStringParameter(TITLE));
|
||||
addField(gz("cms.ui.name"), m_title);
|
||||
addField(gz("cms.ui.title"), m_title);
|
||||
|
||||
m_title.setSize(30);
|
||||
m_title.setMaxLength(200);
|
||||
|
|
@ -128,10 +128,10 @@ public class CategoryLocalizationForm extends BaseForm {
|
|||
m_title.setOnKeyUp("if (defaulting) { this.form." + URL + ".value = urlize(this.value) }");
|
||||
|
||||
// is enabled?
|
||||
m_isEnabled = new RadioGroup(IS_ENABLED);
|
||||
m_isEnabled.addOption(new Option("no", new Label(gz("cms.ui.no"))));
|
||||
m_isEnabled.addOption(new Option("yes", new Label(gz("cms.ui.yes"))));
|
||||
addField(gz("cms.ui.category.is_enabled"), m_isEnabled);
|
||||
// m_isEnabled = new RadioGroup(IS_ENABLED);
|
||||
// m_isEnabled.addOption(new Option("no", new Label(gz("cms.ui.no"))));
|
||||
// m_isEnabled.addOption(new Option("yes", new Label(gz("cms.ui.yes"))));
|
||||
// addField(gz("cms.ui.category.is_enabled"), m_isEnabled);
|
||||
|
||||
m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
||||
addField(gz("cms.ui.description"), m_description);
|
||||
|
|
@ -165,25 +165,25 @@ public class CategoryLocalizationForm extends BaseForm {
|
|||
//the URLs. Also, a category is the same resource for every language variant therefore
|
||||
//the URL should be the same.
|
||||
//Changed field to Hidden, initalised with URL of category itself.
|
||||
m_url = new Hidden(new TrimmedStringParameter(URL));
|
||||
try {
|
||||
m_url.addPrintListener(new PrintListener() {
|
||||
|
||||
@Override
|
||||
public void prepare(final PrintEvent event) {
|
||||
final Hidden target = (Hidden) event.getTarget();
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final Category cat = m_category.getCategory(state);
|
||||
|
||||
target.setValue(state, cat.getName());
|
||||
}
|
||||
|
||||
});
|
||||
} catch (TooManyListenersException | IllegalArgumentException ex) {
|
||||
LOGGER.fatal(ex);
|
||||
}
|
||||
addField(gz("cms.ui.category.url"), m_url);
|
||||
// m_url = new Hidden(new TrimmedStringParameter(URL));
|
||||
// try {
|
||||
// m_url.addPrintListener(new PrintListener() {
|
||||
//
|
||||
// @Override
|
||||
// public void prepare(final PrintEvent event) {
|
||||
// final Hidden target = (Hidden) event.getTarget();
|
||||
// final PageState state = event.getPageState();
|
||||
//
|
||||
// final Category cat = m_category.getCategory(state);
|
||||
//
|
||||
// target.setValue(state, cat.getName());
|
||||
// }
|
||||
//
|
||||
// });
|
||||
// } catch (TooManyListenersException | IllegalArgumentException ex) {
|
||||
// LOGGER.fatal(ex);
|
||||
// }
|
||||
// addField(gz("cms.ui.category.url"), m_url);
|
||||
|
||||
addAction(new Finish());
|
||||
addAction(new Cancel());
|
||||
|
|
@ -192,7 +192,7 @@ public class CategoryLocalizationForm extends BaseForm {
|
|||
|
||||
@Override
|
||||
public void generateXML(PageState ps, Element parent) {
|
||||
m_script.generateXML(ps, parent);
|
||||
// m_script.generateXML(ps, parent);
|
||||
super.generateXML(ps, parent);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,22 +32,19 @@ import com.arsdigita.bebop.table.TableColumnModel;
|
|||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.bebop.util.GlobalizationUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.libreccm.categorization.Category;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.libreccm.l10n.GlobalizedMessagesUtil;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Lists all existing localizations for a selected category.
|
||||
|
|
@ -64,6 +61,12 @@ public class CategoryLocalizationTable extends Table implements
|
|||
private static final String TABLE_COL_LANG = "table_col_lang";
|
||||
private static final String TABLE_COL_DEL = "table_col_del";
|
||||
|
||||
private static final int COL_LOCALE = 0;
|
||||
private static final int COL_TITLE = 1;
|
||||
private static final int COL_DESCRIPTION = 2;
|
||||
private static final int COL_EDIT = 3;
|
||||
private static final int COL_DEL = 4;
|
||||
|
||||
private final CategoryRequestLocal m_category;
|
||||
private final SingleSelectionModel m_model;
|
||||
private final SingleSelectionModel m_catLocale;
|
||||
|
|
@ -94,31 +97,26 @@ public class CategoryLocalizationTable extends Table implements
|
|||
|
||||
// define columns
|
||||
columnModel.add(new TableColumn(
|
||||
0,
|
||||
COL_LOCALE,
|
||||
messagesUtil.getGlobalizedMessage(
|
||||
"cms.ui.category.localization.locale")
|
||||
.localize(),
|
||||
"cms.ui.category.localization.locale"),
|
||||
TABLE_COL_LANG));
|
||||
columnModel.add(new TableColumn(
|
||||
1,
|
||||
COL_TITLE,
|
||||
messagesUtil
|
||||
.getGlobalizedMessage("cms.ui.category.localization_name")
|
||||
.localize()));
|
||||
.getGlobalizedMessage("cms.ui.category.localization_title")));
|
||||
columnModel.add(new TableColumn(
|
||||
2,
|
||||
COL_DESCRIPTION,
|
||||
messagesUtil.getGlobalizedMessage(
|
||||
"cms.ui.category.localization_description")
|
||||
.localize()));
|
||||
"cms.ui.category.localization_description")));
|
||||
columnModel.add(new TableColumn(
|
||||
3,
|
||||
COL_EDIT,
|
||||
messagesUtil
|
||||
.getGlobalizedMessage("cms.ui.category.localization_url")
|
||||
.localize()));
|
||||
.getGlobalizedMessage("cms.ui.category.localization_edit")));
|
||||
columnModel.add(new TableColumn(
|
||||
4,
|
||||
COL_DEL,
|
||||
messagesUtil
|
||||
.getGlobalizedMessage("cms.ui.category.localization_action")
|
||||
.localize(),
|
||||
.getGlobalizedMessage("cms.ui.category.localization_action"),
|
||||
TABLE_COL_DEL));
|
||||
|
||||
super.setModelBuilder(new CategoryLocalizationTableModelBuilder());
|
||||
|
|
@ -130,101 +128,87 @@ public class CategoryLocalizationTable extends Table implements
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* XXXX
|
||||
*
|
||||
*/
|
||||
private class CategoryLocalizationTableModelBuilder extends LockableImpl
|
||||
implements TableModelBuilder {
|
||||
|
||||
public TableModel makeModel(Table table, PageState state) {
|
||||
@Override
|
||||
public TableModel makeModel(final Table table, final PageState state) {
|
||||
|
||||
final Category category = m_category.getCategory(state);
|
||||
|
||||
if (category != null) {
|
||||
return new CategoryLocalizationTableModel(table, state, category);
|
||||
} else {
|
||||
if (category == null) {
|
||||
return Table.EMPTY_MODEL;
|
||||
} else {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final CategoryLocalizationTableController controller = cdiUtil
|
||||
.findBean(CategoryLocalizationTableController.class);
|
||||
|
||||
final List<CategoryLocalizationTableRow> rows = controller
|
||||
.getCategoryLocalizations(category);
|
||||
return new CategoryLocalizationTableModel(table, rows);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* XXX
|
||||
*
|
||||
*/
|
||||
private class CategoryLocalizationTableModel implements TableModel {
|
||||
|
||||
private Table m_table;
|
||||
private ArrayList<LocalizedString> localizedStringCollection;
|
||||
private LocalizedString m_categoryLocalization;
|
||||
private final Table table;
|
||||
private final Iterator<CategoryLocalizationTableRow> iterator;
|
||||
private CategoryLocalizationTableRow currentRow;
|
||||
|
||||
private CategoryLocalizationTableModel(Table t, PageState ps,
|
||||
Category category) {
|
||||
m_table = t;
|
||||
localizedStringCollection = new ArrayList<>();
|
||||
localizedStringCollection.add(category.getTitle());
|
||||
localizedStringCollection.add(category.getDescription());
|
||||
private CategoryLocalizationTableModel(
|
||||
final Table table,
|
||||
final List<CategoryLocalizationTableRow> rows) {
|
||||
|
||||
this.table = table;
|
||||
iterator = rows.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return m_table.getColumnModel().size();
|
||||
return table.getColumnModel().size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check collection for the existence of another row.
|
||||
*
|
||||
* If exists, fetch the value of current CategoryLocalization object
|
||||
* into m_categoryLocalization class variable.
|
||||
*/
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
return false;
|
||||
// if (m_categoryLocalizations != null && m_categoryLocalizations.next()) {
|
||||
// m_categoryLocalization = m_categoryLocalizations.getCategoryLocalization();
|
||||
// return true;
|
||||
//
|
||||
// } else {
|
||||
//
|
||||
// return false;
|
||||
//
|
||||
// }
|
||||
|
||||
if (iterator.hasNext()) {
|
||||
currentRow = iterator.next();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the
|
||||
*
|
||||
* @see com.arsdigita.bebop.table.TableModel#getElementAt(int)
|
||||
*/
|
||||
public Object getElementAt(int columnIndex) {
|
||||
return null;
|
||||
// switch (columnIndex) {
|
||||
// case 0:
|
||||
// Locale clLocale = new Locale(m_categoryLocalization.getLocale());
|
||||
// return clLocale.getDisplayLanguage(/*Locale*/);
|
||||
// case 1:
|
||||
// return m_categoryLocalization.getName();
|
||||
// case 2:
|
||||
// String desc = m_categoryLocalization.getDescription();
|
||||
// if (desc != null && desc.length() > MAX_DESC_LENGTH) {
|
||||
// desc = desc.substring(MAX_DESC_LENGTH - 3).concat("...");
|
||||
// }
|
||||
// return desc;
|
||||
// case 3:
|
||||
// return m_categoryLocalization.getURL();
|
||||
// case 4:
|
||||
// return GlobalizationUtil.globalize("cms.ui.delete").localize();
|
||||
// default:
|
||||
// return null;
|
||||
// }
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
|
||||
switch (columnIndex) {
|
||||
case COL_LOCALE:
|
||||
return currentRow.getLocale();
|
||||
case COL_TITLE:
|
||||
return currentRow.getTitle();
|
||||
case COL_DESCRIPTION:
|
||||
return currentRow.getDescription();
|
||||
case COL_EDIT:
|
||||
return new GlobalizedMessage("cms.ui.edit",
|
||||
CmsConstants.CMS_BUNDLE);
|
||||
case COL_DEL:
|
||||
return new GlobalizedMessage("cms.ui.delete",
|
||||
CmsConstants.CMS_BUNDLE);
|
||||
default:
|
||||
throw new IllegalArgumentException("Illegal Column Index");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @see com.arsdigita.bebop.table.TableModel#getKeyAt(int)
|
||||
*/
|
||||
public Object getKeyAt(int columnIndex) {
|
||||
return null;
|
||||
// return m_categoryLocalization.getID();
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
return currentRow.getLocale();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -232,9 +216,15 @@ public class CategoryLocalizationTable extends Table implements
|
|||
private class EditCellRenderer extends LockableImpl implements
|
||||
TableCellRenderer {
|
||||
|
||||
public Component getComponent(Table table, PageState state, Object value,
|
||||
boolean isSelected, final Object key,
|
||||
int row, int column) {
|
||||
@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) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final PermissionChecker permissionChecker = cdiUtil.findBean(
|
||||
PermissionChecker.class);
|
||||
|
|
@ -253,9 +243,15 @@ public class CategoryLocalizationTable extends Table implements
|
|||
private class DeleteCellRenderer extends LockableImpl implements
|
||||
TableCellRenderer {
|
||||
|
||||
public Component getComponent(Table table, PageState state, Object value,
|
||||
boolean isSelected, Object key,
|
||||
int row, int column) {
|
||||
@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) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final PermissionChecker permissionChecker = cdiUtil.findBean(
|
||||
PermissionChecker.class);
|
||||
|
|
@ -279,9 +275,10 @@ public class CategoryLocalizationTable extends Table implements
|
|||
* into picture when a link on the table is clicked. Handles edit and delete
|
||||
* event.
|
||||
*/
|
||||
public void cellSelected(TableActionEvent evt) {
|
||||
@Override
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
|
||||
PageState state = evt.getPageState();
|
||||
PageState state = event.getPageState();
|
||||
|
||||
// // Get selected CategoryLocalization
|
||||
// CategoryLocalization categoryLocalization =
|
||||
|
|
@ -308,8 +305,9 @@ public class CategoryLocalizationTable extends Table implements
|
|||
* provide Implementation to TableActionListener method. Does nothing in our
|
||||
* case.
|
||||
*/
|
||||
public void headSelected(TableActionEvent e) {
|
||||
throw new UnsupportedOperationException("Not Implemented");
|
||||
@Override
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
//Nothing
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* Copyright (C) 2018 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.category;
|
||||
|
||||
import org.libreccm.categorization.Category;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
class CategoryLocalizationTableController {
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
protected List<CategoryLocalizationTableRow> getCategoryLocalizations(
|
||||
final Category forCategory) {
|
||||
|
||||
final Map<Locale, CategoryLocalizationTableRow> localizations
|
||||
= new HashMap<>();
|
||||
|
||||
final Set<Locale> locales = new HashSet<>();
|
||||
locales.addAll(forCategory.getTitle().getAvailableLocales());
|
||||
locales.addAll(forCategory.getDescription().getAvailableLocales());
|
||||
|
||||
return locales
|
||||
.stream()
|
||||
.map(locale -> generateRow(locale, forCategory))
|
||||
.sorted()
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private CategoryLocalizationTableRow generateRow(final Locale locale,
|
||||
final Category category) {
|
||||
|
||||
final CategoryLocalizationTableRow row
|
||||
= new CategoryLocalizationTableRow(
|
||||
locale);
|
||||
|
||||
if (category.getTitle().hasValue(locale)) {
|
||||
row.setTitle(category.getTitle().getValue(locale));
|
||||
}
|
||||
|
||||
if (category.getDescription().hasValue(locale)) {
|
||||
row.setDescription(category.getDescription().getValue(locale));
|
||||
}
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* Copyright (C) 2018 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.ui.category;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
class CategoryLocalizationTableRow
|
||||
implements Comparable<CategoryLocalizationTableRow> {
|
||||
|
||||
private final Locale locale;
|
||||
private String title;
|
||||
private String description;
|
||||
|
||||
public CategoryLocalizationTableRow(final Locale locale) {
|
||||
this.locale = locale;
|
||||
}
|
||||
|
||||
public Locale getLocale() {
|
||||
return locale;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(final String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(final String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(final CategoryLocalizationTableRow other) {
|
||||
return locale.toString().compareTo(other.getLocale().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
hash = 53 * hash + Objects.hashCode(locale);
|
||||
hash = 53 * hash + Objects.hashCode(title);
|
||||
hash = 53 * hash + Objects.hashCode(description);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (!(obj instanceof CategoryLocalizationTableRow)) {
|
||||
return false;
|
||||
}
|
||||
final CategoryLocalizationTableRow other
|
||||
= (CategoryLocalizationTableRow) obj;
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(title, other.getTitle())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(description, other.getDescription())) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(locale, other.getLocale());
|
||||
}
|
||||
|
||||
public boolean canEqual(final Object obj) {
|
||||
return obj instanceof CategoryLocalizationTableRow;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return toString("");
|
||||
}
|
||||
|
||||
public String toString(final String data) {
|
||||
return String.format("%s{ "
|
||||
+ "locale = \"%s\", "
|
||||
+ "title = \"%s\", "
|
||||
+ "description = \"%s\"%s"
|
||||
+ " }",
|
||||
super.toString(),
|
||||
Objects.toString(locale),
|
||||
title,
|
||||
description,
|
||||
data);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -26,11 +26,13 @@ import com.arsdigita.bebop.event.ActionEvent;
|
|||
import com.arsdigita.bebop.list.ListModel;
|
||||
import com.arsdigita.bebop.list.ListModelBuilder;
|
||||
import com.arsdigita.bebop.util.GlobalizationUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.libreccm.categorization.Category;
|
||||
import org.libreccm.categorization.CategoryManager;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
/**
|
||||
* A List of all subcategories of the current category.
|
||||
|
|
@ -63,8 +65,9 @@ public class SubcategoryList extends SortableCategoryList {
|
|||
// user selects it here
|
||||
super.addActionListener(this::actionPerformed);
|
||||
|
||||
Label label = new Label(GlobalizationUtil.globalize(
|
||||
"cms.ui.category.subcategory.none"));
|
||||
Label label = new Label(new GlobalizedMessage(
|
||||
"cms.ui.category.subcategory.none",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
label.setFontWeight(Label.ITALIC);
|
||||
setEmptyView(label);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -506,3 +506,7 @@ cms.ui.pages.pagemodels.cancel=Cancel
|
|||
cms.ui.cateogry.is_visible=Is visible?
|
||||
cms.ui.category.cantmoved=This category can't be moved.
|
||||
cms.ui.contentcenter.pagestable.columns.pages_instance.header=Pages Instance
|
||||
cms.ui.category.is_visible=Visible?
|
||||
cms.ui.category.move=Move category
|
||||
cms.ui.title=Title
|
||||
cms.ui.select_one=Choose one
|
||||
|
|
|
|||
|
|
@ -503,3 +503,7 @@ cms.ui.pages.pagemodels.cancel=Abbrechen
|
|||
cms.ui.cateogry.is_visible=Sichtbar?
|
||||
cms.ui.category.cantmoved=Diese Kategorie kann nicht verschoben werden.
|
||||
cms.ui.contentcenter.pagestable.columns.pages_instance.header=Pages Instanz
|
||||
cms.ui.category.is_visible=Sichtbar?
|
||||
cms.ui.category.move=Kategorie verschieben
|
||||
cms.ui.title=Titel
|
||||
cms.ui.select_one=Bitte ausw\u00e4hlen
|
||||
|
|
|
|||
|
|
@ -463,3 +463,9 @@ cms.ui.cateogry.is_visible=Is visible?
|
|||
cms.ui.category.cantmoved=This category can't be moved.
|
||||
cms.ui.category.localization_none=No localization available
|
||||
cms.ui.contentcenter.pagestable.columns.pages_instance.header=Pages Instance
|
||||
cms.ui.category.is_visible=Visible?
|
||||
cms.ui.category.subcategory.none=
|
||||
cms.ui.category.linked_none=No linked categories
|
||||
cms.ui.category.move=Move category
|
||||
cms.ui.title=Title
|
||||
cms.ui.select_one=Choose one
|
||||
|
|
|
|||
Loading…
Reference in New Issue