CCM NG/ccm-cms: Lifecycles tab

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4634 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2017-03-17 16:42:06 +00:00
parent 4fb0dbcb40
commit 30d36d4bff
19 changed files with 1103 additions and 651 deletions

View File

@ -23,19 +23,15 @@ import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label; 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.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;
import com.arsdigita.bebop.event.FormValidationListener; import com.arsdigita.bebop.event.FormValidationListener;
import com.arsdigita.bebop.form.FormErrorDisplay; import com.arsdigita.bebop.form.FormErrorDisplay;
import com.arsdigita.bebop.form.Hidden;
import com.arsdigita.bebop.form.Submit; import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.TextArea; import com.arsdigita.bebop.form.TextArea;
import com.arsdigita.bebop.form.TextField; import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.IntegerParameter; import com.arsdigita.bebop.parameters.IntegerParameter;
import com.arsdigita.bebop.parameters.NotEmptyValidationListener; import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
import com.arsdigita.bebop.parameters.NotNullValidationListener;
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener; import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
import com.arsdigita.bebop.parameters.StringLengthValidationListener; import com.arsdigita.bebop.parameters.StringLengthValidationListener;
import com.arsdigita.bebop.parameters.TrimmedStringParameter; import com.arsdigita.bebop.parameters.TrimmedStringParameter;
@ -52,11 +48,10 @@ import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.lifecycle.LifecycleDefinitionRepository;
import org.librecms.lifecycle.PhaseDefinititionRepository;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Optional;
/** /**
* This class contains a form component to add a lifecycle phase definition. * This class contains a form component to add a lifecycle phase definition.
@ -68,7 +63,6 @@ import java.util.Locale;
*/ */
class AddPhaseForm extends CMSForm { class AddPhaseForm extends CMSForm {
private final static String PHASE_ID = "id";
private final static String LABEL = "label"; private final static String LABEL = "label";
private final static String DESCRIPTION = "description"; private final static String DESCRIPTION = "description";
private final static String DELAY_DAYS = "delay_days"; private final static String DELAY_DAYS = "delay_days";
@ -80,19 +74,18 @@ class AddPhaseForm extends CMSForm {
private final static String SUBMIT = "submit"; private final static String SUBMIT = "submit";
private final static String CANCEL = "cancel"; private final static String CANCEL = "cancel";
private final LifecycleDefinitionRequestLocal m_cycle; private final LifecycleDefinitionRequestLocal selectedLifecycle;
private final Hidden m_id; private final TextField phaseLabel;
private final TextField m_label; private final TextArea phaseDescription;
private final TextArea m_description; private final TextField delayDays;
private final TextField m_delay_days; private final TextField delayHours;
private final TextField m_delay_hours; private final TextField delayMinutes;
private final TextField m_delay_minutes; private final TextField durationDays;
private final TextField m_duration_days; private final TextField durationHours;
private final TextField m_duration_hours; private final TextField durationMinutes;
private final TextField m_duration_minutes; private final Submit submit;
private final Submit m_submit; private final Submit cancel;
private final Submit m_cancel;
/** /**
* Constructor. * Constructor.
@ -101,112 +94,98 @@ class AddPhaseForm extends CMSForm {
* cycle definition is selected since phase definitions are * cycle definition is selected since phase definitions are
* associated to cycle definitions * associated to cycle definitions
*/ */
public AddPhaseForm(final LifecycleDefinitionRequestLocal cycle) { public AddPhaseForm(final LifecycleDefinitionRequestLocal selectedLifecycle) {
super("LifecyclePhaseDefinition"); super("LifecyclePhaseDefinition");
m_cycle = cycle; this.selectedLifecycle = selectedLifecycle;
m_id = new Hidden(new BigDecimalParameter(PHASE_ID)); final Label heading = new Label(gz("cms.ui.lifecycle.phase_add"));
add(m_id);
m_id.addValidationListener(new NotNullValidationListener());
Label heading = new Label(gz("cms.ui.lifecycle.phase_add"));
heading.setFontWeight(Label.BOLD); heading.setFontWeight(Label.BOLD);
add(heading, ColumnPanel.FULL_WIDTH); add(heading, ColumnPanel.FULL_WIDTH);
add(new FormErrorDisplay(this), ColumnPanel.FULL_WIDTH); add(new FormErrorDisplay(this), ColumnPanel.FULL_WIDTH);
add(new Label(gz("cms.ui.name"))); add(new Label(gz("cms.ui.lifecycle.phase.name")));
m_label = new TextField(new TrimmedStringParameter(LABEL)); phaseLabel = new TextField(new TrimmedStringParameter(LABEL));
m_label.addValidationListener(new NotEmptyValidationListener()); phaseLabel.addValidationListener(new NotEmptyValidationListener());
m_label.setSize(40); phaseLabel.setSize(40);
m_label.setMaxLength(1000); phaseLabel.setMaxLength(1000);
add(m_label); add(phaseLabel);
add(new Label(gz("cms.ui.description"))); add(new Label(gz("cms.ui.lifecycle.phase.description")));
m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION)); phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
m_description.addValidationListener(new StringLengthValidationListener( phaseDescription.addValidationListener(
4000)); new StringLengthValidationListener(
m_description.setCols(40); 4000));
m_description.setRows(5); phaseDescription.setCols(40);
m_description.setWrap(TextArea.SOFT); phaseDescription.setRows(5);
add(m_description); phaseDescription.setWrap(TextArea.SOFT);
add(phaseDescription);
// phase delay // phase delay
add(new Label(gz("cms.ui.lifecycle.phase_start_delay"))); add(new Label(gz("cms.ui.lifecycle.phase_start_delay")));
m_delay_days = new TextField(new IntegerParameter(DELAY_DAYS)); delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
m_delay_hours = new TextField(new IntegerParameter(DELAY_HOURS)); delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
m_delay_minutes = new TextField(new IntegerParameter(DELAY_MINUTES)); delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
//max value: days: 60 years, hours: 7 days, minutes: 1 day //max value: days: 60 years, hours: 7 days, minutes: 1 day
m_delay_days.addValidationListener( delayDays.addValidationListener(
new NumberInRangeValidationListener(0, 21900)); new NumberInRangeValidationListener(0, 21900));
m_delay_hours.addValidationListener(new NumberInRangeValidationListener( delayHours.addValidationListener(new NumberInRangeValidationListener(
0, 168)); 0, 168));
m_delay_minutes.addValidationListener( delayMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440)); new NumberInRangeValidationListener(0, 1440));
m_delay_days.setSize(7); delayDays.setSize(7);
m_delay_hours.setSize(7); delayHours.setSize(7);
m_delay_minutes.setSize(7); delayMinutes.setSize(7);
m_delay_days.setClassAttr("DaysField"); delayDays.setClassAttr("DaysField");
m_delay_hours.setClassAttr("HoursField"); delayHours.setClassAttr("HoursField");
m_delay_minutes.setClassAttr("MinutesField"); delayMinutes.setClassAttr("MinutesField");
SimpleContainer de = new SimpleContainer(); final SimpleContainer delayContainer = new SimpleContainer();
de.add(new Label(gz("cms.ui.lifecycle.phase_days"))); delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
de.add(m_delay_days); delayContainer.add(delayDays);
de.add(new Label(gz("cms.ui.lifecycle.phase_hours"))); delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
de.add(m_delay_hours); delayContainer.add(delayHours);
de.add(new Label(gz("cms.ui.lifecycle.phase_mins"))); delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
de.add(m_delay_minutes); delayContainer.add(delayMinutes);
add(de); add(delayContainer);
// phase duration // phase duration
add(new Label(gz("cms.ui.lifecycle.phase_duration"))); add(new Label(gz("cms.ui.lifecycle.phase_duration")));
m_duration_days = new TextField(new IntegerParameter(DURATION_DAYS)); durationDays = new TextField(new IntegerParameter(DURATION_DAYS));
m_duration_hours = new TextField(new IntegerParameter(DURATION_HOURS)); durationHours = new TextField(new IntegerParameter(DURATION_HOURS));
m_duration_minutes = new TextField( durationMinutes = new TextField(
new IntegerParameter(DURATION_MINUTES)); new IntegerParameter(DURATION_MINUTES));
//max value: days: 60 years, hours: 7 days, minutes: 1 day //max value: days: 60 years, hours: 7 days, minutes: 1 day
m_duration_days.addValidationListener( durationDays.addValidationListener(
new NumberInRangeValidationListener(0, 21900)); new NumberInRangeValidationListener(0, 21900));
m_duration_hours.addValidationListener( durationHours.addValidationListener(
new NumberInRangeValidationListener(0, 168)); new NumberInRangeValidationListener(0, 168));
m_duration_minutes.addValidationListener( durationMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440)); new NumberInRangeValidationListener(0, 1440));
m_duration_days.setSize(7); durationDays.setSize(7);
m_duration_hours.setSize(7); durationHours.setSize(7);
m_duration_minutes.setSize(7); durationMinutes.setSize(7);
m_duration_days.setClassAttr("DaysField"); durationDays.setClassAttr("DaysField");
m_duration_hours.setClassAttr("HoursField"); durationHours.setClassAttr("HoursField");
m_duration_minutes.setClassAttr("MinutesField"); durationMinutes.setClassAttr("MinutesField");
SimpleContainer du = new SimpleContainer(); final SimpleContainer durationContainer = new SimpleContainer();
du.add(new Label(gz("cms.ui.lifecycle.phase_days"))); durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
du.add(m_duration_days); durationContainer.add(durationDays);
du.add(new Label(gz("cms.ui.lifecycle.phase_hours"))); durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
du.add(m_duration_hours); durationContainer.add(durationHours);
du.add(new Label(gz("cms.ui.lifecycle.phase_mins"))); durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
du.add(m_duration_minutes); durationContainer.add(durationMinutes);
add(du); add(durationContainer);
SimpleContainer s = new SimpleContainer(); final SimpleContainer submitCancel = new SimpleContainer();
m_submit = new Submit(SUBMIT); submit = new Submit(SUBMIT, gz("cms.ui.lifecycle.phase.add_submit"));
m_submit.setButtonLabel("Add Phase"); submitCancel.add(submit);
s.add(m_submit); cancel = new Submit(CANCEL, gz("cms.ui.lifecycle.phase.add_cancel"));
m_cancel = new Submit(CANCEL); submitCancel.add(cancel);
m_cancel.setButtonLabel("Cancel"); add(submitCancel, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
s.add(m_cancel);
add(s, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
addInitListener(new FormInitListener() {
public final void init(final FormSectionEvent event)
throws FormProcessException {
initializePhase(event.getPageState());
}
});
addSubmissionListener(new FormSecurityListener( addSubmissionListener(new FormSecurityListener(
AdminPrivileges.ADMINISTER_LIFECYLES)); AdminPrivileges.ADMINISTER_LIFECYLES));
@ -225,6 +204,7 @@ class AddPhaseForm extends CMSForm {
addProcessListener(new FormProcessListener() { addProcessListener(new FormProcessListener() {
@Override
public final void process(final FormSectionEvent event) public final void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
addPhase(event.getPageState()); addPhase(event.getPageState());
@ -244,26 +224,7 @@ class AddPhaseForm extends CMSForm {
*/ */
@Override @Override
public boolean isCancelled(final PageState state) { public boolean isCancelled(final PageState state) {
return m_cancel.isSelected(state); return cancel.isSelected(state);
}
/**
* Generate a unique ID for the new phase.
*
* @param state The page state
*
* @pre state != null
*/
protected void initializePhase(final PageState state)
throws FormProcessException {
// Not neccessary with JPA
// if (m_id.getValue(state) == null) {
// try {
// m_id.setValue(state, Sequences.getNextValue());
// } catch (SQLException e) {
// throw new UncheckedWrapperException(e);
// }
// }
} }
/** /**
@ -274,39 +235,40 @@ class AddPhaseForm extends CMSForm {
* @pre state != null * @pre state != null
*/ */
protected void addPhase(final PageState state) throws FormProcessException { protected void addPhase(final PageState state) throws FormProcessException {
final String label = (String) m_label.getValue(state); final String label = (String) phaseLabel.getValue(state);
final String description = (String) m_description.getValue(state); final String description = (String) phaseDescription.getValue(state);
final Integer delDays = (Integer) m_delay_days.getValue(state); final int delDays = (int) Optional
final Integer delHours = (Integer) m_delay_hours.getValue(state); .ofNullable(delayDays.getValue(state))
final Integer delMinutes = (Integer) m_delay_minutes.getValue(state); .orElseGet(() -> 0);
final Integer durDays = (Integer) m_duration_days.getValue(state); final int delHours = (int) Optional
final Integer durHours = (Integer) m_duration_hours.getValue(state); .ofNullable(delayHours.getValue(state))
final Integer durMinutes = (Integer) m_duration_minutes.getValue(state); .orElseGet(() -> 0);
final int delMinutes = (int) Optional
.ofNullable(delayMinutes.getValue(state))
.orElseGet(() -> 0);
final int durDays = (int) Optional
.ofNullable(durationDays.getValue(state))
.orElseGet(() -> 0);
final int durHours = (int) Optional
.ofNullable(durationHours.getValue(state))
.orElseGet(() -> 0);
final int durMinutes = (int) Optional
.ofNullable(durationMinutes.getValue(state))
.orElseGet(() -> 0);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil.findBean( final LifecycleAdminPaneController controller = cdiUtil
LifecycleDefinitionRepository.class); .findBean(LifecycleAdminPaneController.class);
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean( controller.addPhaseDefinition(
PhaseDefinititionRepository.class); selectedLifecycle.getLifecycleDefinition(state),
final ConfigurationManager confManager = cdiUtil.findBean( label,
ConfigurationManager.class); description,
final KernelConfig kernelConfig = confManager.findConfiguration( delDays,
KernelConfig.class); delHours,
final Locale defaultLocale = kernelConfig.getDefaultLocale(); delMinutes,
durDays,
// Check if the object already exists for double click protection. durHours,
final PhaseDefinition phaseDef = new PhaseDefinition(); durMinutes);
final LifecycleDefinition cycleDef = m_cycle.getLifecycleDefinition(
state);
cycleDef.addPhaseDefinition(phaseDef);
phaseDef.getLabel().addValue(defaultLocale, label);
phaseDef.getDescription().addValue(defaultLocale, description);
phaseDef.setDefaultDelay(delDays * delHours * delMinutes * 60);
phaseDef.setDefaultDuration(durDays * durHours * durMinutes * 60);
phaseDefRepo.save(phaseDef);
lifecycleDefRepo.save(cycleDef);
} }
/** /**
@ -316,27 +278,34 @@ class AddPhaseForm extends CMSForm {
* *
* @pre state != null * @pre state != null
*/ */
protected void validateUniqueName(PageState state) protected void validateUniqueName(final PageState state)
throws FormProcessException { throws FormProcessException {
String label = (String) m_label.getValue(state);
final LifecycleDefinition cycleDef = m_cycle.getLifecycleDefinition( final String label = (String) phaseLabel.getValue(state);
state);
final List<PhaseDefinition> phaseDefs = cycleDef.getPhaseDefinitions(); final LifecycleDefinition cycleDef = selectedLifecycle
.getLifecycleDefinition(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final LifecycleAdminPaneController controller = cdiUtil
.findBean(LifecycleAdminPaneController.class);
final List<PhaseDefinition> phaseDefs = controller
.getPhaseDefinitions(cycleDef);
final ConfigurationManager confManager = cdiUtil.findBean( final ConfigurationManager confManager = cdiUtil.findBean(
ConfigurationManager.class); ConfigurationManager.class);
final KernelConfig kernelConfig = confManager.findConfiguration( final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class); KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale(); final Locale defaultLocale = kernelConfig.getDefaultLocale();
for (final PhaseDefinition phaseDef : phaseDefs) { final boolean duplicateLabel = phaseDefs
if (phaseDef.getLabel().getValue(defaultLocale).equalsIgnoreCase( .stream()
label)) { .map(phaseDef -> phaseDef.getLabel().getValue(defaultLocale))
throw new FormProcessException(new GlobalizedMessage( .anyMatch(phaseDefLabel -> phaseDefLabel.equalsIgnoreCase(label));
"cms.ui.lifecycle.phase_name_not_unique",
CmsConstants.CMS_BUNDLE)); if (duplicateLabel) {
} throw new FormProcessException(new GlobalizedMessage(
"cms.ui.lifecycle.phase_name_not_unique",
CmsConstants.CMS_BUNDLE));
} }
} }
@ -347,11 +316,12 @@ class AddPhaseForm extends CMSForm {
* *
* @pre state != null * @pre state != null
*/ */
protected void validateDuration(PageState state) protected void validateDuration(final PageState state)
throws FormProcessException { throws FormProcessException {
Integer durDays = (Integer) m_duration_days.getValue(state);
Integer durHours = (Integer) m_duration_hours.getValue(state); final Integer durDays = (Integer) durationDays.getValue(state);
Integer durMinutes = (Integer) m_duration_minutes.getValue(state); final Integer durHours = (Integer) durationHours.getValue(state);
final Integer durMinutes = (Integer) durationMinutes.getValue(state);
// Phase duration is infinite, so the duration is valid. // Phase duration is infinite, so the duration is valid.
if (durDays == null && durHours == null && durMinutes == null) { if (durDays == null && durHours == null && durMinutes == null) {
@ -360,19 +330,19 @@ class AddPhaseForm extends CMSForm {
int days, hours, minutes; int days, hours, minutes;
if (durDays != null) { if (durDays != null) {
days = durDays.intValue(); days = durDays;
} else { } else {
days = 0; days = 0;
} }
if (durHours != null) { if (durHours != null) {
hours = durHours.intValue(); hours = durHours;
} else { } else {
hours = 0; hours = 0;
} }
if (durMinutes != null) { if (durMinutes != null) {
minutes = durMinutes.intValue(); minutes = durMinutes;
} else { } else {
minutes = 0; minutes = 0;
} }
@ -389,8 +359,4 @@ class AddPhaseForm extends CMSForm {
CmsConstants.CMS_BUNDLE); CmsConstants.CMS_BUNDLE);
} }
private static String lz(final String key) {
return (String) gz(key).localize();
}
} }

View File

@ -18,29 +18,17 @@
*/ */
package com.arsdigita.cms.ui.lifecycle; package com.arsdigita.cms.ui.lifecycle;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.ParameterEvent;
import com.arsdigita.bebop.event.ParameterListener;
import com.arsdigita.bebop.form.TextArea; import com.arsdigita.bebop.form.TextArea;
import com.arsdigita.bebop.form.TextField; import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.NotEmptyValidationListener; import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
import com.arsdigita.bebop.parameters.StringLengthValidationListener; import com.arsdigita.bebop.parameters.StringLengthValidationListener;
import com.arsdigita.bebop.parameters.TrimmedStringParameter; import com.arsdigita.bebop.parameters.TrimmedStringParameter;
import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ui.BaseForm; import com.arsdigita.cms.ui.BaseForm;
import com.arsdigita.cms.ui.FormSecurityListener; import com.arsdigita.cms.ui.FormSecurityListener;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager;
import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.lifecycle.LifecycleDefinition;
import java.util.Locale;
/** /**
* @author <a href="mailto:jross@redhat.com">Justin Ross</a> * @author <a href="mailto:jross@redhat.com">Justin Ross</a>
@ -48,27 +36,28 @@ import java.util.Locale;
*/ */
class BaseLifecycleForm extends BaseForm { class BaseLifecycleForm extends BaseForm {
final TextField m_name; private final TextField lifecycleName;
final TextArea m_description; private final TextArea lifecycleDescription;
BaseLifecycleForm(final String key, final GlobalizedMessage message) { BaseLifecycleForm(final String key, final GlobalizedMessage message) {
super(key, message); super(key, message);
m_name = new TextField(new TrimmedStringParameter("label")); lifecycleName = new TextField(new TrimmedStringParameter("label"));
addField(gz("cms.ui.name"), m_name); addField(gz("cms.ui.lifecycle.name"), lifecycleName);
m_name.addValidationListener(new NotEmptyValidationListener()); lifecycleName.addValidationListener(new NotEmptyValidationListener());
m_name.setSize(40); lifecycleName.setSize(40);
m_name.setMaxLength(1000); lifecycleName.setMaxLength(1000);
m_description = new TextArea(new TrimmedStringParameter("description")); lifecycleDescription = new TextArea(
addField(gz("cms.ui.description"), m_description); new TrimmedStringParameter("description"));
addField(gz("cms.ui.lifecycle.description"), lifecycleDescription);
m_description.addValidationListener(new StringLengthValidationListener( lifecycleDescription.addValidationListener(
4000)); new StringLengthValidationListener(4000));
m_description.setCols(40); lifecycleDescription.setCols(40);
m_description.setRows(5); lifecycleDescription.setRows(5);
m_description.setWrap(TextArea.SOFT); lifecycleDescription.setWrap(TextArea.SOFT);
addAction(new Finish()); addAction(new Finish());
addAction(new Cancel()); addAction(new Cancel());
@ -77,43 +66,12 @@ class BaseLifecycleForm extends BaseForm {
AdminPrivileges.ADMINISTER_LIFECYLES)); AdminPrivileges.ADMINISTER_LIFECYLES));
} }
class NameUniqueListener implements ParameterListener { protected TextField getLifecycleName() {
return lifecycleName;
private final LifecycleDefinitionRequestLocal m_definition; }
NameUniqueListener(final LifecycleDefinitionRequestLocal definition) {
m_definition = definition;
}
@Override
public final void validate(final ParameterEvent e)
throws FormProcessException {
final PageState state = e.getPageState();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ConfigurationManager confManager = cdiUtil.findBean(
ConfigurationManager.class);
final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
final String label = (String) m_name.getValue(state);
final java.util.List<LifecycleDefinition> definitions = CMS
.getContext().getContentSection().getLifecycleDefinitions();
for (final LifecycleDefinition definition : definitions) {
if (definition.getLabel().getValue(defaultLocale)
.equalsIgnoreCase(label)
&& (m_definition == null
|| !m_definition.getLifecycleDefinition(state)
.equals(definition))) {
throw new FormProcessException(new GlobalizedMessage(
"cms.ui.lifecycle.name_not_unique",
CmsConstants.CMS_BUNDLE));
}
}
}
protected TextArea getLifecycleDescription() {
return lifecycleDescription;
} }
} }

View File

@ -28,19 +28,20 @@ import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.form.Hidden; import com.arsdigita.bebop.form.Hidden;
import com.arsdigita.bebop.form.Submit; import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.parameters.BigDecimalParameter; import com.arsdigita.bebop.parameters.LongParameter;
import com.arsdigita.bebop.parameters.NotNullValidationListener; import com.arsdigita.bebop.parameters.NotNullValidationListener;
import org.librecms.lifecycle.PhaseDefinition; import org.librecms.lifecycle.PhaseDefinition;
import com.arsdigita.cms.ui.CMSForm; import com.arsdigita.cms.ui.CMSForm;
import com.arsdigita.cms.ui.FormSecurityListener; import com.arsdigita.cms.ui.FormSecurityListener;
import com.arsdigita.globalization.GlobalizedMessage;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.lifecycle.PhaseDefinititionRepository; import org.librecms.lifecycle.PhaseDefinititionRepository;
/** /**
* This class handles the deleting of a phase definition. * This class handles the deleting of a phase definition.
* *
@ -50,35 +51,40 @@ import org.librecms.lifecycle.PhaseDefinititionRepository;
class DeletePhaseForm extends CMSForm class DeletePhaseForm extends CMSForm
implements FormProcessListener, FormInitListener { implements FormProcessListener, FormInitListener {
private final PhaseRequestLocal m_phase; private final PhaseRequestLocal selectedPhaseDef;
private final Hidden m_id; private final Hidden selectedPhaseDefId;
private final Submit m_deleteWidget; private final Submit deleteWidget;
private final Submit m_cancelWidget; private final Submit cancelWidget;
/** /**
* @param m The phase selection model. This tells the form which phase * @param m The phase selection model. This tells the form which phase
* definition is selected. * definition is selected.
*/ */
public DeletePhaseForm(final PhaseRequestLocal phase) { public DeletePhaseForm(final PhaseRequestLocal selectedPhaseDef) {
super("PhaseDefinitionDelete"); super("PhaseDefinitionDelete");
m_phase = phase; this.selectedPhaseDef = selectedPhaseDef;
m_id = new Hidden(new BigDecimalParameter("id")); selectedPhaseDefId = new Hidden(new LongParameter("id"));
add(m_id); add(selectedPhaseDefId);
m_id.addValidationListener(new NotNullValidationListener()); selectedPhaseDefId
.addValidationListener(new NotNullValidationListener());
final BoxPanel buttons = new BoxPanel(BoxPanel.HORIZONTAL); final BoxPanel buttons = new BoxPanel(BoxPanel.HORIZONTAL);
m_deleteWidget = new Submit("delete"); deleteWidget = new Submit("delete",
m_deleteWidget.setButtonLabel("Delete"); new GlobalizedMessage(
m_deleteWidget.setClassAttr("deletePhase"); "cms.ui.lifecycle.phase.delete_submit",
buttons.add(m_deleteWidget); CmsConstants.CMS_BUNDLE));
deleteWidget.setClassAttr("deletePhase");
buttons.add(deleteWidget);
m_cancelWidget = new Submit("cancel"); cancelWidget = new Submit("cancel",
m_cancelWidget.setButtonLabel("Cancel"); new GlobalizedMessage(
m_cancelWidget.setClassAttr("canceldeletePhase"); "cms.ui.lifecycle.phase.delete_cancel",
buttons.add(m_cancelWidget); CmsConstants.CMS_BUNDLE));
cancelWidget.setClassAttr("canceldeletePhase");
buttons.add(cancelWidget);
add(buttons, ColumnPanel.CENTER | ColumnPanel.FULL_WIDTH); add(buttons, ColumnPanel.CENTER | ColumnPanel.FULL_WIDTH);
@ -99,7 +105,7 @@ class DeletePhaseForm extends CMSForm
*/ */
@Override @Override
public boolean isCancelled(final PageState state) { public boolean isCancelled(final PageState state) {
return m_cancelWidget.isSelected(state); return cancelWidget.isSelected(state);
} }
/** /**
@ -112,8 +118,9 @@ class DeletePhaseForm extends CMSForm
@Override @Override
public final void process(final FormSectionEvent event) public final void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final FormData data = event.getFormData(); final FormData data = event.getFormData();
final Long key = (Long) data.get(m_id.getName()); final Long key = (Long) data.get(selectedPhaseDefId.getName());
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean( final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
@ -138,9 +145,10 @@ class DeletePhaseForm extends CMSForm
final FormData data = event.getFormData(); final FormData data = event.getFormData();
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final Long id = m_phase.getPhase(state).getDefinitionId(); final Long phaseDefId = selectedPhaseDef.getPhase(state)
.getDefinitionId();
data.put(m_id.getName(), id); data.put(selectedPhaseDefId.getName(), phaseDefId);
} }
} }

View File

@ -49,9 +49,11 @@ import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.lifecycle.PhaseDefinititionRepository; import org.librecms.lifecycle.LifecycleDefinition;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Optional;
/** /**
* This class contains a form component to edit a lifecycle phase definition. * This class contains a form component to edit a lifecycle phase definition.
@ -63,7 +65,6 @@ import java.util.Locale;
*/ */
class EditPhaseForm extends CMSForm { class EditPhaseForm extends CMSForm {
private final static String PHASE_ID = "id";
private final static String LABEL = "label"; private final static String LABEL = "label";
private final static String DESCRIPTION = "description"; private final static String DESCRIPTION = "description";
private final static String DELAY_DAYS = "delay_days"; private final static String DELAY_DAYS = "delay_days";
@ -75,18 +76,19 @@ class EditPhaseForm extends CMSForm {
private final static String SUBMIT = "submit"; private final static String SUBMIT = "submit";
private final static String CANCEL = "cancel"; private final static String CANCEL = "cancel";
private final PhaseRequestLocal m_phase; private final LifecycleDefinitionRequestLocal selectedLifecycle;
private final PhaseRequestLocal selectedPhase;
private final TextField m_label; private final TextField phaseLabel;
private final TextArea m_description; private final TextArea phaseDescription;
private final TextField m_delayDays; private final TextField delayDays;
private final TextField m_delayHours; private final TextField delayHours;
private final TextField m_delayMinutes; private final TextField delayMinutes;
private final TextField m_durDays; private final TextField durationDays;
private final TextField m_durHours; private final TextField durationHours;
private final TextField m_durMinutes; private final TextField durationMinutes;
private final Submit m_submit; private final Submit submit;
private final Submit m_cancel; private final Submit cancel;
/** /**
* Constructor. * Constructor.
@ -96,100 +98,106 @@ class EditPhaseForm extends CMSForm {
* *
* @pre phases != null * @pre phases != null
*/ */
public EditPhaseForm(final PhaseRequestLocal phase) { public EditPhaseForm(
final LifecycleDefinitionRequestLocal selectedLifecycle,
final PhaseRequestLocal selectedPhase) {
super("EditPhaseDefinition"); super("EditPhaseDefinition");
m_phase = phase; this.selectedLifecycle = selectedLifecycle;
this.selectedPhase = selectedPhase;
add(new Label()); add(new Label());
add(new FormErrorDisplay(this)); add(new FormErrorDisplay(this));
add(new Label(gz("cms.ui.name"))); add(new Label(gz("cms.ui.lifecycle.phase.name")));
m_label = new TextField(new TrimmedStringParameter(LABEL)); phaseLabel = new TextField(new TrimmedStringParameter(LABEL));
m_label.addValidationListener(new NotEmptyValidationListener()); phaseLabel.addValidationListener(new NotEmptyValidationListener());
m_label.setSize(40); phaseLabel.setSize(40);
m_label.setMaxLength(1000); phaseLabel.setMaxLength(1000);
add(m_label); add(phaseLabel);
add(new Label(gz("cms.ui.description"))); add(new Label(gz("cms.ui.lifecycle.phase.description")));
m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION)); phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
m_description.addValidationListener(new StringLengthValidationListener( phaseDescription.addValidationListener(
4000)); new StringLengthValidationListener(
m_description.setCols(40); 4000));
m_description.setRows(5); phaseDescription.setCols(40);
m_description.setWrap(TextArea.SOFT); phaseDescription.setRows(5);
add(m_description); phaseDescription.setWrap(TextArea.SOFT);
add(phaseDescription);
// Phase duration // Phase duration
// Max value: days: 60 years, hours: 7 days, minutes: 1 day // Max value: days: 60 years, hours: 7 days, minutes: 1 day
m_delayDays = new TextField(new IntegerParameter(DELAY_DAYS)); delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
m_delayDays.addValidationListener(new NumberInRangeValidationListener(0, delayDays.addValidationListener(new NumberInRangeValidationListener(0,
21900));
m_delayDays.setSize(7);
m_delayDays.setClassAttr("DaysField");
m_delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
m_delayHours.addValidationListener(
new NumberInRangeValidationListener(0, 168));
m_delayHours.setClassAttr("HoursField");
m_delayHours.setSize(7);
m_delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
m_delayMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440));
m_delayMinutes.setSize(7);
m_delayMinutes.setClassAttr("MinutesField");
add(new Label(new GlobalizedMessage("cms.ui.lifecycle.start_delay",
CmsConstants.CMS_BUNDLE)));
SimpleContainer de = new SimpleContainer();
de.add(new Label(gz("cms.ui.lifecycle.phase_days")));
de.add(m_delayDays);
de.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
de.add(m_delayHours);
de.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
de.add(m_delayMinutes);
add(de);
// Phase duration
// Max value: days: 60 years, hours: 7 days, minutes: 1 day
m_durDays = new TextField(new IntegerParameter(DURATION_DAYS));
m_durDays.addValidationListener(new NumberInRangeValidationListener(0,
21900)); 21900));
m_durDays.setSize(7); delayDays.setSize(7);
m_durDays.setClassAttr("DaysField"); delayDays.setClassAttr("DaysField");
m_durHours = new TextField(new IntegerParameter(DURATION_HOURS)); delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
m_durHours.addValidationListener(new NumberInRangeValidationListener(0, delayHours.addValidationListener(
168)); new NumberInRangeValidationListener(0, 168));
m_durHours.setSize(7); delayHours.setClassAttr("HoursField");
m_durHours.setClassAttr("HoursField"); delayHours.setSize(7);
m_durMinutes = new TextField(new IntegerParameter(DURATION_MINUTES)); delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
m_durMinutes.addValidationListener( delayMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440)); new NumberInRangeValidationListener(0, 1440));
m_durMinutes.setSize(7); delayMinutes.setSize(7);
m_durMinutes.setClassAttr("MinutesField"); delayMinutes.setClassAttr("MinutesField");
add(new Label(gz("cms.ui.lifecycle.duration"))); add(new Label(
SimpleContainer du = new SimpleContainer(); new GlobalizedMessage("cms.ui.lifecycle.phase_start_delay",
du.add(new Label(gz("cms.ui.lifecycle.phase_days"))); CmsConstants.CMS_BUNDLE)));
du.add(m_durDays); final SimpleContainer delayContainer = new SimpleContainer();
du.add(new Label(gz("cms.ui.lifecycle.phase_hours"))); delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
du.add(m_durHours); delayContainer.add(delayDays);
du.add(new Label(gz("cms.ui.lifecycle.phase_mins"))); delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
du.add(m_durMinutes); delayContainer.add(delayHours);
add(du); delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
delayContainer.add(delayMinutes);
add(delayContainer);
// Phase duration
// Max value: days: 60 years, hours: 7 days, minutes: 1 day
durationDays = new TextField(new IntegerParameter(DURATION_DAYS));
durationDays.addValidationListener(
new NumberInRangeValidationListener(0,
21900));
durationDays.setSize(7);
durationDays.setClassAttr("DaysField");
durationHours = new TextField(new IntegerParameter(DURATION_HOURS));
durationHours.addValidationListener(new NumberInRangeValidationListener(
0,
168));
durationHours.setSize(7);
durationHours.setClassAttr("HoursField");
durationMinutes = new TextField(new IntegerParameter(DURATION_MINUTES));
durationMinutes.addValidationListener(
new NumberInRangeValidationListener(0, 1440));
durationMinutes.setSize(7);
durationMinutes.setClassAttr("MinutesField");
add(new Label(gz("cms.ui.lifecycle.phase_duration")));
final SimpleContainer durationContainer = new SimpleContainer();
durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
durationContainer.add(durationDays);
durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
durationContainer.add(durationHours);
durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
durationContainer.add(durationMinutes);
add(durationContainer);
// Submit and cancel buttons // Submit and cancel buttons
SimpleContainer s = new SimpleContainer(); final SimpleContainer submitCancelContainer = new SimpleContainer();
m_submit = new Submit(SUBMIT); submit = new Submit(SUBMIT, gz("cms.ui.lifecycle.phase.edit_submit"));
m_submit.setButtonLabel("Edit Phase"); submitCancelContainer.add(submit);
s.add(m_submit); cancel = new Submit(CANCEL, gz("cms.ui.lifecycle.phase.edit_cancel"));
m_cancel = new Submit(CANCEL); submitCancelContainer.add(cancel);
m_cancel.setButtonLabel("Cancel"); add(submitCancelContainer, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
s.add(m_cancel);
add(s, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
// Add form listeners. // Add form listeners.
addInitListener(new FormInitListener() { addInitListener(new FormInitListener() {
@ -240,7 +248,7 @@ class EditPhaseForm extends CMSForm {
*/ */
@Override @Override
public boolean isCancelled(final PageState state) { public boolean isCancelled(final PageState state) {
return m_cancel.isSelected(state); return cancel.isSelected(state);
} }
/** /**
@ -253,21 +261,27 @@ class EditPhaseForm extends CMSForm {
*/ */
private void initializePhaseDefinition(final PageState state) private void initializePhaseDefinition(final PageState state)
throws FormProcessException { throws FormProcessException {
PhaseDefinition pd = m_phase.getPhase(state);
m_label.setValue(state, pd.getLabel());
m_description.setValue(state, pd.getDescription());
long[] delay = Duration.formatDHM(pd.getDefaultDelay()); final Locale defaultLocale = KernelConfig.getConfig().getDefaultLocale();
m_delayDays.setValue(state, delay[0]);
m_delayHours.setValue(state, delay[1]);
m_delayMinutes.setValue(state, delay[2]);
Long duration = pd.getDefaultDuration(); final PhaseDefinition phaseDef = selectedPhase.getPhase(state);
if (duration != null) { phaseLabel.setValue(state, phaseDef.getLabel().getValue(defaultLocale));
Long[] dhm = Duration.formatDHM(duration); phaseDescription.setValue(state,
m_durDays.setValue(state, dhm[0]); phaseDef
m_durHours.setValue(state, dhm[1]); .getDescription()
m_durMinutes.setValue(state, dhm[2]); .getValue(defaultLocale));
final long[] delay = Duration.formatDHM(phaseDef.getDefaultDelay());
delayDays.setValue(state, delay[0]);
delayHours.setValue(state, delay[1]);
delayMinutes.setValue(state, delay[2]);
final Long duration = phaseDef.getDefaultDuration();
if (duration != 0) {
final Long[] dhm = Duration.formatDHM(duration);
durationDays.setValue(state, dhm[0]);
durationHours.setValue(state, dhm[1]);
durationMinutes.setValue(state, dhm[2]);
} }
} }
@ -281,31 +295,40 @@ class EditPhaseForm extends CMSForm {
private void updatePhaseDefinition(final PageState state) private void updatePhaseDefinition(final PageState state)
throws FormProcessException { throws FormProcessException {
final String label = (String) m_label.getValue(state); final String label = (String) phaseLabel.getValue(state);
final String description = (String) m_description.getValue(state); final String description = (String) phaseDescription.getValue(state);
final Integer delayDays = (Integer) m_delayDays.getValue(state); final int delDays = (int) Optional
final Integer delayHours = (Integer) m_delayHours.getValue(state); .ofNullable(delayDays.getValue(state))
final Integer delayMinutes = (Integer) m_delayMinutes.getValue(state); .orElseGet(() -> 0);
final Integer durDays = (Integer) m_durDays.getValue(state); final int delHours = (int) Optional
final Integer durHours = (Integer) m_durHours.getValue(state); .ofNullable(delayHours.getValue(state))
final Integer durMinutes = (Integer) m_durMinutes.getValue(state); .orElseGet(() -> 0);;
final int delMinutes = (int) Optional
.ofNullable(delayMinutes.getValue(state))
.orElseGet(() -> 0);;
final int durDays = (int) Optional
.ofNullable(durationDays.getValue(state))
.orElseGet(() -> 0);;
final int durHours = (int) Optional
.ofNullable(durationHours.getValue(state))
.orElseGet(() -> 0);;
final int durMinutes = (int) Optional
.ofNullable(durationMinutes.getValue(state))
.orElseGet(() -> 0);;
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ConfigurationManager confManager = cdiUtil.findBean( final LifecycleAdminPaneController controller = cdiUtil
ConfigurationManager.class); .findBean(LifecycleAdminPaneController.class);
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
PhaseDefinititionRepository.class);
final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
final PhaseDefinition phaseDefinition = m_phase.getPhase(state); controller.updatePhaseDefinition(selectedPhase.getPhase(state),
phaseDefinition.getLabel().addValue(defaultLocale, label); label,
phaseDefinition.getDescription().addValue(defaultLocale, description); description,
phaseDefinition.setDefaultDelay(delayDays * delayHours * delayMinutes delDays,
* 60); delHours,
phaseDefinition.setDefaultDuration(durDays * durHours * durMinutes * 60); delMinutes,
phaseDefRepo.save(phaseDefinition); durDays,
durHours,
durMinutes);
} }
/** /**
@ -318,24 +341,46 @@ class EditPhaseForm extends CMSForm {
*/ */
private void validateUniqueName(final PageState state) private void validateUniqueName(final PageState state)
throws FormProcessException { throws FormProcessException {
final String newLabel = (String) m_label.getValue(state);
// PhaseDefinition pd = m_phase.getPhase(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
// PhaseDefinitionCollection phaseDefs = pd.getLifecycleDefinition() final ConfigurationManager confManager = cdiUtil.findBean(
// .getPhaseDefinitions(); ConfigurationManager.class);
// final KernelConfig kernelConfig = confManager.findConfiguration(
// // If the name has changed, check for uniqueness. KernelConfig.class);
// if (!pd.getLabel().equalsIgnoreCase(newLabel)) { final Locale defaultLocale = kernelConfig.getDefaultLocale();
// while (phaseDefs.next()) {
// PhaseDefinition phaseDef = phaseDefs.getPhaseDefinition(); final String oldLabel = selectedPhase
// .getPhase(state)
// if (phaseDef.getLabel().equalsIgnoreCase(newLabel)) { .getLabel()
// phaseDefs.close(); .getValue(defaultLocale);
// throw new FormProcessException(GlobalizationUtil.globalize( final String newLabel = (String) phaseLabel.getValue(state);
// "cms.ui.lifecycle.phase_name_not_unique"));
// } if (oldLabel.equals(newLabel)) {
// } //Label has node changed, no validation required.
// } return;
}
final LifecycleDefinition cycleDef = selectedLifecycle
.getLifecycleDefinition(state);
final LifecycleAdminPaneController controller = cdiUtil
.findBean(LifecycleAdminPaneController.class);
final List<PhaseDefinition> phaseDefs = controller
.getPhaseDefinitions(cycleDef);
final boolean duplicateLabel = phaseDefs
.stream()
.map(phaseDef -> phaseDef.getLabel().getValue(defaultLocale))
.anyMatch(phaseDefLabel -> {
return phaseDefLabel.equalsIgnoreCase(newLabel);
});
if (duplicateLabel) {
throw new FormProcessException(new GlobalizedMessage(
"cms.ui.lifecycle.phase_name_not_unique",
CmsConstants.CMS_BUNDLE));
}
} }
/** /**
@ -343,13 +388,14 @@ class EditPhaseForm extends CMSForm {
* *
* @param state The page state * @param state The page state
* *
* @pre state != null *
*/ */
private void validateDuration(final PageState state) private void validateDuration(final PageState state)
throws FormProcessException { throws FormProcessException {
final Integer durDays = (Integer) m_durDays.getValue(state);
final Integer durHours = (Integer) m_durHours.getValue(state); final Integer durDays = (Integer) durationDays.getValue(state);
final Integer durMinutes = (Integer) m_durMinutes.getValue(state); final Integer durHours = (Integer) durationHours.getValue(state);
final Integer durMinutes = (Integer) durationMinutes.getValue(state);
// Phase duration is infinite, so the duration is valid. // Phase duration is infinite, so the duration is valid.
if (durDays == null && durHours == null && durMinutes == null) { if (durDays == null && durHours == null && durMinutes == null) {
@ -357,22 +403,22 @@ class EditPhaseForm extends CMSForm {
} }
int days, hours, minutes; int days, hours, minutes;
if (durDays != null) { if (durDays == null) {
days = durDays.intValue();
} else {
days = 0; days = 0;
} else {
days = durDays;
} }
if (durHours != null) { if (durHours == null) {
hours = durHours.intValue();
} else {
hours = 0; hours = 0;
} else {
hours = durHours;
} }
if (durMinutes != null) { if (durMinutes == null) {
minutes = durMinutes.intValue();
} else {
minutes = 0; minutes = 0;
} else {
minutes = durMinutes;
} }
if ((days + hours + minutes) == 0) { if ((days + hours + minutes) == 0) {
@ -386,8 +432,4 @@ class EditPhaseForm extends CMSForm {
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE); return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
} }
private static String lz(final String key) {
return (String) gz(key).localize();
}
} }

View File

@ -40,7 +40,6 @@ import com.arsdigita.bebop.parameters.DateParameter;
import com.arsdigita.bebop.parameters.IntegerParameter; import com.arsdigita.bebop.parameters.IntegerParameter;
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener; import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ContentCenter;
import com.arsdigita.cms.ui.BaseForm; import com.arsdigita.cms.ui.BaseForm;
import com.arsdigita.cms.ui.ContentItemPage; import com.arsdigita.cms.ui.ContentItemPage;
import com.arsdigita.cms.ui.item.ContentItemRequestLocal; import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
@ -51,15 +50,12 @@ import com.arsdigita.mail.Mail;
import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.web.RedirectSignal; import com.arsdigita.web.RedirectSignal;
import com.arsdigita.web.URL; import com.arsdigita.web.URL;
import com.arsdigita.web.Web;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.arsdigita.cms.CMSConfig; import org.arsdigita.cms.CMSConfig;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.notification.Notification;
import org.libreccm.security.Party;
import org.libreccm.security.Shiro; import org.libreccm.security.Shiro;
import org.libreccm.security.User; import org.libreccm.security.User;
import org.libreccm.security.UserRepository; import org.libreccm.security.UserRepository;
@ -74,13 +70,11 @@ import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemManager; import org.librecms.contentsection.ContentItemManager;
import org.librecms.contentsection.ContentItemRepository; import org.librecms.contentsection.ContentItemRepository;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionConfig;
import org.librecms.contentsection.privileges.ItemPrivileges; import org.librecms.contentsection.privileges.ItemPrivileges;
import org.librecms.lifecycle.Lifecycle; import org.librecms.lifecycle.Lifecycle;
import org.librecms.lifecycle.LifecycleDefinition; import org.librecms.lifecycle.LifecycleDefinition;
import org.librecms.lifecycle.LifecycleDefinitionRepository; import org.librecms.lifecycle.LifecycleDefinitionRepository;
import org.librecms.lifecycle.LifecycleManager; import org.librecms.lifecycle.LifecycleManager;
import org.librecms.lifecycle.LifecycleRepository;
import org.librecms.lifecycle.Phase; import org.librecms.lifecycle.Phase;
import org.librecms.lifecycle.PhaseDefinition; import org.librecms.lifecycle.PhaseDefinition;
import org.librecms.lifecycle.PhaseRepository; import org.librecms.lifecycle.PhaseRepository;
@ -91,10 +85,7 @@ import org.librecms.workflow.CmsTaskType;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.io.Writer; import java.io.Writer;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar; import java.util.Calendar;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.TimeZone; import java.util.TimeZone;

View File

@ -24,18 +24,9 @@ import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.event.FormProcessListener; import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import com.arsdigita.kernel.KernelConfig;
import org.apache.logging.log4j.LogManager;
import org.librecms.contentsection.ContentSection;
import org.librecms.lifecycle.LifecycleDefinition; import org.librecms.lifecycle.LifecycleDefinition;
import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager;
import org.librecms.contentsection.ContentSectionManager;
import org.librecms.lifecycle.LifecycleDefinitionRepository;
import java.util.Locale;
/** /**
* @author Michael Pih * @author Michael Pih
@ -46,16 +37,15 @@ import java.util.Locale;
*/ */
class LifecycleAddForm extends BaseLifecycleForm { class LifecycleAddForm extends BaseLifecycleForm {
private static final Logger LOGGER = LogManager.getLogger(LifecycleAddForm.class); private final SingleSelectionModel<Long> selectedLifecycle;
private final SingleSelectionModel<Long> m_model; LifecycleAddForm(final SingleSelectionModel<Long> selectedLifecycle) {
LifecycleAddForm(final SingleSelectionModel<Long> model) {
super("LifecycleDefinition", gz("cms.ui.lifecycle.add")); super("LifecycleDefinition", gz("cms.ui.lifecycle.add"));
m_model = model; this.selectedLifecycle = selectedLifecycle;
m_name.addValidationListener(new NameUniqueListener(null)); getLifecycleName().addValidationListener(
new LifecycleNameUniqueListener(this));
addProcessListener(new ProcessListener()); addProcessListener(new ProcessListener());
} }
@ -63,35 +53,22 @@ class LifecycleAddForm extends BaseLifecycleForm {
private class ProcessListener implements FormProcessListener { private class ProcessListener implements FormProcessListener {
@Override @Override
public final void process(final FormSectionEvent e) public final void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = e.getPageState();
final PageState state = event.getPageState();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ConfigurationManager confManager = cdiUtil.findBean( final LifecycleAdminPaneController controller = cdiUtil
ConfigurationManager.class); .findBean(LifecycleAdminPaneController.class);
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil.findBean(
LifecycleDefinitionRepository.class);
final ContentSectionManager sectionManager = cdiUtil.findBean(
ContentSectionManager.class);
final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
final LifecycleDefinition definition = new LifecycleDefinition(); final LifecycleDefinition definition = controller
.createLifecycleDefinition(
CMS.getContext().getContentSection(),
(String) getLifecycleName().getValue(state),
(String) getLifecycleDescription().getValue(state));
definition.getLabel().addValue(defaultLocale, selectedLifecycle.setSelectedKey(state,
(String) m_name.getValue(state)); definition.getDefinitionId());
definition.getDescription().addValue(
defaultLocale,
(String) m_description.getValue(state));
lifecycleDefRepo.save(definition);
final ContentSection section = CMS.getContext().getContentSection();
sectionManager.addLifecycleDefinitionToContentSection(definition,
section);
m_model.setSelectedKey(state,
definition.getDefinitionId());
} }
} }

View File

@ -32,48 +32,42 @@ import com.arsdigita.cms.ui.BaseAdminPane;
import com.arsdigita.cms.ui.BaseDeleteForm; import com.arsdigita.cms.ui.BaseDeleteForm;
import com.arsdigita.cms.ui.FormSecurityListener; import com.arsdigita.cms.ui.FormSecurityListener;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.privileges.AdminPrivileges; import org.librecms.contentsection.privileges.AdminPrivileges;
import org.librecms.lifecycle.LifecycleDefinitionRepository; import org.librecms.lifecycle.LifecycleDefinitionRepository;
/** /**
* This class contains the split pane for the lifecycle administration * This class contains the split pane for the lifecycle administration
* interface. * interface.
* *
*
* @author Michael Pih * @author Michael Pih
* @author Jack Chung * @author Jack Chung
* @author <a href="mailto:jross@redhat.com">Justin Ross</a> * @author <a href="mailto:jross@redhat.com">Justin Ross</a>
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
public class LifecycleAdminPane extends BaseAdminPane { public class LifecycleAdminPane extends BaseAdminPane {
private static Logger LOGGER = LogManager.getLogger(LifecycleAdminPane.class); private final SingleSelectionModel selectionModel;
private final LifecycleDefinitionRequestLocal selectionLifecycleDefinition;
private final SingleSelectionModel m_model;
private final LifecycleDefinitionRequestLocal m_definition;
public LifecycleAdminPane() { public LifecycleAdminPane() {
super(new Label(gz("cms.ui.lifecycles")), super(new Label(gz("cms.ui.lifecycles")),
new LifecycleListModelBuilder()); new LifecycleListModelBuilder());
m_model = getSelectionModel(); selectionModel = getSelectionModel();
m_definition = new SelectionRequestLocal(); selectionLifecycleDefinition = new SelectionRequestLocal();
// XXX secvis // XXX secvis
//add(new LifecycleAdminContainer(m_addLink)); //add(new LifecycleAdminContainer(m_addLink));
setAdd(gz("cms.ui.lifecycle.add"), setAdd(gz("cms.ui.lifecycle.add"),
new LifecycleAddForm(m_model)); new LifecycleAddForm(selectionModel));
setEdit(gz("cms.ui.lifecycle.edit"), setEdit(gz("cms.ui.lifecycle.edit"),
new LifecycleEditForm(m_definition)); new LifecycleEditForm(selectionLifecycleDefinition));
setDelete(gz("cms.ui.lifecycle.delete"), new DeleteForm()); setDelete(gz("cms.ui.lifecycle.delete"), new DeleteForm());
setIntroPane(new Label(gz("cms.ui.lifecycle.intro"))); setIntroPane(new Label(gz("cms.ui.lifecycle.intro")));
setItemPane(new LifecycleItemPane(m_definition, setItemPane(new LifecycleItemPane(selectionLifecycleDefinition,
getEditLink(), getEditLink(),
getDeleteLink())); getDeleteLink()));
@ -85,7 +79,7 @@ public class LifecycleAdminPane extends BaseAdminPane {
@Override @Override
protected final Object initialValue(final PageState state) { protected final Object initialValue(final PageState state) {
final String id = m_model.getSelectedKey(state).toString(); final String id = selectionModel.getSelectedKey(state).toString();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
@ -105,24 +99,21 @@ public class LifecycleAdminPane extends BaseAdminPane {
AdminPrivileges.ADMINISTER_LIFECYLES)); AdminPrivileges.ADMINISTER_LIFECYLES));
} }
@Override
public final void process(final FormSectionEvent event) public final void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final ContentSection section = CMS.getContext().getContentSection(); final ContentSection section = CMS.getContext().getContentSection();
final LifecycleDefinition definition = m_definition final LifecycleDefinition definition = selectionLifecycleDefinition
.getLifecycleDefinition(state); .getLifecycleDefinition(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentSectionManager sectionManager = cdiUtil.findBean( final LifecycleAdminPaneController controller = cdiUtil
ContentSectionManager.class); .findBean(LifecycleAdminPaneController.class);
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil controller.deleteLifecycleDefinition(definition, section);
.findBean(LifecycleDefinitionRepository.class);
sectionManager.removeLifecycleDefinitionFromContentSection( selectionModel.clearSelection(state);
definition, section);
lifecycleDefRepo.delete(definition);
m_model.clearSelection(state);
} }
} }

View File

@ -0,0 +1,296 @@
/*
* Copyright (C) 2017 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.cms.ui.lifecycle;
import com.arsdigita.kernel.KernelConfig;
import org.libreccm.configuration.ConfigurationManager;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.ContentSectionRepository;
import org.librecms.lifecycle.LifecycleDefinition;
import org.librecms.lifecycle.LifecycleDefinitionRepository;
import org.librecms.lifecycle.PhaseDefinition;
import org.librecms.lifecycle.PhaseDefinititionRepository;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.transaction.Transactional;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@RequestScoped
class LifecycleAdminPaneController {
@Inject
private ConfigurationManager confManager;
@Inject
private ContentSectionRepository sectionRepo;
@Inject
private ContentSectionManager sectionManager;
@Inject
private LifecycleDefinitionRepository lifecycleDefRepo;
@Inject
private PhaseDefinititionRepository phaseDefRepo;
@Transactional(Transactional.TxType.REQUIRED)
public List<LifecycleDefinition> getLifecyclesForContentSection(
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());
}
/**
* Create a new lifecycle definition
*
* @param section The content section which the
* {@link LifecycleDefinition} is created.
* @param name The name of the new lifecycle definition.
* @param description The description of the new lifecycle definition.
*/
@Transactional(Transactional.TxType.REQUIRED)
public LifecycleDefinition createLifecycleDefinition(
final ContentSection section,
final String name,
final String description) {
Objects.requireNonNull(section, "ContentSection can't be null.");
Objects.requireNonNull(name, "Name can't be null");
if (name.trim().isEmpty()) {
throw new IllegalArgumentException("Name can't be empty.");
}
final KernelConfig kernelConfig = confManager
.findConfiguration(KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
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 LifecycleDefinition definition = new LifecycleDefinition();
definition.getLabel().addValue(defaultLocale, name);
definition.getDescription().addValue(defaultLocale, description);
lifecycleDefRepo.save(definition);
sectionManager.addLifecycleDefinitionToContentSection(definition,
contentSection);
return definition;
}
/**
* Update the name and/or description of a {@link LifecycleDefinition}.
*
* @param definition The definition to update.
* @param name The new name.
* @param description The new description.
*/
@Transactional(Transactional.TxType.REQUIRED)
public void updateLifecycleDefinition(final LifecycleDefinition definition,
final String name,
final String description) {
Objects.requireNonNull(definition, "definition can't be null.");
Objects.requireNonNull(name, "name can't be null");
if (name.trim().isEmpty()) {
throw new IllegalArgumentException("Name can't be empty.");
}
final LifecycleDefinition lifecycleDefinition = lifecycleDefRepo
.findById(definition.getDefinitionId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No LifecycleDefinition with ID %d in the database. "
+ "Where did that ID come from?",
definition.getDefinitionId())));
final KernelConfig kernelConfig = confManager
.findConfiguration(KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
if (!lifecycleDefinition.getLabel().getValue(defaultLocale).equals(name)) {
lifecycleDefinition.getLabel().addValue(defaultLocale, name);
}
if (!lifecycleDefinition.getDescription().getValue(defaultLocale)
.equals(description)) {
lifecycleDefinition.getDescription().addValue(defaultLocale,
description);
}
lifecycleDefRepo.save(lifecycleDefinition);
}
@Transactional(Transactional.TxType.REQUIRED)
public void deleteLifecycleDefinition(
final LifecycleDefinition definition,
final ContentSection section) {
Objects.requireNonNull(definition, "definition can't be null.");
final LifecycleDefinition lifecycleDefinition = lifecycleDefRepo
.findById(definition.getDefinitionId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No LifecycleDefinition with ID %d in the database. "
+ "Where did that ID come from?",
definition.getDefinitionId())));
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())));
sectionManager.removeLifecycleDefinitionFromContentSection(
lifecycleDefinition,
contentSection);
lifecycleDefRepo.delete(lifecycleDefinition);
}
@Transactional(Transactional.TxType.REQUIRED)
public List<PhaseDefinition> getPhaseDefinitions(
final LifecycleDefinition definition) {
Objects.requireNonNull(definition);
final LifecycleDefinition lifecycleDefinition = lifecycleDefRepo
.findById(definition.getDefinitionId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No LifecycleDefinition with ID %d in the database. "
+ "Where did that ID come from?",
definition.getDefinitionId())));
return new ArrayList<>(lifecycleDefinition.getPhaseDefinitions());
}
@Transactional(Transactional.TxType.REQUIRED)
public void addPhaseDefinition(final LifecycleDefinition definition,
final String label,
final String description,
final int delayDays,
final int delayHours,
final int delayMinutes,
final int durationDays,
final int durationHours,
final int durationMinutes) {
Objects.requireNonNull(definition, "definition can't be null");
Objects.requireNonNull(label, "label can't be null");
if (label.trim().isEmpty()) {
throw new IllegalArgumentException(String.format(
"label can't be empty."));
}
final LifecycleDefinition lifecycleDefinition = lifecycleDefRepo
.findById(definition.getDefinitionId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No LifecycleDefinition with ID %d in the database. "
+ "Where did that ID come from?",
definition.getDefinitionId())));
final KernelConfig kernelConfig = confManager
.findConfiguration(KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
final PhaseDefinition phaseDefinition = new PhaseDefinition();
lifecycleDefinition.addPhaseDefinition(phaseDefinition);
phaseDefinition.getLabel().addValue(defaultLocale, label);
phaseDefinition.getDescription().addValue(defaultLocale, description);
int delay = delayDays * 24 * 60 * 60;
delay += delayHours * 60 * 60;
delay += delayMinutes * 60;
phaseDefinition.setDefaultDelay(delay);
int duration = durationDays * 24 * 60 * 60;
duration += durationHours * 60 * 60;
duration += durationMinutes * 60;
phaseDefinition.setDefaultDuration(duration);
phaseDefRepo.save(phaseDefinition);
lifecycleDefRepo.save(lifecycleDefinition);
}
@Transactional(Transactional.TxType.REQUIRED)
public void updatePhaseDefinition(final PhaseDefinition definition,
final String label,
final String description,
final int delayDays,
final int delayHours,
final int delayMinutes,
final int durationDays,
final int durationHours,
final int durationMinutes) {
Objects.requireNonNull(definition, "definition can't be null");
Objects.requireNonNull(label, "label can't be null");
if (label.trim().isEmpty()) {
throw new IllegalArgumentException(String.format(
"label can't be empty."));
}
final PhaseDefinition phaseDefinition = phaseDefRepo
.findById(definition.getDefinitionId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No PhaseDefinition with ID %d in the database. "
+ "Where did that ID come from?",
definition.getDefinitionId())));
final KernelConfig kernelConfig = confManager
.findConfiguration(KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
phaseDefinition.getLabel().addValue(defaultLocale, label);
phaseDefinition.getDescription().addValue(defaultLocale, description);
int delay = delayDays * 24 * 60 * 60;
delay += delayHours * 60 * 60;
delay += delayMinutes * 60;
phaseDefinition.setDefaultDelay(delay);
int duration = durationDays * 24 * 60 * 60;
duration += durationHours * 60 * 60;
duration += durationMinutes * 60;
phaseDefinition.setDefaultDuration(duration);
phaseDefRepo.save(phaseDefinition);
}
}

View File

@ -23,11 +23,19 @@ import com.arsdigita.bebop.RequestLocal;
import org.librecms.lifecycle.LifecycleDefinition; import org.librecms.lifecycle.LifecycleDefinition;
import java.util.Optional;
public abstract class LifecycleDefinitionRequestLocal extends RequestLocal { public abstract class LifecycleDefinitionRequestLocal extends RequestLocal {
public final LifecycleDefinition getLifecycleDefinition( public final LifecycleDefinition getLifecycleDefinition(
final PageState state) { final PageState state) {
return (LifecycleDefinition) get(state);
@SuppressWarnings("unchecked")
final Optional<LifecycleDefinition> definition
= (Optional<LifecycleDefinition>) get(
state);
return definition.get();
} }
} }

View File

@ -23,16 +23,9 @@ import com.arsdigita.bebop.PageState;
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;
import com.arsdigita.kernel.KernelConfig;
import org.apache.logging.log4j.LogManager;
import org.librecms.lifecycle.LifecycleDefinition; import org.librecms.lifecycle.LifecycleDefinition;
import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager;
import org.librecms.lifecycle.LifecycleDefinitionRepository;
import java.util.Locale;
/** /**
* This class contains a form component to edit a lifecycle definition. * This class contains a form component to edit a lifecycle definition.
@ -40,20 +33,19 @@ import java.util.Locale;
* @author Jack Chung * @author Jack Chung
* @author Xixi D'Moon &lt;xdmoon@redhat.com&gt; * @author Xixi D'Moon &lt;xdmoon@redhat.com&gt;
* @author Justin Ross &lt;jross@redhat.com&gt; * @author Justin Ross &lt;jross@redhat.com&gt;
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
class LifecycleEditForm extends BaseLifecycleForm { class LifecycleEditForm extends BaseLifecycleForm {
private static final Logger LOGGER = LogManager.getLogger( private final LifecycleDefinitionRequestLocal selectedDefinition;
LifecycleEditForm.class);
private final LifecycleDefinitionRequestLocal m_definition; LifecycleEditForm(final LifecycleDefinitionRequestLocal selectedDefinition) {
LifecycleEditForm(final LifecycleDefinitionRequestLocal definition) {
super("LifecycleEdit", gz("cms.ui.lifecycle.edit")); super("LifecycleEdit", gz("cms.ui.lifecycle.edit"));
m_definition = definition; this.selectedDefinition = selectedDefinition;
m_name.addValidationListener(new NameUniqueListener(m_definition)); getLifecycleName().addValidationListener(
new LifecycleNameUniqueListener(this, selectedDefinition));
addInitListener(new InitListener()); addInitListener(new InitListener());
addProcessListener(new ProcessListener()); addProcessListener(new ProcessListener());
@ -61,13 +53,14 @@ class LifecycleEditForm extends BaseLifecycleForm {
private class InitListener implements FormInitListener { private class InitListener implements FormInitListener {
public final void init(final FormSectionEvent e) { @Override
final PageState state = e.getPageState(); public final void init(final FormSectionEvent event) {
final LifecycleDefinition cycle = m_definition final PageState state = event.getPageState();
final LifecycleDefinition cycle = selectedDefinition
.getLifecycleDefinition(state); .getLifecycleDefinition(state);
m_name.setValue(state, cycle.getLabel()); getLifecycleName().setValue(state, cycle.getLabel());
m_description.setValue(state, cycle.getDescription()); getLifecycleDescription().setValue(state, cycle.getDescription());
} }
} }
@ -78,24 +71,17 @@ class LifecycleEditForm extends BaseLifecycleForm {
public final void process(final FormSectionEvent event) public final void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final LifecycleDefinition definition = m_definition final LifecycleDefinition definition = selectedDefinition
.getLifecycleDefinition(state); .getLifecycleDefinition(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ConfigurationManager confManager = cdiUtil.findBean( final LifecycleAdminPaneController controller = cdiUtil
ConfigurationManager.class); .findBean(LifecycleAdminPaneController.class);
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
.findBean(LifecycleDefinitionRepository.class);
final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
definition.getLabel().addValue(defaultLocale, controller.updateLifecycleDefinition(
(String) m_name.getValue(state)); definition,
definition.getDescription().addValue( (String) getLifecycleName().getValue(state),
defaultLocale, (String) getLifecycleDescription().getValue(state));
(String) m_description.getValue(state));
lifecycleDefRepo.save(definition);
} }
} }

View File

@ -60,34 +60,38 @@ import java.util.Locale;
*/ */
class LifecycleItemPane extends BaseItemPane { class LifecycleItemPane extends BaseItemPane {
private final LifecycleDefinitionRequestLocal m_cycle; private final LifecycleDefinitionRequestLocal selectedLifecycle;
private final PhaseRequestLocal m_phase; private final PhaseRequestLocal selectedPhase;
private final Container m_detailPane; private final Container detailPane;
private final Table m_phases; private final Table phasesTable;
public LifecycleItemPane(final LifecycleDefinitionRequestLocal cycle, public LifecycleItemPane(
final ActionLink editLink, final LifecycleDefinitionRequestLocal selectedLifecycle,
final ActionLink deleteLink) { final ActionLink editLink,
m_cycle = cycle; final ActionLink deleteLink) {
m_phase = new SelectionRequestLocal();
m_phases = new PhaseTable(); this.selectedLifecycle = selectedLifecycle;
selectedPhase = new SelectionRequestLocal();
m_detailPane = new SimpleContainer(); phasesTable = new PhaseTable();
add(m_detailPane);
setDefault(m_detailPane);
m_detailPane.add(new SummarySection(editLink, deleteLink)); detailPane = new SimpleContainer();
add(detailPane);
setDefault(detailPane);
detailPane.add(new SummarySection(editLink, deleteLink));
final ActionLink phaseAddLink = new ActionLink(new Label(gz( final ActionLink phaseAddLink = new ActionLink(new Label(gz(
"cms.ui.lifecycle.phase_add"))); "cms.ui.lifecycle.phase_add")));
m_detailPane.add(new PhaseSection(phaseAddLink)); detailPane.add(new PhaseSection(phaseAddLink));
final AddPhaseForm phaseAddForm = new AddPhaseForm(m_cycle); final AddPhaseForm phaseAddForm = new AddPhaseForm(selectedLifecycle);
final EditPhaseForm phaseEditForm = new EditPhaseForm(m_phase); final EditPhaseForm phaseEditForm = new EditPhaseForm(selectedLifecycle,
final DeletePhaseForm phaseDeleteForm = new DeletePhaseForm(m_phase); selectedPhase);
final DeletePhaseForm phaseDeleteForm = new DeletePhaseForm(
selectedPhase);
add(phaseAddForm); add(phaseAddForm);
add(phaseEditForm); add(phaseEditForm);
@ -95,17 +99,17 @@ class LifecycleItemPane extends BaseItemPane {
connect(phaseAddLink, phaseAddForm); connect(phaseAddLink, phaseAddForm);
connect(phaseAddForm); connect(phaseAddForm);
connect(m_phases, 4, phaseEditForm); connect(phasesTable, 4, phaseEditForm);
connect(phaseEditForm, m_phases.getRowSelectionModel()); connect(phaseEditForm, phasesTable.getRowSelectionModel());
connect(m_phases, 5, phaseDeleteForm); connect(phasesTable, 5, phaseDeleteForm);
connect(phaseDeleteForm, m_phases.getRowSelectionModel()); connect(phaseDeleteForm, phasesTable.getRowSelectionModel());
} }
private class SelectionRequestLocal extends PhaseRequestLocal { private class SelectionRequestLocal extends PhaseRequestLocal {
@Override @Override
protected final Object initialValue(final PageState state) { protected final Object initialValue(final PageState state) {
final String id = m_phases.getRowSelectionModel().getSelectedKey( final String id = phasesTable.getRowSelectionModel().getSelectedKey(
state).toString(); state).toString();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
@ -136,7 +140,8 @@ class LifecycleItemPane extends BaseItemPane {
private class Properties extends PropertyList { private class Properties extends PropertyList {
@Override @Override
protected final java.util.List properties(final PageState state) { protected final java.util.List<Property> properties(
final PageState state) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ConfigurationManager confManager = cdiUtil.findBean( final ConfigurationManager confManager = cdiUtil.findBean(
@ -145,15 +150,15 @@ class LifecycleItemPane extends BaseItemPane {
KernelConfig.class); KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale(); final Locale defaultLocale = kernelConfig.getDefaultLocale();
final java.util.List props = super.properties(state); final java.util.List<Property> props = super.properties(state);
final LifecycleDefinition cycle = m_cycle final LifecycleDefinition cycle = selectedLifecycle
.getLifecycleDefinition(state); .getLifecycleDefinition(state);
props.add(new Property( props.add(new Property(
gz("cms.ui.name"), gz("cms.ui.lifecycle.name"),
cycle.getLabel().getValue(defaultLocale))); cycle.getLabel().getValue(defaultLocale)));
props.add(new Property( props.add(new Property(
gz("cms.ui.description"), gz("cms.ui.lifecycle.description"),
cycle.getDescription().getValue(defaultLocale))); cycle.getDescription().getValue(defaultLocale)));
return props; return props;
@ -171,7 +176,7 @@ class LifecycleItemPane extends BaseItemPane {
final ActionGroup group = new ActionGroup(); final ActionGroup group = new ActionGroup();
setBody(group); setBody(group);
group.setSubject(m_phases); group.setSubject(phasesTable);
group.addAction(new LifecycleAdminContainer(addLink), group.addAction(new LifecycleAdminContainer(addLink),
ActionGroup.ADD); ActionGroup.ADD);
} }
@ -179,9 +184,9 @@ class LifecycleItemPane extends BaseItemPane {
} }
// XXX fix this // XXX fix this
private static final String[] s_headers = { private static final String[] HEADERS = {
lz("cms.ui.name"), lz("cms.ui.lifecycle.phase.name"),
lz("cms.ui.description"), lz("cms.ui.lifecycle.phase.description"),
lz("cms.ui.lifecycle.phase_delay"), lz("cms.ui.lifecycle.phase_delay"),
lz("cms.ui.lifecycle.phase_duration"), lz("cms.ui.lifecycle.phase_duration"),
"", "",
@ -191,7 +196,7 @@ class LifecycleItemPane extends BaseItemPane {
private class PhaseTable extends Table { private class PhaseTable extends Table {
public PhaseTable() { public PhaseTable() {
super(new PhaseTableModelBuilder(m_cycle), s_headers); super(new PhaseTableModelBuilder(selectedLifecycle), HEADERS);
setEmptyView(new Label(gz("cms.ui.lifecycle.phase_none"))); setEmptyView(new Label(gz("cms.ui.lifecycle.phase_none")));
@ -235,7 +240,7 @@ class LifecycleItemPane extends BaseItemPane {
public final void reset(final PageState state) { public final void reset(final PageState state) {
super.reset(state); super.reset(state);
m_phases.clearSelection(state); phasesTable.clearSelection(state);
} }
} }

View File

@ -22,13 +22,23 @@ import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.list.ListModel; import com.arsdigita.bebop.list.ListModel;
import com.arsdigita.bebop.list.ListModelBuilder; import com.arsdigita.bebop.list.ListModelBuilder;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import com.arsdigita.kernel.KernelConfig;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import com.arsdigita.util.LockableImpl; import com.arsdigita.util.LockableImpl;
import org.libreccm.cdi.utils.CdiUtil;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import org.librecms.lifecycle.LifecycleDefinition; import org.librecms.lifecycle.LifecycleDefinition;
import java.util.Iterator;
import java.util.Locale;
/** /**
* Loads all the current lifecycles from the database so that they may be * Loads all the current lifecycles from the database so that they may be
* displayed in a list. * displayed in a list.
@ -38,45 +48,48 @@ import org.librecms.lifecycle.LifecycleDefinition;
* @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 LifecycleListModelBuilder extends LockableImpl public final class LifecycleListModelBuilder extends LockableImpl
implements ListModelBuilder { implements ListModelBuilder {
@Override @Override
public final ListModel makeModel(final com.arsdigita.bebop.List list, public final ListModel makeModel(final com.arsdigita.bebop.List list,
final PageState state) { final PageState state) {
return new Model(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final LifecycleAdminPaneController controller = cdiUtil
.findBean(LifecycleAdminPaneController.class);
final ContentSection section = CMS.getContext().getContentSection();
return new Model(controller.getLifecyclesForContentSection(section));
} }
private class Model implements ListModel { private class Model implements ListModel {
private final List<LifecycleDefinition> m_cycles; private final Iterator<LifecycleDefinition> iterator;
private int index = -1; private LifecycleDefinition currentLifecycleDef;
private final Locale defaultLocale;
public Model(final PageState state) { public Model(final List<LifecycleDefinition> lifecycles) {
m_cycles = getCollection(state); iterator = lifecycles.iterator();
defaultLocale = KernelConfig.getConfig().getDefaultLocale();
} }
@Override
private List<LifecycleDefinition> getCollection(final PageState state) {
final ContentSection section = CMS.getContext().getContentSection();
final List<LifecycleDefinition> cycles = section.getLifecycleDefinitions();
return cycles;
}
@Override
public boolean next() throws NoSuchElementException { public boolean next() throws NoSuchElementException {
index++; if (iterator.hasNext()) {
return index < m_cycles.size(); currentLifecycleDef = iterator.next();
return true;
} else {
return false;
}
} }
@Override @Override
public Object getElement() { public Object getElement() {
return m_cycles.get(index).getLabel(); return currentLifecycleDef.getLabel().getValue(defaultLocale);
} }
@Override @Override
public String getKey() { public String getKey() {
return Long.toString(m_cycles.get(index).getDefinitionId()); return Long.toString(currentLifecycleDef.getDefinitionId());
} }
} }
} }

View File

@ -0,0 +1,89 @@
/*
* Copyright (C) 2017 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.cms.ui.lifecycle;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.ParameterEvent;
import com.arsdigita.bebop.event.ParameterListener;
import com.arsdigita.cms.CMS;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager;
import org.librecms.CmsConstants;
import org.librecms.lifecycle.LifecycleDefinition;
import java.util.Locale;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class LifecycleNameUniqueListener implements ParameterListener {
private final BaseLifecycleForm form;
private final LifecycleDefinitionRequestLocal selectedDefinition;
protected LifecycleNameUniqueListener(final BaseLifecycleForm form) {
this.form = form;
selectedDefinition = null;
}
protected LifecycleNameUniqueListener(
final BaseLifecycleForm form,
final LifecycleDefinitionRequestLocal selectedDefinition) {
this.form = form;
this.selectedDefinition = selectedDefinition;
}
@Override
public final void validate(final ParameterEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ConfigurationManager confManager = cdiUtil
.findBean(ConfigurationManager.class);
final LifecycleAdminPaneController controller = cdiUtil
.findBean(LifecycleAdminPaneController.class);
final KernelConfig kernelConfig = confManager
.findConfiguration(KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
final String label = (String) form.getLifecycleName().getValue(state);
final java.util.List<LifecycleDefinition> definitions = controller
.getLifecyclesForContentSection(CMS.getContext().getContentSection());
for (final LifecycleDefinition definition : definitions) {
if (definition.getLabel().getValue(defaultLocale)
.equalsIgnoreCase(label)
&& (selectedDefinition == null
|| !selectedDefinition.getLifecycleDefinition(state)
.equals(definition))) {
throw new FormProcessException(new GlobalizedMessage(
"cms.ui.lifecycle.name_not_unique",
CmsConstants.CMS_BUNDLE));
}
}
}
}

View File

@ -23,10 +23,14 @@ import com.arsdigita.bebop.RequestLocal;
import org.librecms.lifecycle.PhaseDefinition; import org.librecms.lifecycle.PhaseDefinition;
import java.util.Optional;
public abstract class PhaseRequestLocal extends RequestLocal { public abstract class PhaseRequestLocal extends RequestLocal {
public final PhaseDefinition getPhase(final PageState state) { public final PhaseDefinition getPhase(final PageState state) {
return (PhaseDefinition) get(state); @SuppressWarnings("unchecked")
final Optional<PhaseDefinition> phaseDef = (Optional<PhaseDefinition>) get(state);
return phaseDef.get();
} }
} }

View File

@ -28,37 +28,45 @@ import org.librecms.lifecycle.LifecycleDefinition;
import org.librecms.lifecycle.PhaseDefinition; import org.librecms.lifecycle.PhaseDefinition;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.Assert; import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.util.LockableImpl; import com.arsdigita.util.LockableImpl;
import org.arsdigita.cms.CMSConfig; import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import java.util.Iterator;
import java.util.List; import java.util.List;
class PhaseTableModelBuilder extends LockableImpl class PhaseTableModelBuilder extends LockableImpl
implements TableModelBuilder { implements TableModelBuilder {
private final LifecycleDefinitionRequestLocal cycle;
public PhaseTableModelBuilder private final LifecycleDefinitionRequestLocal selectedLifecycle;
(final LifecycleDefinitionRequestLocal cycle) {
this.cycle = cycle; public PhaseTableModelBuilder(
final LifecycleDefinitionRequestLocal selectedLifecycle) {
this.selectedLifecycle = selectedLifecycle;
} }
@Override @Override
public final TableModel makeModel(final Table table, public final TableModel makeModel(final Table table,
final PageState state) { final PageState state) {
return new PhaseTableModel(cycle.getLifecycleDefinition(state));
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final LifecycleAdminPaneController controller = cdiUtil
.findBean(LifecycleAdminPaneController.class);
final LifecycleDefinition definition = selectedLifecycle
.getLifecycleDefinition(state);
return new PhaseTableModel(controller.getPhaseDefinitions(definition));
} }
private static class PhaseTableModel implements TableModel { private static class PhaseTableModel implements TableModel {
private final List<PhaseDefinition> phases; private final Iterator<PhaseDefinition> iterator;
private int index = -1; private PhaseDefinition currentPhaseDef;
private PhaseDefinition phase;
public PhaseTableModel(final LifecycleDefinition cycle) { public PhaseTableModel(final List<PhaseDefinition> phaseDefinitions) {
phases = cycle.getPhaseDefinitions(); iterator = phaseDefinitions.iterator();
} }
@Override @Override
@ -68,10 +76,8 @@ class PhaseTableModelBuilder extends LockableImpl
@Override @Override
public final boolean nextRow() { public final boolean nextRow() {
index++; if (iterator.hasNext()) {
if (index < phases.size()) { currentPhaseDef = iterator.next();
phase = phases.get(index);
return true; return true;
} else { } else {
return false; return false;
@ -80,40 +86,45 @@ class PhaseTableModelBuilder extends LockableImpl
@Override @Override
public final Object getElementAt(final int column) { public final Object getElementAt(final int column) {
Assert.exists(phase, "PhaseDefinition m_phase");
switch (column) { switch (column) {
case 0: case 0:
return phase.getLabel(); return currentPhaseDef
case 1: .getLabel()
return phase.getDescription(); .getValue(KernelConfig.getConfig().getDefaultLocale());
case 2: case 1:
return Duration.formatDuration(phase.getDefaultDelay()); return currentPhaseDef
case 3: .getDescription()
final Long duration = phase.getDefaultDuration(); .getValue(KernelConfig.getConfig().getDefaultLocale());
case 2:
return Duration.formatDuration(currentPhaseDef
.getDefaultDelay());
case 3:
final Long duration = currentPhaseDef.getDefaultDuration();
if (duration == null) { if (duration == 0) {
return lz("cms.ui.lifecycle.forever"); return lz("cms.ui.lifecycle.forever");
} else { } else {
return Duration.formatDuration(duration); return Duration.formatDuration(duration);
} }
case 4: case 4:
return lz("cms.ui.lifecycle.phase_edit"); return lz("cms.ui.lifecycle.phase_edit");
case 5: case 5:
return lz("cms.ui.lifecycle.phase_delete"); return lz("cms.ui.lifecycle.phase_delete");
default: default:
throw new IllegalStateException(); throw new IllegalStateException();
} }
} }
@Override @Override
public Object getKeyAt(int columnIndex) { public Object getKeyAt(final int columnIndex) {
if (phase == null) { if (currentPhaseDef == null) {
throw new IllegalStateException(); throw new IllegalStateException();
} else { } else {
return phase.getDefinitionId(); return currentPhaseDef.getDefinitionId();
} }
} }
} }
private static GlobalizedMessage gz(final String key) { private static GlobalizedMessage gz(final String key) {
@ -123,4 +134,5 @@ class PhaseTableModelBuilder extends LockableImpl
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

@ -195,15 +195,11 @@ public class LifecycleDefinition implements Serializable {
+ "definitionId = %d, " + "definitionId = %d, "
+ "label = %s, " + "label = %s, "
+ "description = %s, " + "description = %s, "
+ "defaultListener = \"%s\", "
+ "phaseDefinitions = { %s }%s"
+ " }", + " }",
super.toString(), super.toString(),
definitionId, definitionId,
Objects.toString(label), Objects.toString(label),
Objects.toString(description), Objects.toString(description),
defaultListener,
Objects.toString(phaseDefinitions),
data); data);
} }

View File

@ -181,3 +181,43 @@ cms.ui.workflow.task.role.none=This task has not been assigned to any roles
cms.ui.workflow.task.role.add=Assign this task to a role cms.ui.workflow.task.role.add=Assign this task to a role
cms.ui.workflow.task.role.delete=Remove cms.ui.workflow.task.role.delete=Remove
cms.ui.workflow.task.role.name=Role cms.ui.workflow.task.role.name=Role
cms.ui.lifecycle.intro=Select an existing lifecycle or create a new one
cms.ui.lifecycle.add=Create new lifecycle
cms.ui.lifecycle.name=Name
cms.ui.lifecycle.description=Description
cms.ui.lifecycle.details=Lifecycle details
cms.ui.category.delete_category=Delete category
cms.ui.category.edit_links=Edit links
cms.ui.category.add_a_subcategory=Add a subcategory
cms.ui.category.current_category=Current category
cms.ui.category.extreme_actions=Delete
cms.ui.category.category_purposes=Category purpose
cms.ui.category.category_information=Details
cms.ui.category.linked_categories=Linked categories
cms.ui.category.restore_default_permissions=Restore default permissions
cms.ui.category.return_to_category_info=Back to category info
cms.ui.lifecycle.edit=Edit lifecycle
cms.ui.lifecycle.delete=Delete lifecycle
cms.ui.lifecycle.delete_prompt=Are you sure to delete this lifecycle?
cms.ui.lifecycle.phases=Phases
cms.ui.lifecycle.phase_none=This lifecycle has no phases
cms.ui.lifecycle.phase_add=Add phase
cms.ui.lifecycle.phase.name=Name
cms.ui.lifecycle.phase.description=Description
cms.ui.lifecycle.phase_start_delay=Start delay
cms.ui.lifecycle.phase_days=Days
cms.ui.lifecycle.phase_hours=Hours
cms.ui.lifecycle.phase_minutes=Minutes
cms.ui.lifecycle.phase_duration=Duration
cms.ui.lifecycle.phase.add_submit=Add phase
cms.ui.lifecycle.phase.add_cancel=Cancel
cms.ui.lifecycle.phase_duration_negative=The duration must be greater than zero
cms.ui.lifecycle.phase_name_not_unique=There is already a phase with this name
cms.ui.lifecycle.phase_delay=Delay
cms.ui.lifecycle.phase_edit=Edit
cms.ui.lifecycle.phase_delete=Delete
cms.ui.lifecycle.forever=Forever
cms.ui.lifecycle.phase.edit_submit=Save
cms.ui.lifecycle.phase.edit_cancel=Cancel
cms.ui.lifecycle.phase.delete_submit=Delete
cms.ui.lifecycle.phase.delete_cancel=Cancel

View File

@ -180,3 +180,43 @@ cms.ui.workflow.task.role.none=Diese Aufgabe ist keiner Rolle zugeordnet
cms.ui.workflow.task.role.add=Diese Aufgabe einer Rolle zuordnen cms.ui.workflow.task.role.add=Diese Aufgabe einer Rolle zuordnen
cms.ui.workflow.task.role.delete=Entfernen cms.ui.workflow.task.role.delete=Entfernen
cms.ui.workflow.task.role.name=Rolle cms.ui.workflow.task.role.name=Rolle
cms.ui.lifecycle.intro=Einen Ver\u00f6ffentlichungszyklus ausw\u00e4hlen oder neu erstellen
cms.ui.lifecycle.add=Neuen Ver\u00f6ffentlichungszyklus erstellen
cms.ui.lifecycle.name=Name
cms.ui.lifecycle.description=Beschreibung
cms.ui.lifecycle.details=Ver\u00f6ffentlichungszyklus Details
cms.ui.category.delete_category=Kategorie l\u00f6schen
cms.ui.category.edit_links=Links bearbeiten
cms.ui.category.add_a_subcategory=Unterkateogorie hinzuf\u00fcgen
cms.ui.category.current_category=Aktuelle Kategorie
cms.ui.category.extreme_actions=L\u00f6schen
cms.ui.category.category_purposes=Category purpose
cms.ui.category.category_information=Details
cms.ui.category.linked_categories=Verlinkte Kategorien
cms.ui.category.restore_default_permissions=Berechtigungen zur\u00fccksetzen
cms.ui.category.return_to_category_info=Zur\u00fcck zu den Details
cms.ui.lifecycle.edit=Ver\u00f6ffentlichungszyklus bearbeiten
cms.ui.lifecycle.delete=Ver\u00f6ffentlichungszyklus l\u00f6schen
cms.ui.lifecycle.delete_prompt=Sind Sie sicher, dass Sie den ausgew\u00e4hlten Ver\u00f6ffentlichungszyklus l\u00f6schen wollen?
cms.ui.lifecycle.phases=Phasen
cms.ui.lifecycle.phase_none=Dieser Ver\u00f6ffentlichungszyklus hat keine Phasen
cms.ui.lifecycle.phase_add=Phase hinzuf\u00fcgen
cms.ui.lifecycle.phase.name=Name
cms.ui.lifecycle.phase.description=Beschreibung
cms.ui.lifecycle.phase_start_delay=Beginn verz\u00f6gert um
cms.ui.lifecycle.phase_days=Tage
cms.ui.lifecycle.phase_hours=Stunden
cms.ui.lifecycle.phase_minutes=Minuten
cms.ui.lifecycle.phase_duration=Dauer
cms.ui.lifecycle.phase.add_submit=Phase hinzuf\u00fcgen
cms.ui.lifecycle.phase.add_cancel=Abbrechen
cms.ui.lifecycle.phase_duration_negative=Die Dauer muss gr\u00f6\u00dfer als Null sein
cms.ui.lifecycle.phase_name_not_unique=Es gibt bereits eine Phase mit diesem Namen
cms.ui.lifecycle.phase_delay=Verz\u00f6gerung
cms.ui.lifecycle.phase_edit=Bearbeiten
cms.ui.lifecycle.phase_delete=L\u00f6schen
cms.ui.lifecycle.forever=Unbegrenzt
cms.ui.lifecycle.phase.edit_submit=Speichern
cms.ui.lifecycle.phase.edit_cancel=Abbrechen
cms.ui.lifecycle.phase.delete_submit=L\u00f6schen
cms.ui.lifecycle.phase.delete_cancel=Abbrechen

View File

@ -149,3 +149,33 @@ cms.ui.workflow.task.role.none=This task has not been assigned to any roles
cms.ui.workflow.task.role.add=Assign this task to a role cms.ui.workflow.task.role.add=Assign this task to a role
cms.ui.workflow.task.role.delete=Remove cms.ui.workflow.task.role.delete=Remove
cms.ui.workflow.task.role.name=Role cms.ui.workflow.task.role.name=Role
cms.ui.lifecycle.intro=Select an existing lifecycle or create a new one
cms.ui.lifecycle.add=Create new lifecycle
cms.ui.lifecycle.name=Name
cms.ui.lifecycle.description=Description
cms.ui.lifecycle.details=Lifecycle details
cms.ui.lifecycle.edit=Edit lifecycle
cms.ui.lifecycle.delete=Delete lifecycle
cms.ui.lifecycle.delete_prompt=Are you sure to delete this lifecycle?
cms.ui.lifecycle.phases=Phases
cms.ui.lifecycle.phase_none=This lifecycle has no phases
cms.ui.lifecycle.phase_add=Add phase
cms.ui.lifecycle.phase.name=Name
cms.ui.lifecycle.phase.description=Description
cms.ui.lifecycle.phase_start_delay=Start delay
cms.ui.lifecycle.phase_days=Days
cms.ui.lifecycle.phase_hours=Hours
cms.ui.lifecycle.phase_minutes=Minutes
cms.ui.lifecycle.phase_duration=Duration
cms.ui.lifecycle.phase.add_submit=Add phase
cms.ui.lifecycle.phase.add_cancel=Cancel
cms.ui.lifecycle.phase_duration_negative=The duration must be greater than zero
cms.ui.lifecycle.phase_name_not_unique=There is already a phase with this name
cms.ui.lifecycle.phase_delay=Delay
cms.ui.lifecycle.phase_edit=Edit
cms.ui.lifecycle.phase_delete=Delete
cms.ui.lifecycle.forever=Forever
cms.ui.lifecycle.phase.edit_submit=Save
cms.ui.lifecycle.phase.edit_cancel=Cancel
cms.ui.lifecycle.phase.delete_submit=Delete
cms.ui.lifecycle.phase.delete_cancel=Cancel