CCM NG/ccm-cms: Content Types Tab

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4635 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2017-03-21 10:49:32 +00:00
parent 30d36d4bff
commit 1225c001d2
12 changed files with 408 additions and 127 deletions

View File

@ -20,12 +20,14 @@ package com.arsdigita.cms.ui.type;
import com.arsdigita.bebop.ActionLink; import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.GridPanel;
import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Page; import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.ActionEvent; import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener; import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSubmissionListener; import com.arsdigita.bebop.event.FormSubmissionListener;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
@ -41,6 +43,7 @@ import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.ui.ACSObjectSelectionModel; import com.arsdigita.kernel.ui.ACSObjectSelectionModel;
import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.toolbox.ui.ActionGroup;
import com.arsdigita.toolbox.ui.Cancellable; import com.arsdigita.toolbox.ui.Cancellable;
import com.arsdigita.toolbox.ui.Section;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -48,6 +51,9 @@ import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentSectionManager; import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.ContentTypeManager; import org.librecms.contentsection.ContentTypeManager;
import org.librecms.contenttypes.ContentTypeInfo;
import java.util.List;
/** /**
* This class contains the split pane for the ContentType administration * This class contains the split pane for the ContentType administration
@ -59,7 +65,7 @@ import org.librecms.contentsection.ContentTypeManager;
* @author Justin Ross <jross@redhat.com> * @author Justin Ross <jross@redhat.com>
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
public final class ContentTypeAdminPane extends BaseAdminPane { public final class ContentTypeAdminPane extends BaseAdminPane<String> {
private static final Logger LOGGER = LogManager.getLogger( private static final Logger LOGGER = LogManager.getLogger(
ContentTypeAdminPane.class); ContentTypeAdminPane.class);
@ -85,10 +91,11 @@ public final class ContentTypeAdminPane extends BaseAdminPane {
ActionLink addTypeLink ActionLink addTypeLink
= new ActionLink(new Label(gz("cms.ui.type.add"))); = new ActionLink(new Label(gz("cms.ui.type.add")));
// AddTypeContainer addTypeContainer = new AddTypeContainer(); AddTypeContainer addTypeContainer = new AddTypeContainer();
// getBody().add(addTypeContainer); getBody().add(addTypeContainer);
// getBody().connect(addTypeLink, addTypeContainer); getBody().connect(addTypeLink, addTypeContainer);
// addTypeLink.addActionListener(addTypeContainer); addTypeLink.addActionListener(addTypeContainer);
setEdit(new ActionLink(new Label(gz("cms.ui.type.edit"))), setEdit(new ActionLink(new Label(gz("cms.ui.type.edit"))),
new EditType(m_model)); new EditType(m_model));
@ -303,4 +310,53 @@ public final class ContentTypeAdminPane extends BaseAdminPane {
} }
private class AddTypeContainer
extends GridPanel
implements ActionListener, FormProcessListener {
private final Label noTypesAvailableLabel
= new Label(gz("cms.ui.type.select.none"));
private final SelectType selectType;
public AddTypeContainer() {
super(1);
final Section selectSection = new Section();
selectSection.setHeading(new Label(gz("cms.ui.type.select")));
add(selectSection);
final GridPanel container = new GridPanel(1);
container.add(noTypesAvailableLabel);
selectType = new SelectType();
selectType.addSubmissionListener(new CancelListener(selectType));
selectType.addProcessListener(this);
container.add(selectType);
selectSection.setBody(container);
}
@Override
public void actionPerformed(final ActionEvent event) {
final PageState state = event.getPageState();
final ContentSection section = CMS.getContext().getContentSection();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentTypeAdminPaneController controller = cdiUtil
.findBean(ContentTypeAdminPaneController.class);
final List<ContentTypeInfo> contentTypes = controller
.getNotAssociatedContentTypes(section);
final boolean hasAvailableTypes = !contentTypes.isEmpty();
selectType.setVisible(state, hasAvailableTypes);
noTypesAvailableLabel.setVisible(state, !hasAvailableTypes);
}
@Override
public void process(final FormSectionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
resetPane(state);
}
}
} }

View File

@ -18,15 +18,21 @@
*/ */
package com.arsdigita.cms.ui.type; package com.arsdigita.cms.ui.type;
import com.arsdigita.kernel.KernelConfig; import org.libreccm.workflow.WorkflowTemplate;
import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.l10n.GlobalizationHelper;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionRepository;
import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentType;
import org.librecms.contentsection.ContentTypeRepository; import org.librecms.contentsection.ContentTypeRepository;
import org.librecms.contenttypes.ContentTypeInfo;
import org.librecms.contenttypes.ContentTypesManager;
import org.librecms.lifecycle.LifecycleDefinition;
import java.nio.charset.IllegalCharsetNameException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.ResourceBundle;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
@ -42,16 +48,16 @@ import javax.transaction.Transactional;
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
public class ContentTypeAdminPaneController { class ContentTypeAdminPaneController {
@Inject @Inject
private ContentTypeRepository typeRepo; private ContentTypeRepository typeRepo;
@Inject @Inject
private GlobalizationHelper globalizationHelper; private ContentTypesManager typesManager;
@Inject @Inject
private ConfigurationManager confManager; private ContentSectionRepository sectionRepo;
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public List<String[]> getTypeList(final ContentSection section) { public List<String[]> getTypeList(final ContentSection section) {
@ -65,19 +71,116 @@ public class ContentTypeAdminPaneController {
private String[] generateListEntry(final ContentType type) { private String[] generateListEntry(final ContentType type) {
final String[] entry = new String[2]; final String[] entry = new String[2];
final KernelConfig kernelConfig = confManager.findConfiguration( entry[0] = Long.toString(type.getObjectId());
KernelConfig.class);
entry[0] = type.getUuid(); final ContentTypeInfo typeInfo = typesManager
// Enable if admin UI has fields for editing localised labels... .getContentTypeInfo(type.getContentItemClass());
// if (type.getLabel().hasValue(globalizationHelper.getNegotiatedLocale())) { final ResourceBundle labelBundle = ResourceBundle
// entry[1] = type.getLabel().getValue(globalizationHelper .getBundle(typeInfo.getLabelBundle());
// .getNegotiatedLocale()); final String labelKey = typeInfo.getLabelKey();
// } else {
entry[1] = type.getLabel().getValue(kernelConfig.getDefaultLocale()); entry[1] = labelBundle.getString(labelKey);
// }
return entry; return entry;
} }
@Transactional(Transactional.TxType.REQUIRED)
public List<ContentTypeInfo> getNotAssociatedContentTypes(
final ContentSection section) {
final List<ContentTypeInfo> availableTypes = typesManager
.getAvailableContentTypes();
final List<ContentTypeInfo> associatedTypes = typeRepo
.findByContentSection(section)
.stream()
.map(type -> typesManager.getContentTypeInfo(type))
.collect(Collectors.toList());
return availableTypes
.stream()
.filter(typeInfo -> !associatedTypes.contains(typeInfo))
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
public LifecycleDefinition getLifecycleDefinition(final ContentType type) {
final ContentType contentType = typeRepo
.findById(type.getObjectId())
.orElseThrow(() -> new IllegalCharsetNameException(String.format(
"No ContentType with Id %d in the database. "
+ "Where did that ID come from?",
type.getObjectId())));
return contentType.getDefaultLifecycle();
}
@Transactional(Transactional.TxType.REQUIRED)
public Optional<String> getLifecycleDefinitionLabel(final ContentType type,
final Locale locale) {
final LifecycleDefinition lifecycleDefinition = getLifecycleDefinition(
type);
if (lifecycleDefinition == null) {
return Optional.empty();
} else {
return Optional.of(lifecycleDefinition.getLabel().getValue(locale));
}
}
@Transactional(Transactional.TxType.REQUIRED)
public WorkflowTemplate getWorkflowTemplate(final ContentType type) {
final ContentType contentType = typeRepo
.findById(type.getObjectId())
.orElseThrow(() -> new IllegalCharsetNameException(String.format(
"No ContentType with Id %d in the database. "
+ "Where did that ID come from?",
type.getObjectId())));
return contentType.getDefaultWorkflow();
}
@Transactional(Transactional.TxType.REQUIRED)
public Optional<String> getWorkflowTemplateName(final ContentType type,
final Locale locale) {
final WorkflowTemplate workflowTemplate = getWorkflowTemplate(type);
if (workflowTemplate == null) {
return Optional.empty();
} else {
return Optional.of(workflowTemplate.getName().getValue(locale));
}
}
@Transactional(Transactional.TxType.REQUIRED)
public List<LifecycleDefinition> getLifecycleDefinitions(
final ContentSection section) {
final ContentSection contentSection = sectionRepo
.findById(section.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentSection with ID %d in the database. "
+ "Where did that ID come from?",
section.getObjectId())));
return new ArrayList<>(contentSection.getLifecycleDefinitions());
}
@Transactional(Transactional.TxType.REQUIRED)
public List<WorkflowTemplate> getWorkflowTemplates(
final ContentSection section) {
final ContentSection contentSection = sectionRepo
.findById(section.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentSection with ID %d in the database. "
+ "Where did that ID come from?",
section.getObjectId())));
return new ArrayList<>(contentSection.getWorkflowTemplates());
}
} }

View File

@ -30,19 +30,23 @@ import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.toolbox.ui.Property; import com.arsdigita.toolbox.ui.Property;
import com.arsdigita.toolbox.ui.PropertyList; import com.arsdigita.toolbox.ui.PropertyList;
import org.libreccm.cdi.utils.CdiUtil;
import java.util.Locale; import java.util.Locale;
import org.libreccm.workflow.WorkflowTemplate; import org.libreccm.workflow.WorkflowTemplate;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contenttypes.ContentTypeInfo;
import org.librecms.contenttypes.ContentTypesManager;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.ResourceBundle;
/** /**
* This component displays basic attributes of a content type * This component displays basic attributes of a content type including:
* including:
* *
* label, description, default lifecycle definition, default workflow * label, description, default lifecycle definition, default workflow template
* template
* *
* @author Michael Pih * @author Michael Pih
* @author <a href="mailto:jross@redhat.com">Justin Ross</a> * @author <a href="mailto:jross@redhat.com">Justin Ross</a>
@ -60,16 +64,26 @@ class ContentTypePropertyList extends PropertyList {
protected final List<Property> properties(final PageState state) { protected final List<Property> properties(final PageState state) {
final List<Property> props = super.properties(state); final List<Property> props = super.properties(state);
final ContentType type = m_type.getContentType(state); final ContentType type = m_type.getContentType(state);
final ContentSection section = final ContentSection section = CMS.getContext().getContentSection();
CMS.getContext().getContentSection();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentTypesManager typesManager = cdiUtil
.findBean(ContentTypesManager.class);
final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo(type);
final KernelConfig kernelConfig = KernelConfig.getConfig(); final KernelConfig kernelConfig = KernelConfig.getConfig();
final Locale defaultLocale = kernelConfig.getDefaultLocale(); final Locale defaultLocale = kernelConfig.getDefaultLocale();
final ResourceBundle labelBundle = ResourceBundle
.getBundle(typeInfo.getLabelBundle());
final ResourceBundle descBundle = ResourceBundle
.getBundle(typeInfo.getDescriptionBundle());
props.add(new Property(gz("cms.ui.name"), props.add(new Property(gz("cms.ui.name"),
type.getLabel().getValue(defaultLocale))); labelBundle.getString(typeInfo.getLabelKey())));
props.add(new Property(gz("cms.ui.description"), props.add(new Property(gz("cms.ui.description"),
type.getDescription().getValue(defaultLocale))); descBundle
.getString(typeInfo.getDescriptionKey())));
// props.add(new Property(gz("cms.ui.type.parent"), // props.add(new Property(gz("cms.ui.type.parent"),
// type.getParent().orElse(null))); // type.getParent().orElse(null)));
props.add(new Property(gz("cms.ui.type.lifecycle"), props.add(new Property(gz("cms.ui.type.lifecycle"),
@ -85,26 +99,36 @@ class ContentTypePropertyList extends PropertyList {
final KernelConfig kernelConfig = KernelConfig.getConfig(); final KernelConfig kernelConfig = KernelConfig.getConfig();
final Locale defaultLocale = kernelConfig.getDefaultLocale(); final Locale defaultLocale = kernelConfig.getDefaultLocale();
final LifecycleDefinition cycle = type.getDefaultLifecycle(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentTypeAdminPaneController controller = cdiUtil
.findBean(ContentTypeAdminPaneController.class);
if (cycle == null) { final Optional<String> label = controller
return lz("cms.ui.type.lifecycle.none"); .getLifecycleDefinitionLabel(type, defaultLocale);
if (label.isPresent()) {
return label.get();
} else { } else {
return cycle.getLabel().getValue(defaultLocale); return lz("cms.ui.type.lifecycle.none");
} }
} }
private String getWorkflow(final ContentSection section, private String getWorkflow(final ContentSection section,
final ContentType type) { final ContentType type) {
final KernelConfig kernelConfig = KernelConfig.getConfig(); final KernelConfig kernelConfig = KernelConfig.getConfig();
final Locale defaultLocale = kernelConfig.getDefaultLocale(); final Locale defaultLocale = kernelConfig.getDefaultLocale();
final WorkflowTemplate template = type.getDefaultWorkflow(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentTypeAdminPaneController controller = cdiUtil
.findBean(ContentTypeAdminPaneController.class);
if (template == null) { final Optional<String> name = controller
return lz("cms.ui.type.workflow.none"); .getWorkflowTemplateName(type, defaultLocale);
if (name.isPresent()) {
return name.get();
} else { } else {
return template.getName().getValue(defaultLocale); return lz("cms.ui.type.workflow.none");
} }
} }
@ -115,4 +139,5 @@ class ContentTypePropertyList extends PropertyList {
private static String lz(final String key) { private static String lz(final String key) {
return (String) gz(key).localize(); return (String) gz(key).localize();
} }
} }

View File

@ -25,6 +25,7 @@ import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.SingleSelectionModel; import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.FormInitListener; import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormProcessListener; import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
@ -34,12 +35,8 @@ import com.arsdigita.bebop.form.Hidden;
import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.SingleSelect; import com.arsdigita.bebop.form.SingleSelect;
import com.arsdigita.bebop.form.Submit; import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.TextArea; import com.arsdigita.bebop.parameters.LongParameter;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.NotNullValidationListener; import com.arsdigita.bebop.parameters.NotNullValidationListener;
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
@ -48,6 +45,7 @@ import org.librecms.lifecycle.LifecycleDefinition;
import org.libreccm.workflow.WorkflowTemplate; import org.libreccm.workflow.WorkflowTemplate;
import com.arsdigita.cms.ui.CMSForm; import com.arsdigita.cms.ui.CMSForm;
import com.arsdigita.cms.ui.GlobalNavigation;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig; import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.util.UncheckedWrapperException;
@ -66,8 +64,6 @@ import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import java.util.TooManyListenersException; import java.util.TooManyListenersException;
import javax.persistence.NoResultException;
/** /**
* This class contains a form component to edit a content type * This class contains a form component to edit a content type
* *
@ -80,12 +76,12 @@ public class EditType extends CMSForm
private static final Logger LOGGER = LogManager.getLogger(EditType.class); private static final Logger LOGGER = LogManager.getLogger(EditType.class);
private final SingleSelectionModel<ContentType> m_types; private final SingleSelectionModel<String> m_types;
// Form widgets // Form widgets
private Hidden m_id; private Hidden m_id;
private TextField m_label; // private TextField m_label;
private TextArea m_description; // private TextArea m_description;
private SingleSelect m_lcSelect; private SingleSelect m_lcSelect;
private SingleSelect m_wfSelect; private SingleSelect m_wfSelect;
private Submit m_submit; private Submit m_submit;
@ -95,36 +91,35 @@ public class EditType extends CMSForm
* @param model The content type selection model. This tells the form which * @param model The content type selection model. This tells the form which
* content type is selected. * content type is selected.
*/ */
public EditType(final SingleSelectionModel<ContentType> model) { public EditType(final SingleSelectionModel<String> model) {
super("EditContentType"); super("EditContentType");
m_types = model; m_types = model;
m_id = new Hidden(new BigDecimalParameter("id")); m_id = new Hidden(new LongParameter("id"));
m_id.addValidationListener(new NotNullValidationListener()); m_id.addValidationListener(new NotNullValidationListener());
add(m_id); add(m_id);
add(new Label(new GlobalizedMessage("cms.ui.type.label", // add(new Label(new GlobalizedMessage("cms.ui.type.label",
CmsConstants.CMS_BUNDLE))); // CmsConstants.CMS_BUNDLE)));
m_label = new TextField(new StringParameter("label")); // m_label = new TextField(new StringParameter("label"));
m_label.addValidationListener(new NotNullValidationListener()); // m_label.addValidationListener(new NotNullValidationListener());
m_label.setSize(40); // m_label.setSize(40);
m_label.setMaxLength(1000); // m_label.setMaxLength(1000);
add(m_label); // add(m_label);
//
add(new Label(new GlobalizedMessage("cms.ui.description", // add(new Label(new GlobalizedMessage("cms.ui.description",
CmsConstants.CMS_BUNDLE))); // CmsConstants.CMS_BUNDLE)));
m_description = new TextArea(new StringParameter("description")); // m_description = new TextArea(new StringParameter("description"));
m_description.addValidationListener( // m_description.addValidationListener(
new StringLengthValidationListener(4000)); // new StringLengthValidationListener(4000));
m_description.setCols(40); // m_description.setCols(40);
m_description.setRows(5); // m_description.setRows(5);
m_description.setWrap(TextArea.SOFT); // m_description.setWrap(TextArea.SOFT);
add(m_description); // add(m_description);
add(new Label(new GlobalizedMessage("cms.ui.type.lifecycle", add(new Label(new GlobalizedMessage("cms.ui.type.lifecycle",
CmsConstants.CMS_BUNDLE))); CmsConstants.CMS_BUNDLE)));
m_lcSelect = new SingleSelect(new BigDecimalParameter("lifecycle")); m_lcSelect = new SingleSelect(new LongParameter("lifecycle"));
try { try {
m_lcSelect.addPrintListener(new SelectLifecyclePrintListener()); m_lcSelect.addPrintListener(new SelectLifecyclePrintListener());
} catch (TooManyListenersException e) { } catch (TooManyListenersException e) {
@ -135,7 +130,7 @@ public class EditType extends CMSForm
add(new Label(new GlobalizedMessage("cms.ui.type.workflow", add(new Label(new GlobalizedMessage("cms.ui.type.workflow",
CmsConstants.CMS_BUNDLE))); CmsConstants.CMS_BUNDLE)));
m_wfSelect = new SingleSelect(new BigDecimalParameter("workflow")); m_wfSelect = new SingleSelect(new LongParameter("workflow"));
try { try {
m_wfSelect.addPrintListener(new SelectWorkflowPrintListener()); m_wfSelect.addPrintListener(new SelectWorkflowPrintListener());
} catch (TooManyListenersException e) { } catch (TooManyListenersException e) {
@ -195,14 +190,14 @@ public class EditType extends CMSForm
final ContentType type = getContentType(state); final ContentType type = getContentType(state);
final long typeId = type.getObjectId(); final long typeId = type.getObjectId();
final String label = type.getLabel().getValue(kernelConfig // final String label = type.getLabel().getValue(kernelConfig
.getDefaultLocale()); // .getDefaultLocale());
final String description = type.getDescription().getValue(kernelConfig // final String description = type.getDescription().getValue(kernelConfig
.getDefaultLocale()); // .getDefaultLocale());
data.put(m_id.getName(), typeId); data.put(m_id.getName(), typeId);
data.put(m_label.getName(), label); // data.put(m_label.getName(), label);
data.put(m_description.getName(), description); // data.put(m_description.getName(), description);
final LifecycleDefinition cycle = type.getDefaultLifecycle(); final LifecycleDefinition cycle = type.getDefaultLifecycle();
if (cycle != null) { if (cycle != null) {
@ -220,7 +215,7 @@ public class EditType extends CMSForm
* model. * model.
*/ */
private ContentType getContentType(final PageState state) { private ContentType getContentType(final PageState state) {
final String key = m_types.getSelectedKey(state).toString(); final String key = (String) m_types.getSelectedKey(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentTypeRepository typeRepo = cdiUtil.findBean( final ContentTypeRepository typeRepo = cdiUtil.findBean(
@ -231,8 +226,8 @@ public class EditType extends CMSForm
result = typeRepo.findById(Long.parseLong(key)); result = typeRepo.findById(Long.parseLong(key));
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
throw new UncheckedWrapperException(String.format( throw new UncheckedWrapperException(String.format(
"The provided key \"%s\" is not a long.", key), "The provided key \"%d\" is not a long.", key),
ex); ex);
} }
if (result.isPresent()) { if (result.isPresent()) {
@ -260,8 +255,8 @@ public class EditType extends CMSForm
// Read form variables. // Read form variables.
final Long key = (Long) data.get(m_id.getName()); final Long key = (Long) data.get(m_id.getName());
final String label = (String) data.get(m_label.getName()); // final String label = (String) data.get(m_label.getName());
final String description = (String) data.get(m_description.getName()); // final String description = (String) data.get(m_description.getName());
final Long lifecycleId = (Long) data.get(m_lcSelect.getName()); final Long lifecycleId = (Long) data.get(m_lcSelect.getName());
final Long workflowId = (Long) data.get(m_wfSelect.getName()); final Long workflowId = (Long) data.get(m_wfSelect.getName());
@ -284,19 +279,26 @@ public class EditType extends CMSForm
new Object[]{key})); new Object[]{key}));
} }
final KernelConfig kernelConfig = KernelConfig.getConfig(); // final KernelConfig kernelConfig = KernelConfig.getConfig();
// type.get().getLabel().addValue(kernelConfig.getDefaultLocale(), label);
type.get().getLabel().addValue(kernelConfig.getDefaultLocale(), label); // type.get().getDescription().addValue(kernelConfig.getDefaultLocale(),
type.get().getDescription().addValue(kernelConfig.getDefaultLocale(), // description);
description);
typeRepo.save(type.get()); typeRepo.save(type.get());
// Handle default lifecycle and workflow. // Handle default lifecycle and workflow.
final LifecycleDefinition defaultLifecycle = lifecycleDefRepo.findById( final LifecycleDefinition defaultLifecycle;
lifecycleId).get(); if (lifecycleId == 0) {
final WorkflowTemplate defaultWorkflow = workflowTemplateRepo.findById( defaultLifecycle = null;
workflowId).get(); } else {
defaultLifecycle = lifecycleDefRepo.findById(lifecycleId).get();
}
final WorkflowTemplate defaultWorkflow;
if (workflowId == 0) {
defaultWorkflow = null;
} else {
defaultWorkflow = workflowTemplateRepo.findById(workflowId).get();
}
typeManager.setDefaultLifecycle(type.get(), defaultLifecycle); typeManager.setDefaultLifecycle(type.get(), defaultLifecycle);
typeManager.setDefaultWorkflow(type.get(), defaultWorkflow); typeManager.setDefaultWorkflow(type.get(), defaultWorkflow);
@ -316,19 +318,26 @@ public class EditType extends CMSForm
.getTarget(); .getTarget();
lifecycleSelect.clearOptions(); lifecycleSelect.clearOptions();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentTypeAdminPaneController controller = cdiUtil
.findBean(ContentTypeAdminPaneController.class);
// Get the current content section // Get the current content section
ContentSection section = CMS.getContext().getContentSection(); ContentSection section = CMS.getContext().getContentSection();
lifecycleSelect.addOption(new Option("", "-- select --")); lifecycleSelect.addOption(new Option(
"0",
new Label(new GlobalizedMessage("cms.ui.type.lifecycle.select",
CmsConstants.CMS_BUNDLE))));
final List<LifecycleDefinition> cycles = section final List<LifecycleDefinition> cycles = controller
.getLifecycleDefinitions(); .getLifecycleDefinitions(section);
final Locale defaultLocale = KernelConfig.getConfig() final Locale defaultLocale = KernelConfig.getConfig()
.getDefaultLocale(); .getDefaultLocale();
cycles.forEach(cycle -> { cycles.forEach(cycle -> {
lifecycleSelect.addOption( lifecycleSelect.addOption(
new Option(Long.toString(cycle.getDefinitionId()), new Option(Long.toString(cycle.getDefinitionId()),
cycle.getLabel().getValue(defaultLocale))); new Text(cycle.getLabel().getValue(defaultLocale))));
}); });
} }
@ -349,10 +358,17 @@ public class EditType extends CMSForm
// Get the current content section // Get the current content section
ContentSection section = CMS.getContext().getContentSection(); ContentSection section = CMS.getContext().getContentSection();
workflowSelect.addOption(new Option("", "-- select --")); workflowSelect.addOption(new Option(
"0",
new Label(new GlobalizedMessage("cms.ui.type.workflow.select",
CmsConstants.CMS_BUNDLE))));
final List<WorkflowTemplate> templates = section final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
.getWorkflowTemplates(); final ContentTypeAdminPaneController controller = cdiUtil
.findBean(ContentTypeAdminPaneController.class);
final List<WorkflowTemplate> templates = controller
.getWorkflowTemplates(section);
final Locale defaultLocale = KernelConfig.getConfig() final Locale defaultLocale = KernelConfig.getConfig()
.getDefaultLocale(); .getDefaultLocale();
templates.forEach(template -> { templates.forEach(template -> {

View File

@ -26,6 +26,7 @@ import org.libreccm.security.PermissionChecker;
import org.libreccm.security.PermissionManager; import org.libreccm.security.PermissionManager;
import org.libreccm.security.Role; import org.libreccm.security.Role;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionRepository;
import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentType;
import org.librecms.contentsection.ContentTypeRepository; import org.librecms.contentsection.ContentTypeRepository;
@ -49,6 +50,9 @@ public class TypePermissionsTableController {
@Inject @Inject
private PermissionManager permissionManager; private PermissionManager permissionManager;
@Inject
private ContentSectionRepository sectionRepo;
@Inject @Inject
private ContentTypeRepository typeRepo; private ContentTypeRepository typeRepo;
@ -63,9 +67,16 @@ public class TypePermissionsTableController {
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public List<RowData<Long>> retrieveTypePermissions( public List<RowData<Long>> retrieveTypePermissions(
final long typeId, final ContentSection section) { final long typeId, final ContentSection section) {
final ContentType type = typeRepo.findById(typeId).get();
final List<Role> roles = section.getRoles(); final ContentType type = typeRepo.findById(typeId).get();
final ContentSection contentSection = sectionRepo
.findById(section.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentSection with ID %d in the database. "
+ "Where did that Id come from?",
section.getObjectId())));
final List<Role> roles = contentSection.getRoles();
return roles.stream() return roles.stream()
.map(role -> retrievePermissionsForRole(type, role)) .map(role -> retrievePermissionsForRole(type, role))
@ -88,7 +99,7 @@ public class TypePermissionsTableController {
} }
public void toggleTypeUsePermission(final ContentType type, public void toggleTypeUsePermission(final ContentType type,
final Role role) { final Role role) {
if (permissionChecker.isPermitted(TypePrivileges.USE_TYPE, type, role)) { if (permissionChecker.isPermitted(TypePrivileges.USE_TYPE, type, role)) {
permissionManager.revokePrivilege(TypePrivileges.USE_TYPE, permissionManager.revokePrivilege(TypePrivileges.USE_TYPE,
role, role,

View File

@ -42,6 +42,7 @@ import org.librecms.dispatcher.MultilingualItemResolver;
import java.util.Arrays; import java.util.Arrays;
import org.librecms.contentsection.privileges.TypePrivileges; import org.librecms.contentsection.privileges.TypePrivileges;
import org.librecms.contenttypes.ContentTypeDescription;
import java.util.Locale; import java.util.Locale;
@ -348,6 +349,7 @@ public class ContentSectionSetup extends AbstractCcmApplicationSetup {
final ContentType type = new ContentType(); final ContentType type = new ContentType();
type.setContentSection(section); type.setContentSection(section);
type.setUuid(UUID.randomUUID().toString()); type.setUuid(UUID.randomUUID().toString());
type.setDisplayName(clazz.getSimpleName());
type.setContentItemClass(clazz.getName()); type.setContentItemClass(clazz.getName());
getEntityManager().persist(type); getEntityManager().persist(type);
section.addContentType(type); section.addContentType(type);

View File

@ -18,9 +18,6 @@
*/ */
package org.librecms.contentsection; package org.librecms.contentsection;
import com.arsdigita.globalization.GlobalizedMessage;
import org.libreccm.l10n.GlobalizationHelper;
import org.librecms.contentsection.privileges.TypePrivileges; import org.librecms.contentsection.privileges.TypePrivileges;
import org.libreccm.security.AuthorizationRequired; import org.libreccm.security.AuthorizationRequired;
@ -29,12 +26,8 @@ import org.libreccm.security.RequiresPrivilege;
import org.libreccm.security.Role; import org.libreccm.security.Role;
import org.libreccm.workflow.WorkflowTemplate; import org.libreccm.workflow.WorkflowTemplate;
import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.contenttypes.Article;
import org.librecms.lifecycle.LifecycleDefinition; import org.librecms.lifecycle.LifecycleDefinition;
import java.util.Objects;
import java.util.ResourceBundle;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.transaction.Transactional; import javax.transaction.Transactional;

View File

@ -221,3 +221,26 @@ cms.ui.lifecycle.phase.edit_submit=Save
cms.ui.lifecycle.phase.edit_cancel=Cancel cms.ui.lifecycle.phase.edit_cancel=Cancel
cms.ui.lifecycle.phase.delete_submit=Delete cms.ui.lifecycle.phase.delete_submit=Delete
cms.ui.lifecycle.phase.delete_cancel=Cancel cms.ui.lifecycle.phase.delete_cancel=Cancel
cms.ui.type.intro=Select a content type or create a new one
cms.ui.type.add=Add content type
cms.ui.types=Content types
cms.ui.type.details=Content Type Details
cms.ui.name=Name
cms.ui.description=Description
cms.ui.type.lifecycle=Default lifecycle
cms.ui.type.workflow=Standard workflow
cms.ui.type.lifecycle.none=No default lifecycle
cms.ui.type.workflow.none=No default workflow
cms.ui.type.templates=Templates
cms.ui.type.template.add=Add template
cms.ui.type.edit=Edit
cms.ui.type.delete=Delete
cms.ui.type.permissions=Permissions
cms.ui.type.permissions.role=Role
cms.ui.type.permissions_can_use=Can use
cms.ui.type.permission.action=Revoke permission
cms.ui.type.permissions.actions.revoke=Revoke permission
cms.ui.type.lifecycle.select=Select the default lifecycle
cms.ui.type.workflow.select=Select default workflow
cms.ui.type.select=Select Content Type
cms.ui.type.select.none=There are no available content types to select

View File

@ -220,3 +220,26 @@ cms.ui.lifecycle.phase.edit_submit=Speichern
cms.ui.lifecycle.phase.edit_cancel=Abbrechen cms.ui.lifecycle.phase.edit_cancel=Abbrechen
cms.ui.lifecycle.phase.delete_submit=L\u00f6schen cms.ui.lifecycle.phase.delete_submit=L\u00f6schen
cms.ui.lifecycle.phase.delete_cancel=Abbrechen cms.ui.lifecycle.phase.delete_cancel=Abbrechen
cms.ui.type.intro=W\u00e4hlen Sie einen Dokumenttyp oder erstellen Sie einen neuen
cms.ui.type.add=Dokumenttyp hinzuf\u00fcgen
cms.ui.types=Dokumenttypen
cms.ui.type.details=Dokumententyp Details
cms.ui.name=Name
cms.ui.description=Beschreibung
cms.ui.type.lifecycle=Voreingestellter Ver\u00f6ffentlichungszyklus
cms.ui.type.workflow=Voreingestellter Arbeitsablauf
cms.ui.type.lifecycle.none=Kein voreingestellter Ver\u00f6ffentlichungszyklus
cms.ui.type.workflow.none=Kein voreingestellter Arbeitsablauf
cms.ui.type.templates=Vorlagen
cms.ui.type.template.add=Vorlage hinzuf\u00fcgen
cms.ui.type.edit=Bearbeiten
cms.ui.type.delete=L\u00f6schen
cms.ui.type.permissions=Berechtigungen
cms.ui.type.permissions.role=Rolle
cms.ui.type.permissions_can_use=Darf Dokumenttype verwenden?
cms.ui.type.permission.action=Berechtigung entziehen
cms.ui.type.permissions.actions.revoke=Berechtigung entziehen
cms.ui.type.lifecycle.select=Voreingestellten Ver\u00f6ffentlichungszyklus ausw\u00e4hlen
cms.ui.type.workflow.select=Voreingestellten Arbeitsablauf ausw\u00e4hlen
cms.ui.type.select=Dolkumententype ausw\u00e4hlen
cms.ui.type.select.none=Keine verf\u00fcgbaren Dokumententypen

View File

@ -179,3 +179,26 @@ cms.ui.lifecycle.phase.edit_submit=Save
cms.ui.lifecycle.phase.edit_cancel=Cancel cms.ui.lifecycle.phase.edit_cancel=Cancel
cms.ui.lifecycle.phase.delete_submit=Delete cms.ui.lifecycle.phase.delete_submit=Delete
cms.ui.lifecycle.phase.delete_cancel=Cancel cms.ui.lifecycle.phase.delete_cancel=Cancel
cms.ui.type.intro=Select a content type or create a new one
cms.ui.type.add=Add content type
cms.ui.types=Content types
cms.ui.type.details=Content Type Details
cms.ui.name=Name
cms.ui.description=Description
cms.ui.type.lifecycle=Default lifecycle
cms.ui.type.workflow=Standard workflow
cms.ui.type.lifecycle.none=No default lifecycle
cms.ui.type.workflow.none=No default workflow
cms.ui.type.templates=Templates
cms.ui.type.template.add=Add template
cms.ui.type.edit=Edit
cms.ui.type.delete=Delete
cms.ui.type.permissions=Permissions
cms.ui.type.permissions.role=Role
cms.ui.type.permissions_can_use=Can use content type?
cms.ui.type.permission.action=Revoke permission
cms.ui.type.permissions.actions.revoke=Revoke permission
cms.ui.type.lifecycle.select=Select the default lifecycle
cms.ui.type.workflow.select=Select default workflow
cms.ui.type.select=Select Content Type
cms.ui.type.select.none=There are no available content types to select

View File

@ -30,7 +30,7 @@ import com.arsdigita.bebop.PageState;
* explicitly. * explicitly.
* *
* @author David Lutterkort * @author David Lutterkort
* @version $Id$ */ */
public class DefaultListCellRenderer implements ListCellRenderer { public class DefaultListCellRenderer implements ListCellRenderer {
/** /**
@ -40,15 +40,21 @@ public class DefaultListCellRenderer implements ListCellRenderer {
* <code>isSelected</code> is not true, returns a * <code>isSelected</code> is not true, returns a
* <code>ControlLink</code> labelled with * <code>ControlLink</code> labelled with
* <code>value.toString()</code>. When the user clicks on the link, that * <code>value.toString()</code>. When the user clicks on the link, that
* item becomes selected. */ * item becomes selected.
public Component getComponent(List list, PageState state, Object value, */
String key, int index, boolean isSelected) @Override
public Component getComponent(final List list,
final PageState state,
final Object value,
final String key,
final int index,
final boolean isSelected)
{ {
Label l = new Label(value.toString()); final Label label = new Label(value.toString());
if (isSelected) { if (isSelected) {
l.setFontWeight(Label.BOLD); label.setFontWeight(Label.BOLD);
return l; return label;
} }
return new ControlLink(l); return new ControlLink(label);
} }
} }

View File

@ -37,10 +37,10 @@ public class RowData<K> {
private K rowKey; private K rowKey;
private final List<String> cols; private final String[] cols;
public RowData(final int numCols) { public RowData(final int numCols) {
cols = new ArrayList<>(numCols); cols = new String[numCols];
} }
public K getRowKey() { public K getRowKey() {
@ -52,11 +52,11 @@ public class RowData<K> {
} }
public String getColData(final int colIndex) { public String getColData(final int colIndex) {
return cols.get(colIndex); return cols[colIndex];
} }
public void setColData(final int colIndex, final String data) { public void setColData(final int colIndex, final String data) {
cols.set(colIndex, data); cols[colIndex] = data;
} }
} }