CCM NG/ccm-cms: Lifecycles tab
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4634 8810af33-2d31-482b-a856-94f89814c4dfccm-docs
parent
4fb0dbcb40
commit
30d36d4bff
|
|
@ -23,19 +23,15 @@ import com.arsdigita.bebop.FormProcessException;
|
|||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormValidationListener;
|
||||
import com.arsdigita.bebop.form.FormErrorDisplay;
|
||||
import com.arsdigita.bebop.form.Hidden;
|
||||
import com.arsdigita.bebop.form.Submit;
|
||||
import com.arsdigita.bebop.form.TextArea;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
||||
import com.arsdigita.bebop.parameters.IntegerParameter;
|
||||
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
|
||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
||||
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
|
||||
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
|
||||
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
||||
|
|
@ -52,11 +48,10 @@ import org.libreccm.cdi.utils.CdiUtil;
|
|||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
||||
import org.librecms.lifecycle.PhaseDefinititionRepository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* This class contains a form component to add a lifecycle phase definition.
|
||||
|
|
@ -68,7 +63,6 @@ import java.util.Locale;
|
|||
*/
|
||||
class AddPhaseForm extends CMSForm {
|
||||
|
||||
private final static String PHASE_ID = "id";
|
||||
private final static String LABEL = "label";
|
||||
private final static String DESCRIPTION = "description";
|
||||
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 CANCEL = "cancel";
|
||||
|
||||
private final LifecycleDefinitionRequestLocal m_cycle;
|
||||
private final LifecycleDefinitionRequestLocal selectedLifecycle;
|
||||
|
||||
private final Hidden m_id;
|
||||
private final TextField m_label;
|
||||
private final TextArea m_description;
|
||||
private final TextField m_delay_days;
|
||||
private final TextField m_delay_hours;
|
||||
private final TextField m_delay_minutes;
|
||||
private final TextField m_duration_days;
|
||||
private final TextField m_duration_hours;
|
||||
private final TextField m_duration_minutes;
|
||||
private final Submit m_submit;
|
||||
private final Submit m_cancel;
|
||||
private final TextField phaseLabel;
|
||||
private final TextArea phaseDescription;
|
||||
private final TextField delayDays;
|
||||
private final TextField delayHours;
|
||||
private final TextField delayMinutes;
|
||||
private final TextField durationDays;
|
||||
private final TextField durationHours;
|
||||
private final TextField durationMinutes;
|
||||
private final Submit submit;
|
||||
private final Submit cancel;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
|
|
@ -101,112 +94,98 @@ class AddPhaseForm extends CMSForm {
|
|||
* cycle definition is selected since phase definitions are
|
||||
* associated to cycle definitions
|
||||
*/
|
||||
public AddPhaseForm(final LifecycleDefinitionRequestLocal cycle) {
|
||||
public AddPhaseForm(final LifecycleDefinitionRequestLocal selectedLifecycle) {
|
||||
super("LifecyclePhaseDefinition");
|
||||
|
||||
m_cycle = cycle;
|
||||
this.selectedLifecycle = selectedLifecycle;
|
||||
|
||||
m_id = new Hidden(new BigDecimalParameter(PHASE_ID));
|
||||
add(m_id);
|
||||
m_id.addValidationListener(new NotNullValidationListener());
|
||||
|
||||
Label heading = new Label(gz("cms.ui.lifecycle.phase_add"));
|
||||
final Label heading = new Label(gz("cms.ui.lifecycle.phase_add"));
|
||||
heading.setFontWeight(Label.BOLD);
|
||||
add(heading, ColumnPanel.FULL_WIDTH);
|
||||
add(new FormErrorDisplay(this), ColumnPanel.FULL_WIDTH);
|
||||
|
||||
add(new Label(gz("cms.ui.name")));
|
||||
m_label = new TextField(new TrimmedStringParameter(LABEL));
|
||||
m_label.addValidationListener(new NotEmptyValidationListener());
|
||||
m_label.setSize(40);
|
||||
m_label.setMaxLength(1000);
|
||||
add(m_label);
|
||||
add(new Label(gz("cms.ui.lifecycle.phase.name")));
|
||||
phaseLabel = new TextField(new TrimmedStringParameter(LABEL));
|
||||
phaseLabel.addValidationListener(new NotEmptyValidationListener());
|
||||
phaseLabel.setSize(40);
|
||||
phaseLabel.setMaxLength(1000);
|
||||
add(phaseLabel);
|
||||
|
||||
add(new Label(gz("cms.ui.description")));
|
||||
m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
||||
m_description.addValidationListener(new StringLengthValidationListener(
|
||||
add(new Label(gz("cms.ui.lifecycle.phase.description")));
|
||||
phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
||||
phaseDescription.addValidationListener(
|
||||
new StringLengthValidationListener(
|
||||
4000));
|
||||
m_description.setCols(40);
|
||||
m_description.setRows(5);
|
||||
m_description.setWrap(TextArea.SOFT);
|
||||
add(m_description);
|
||||
phaseDescription.setCols(40);
|
||||
phaseDescription.setRows(5);
|
||||
phaseDescription.setWrap(TextArea.SOFT);
|
||||
add(phaseDescription);
|
||||
|
||||
// phase delay
|
||||
add(new Label(gz("cms.ui.lifecycle.phase_start_delay")));
|
||||
m_delay_days = new TextField(new IntegerParameter(DELAY_DAYS));
|
||||
m_delay_hours = new TextField(new IntegerParameter(DELAY_HOURS));
|
||||
m_delay_minutes = new TextField(new IntegerParameter(DELAY_MINUTES));
|
||||
delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
|
||||
delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
|
||||
delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
|
||||
|
||||
//max value: days: 60 years, hours: 7 days, minutes: 1 day
|
||||
m_delay_days.addValidationListener(
|
||||
delayDays.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 21900));
|
||||
m_delay_hours.addValidationListener(new NumberInRangeValidationListener(
|
||||
delayHours.addValidationListener(new NumberInRangeValidationListener(
|
||||
0, 168));
|
||||
m_delay_minutes.addValidationListener(
|
||||
delayMinutes.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 1440));
|
||||
m_delay_days.setSize(7);
|
||||
m_delay_hours.setSize(7);
|
||||
m_delay_minutes.setSize(7);
|
||||
m_delay_days.setClassAttr("DaysField");
|
||||
m_delay_hours.setClassAttr("HoursField");
|
||||
m_delay_minutes.setClassAttr("MinutesField");
|
||||
delayDays.setSize(7);
|
||||
delayHours.setSize(7);
|
||||
delayMinutes.setSize(7);
|
||||
delayDays.setClassAttr("DaysField");
|
||||
delayHours.setClassAttr("HoursField");
|
||||
delayMinutes.setClassAttr("MinutesField");
|
||||
|
||||
SimpleContainer de = new SimpleContainer();
|
||||
de.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
||||
de.add(m_delay_days);
|
||||
de.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
||||
de.add(m_delay_hours);
|
||||
de.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
|
||||
de.add(m_delay_minutes);
|
||||
add(de);
|
||||
final SimpleContainer delayContainer = new SimpleContainer();
|
||||
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
||||
delayContainer.add(delayDays);
|
||||
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
||||
delayContainer.add(delayHours);
|
||||
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
|
||||
delayContainer.add(delayMinutes);
|
||||
add(delayContainer);
|
||||
|
||||
// phase duration
|
||||
add(new Label(gz("cms.ui.lifecycle.phase_duration")));
|
||||
m_duration_days = new TextField(new IntegerParameter(DURATION_DAYS));
|
||||
m_duration_hours = new TextField(new IntegerParameter(DURATION_HOURS));
|
||||
m_duration_minutes = new TextField(
|
||||
durationDays = new TextField(new IntegerParameter(DURATION_DAYS));
|
||||
durationHours = new TextField(new IntegerParameter(DURATION_HOURS));
|
||||
durationMinutes = new TextField(
|
||||
new IntegerParameter(DURATION_MINUTES));
|
||||
|
||||
//max value: days: 60 years, hours: 7 days, minutes: 1 day
|
||||
m_duration_days.addValidationListener(
|
||||
durationDays.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 21900));
|
||||
m_duration_hours.addValidationListener(
|
||||
durationHours.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 168));
|
||||
m_duration_minutes.addValidationListener(
|
||||
durationMinutes.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 1440));
|
||||
m_duration_days.setSize(7);
|
||||
m_duration_hours.setSize(7);
|
||||
m_duration_minutes.setSize(7);
|
||||
m_duration_days.setClassAttr("DaysField");
|
||||
m_duration_hours.setClassAttr("HoursField");
|
||||
m_duration_minutes.setClassAttr("MinutesField");
|
||||
durationDays.setSize(7);
|
||||
durationHours.setSize(7);
|
||||
durationMinutes.setSize(7);
|
||||
durationDays.setClassAttr("DaysField");
|
||||
durationHours.setClassAttr("HoursField");
|
||||
durationMinutes.setClassAttr("MinutesField");
|
||||
|
||||
SimpleContainer du = new SimpleContainer();
|
||||
du.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
||||
du.add(m_duration_days);
|
||||
du.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
||||
du.add(m_duration_hours);
|
||||
du.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
|
||||
du.add(m_duration_minutes);
|
||||
add(du);
|
||||
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);
|
||||
|
||||
SimpleContainer s = new SimpleContainer();
|
||||
m_submit = new Submit(SUBMIT);
|
||||
m_submit.setButtonLabel("Add Phase");
|
||||
s.add(m_submit);
|
||||
m_cancel = new Submit(CANCEL);
|
||||
m_cancel.setButtonLabel("Cancel");
|
||||
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());
|
||||
}
|
||||
|
||||
});
|
||||
final SimpleContainer submitCancel = new SimpleContainer();
|
||||
submit = new Submit(SUBMIT, gz("cms.ui.lifecycle.phase.add_submit"));
|
||||
submitCancel.add(submit);
|
||||
cancel = new Submit(CANCEL, gz("cms.ui.lifecycle.phase.add_cancel"));
|
||||
submitCancel.add(cancel);
|
||||
add(submitCancel, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
|
||||
|
||||
addSubmissionListener(new FormSecurityListener(
|
||||
AdminPrivileges.ADMINISTER_LIFECYLES));
|
||||
|
|
@ -225,6 +204,7 @@ class AddPhaseForm extends CMSForm {
|
|||
|
||||
addProcessListener(new FormProcessListener() {
|
||||
|
||||
@Override
|
||||
public final void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
addPhase(event.getPageState());
|
||||
|
|
@ -244,26 +224,7 @@ class AddPhaseForm extends CMSForm {
|
|||
*/
|
||||
@Override
|
||||
public boolean isCancelled(final PageState state) {
|
||||
return m_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);
|
||||
// }
|
||||
// }
|
||||
return cancel.isSelected(state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -274,39 +235,40 @@ class AddPhaseForm extends CMSForm {
|
|||
* @pre state != null
|
||||
*/
|
||||
protected void addPhase(final PageState state) throws FormProcessException {
|
||||
final String label = (String) m_label.getValue(state);
|
||||
final String description = (String) m_description.getValue(state);
|
||||
final Integer delDays = (Integer) m_delay_days.getValue(state);
|
||||
final Integer delHours = (Integer) m_delay_hours.getValue(state);
|
||||
final Integer delMinutes = (Integer) m_delay_minutes.getValue(state);
|
||||
final Integer durDays = (Integer) m_duration_days.getValue(state);
|
||||
final Integer durHours = (Integer) m_duration_hours.getValue(state);
|
||||
final Integer durMinutes = (Integer) m_duration_minutes.getValue(state);
|
||||
final String label = (String) phaseLabel.getValue(state);
|
||||
final String description = (String) phaseDescription.getValue(state);
|
||||
final int delDays = (int) Optional
|
||||
.ofNullable(delayDays.getValue(state))
|
||||
.orElseGet(() -> 0);
|
||||
final int delHours = (int) Optional
|
||||
.ofNullable(delayHours.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 LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil.findBean(
|
||||
LifecycleDefinitionRepository.class);
|
||||
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
|
||||
PhaseDefinititionRepository.class);
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
||||
KernelConfig.class);
|
||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
||||
|
||||
// Check if the object already exists for double click protection.
|
||||
final PhaseDefinition phaseDef = new PhaseDefinition();
|
||||
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);
|
||||
final LifecycleAdminPaneController controller = cdiUtil
|
||||
.findBean(LifecycleAdminPaneController.class);
|
||||
controller.addPhaseDefinition(
|
||||
selectedLifecycle.getLifecycleDefinition(state),
|
||||
label,
|
||||
description,
|
||||
delDays,
|
||||
delHours,
|
||||
delMinutes,
|
||||
durDays,
|
||||
durHours,
|
||||
durMinutes);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -316,29 +278,36 @@ class AddPhaseForm extends CMSForm {
|
|||
*
|
||||
* @pre state != null
|
||||
*/
|
||||
protected void validateUniqueName(PageState state)
|
||||
protected void validateUniqueName(final PageState state)
|
||||
throws FormProcessException {
|
||||
String label = (String) m_label.getValue(state);
|
||||
|
||||
final LifecycleDefinition cycleDef = m_cycle.getLifecycleDefinition(
|
||||
state);
|
||||
final List<PhaseDefinition> phaseDefs = cycleDef.getPhaseDefinitions();
|
||||
final String label = (String) phaseLabel.getValue(state);
|
||||
|
||||
final LifecycleDefinition cycleDef = selectedLifecycle
|
||||
.getLifecycleDefinition(state);
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final LifecycleAdminPaneController controller = cdiUtil
|
||||
.findBean(LifecycleAdminPaneController.class);
|
||||
final List<PhaseDefinition> phaseDefs = controller
|
||||
.getPhaseDefinitions(cycleDef);
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
||||
KernelConfig.class);
|
||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
||||
|
||||
for (final PhaseDefinition phaseDef : phaseDefs) {
|
||||
if (phaseDef.getLabel().getValue(defaultLocale).equalsIgnoreCase(
|
||||
label)) {
|
||||
final boolean duplicateLabel = phaseDefs
|
||||
.stream()
|
||||
.map(phaseDef -> phaseDef.getLabel().getValue(defaultLocale))
|
||||
.anyMatch(phaseDefLabel -> phaseDefLabel.equalsIgnoreCase(label));
|
||||
|
||||
if (duplicateLabel) {
|
||||
throw new FormProcessException(new GlobalizedMessage(
|
||||
"cms.ui.lifecycle.phase_name_not_unique",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the phase duration. The duration cannot be 0.
|
||||
|
|
@ -347,11 +316,12 @@ class AddPhaseForm extends CMSForm {
|
|||
*
|
||||
* @pre state != null
|
||||
*/
|
||||
protected void validateDuration(PageState state)
|
||||
protected void validateDuration(final PageState state)
|
||||
throws FormProcessException {
|
||||
Integer durDays = (Integer) m_duration_days.getValue(state);
|
||||
Integer durHours = (Integer) m_duration_hours.getValue(state);
|
||||
Integer durMinutes = (Integer) m_duration_minutes.getValue(state);
|
||||
|
||||
final Integer durDays = (Integer) durationDays.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.
|
||||
if (durDays == null && durHours == null && durMinutes == null) {
|
||||
|
|
@ -360,19 +330,19 @@ class AddPhaseForm extends CMSForm {
|
|||
|
||||
int days, hours, minutes;
|
||||
if (durDays != null) {
|
||||
days = durDays.intValue();
|
||||
days = durDays;
|
||||
} else {
|
||||
days = 0;
|
||||
}
|
||||
|
||||
if (durHours != null) {
|
||||
hours = durHours.intValue();
|
||||
hours = durHours;
|
||||
} else {
|
||||
hours = 0;
|
||||
}
|
||||
|
||||
if (durMinutes != null) {
|
||||
minutes = durMinutes.intValue();
|
||||
minutes = durMinutes;
|
||||
} else {
|
||||
minutes = 0;
|
||||
}
|
||||
|
|
@ -389,8 +359,4 @@ class AddPhaseForm extends CMSForm {
|
|||
CmsConstants.CMS_BUNDLE);
|
||||
}
|
||||
|
||||
private static String lz(final String key) {
|
||||
return (String) gz(key).localize();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,29 +18,17 @@
|
|||
*/
|
||||
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.TextField;
|
||||
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
|
||||
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
|
||||
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
||||
import com.arsdigita.cms.CMS;
|
||||
|
||||
import com.arsdigita.cms.ui.BaseForm;
|
||||
import com.arsdigita.cms.ui.FormSecurityListener;
|
||||
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.lifecycle.LifecycleDefinition;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:jross@redhat.com">Justin Ross</a>
|
||||
|
|
@ -48,27 +36,28 @@ import java.util.Locale;
|
|||
*/
|
||||
class BaseLifecycleForm extends BaseForm {
|
||||
|
||||
final TextField m_name;
|
||||
final TextArea m_description;
|
||||
private final TextField lifecycleName;
|
||||
private final TextArea lifecycleDescription;
|
||||
|
||||
BaseLifecycleForm(final String key, final GlobalizedMessage message) {
|
||||
super(key, message);
|
||||
|
||||
m_name = new TextField(new TrimmedStringParameter("label"));
|
||||
addField(gz("cms.ui.name"), m_name);
|
||||
lifecycleName = new TextField(new TrimmedStringParameter("label"));
|
||||
addField(gz("cms.ui.lifecycle.name"), lifecycleName);
|
||||
|
||||
m_name.addValidationListener(new NotEmptyValidationListener());
|
||||
m_name.setSize(40);
|
||||
m_name.setMaxLength(1000);
|
||||
lifecycleName.addValidationListener(new NotEmptyValidationListener());
|
||||
lifecycleName.setSize(40);
|
||||
lifecycleName.setMaxLength(1000);
|
||||
|
||||
m_description = new TextArea(new TrimmedStringParameter("description"));
|
||||
addField(gz("cms.ui.description"), m_description);
|
||||
lifecycleDescription = new TextArea(
|
||||
new TrimmedStringParameter("description"));
|
||||
addField(gz("cms.ui.lifecycle.description"), lifecycleDescription);
|
||||
|
||||
m_description.addValidationListener(new StringLengthValidationListener(
|
||||
4000));
|
||||
m_description.setCols(40);
|
||||
m_description.setRows(5);
|
||||
m_description.setWrap(TextArea.SOFT);
|
||||
lifecycleDescription.addValidationListener(
|
||||
new StringLengthValidationListener(4000));
|
||||
lifecycleDescription.setCols(40);
|
||||
lifecycleDescription.setRows(5);
|
||||
lifecycleDescription.setWrap(TextArea.SOFT);
|
||||
|
||||
addAction(new Finish());
|
||||
addAction(new Cancel());
|
||||
|
|
@ -77,43 +66,12 @@ class BaseLifecycleForm extends BaseForm {
|
|||
AdminPrivileges.ADMINISTER_LIFECYLES));
|
||||
}
|
||||
|
||||
class NameUniqueListener implements ParameterListener {
|
||||
|
||||
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 TextField getLifecycleName() {
|
||||
return lifecycleName;
|
||||
}
|
||||
|
||||
protected TextArea getLifecycleDescription() {
|
||||
return lifecycleDescription;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,19 +28,20 @@ import com.arsdigita.bebop.event.FormProcessListener;
|
|||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.form.Hidden;
|
||||
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 org.librecms.lifecycle.PhaseDefinition;
|
||||
|
||||
import com.arsdigita.cms.ui.CMSForm;
|
||||
import com.arsdigita.cms.ui.FormSecurityListener;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||
import org.librecms.lifecycle.PhaseDefinititionRepository;
|
||||
|
||||
|
||||
/**
|
||||
* This class handles the deleting of a phase definition.
|
||||
*
|
||||
|
|
@ -50,35 +51,40 @@ import org.librecms.lifecycle.PhaseDefinititionRepository;
|
|||
class DeletePhaseForm extends CMSForm
|
||||
implements FormProcessListener, FormInitListener {
|
||||
|
||||
private final PhaseRequestLocal m_phase;
|
||||
private final PhaseRequestLocal selectedPhaseDef;
|
||||
|
||||
private final Hidden m_id;
|
||||
private final Submit m_deleteWidget;
|
||||
private final Submit m_cancelWidget;
|
||||
private final Hidden selectedPhaseDefId;
|
||||
private final Submit deleteWidget;
|
||||
private final Submit cancelWidget;
|
||||
|
||||
/**
|
||||
* @param m The phase selection model. This tells the form which phase
|
||||
* definition is selected.
|
||||
*/
|
||||
public DeletePhaseForm(final PhaseRequestLocal phase) {
|
||||
public DeletePhaseForm(final PhaseRequestLocal selectedPhaseDef) {
|
||||
super("PhaseDefinitionDelete");
|
||||
|
||||
m_phase = phase;
|
||||
this.selectedPhaseDef = selectedPhaseDef;
|
||||
|
||||
m_id = new Hidden(new BigDecimalParameter("id"));
|
||||
add(m_id);
|
||||
m_id.addValidationListener(new NotNullValidationListener());
|
||||
selectedPhaseDefId = new Hidden(new LongParameter("id"));
|
||||
add(selectedPhaseDefId);
|
||||
selectedPhaseDefId
|
||||
.addValidationListener(new NotNullValidationListener());
|
||||
|
||||
final BoxPanel buttons = new BoxPanel(BoxPanel.HORIZONTAL);
|
||||
m_deleteWidget = new Submit("delete");
|
||||
m_deleteWidget.setButtonLabel("Delete");
|
||||
m_deleteWidget.setClassAttr("deletePhase");
|
||||
buttons.add(m_deleteWidget);
|
||||
deleteWidget = new Submit("delete",
|
||||
new GlobalizedMessage(
|
||||
"cms.ui.lifecycle.phase.delete_submit",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
deleteWidget.setClassAttr("deletePhase");
|
||||
buttons.add(deleteWidget);
|
||||
|
||||
m_cancelWidget = new Submit("cancel");
|
||||
m_cancelWidget.setButtonLabel("Cancel");
|
||||
m_cancelWidget.setClassAttr("canceldeletePhase");
|
||||
buttons.add(m_cancelWidget);
|
||||
cancelWidget = new Submit("cancel",
|
||||
new GlobalizedMessage(
|
||||
"cms.ui.lifecycle.phase.delete_cancel",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
cancelWidget.setClassAttr("canceldeletePhase");
|
||||
buttons.add(cancelWidget);
|
||||
|
||||
add(buttons, ColumnPanel.CENTER | ColumnPanel.FULL_WIDTH);
|
||||
|
||||
|
|
@ -99,7 +105,7 @@ class DeletePhaseForm extends CMSForm
|
|||
*/
|
||||
@Override
|
||||
public boolean isCancelled(final PageState state) {
|
||||
return m_cancelWidget.isSelected(state);
|
||||
return cancelWidget.isSelected(state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -112,8 +118,9 @@ class DeletePhaseForm extends CMSForm
|
|||
@Override
|
||||
public final void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
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 PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
|
||||
|
|
@ -138,9 +145,10 @@ class DeletePhaseForm extends CMSForm
|
|||
final FormData data = event.getFormData();
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,9 +49,11 @@ import org.libreccm.cdi.utils.CdiUtil;
|
|||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.librecms.CmsConstants;
|
||||
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.Optional;
|
||||
|
||||
/**
|
||||
* This class contains a form component to edit a lifecycle phase definition.
|
||||
|
|
@ -63,7 +65,6 @@ import java.util.Locale;
|
|||
*/
|
||||
class EditPhaseForm extends CMSForm {
|
||||
|
||||
private final static String PHASE_ID = "id";
|
||||
private final static String LABEL = "label";
|
||||
private final static String DESCRIPTION = "description";
|
||||
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 CANCEL = "cancel";
|
||||
|
||||
private final PhaseRequestLocal m_phase;
|
||||
private final LifecycleDefinitionRequestLocal selectedLifecycle;
|
||||
private final PhaseRequestLocal selectedPhase;
|
||||
|
||||
private final TextField m_label;
|
||||
private final TextArea m_description;
|
||||
private final TextField m_delayDays;
|
||||
private final TextField m_delayHours;
|
||||
private final TextField m_delayMinutes;
|
||||
private final TextField m_durDays;
|
||||
private final TextField m_durHours;
|
||||
private final TextField m_durMinutes;
|
||||
private final Submit m_submit;
|
||||
private final Submit m_cancel;
|
||||
private final TextField phaseLabel;
|
||||
private final TextArea phaseDescription;
|
||||
private final TextField delayDays;
|
||||
private final TextField delayHours;
|
||||
private final TextField delayMinutes;
|
||||
private final TextField durationDays;
|
||||
private final TextField durationHours;
|
||||
private final TextField durationMinutes;
|
||||
private final Submit submit;
|
||||
private final Submit cancel;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
|
|
@ -96,100 +98,106 @@ class EditPhaseForm extends CMSForm {
|
|||
*
|
||||
* @pre phases != null
|
||||
*/
|
||||
public EditPhaseForm(final PhaseRequestLocal phase) {
|
||||
public EditPhaseForm(
|
||||
final LifecycleDefinitionRequestLocal selectedLifecycle,
|
||||
final PhaseRequestLocal selectedPhase) {
|
||||
|
||||
super("EditPhaseDefinition");
|
||||
|
||||
m_phase = phase;
|
||||
this.selectedLifecycle = selectedLifecycle;
|
||||
this.selectedPhase = selectedPhase;
|
||||
|
||||
add(new Label());
|
||||
add(new FormErrorDisplay(this));
|
||||
|
||||
add(new Label(gz("cms.ui.name")));
|
||||
m_label = new TextField(new TrimmedStringParameter(LABEL));
|
||||
m_label.addValidationListener(new NotEmptyValidationListener());
|
||||
m_label.setSize(40);
|
||||
m_label.setMaxLength(1000);
|
||||
add(m_label);
|
||||
add(new Label(gz("cms.ui.lifecycle.phase.name")));
|
||||
phaseLabel = new TextField(new TrimmedStringParameter(LABEL));
|
||||
phaseLabel.addValidationListener(new NotEmptyValidationListener());
|
||||
phaseLabel.setSize(40);
|
||||
phaseLabel.setMaxLength(1000);
|
||||
add(phaseLabel);
|
||||
|
||||
add(new Label(gz("cms.ui.description")));
|
||||
m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
||||
m_description.addValidationListener(new StringLengthValidationListener(
|
||||
add(new Label(gz("cms.ui.lifecycle.phase.description")));
|
||||
phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
||||
phaseDescription.addValidationListener(
|
||||
new StringLengthValidationListener(
|
||||
4000));
|
||||
m_description.setCols(40);
|
||||
m_description.setRows(5);
|
||||
m_description.setWrap(TextArea.SOFT);
|
||||
add(m_description);
|
||||
phaseDescription.setCols(40);
|
||||
phaseDescription.setRows(5);
|
||||
phaseDescription.setWrap(TextArea.SOFT);
|
||||
add(phaseDescription);
|
||||
|
||||
// Phase duration
|
||||
// Max value: days: 60 years, hours: 7 days, minutes: 1 day
|
||||
m_delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
|
||||
m_delayDays.addValidationListener(new NumberInRangeValidationListener(0,
|
||||
delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
|
||||
delayDays.addValidationListener(new NumberInRangeValidationListener(0,
|
||||
21900));
|
||||
m_delayDays.setSize(7);
|
||||
m_delayDays.setClassAttr("DaysField");
|
||||
delayDays.setSize(7);
|
||||
delayDays.setClassAttr("DaysField");
|
||||
|
||||
m_delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
|
||||
m_delayHours.addValidationListener(
|
||||
delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
|
||||
delayHours.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 168));
|
||||
m_delayHours.setClassAttr("HoursField");
|
||||
m_delayHours.setSize(7);
|
||||
delayHours.setClassAttr("HoursField");
|
||||
delayHours.setSize(7);
|
||||
|
||||
m_delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
|
||||
m_delayMinutes.addValidationListener(
|
||||
delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
|
||||
delayMinutes.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 1440));
|
||||
m_delayMinutes.setSize(7);
|
||||
m_delayMinutes.setClassAttr("MinutesField");
|
||||
delayMinutes.setSize(7);
|
||||
delayMinutes.setClassAttr("MinutesField");
|
||||
|
||||
add(new Label(new GlobalizedMessage("cms.ui.lifecycle.start_delay",
|
||||
add(new Label(
|
||||
new GlobalizedMessage("cms.ui.lifecycle.phase_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);
|
||||
final SimpleContainer delayContainer = new SimpleContainer();
|
||||
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
||||
delayContainer.add(delayDays);
|
||||
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
||||
delayContainer.add(delayHours);
|
||||
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
|
||||
m_durDays = new TextField(new IntegerParameter(DURATION_DAYS));
|
||||
m_durDays.addValidationListener(new NumberInRangeValidationListener(0,
|
||||
durationDays = new TextField(new IntegerParameter(DURATION_DAYS));
|
||||
durationDays.addValidationListener(
|
||||
new NumberInRangeValidationListener(0,
|
||||
21900));
|
||||
m_durDays.setSize(7);
|
||||
m_durDays.setClassAttr("DaysField");
|
||||
durationDays.setSize(7);
|
||||
durationDays.setClassAttr("DaysField");
|
||||
|
||||
m_durHours = new TextField(new IntegerParameter(DURATION_HOURS));
|
||||
m_durHours.addValidationListener(new NumberInRangeValidationListener(0,
|
||||
durationHours = new TextField(new IntegerParameter(DURATION_HOURS));
|
||||
durationHours.addValidationListener(new NumberInRangeValidationListener(
|
||||
0,
|
||||
168));
|
||||
m_durHours.setSize(7);
|
||||
m_durHours.setClassAttr("HoursField");
|
||||
durationHours.setSize(7);
|
||||
durationHours.setClassAttr("HoursField");
|
||||
|
||||
m_durMinutes = new TextField(new IntegerParameter(DURATION_MINUTES));
|
||||
m_durMinutes.addValidationListener(
|
||||
durationMinutes = new TextField(new IntegerParameter(DURATION_MINUTES));
|
||||
durationMinutes.addValidationListener(
|
||||
new NumberInRangeValidationListener(0, 1440));
|
||||
m_durMinutes.setSize(7);
|
||||
m_durMinutes.setClassAttr("MinutesField");
|
||||
durationMinutes.setSize(7);
|
||||
durationMinutes.setClassAttr("MinutesField");
|
||||
|
||||
add(new Label(gz("cms.ui.lifecycle.duration")));
|
||||
SimpleContainer du = new SimpleContainer();
|
||||
du.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
||||
du.add(m_durDays);
|
||||
du.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
||||
du.add(m_durHours);
|
||||
du.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
|
||||
du.add(m_durMinutes);
|
||||
add(du);
|
||||
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
|
||||
SimpleContainer s = new SimpleContainer();
|
||||
m_submit = new Submit(SUBMIT);
|
||||
m_submit.setButtonLabel("Edit Phase");
|
||||
s.add(m_submit);
|
||||
m_cancel = new Submit(CANCEL);
|
||||
m_cancel.setButtonLabel("Cancel");
|
||||
s.add(m_cancel);
|
||||
add(s, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
|
||||
final SimpleContainer submitCancelContainer = new SimpleContainer();
|
||||
submit = new Submit(SUBMIT, gz("cms.ui.lifecycle.phase.edit_submit"));
|
||||
submitCancelContainer.add(submit);
|
||||
cancel = new Submit(CANCEL, gz("cms.ui.lifecycle.phase.edit_cancel"));
|
||||
submitCancelContainer.add(cancel);
|
||||
add(submitCancelContainer, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
|
||||
|
||||
// Add form listeners.
|
||||
addInitListener(new FormInitListener() {
|
||||
|
|
@ -240,7 +248,7 @@ class EditPhaseForm extends CMSForm {
|
|||
*/
|
||||
@Override
|
||||
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)
|
||||
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());
|
||||
m_delayDays.setValue(state, delay[0]);
|
||||
m_delayHours.setValue(state, delay[1]);
|
||||
m_delayMinutes.setValue(state, delay[2]);
|
||||
final Locale defaultLocale = KernelConfig.getConfig().getDefaultLocale();
|
||||
|
||||
Long duration = pd.getDefaultDuration();
|
||||
if (duration != null) {
|
||||
Long[] dhm = Duration.formatDHM(duration);
|
||||
m_durDays.setValue(state, dhm[0]);
|
||||
m_durHours.setValue(state, dhm[1]);
|
||||
m_durMinutes.setValue(state, dhm[2]);
|
||||
final PhaseDefinition phaseDef = selectedPhase.getPhase(state);
|
||||
phaseLabel.setValue(state, phaseDef.getLabel().getValue(defaultLocale));
|
||||
phaseDescription.setValue(state,
|
||||
phaseDef
|
||||
.getDescription()
|
||||
.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)
|
||||
throws FormProcessException {
|
||||
|
||||
final String label = (String) m_label.getValue(state);
|
||||
final String description = (String) m_description.getValue(state);
|
||||
final Integer delayDays = (Integer) m_delayDays.getValue(state);
|
||||
final Integer delayHours = (Integer) m_delayHours.getValue(state);
|
||||
final Integer delayMinutes = (Integer) m_delayMinutes.getValue(state);
|
||||
final Integer durDays = (Integer) m_durDays.getValue(state);
|
||||
final Integer durHours = (Integer) m_durHours.getValue(state);
|
||||
final Integer durMinutes = (Integer) m_durMinutes.getValue(state);
|
||||
final String label = (String) phaseLabel.getValue(state);
|
||||
final String description = (String) phaseDescription.getValue(state);
|
||||
final int delDays = (int) Optional
|
||||
.ofNullable(delayDays.getValue(state))
|
||||
.orElseGet(() -> 0);
|
||||
final int delHours = (int) Optional
|
||||
.ofNullable(delayHours.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 ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
|
||||
PhaseDefinititionRepository.class);
|
||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
||||
KernelConfig.class);
|
||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
||||
final LifecycleAdminPaneController controller = cdiUtil
|
||||
.findBean(LifecycleAdminPaneController.class);
|
||||
|
||||
final PhaseDefinition phaseDefinition = m_phase.getPhase(state);
|
||||
phaseDefinition.getLabel().addValue(defaultLocale, label);
|
||||
phaseDefinition.getDescription().addValue(defaultLocale, description);
|
||||
phaseDefinition.setDefaultDelay(delayDays * delayHours * delayMinutes
|
||||
* 60);
|
||||
phaseDefinition.setDefaultDuration(durDays * durHours * durMinutes * 60);
|
||||
phaseDefRepo.save(phaseDefinition);
|
||||
controller.updatePhaseDefinition(selectedPhase.getPhase(state),
|
||||
label,
|
||||
description,
|
||||
delDays,
|
||||
delHours,
|
||||
delMinutes,
|
||||
durDays,
|
||||
durHours,
|
||||
durMinutes);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -318,24 +341,46 @@ class EditPhaseForm extends CMSForm {
|
|||
*/
|
||||
private void validateUniqueName(final PageState state)
|
||||
throws FormProcessException {
|
||||
final String newLabel = (String) m_label.getValue(state);
|
||||
|
||||
// PhaseDefinition pd = m_phase.getPhase(state);
|
||||
// PhaseDefinitionCollection phaseDefs = pd.getLifecycleDefinition()
|
||||
// .getPhaseDefinitions();
|
||||
//
|
||||
// // If the name has changed, check for uniqueness.
|
||||
// if (!pd.getLabel().equalsIgnoreCase(newLabel)) {
|
||||
// while (phaseDefs.next()) {
|
||||
// PhaseDefinition phaseDef = phaseDefs.getPhaseDefinition();
|
||||
//
|
||||
// if (phaseDef.getLabel().equalsIgnoreCase(newLabel)) {
|
||||
// phaseDefs.close();
|
||||
// throw new FormProcessException(GlobalizationUtil.globalize(
|
||||
// "cms.ui.lifecycle.phase_name_not_unique"));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
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 oldLabel = selectedPhase
|
||||
.getPhase(state)
|
||||
.getLabel()
|
||||
.getValue(defaultLocale);
|
||||
final String newLabel = (String) phaseLabel.getValue(state);
|
||||
|
||||
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
|
||||
*
|
||||
* @pre state != null
|
||||
*
|
||||
*/
|
||||
private void validateDuration(final PageState state)
|
||||
throws FormProcessException {
|
||||
final Integer durDays = (Integer) m_durDays.getValue(state);
|
||||
final Integer durHours = (Integer) m_durHours.getValue(state);
|
||||
final Integer durMinutes = (Integer) m_durMinutes.getValue(state);
|
||||
|
||||
final Integer durDays = (Integer) durationDays.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.
|
||||
if (durDays == null && durHours == null && durMinutes == null) {
|
||||
|
|
@ -357,22 +403,22 @@ class EditPhaseForm extends CMSForm {
|
|||
}
|
||||
|
||||
int days, hours, minutes;
|
||||
if (durDays != null) {
|
||||
days = durDays.intValue();
|
||||
} else {
|
||||
if (durDays == null) {
|
||||
days = 0;
|
||||
} else {
|
||||
days = durDays;
|
||||
}
|
||||
|
||||
if (durHours != null) {
|
||||
hours = durHours.intValue();
|
||||
} else {
|
||||
if (durHours == null) {
|
||||
hours = 0;
|
||||
} else {
|
||||
hours = durHours;
|
||||
}
|
||||
|
||||
if (durMinutes != null) {
|
||||
minutes = durMinutes.intValue();
|
||||
} else {
|
||||
if (durMinutes == null) {
|
||||
minutes = 0;
|
||||
} else {
|
||||
minutes = durMinutes;
|
||||
}
|
||||
|
||||
if ((days + hours + minutes) == 0) {
|
||||
|
|
@ -386,8 +432,4 @@ class EditPhaseForm extends CMSForm {
|
|||
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
|
||||
}
|
||||
|
||||
private static String lz(final String key) {
|
||||
return (String) gz(key).localize();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,7 +40,6 @@ import com.arsdigita.bebop.parameters.DateParameter;
|
|||
import com.arsdigita.bebop.parameters.IntegerParameter;
|
||||
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.cms.ContentCenter;
|
||||
import com.arsdigita.cms.ui.BaseForm;
|
||||
import com.arsdigita.cms.ui.ContentItemPage;
|
||||
import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
|
||||
|
|
@ -51,15 +50,12 @@ import com.arsdigita.mail.Mail;
|
|||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
import com.arsdigita.web.RedirectSignal;
|
||||
import com.arsdigita.web.URL;
|
||||
import com.arsdigita.web.Web;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.arsdigita.cms.CMSConfig;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.libreccm.notification.Notification;
|
||||
import org.libreccm.security.Party;
|
||||
import org.libreccm.security.Shiro;
|
||||
import org.libreccm.security.User;
|
||||
import org.libreccm.security.UserRepository;
|
||||
|
|
@ -74,13 +70,11 @@ import org.librecms.contentsection.ContentItem;
|
|||
import org.librecms.contentsection.ContentItemManager;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.ContentSectionConfig;
|
||||
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||
import org.librecms.lifecycle.Lifecycle;
|
||||
import org.librecms.lifecycle.LifecycleDefinition;
|
||||
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
||||
import org.librecms.lifecycle.LifecycleManager;
|
||||
import org.librecms.lifecycle.LifecycleRepository;
|
||||
import org.librecms.lifecycle.Phase;
|
||||
import org.librecms.lifecycle.PhaseDefinition;
|
||||
import org.librecms.lifecycle.PhaseRepository;
|
||||
|
|
@ -91,10 +85,7 @@ import org.librecms.workflow.CmsTaskType;
|
|||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.io.Writer;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.util.Calendar;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
|
|
|||
|
|
@ -24,18 +24,9 @@ import com.arsdigita.bebop.SingleSelectionModel;
|
|||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
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.apache.logging.log4j.Logger;
|
||||
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
|
||||
|
|
@ -46,16 +37,15 @@ import java.util.Locale;
|
|||
*/
|
||||
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> model) {
|
||||
LifecycleAddForm(final SingleSelectionModel<Long> selectedLifecycle) {
|
||||
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());
|
||||
}
|
||||
|
|
@ -63,34 +53,21 @@ class LifecycleAddForm extends BaseLifecycleForm {
|
|||
private class ProcessListener implements FormProcessListener {
|
||||
|
||||
@Override
|
||||
public final void process(final FormSectionEvent e)
|
||||
public final void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.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 LifecycleAdminPaneController controller = cdiUtil
|
||||
.findBean(LifecycleAdminPaneController.class);
|
||||
|
||||
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,
|
||||
(String) m_name.getValue(state));
|
||||
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,
|
||||
selectedLifecycle.setSelectedKey(state,
|
||||
definition.getDefinitionId());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,48 +32,42 @@ import com.arsdigita.cms.ui.BaseAdminPane;
|
|||
import com.arsdigita.cms.ui.BaseDeleteForm;
|
||||
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.librecms.contentsection.ContentSectionManager;
|
||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
||||
|
||||
|
||||
/**
|
||||
* This class contains the split pane for the lifecycle administration
|
||||
* interface.
|
||||
*
|
||||
|
||||
*
|
||||
* @author Michael Pih
|
||||
* @author Jack Chung
|
||||
* @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 {
|
||||
|
||||
private static Logger LOGGER = LogManager.getLogger(LifecycleAdminPane.class);
|
||||
|
||||
private final SingleSelectionModel m_model;
|
||||
private final LifecycleDefinitionRequestLocal m_definition;
|
||||
private final SingleSelectionModel selectionModel;
|
||||
private final LifecycleDefinitionRequestLocal selectionLifecycleDefinition;
|
||||
|
||||
public LifecycleAdminPane() {
|
||||
super(new Label(gz("cms.ui.lifecycles")),
|
||||
new LifecycleListModelBuilder());
|
||||
|
||||
m_model = getSelectionModel();
|
||||
m_definition = new SelectionRequestLocal();
|
||||
selectionModel = getSelectionModel();
|
||||
selectionLifecycleDefinition = new SelectionRequestLocal();
|
||||
|
||||
// XXX secvis
|
||||
//add(new LifecycleAdminContainer(m_addLink));
|
||||
setAdd(gz("cms.ui.lifecycle.add"),
|
||||
new LifecycleAddForm(m_model));
|
||||
new LifecycleAddForm(selectionModel));
|
||||
setEdit(gz("cms.ui.lifecycle.edit"),
|
||||
new LifecycleEditForm(m_definition));
|
||||
new LifecycleEditForm(selectionLifecycleDefinition));
|
||||
setDelete(gz("cms.ui.lifecycle.delete"), new DeleteForm());
|
||||
|
||||
setIntroPane(new Label(gz("cms.ui.lifecycle.intro")));
|
||||
setItemPane(new LifecycleItemPane(m_definition,
|
||||
setItemPane(new LifecycleItemPane(selectionLifecycleDefinition,
|
||||
getEditLink(),
|
||||
getDeleteLink()));
|
||||
|
||||
|
|
@ -85,7 +79,7 @@ public class LifecycleAdminPane extends BaseAdminPane {
|
|||
|
||||
@Override
|
||||
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 LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
|
||||
|
|
@ -105,24 +99,21 @@ public class LifecycleAdminPane extends BaseAdminPane {
|
|||
AdminPrivileges.ADMINISTER_LIFECYLES));
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
final ContentSection section = CMS.getContext().getContentSection();
|
||||
final LifecycleDefinition definition = m_definition
|
||||
final LifecycleDefinition definition = selectionLifecycleDefinition
|
||||
.getLifecycleDefinition(state);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ContentSectionManager sectionManager = cdiUtil.findBean(
|
||||
ContentSectionManager.class);
|
||||
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
|
||||
.findBean(LifecycleDefinitionRepository.class);
|
||||
final LifecycleAdminPaneController controller = cdiUtil
|
||||
.findBean(LifecycleAdminPaneController.class);
|
||||
controller.deleteLifecycleDefinition(definition, section);
|
||||
|
||||
sectionManager.removeLifecycleDefinitionFromContentSection(
|
||||
definition, section);
|
||||
lifecycleDefRepo.delete(definition);
|
||||
|
||||
m_model.clearSelection(state);
|
||||
selectionModel.clearSelection(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -23,11 +23,19 @@ import com.arsdigita.bebop.RequestLocal;
|
|||
|
||||
import org.librecms.lifecycle.LifecycleDefinition;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public abstract class LifecycleDefinitionRequestLocal extends RequestLocal {
|
||||
|
||||
public final LifecycleDefinition getLifecycleDefinition(
|
||||
final PageState state) {
|
||||
return (LifecycleDefinition) get(state);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
final Optional<LifecycleDefinition> definition
|
||||
= (Optional<LifecycleDefinition>) get(
|
||||
state);
|
||||
|
||||
return definition.get();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,16 +23,9 @@ import com.arsdigita.bebop.PageState;
|
|||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.librecms.lifecycle.LifecycleDefinition;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
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.
|
||||
|
|
@ -40,20 +33,19 @@ import java.util.Locale;
|
|||
* @author Jack Chung
|
||||
* @author Xixi D'Moon <xdmoon@redhat.com>
|
||||
* @author Justin Ross <jross@redhat.com>
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
class LifecycleEditForm extends BaseLifecycleForm {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
LifecycleEditForm.class);
|
||||
private final LifecycleDefinitionRequestLocal selectedDefinition;
|
||||
|
||||
private final LifecycleDefinitionRequestLocal m_definition;
|
||||
|
||||
LifecycleEditForm(final LifecycleDefinitionRequestLocal definition) {
|
||||
LifecycleEditForm(final LifecycleDefinitionRequestLocal selectedDefinition) {
|
||||
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());
|
||||
addProcessListener(new ProcessListener());
|
||||
|
|
@ -61,13 +53,14 @@ class LifecycleEditForm extends BaseLifecycleForm {
|
|||
|
||||
private class InitListener implements FormInitListener {
|
||||
|
||||
public final void init(final FormSectionEvent e) {
|
||||
final PageState state = e.getPageState();
|
||||
final LifecycleDefinition cycle = m_definition
|
||||
@Override
|
||||
public final void init(final FormSectionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
final LifecycleDefinition cycle = selectedDefinition
|
||||
.getLifecycleDefinition(state);
|
||||
|
||||
m_name.setValue(state, cycle.getLabel());
|
||||
m_description.setValue(state, cycle.getDescription());
|
||||
getLifecycleName().setValue(state, cycle.getLabel());
|
||||
getLifecycleDescription().setValue(state, cycle.getDescription());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -78,24 +71,17 @@ class LifecycleEditForm extends BaseLifecycleForm {
|
|||
public final void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
final PageState state = event.getPageState();
|
||||
final LifecycleDefinition definition = m_definition
|
||||
final LifecycleDefinition definition = selectedDefinition
|
||||
.getLifecycleDefinition(state);
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
|
||||
.findBean(LifecycleDefinitionRepository.class);
|
||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
||||
KernelConfig.class);
|
||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
||||
final LifecycleAdminPaneController controller = cdiUtil
|
||||
.findBean(LifecycleAdminPaneController.class);
|
||||
|
||||
definition.getLabel().addValue(defaultLocale,
|
||||
(String) m_name.getValue(state));
|
||||
definition.getDescription().addValue(
|
||||
defaultLocale,
|
||||
(String) m_description.getValue(state));
|
||||
lifecycleDefRepo.save(definition);
|
||||
controller.updateLifecycleDefinition(
|
||||
definition,
|
||||
(String) getLifecycleName().getValue(state),
|
||||
(String) getLifecycleDescription().getValue(state));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,34 +60,38 @@ import java.util.Locale;
|
|||
*/
|
||||
class LifecycleItemPane extends BaseItemPane {
|
||||
|
||||
private final LifecycleDefinitionRequestLocal m_cycle;
|
||||
private final PhaseRequestLocal m_phase;
|
||||
private final LifecycleDefinitionRequestLocal selectedLifecycle;
|
||||
private final PhaseRequestLocal selectedPhase;
|
||||
|
||||
private final Container m_detailPane;
|
||||
private final Table m_phases;
|
||||
private final Container detailPane;
|
||||
private final Table phasesTable;
|
||||
|
||||
public LifecycleItemPane(final LifecycleDefinitionRequestLocal cycle,
|
||||
public LifecycleItemPane(
|
||||
final LifecycleDefinitionRequestLocal selectedLifecycle,
|
||||
final ActionLink editLink,
|
||||
final ActionLink deleteLink) {
|
||||
m_cycle = cycle;
|
||||
m_phase = new SelectionRequestLocal();
|
||||
|
||||
m_phases = new PhaseTable();
|
||||
this.selectedLifecycle = selectedLifecycle;
|
||||
selectedPhase = new SelectionRequestLocal();
|
||||
|
||||
m_detailPane = new SimpleContainer();
|
||||
add(m_detailPane);
|
||||
setDefault(m_detailPane);
|
||||
phasesTable = new PhaseTable();
|
||||
|
||||
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(
|
||||
"cms.ui.lifecycle.phase_add")));
|
||||
|
||||
m_detailPane.add(new PhaseSection(phaseAddLink));
|
||||
detailPane.add(new PhaseSection(phaseAddLink));
|
||||
|
||||
final AddPhaseForm phaseAddForm = new AddPhaseForm(m_cycle);
|
||||
final EditPhaseForm phaseEditForm = new EditPhaseForm(m_phase);
|
||||
final DeletePhaseForm phaseDeleteForm = new DeletePhaseForm(m_phase);
|
||||
final AddPhaseForm phaseAddForm = new AddPhaseForm(selectedLifecycle);
|
||||
final EditPhaseForm phaseEditForm = new EditPhaseForm(selectedLifecycle,
|
||||
selectedPhase);
|
||||
final DeletePhaseForm phaseDeleteForm = new DeletePhaseForm(
|
||||
selectedPhase);
|
||||
|
||||
add(phaseAddForm);
|
||||
add(phaseEditForm);
|
||||
|
|
@ -95,17 +99,17 @@ class LifecycleItemPane extends BaseItemPane {
|
|||
|
||||
connect(phaseAddLink, phaseAddForm);
|
||||
connect(phaseAddForm);
|
||||
connect(m_phases, 4, phaseEditForm);
|
||||
connect(phaseEditForm, m_phases.getRowSelectionModel());
|
||||
connect(m_phases, 5, phaseDeleteForm);
|
||||
connect(phaseDeleteForm, m_phases.getRowSelectionModel());
|
||||
connect(phasesTable, 4, phaseEditForm);
|
||||
connect(phaseEditForm, phasesTable.getRowSelectionModel());
|
||||
connect(phasesTable, 5, phaseDeleteForm);
|
||||
connect(phaseDeleteForm, phasesTable.getRowSelectionModel());
|
||||
}
|
||||
|
||||
private class SelectionRequestLocal extends PhaseRequestLocal {
|
||||
|
||||
@Override
|
||||
protected final Object initialValue(final PageState state) {
|
||||
final String id = m_phases.getRowSelectionModel().getSelectedKey(
|
||||
final String id = phasesTable.getRowSelectionModel().getSelectedKey(
|
||||
state).toString();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
|
@ -136,7 +140,8 @@ class LifecycleItemPane extends BaseItemPane {
|
|||
private class Properties extends PropertyList {
|
||||
|
||||
@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 ConfigurationManager confManager = cdiUtil.findBean(
|
||||
|
|
@ -145,15 +150,15 @@ class LifecycleItemPane extends BaseItemPane {
|
|||
KernelConfig.class);
|
||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
||||
|
||||
final java.util.List props = super.properties(state);
|
||||
final LifecycleDefinition cycle = m_cycle
|
||||
final java.util.List<Property> props = super.properties(state);
|
||||
final LifecycleDefinition cycle = selectedLifecycle
|
||||
.getLifecycleDefinition(state);
|
||||
|
||||
props.add(new Property(
|
||||
gz("cms.ui.name"),
|
||||
gz("cms.ui.lifecycle.name"),
|
||||
cycle.getLabel().getValue(defaultLocale)));
|
||||
props.add(new Property(
|
||||
gz("cms.ui.description"),
|
||||
gz("cms.ui.lifecycle.description"),
|
||||
cycle.getDescription().getValue(defaultLocale)));
|
||||
|
||||
return props;
|
||||
|
|
@ -171,7 +176,7 @@ class LifecycleItemPane extends BaseItemPane {
|
|||
final ActionGroup group = new ActionGroup();
|
||||
setBody(group);
|
||||
|
||||
group.setSubject(m_phases);
|
||||
group.setSubject(phasesTable);
|
||||
group.addAction(new LifecycleAdminContainer(addLink),
|
||||
ActionGroup.ADD);
|
||||
}
|
||||
|
|
@ -179,9 +184,9 @@ class LifecycleItemPane extends BaseItemPane {
|
|||
}
|
||||
|
||||
// XXX fix this
|
||||
private static final String[] s_headers = {
|
||||
lz("cms.ui.name"),
|
||||
lz("cms.ui.description"),
|
||||
private static final String[] HEADERS = {
|
||||
lz("cms.ui.lifecycle.phase.name"),
|
||||
lz("cms.ui.lifecycle.phase.description"),
|
||||
lz("cms.ui.lifecycle.phase_delay"),
|
||||
lz("cms.ui.lifecycle.phase_duration"),
|
||||
"",
|
||||
|
|
@ -191,7 +196,7 @@ class LifecycleItemPane extends BaseItemPane {
|
|||
private class PhaseTable extends Table {
|
||||
|
||||
public PhaseTable() {
|
||||
super(new PhaseTableModelBuilder(m_cycle), s_headers);
|
||||
super(new PhaseTableModelBuilder(selectedLifecycle), HEADERS);
|
||||
|
||||
setEmptyView(new Label(gz("cms.ui.lifecycle.phase_none")));
|
||||
|
||||
|
|
@ -235,7 +240,7 @@ class LifecycleItemPane extends BaseItemPane {
|
|||
public final void reset(final PageState state) {
|
||||
super.reset(state);
|
||||
|
||||
m_phases.clearSelection(state);
|
||||
phasesTable.clearSelection(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,13 +22,23 @@ import com.arsdigita.bebop.PageState;
|
|||
import com.arsdigita.bebop.list.ListModel;
|
||||
import com.arsdigita.bebop.list.ListModelBuilder;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
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
|
||||
* displayed in a list.
|
||||
|
|
@ -43,40 +53,43 @@ public final class LifecycleListModelBuilder extends LockableImpl
|
|||
@Override
|
||||
public final ListModel makeModel(final com.arsdigita.bebop.List list,
|
||||
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 final List<LifecycleDefinition> m_cycles;
|
||||
private int index = -1;
|
||||
private final Iterator<LifecycleDefinition> iterator;
|
||||
private LifecycleDefinition currentLifecycleDef;
|
||||
private final Locale defaultLocale;
|
||||
|
||||
public Model(final PageState state) {
|
||||
m_cycles = getCollection(state);
|
||||
public Model(final List<LifecycleDefinition> lifecycles) {
|
||||
iterator = lifecycles.iterator();
|
||||
defaultLocale = KernelConfig.getConfig().getDefaultLocale();
|
||||
}
|
||||
|
||||
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 {
|
||||
index++;
|
||||
return index < m_cycles.size();
|
||||
if (iterator.hasNext()) {
|
||||
currentLifecycleDef = iterator.next();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElement() {
|
||||
return m_cycles.get(index).getLabel();
|
||||
return currentLifecycleDef.getLabel().getValue(defaultLocale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKey() {
|
||||
return Long.toString(m_cycles.get(index).getDefinitionId());
|
||||
return Long.toString(currentLifecycleDef.getDefinitionId());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -23,10 +23,14 @@ import com.arsdigita.bebop.RequestLocal;
|
|||
|
||||
import org.librecms.lifecycle.PhaseDefinition;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public abstract class PhaseRequestLocal extends RequestLocal {
|
||||
|
||||
|
||||
public final PhaseDefinition getPhase(final PageState state) {
|
||||
return (PhaseDefinition) get(state);
|
||||
@SuppressWarnings("unchecked")
|
||||
final Optional<PhaseDefinition> phaseDef = (Optional<PhaseDefinition>) get(state);
|
||||
return phaseDef.get();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,37 +28,45 @@ import org.librecms.lifecycle.LifecycleDefinition;
|
|||
import org.librecms.lifecycle.PhaseDefinition;
|
||||
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.arsdigita.cms.CMSConfig;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
class PhaseTableModelBuilder extends LockableImpl
|
||||
implements TableModelBuilder {
|
||||
private final LifecycleDefinitionRequestLocal cycle;
|
||||
|
||||
public PhaseTableModelBuilder
|
||||
(final LifecycleDefinitionRequestLocal cycle) {
|
||||
this.cycle = cycle;
|
||||
private final LifecycleDefinitionRequestLocal selectedLifecycle;
|
||||
|
||||
public PhaseTableModelBuilder(
|
||||
final LifecycleDefinitionRequestLocal selectedLifecycle) {
|
||||
this.selectedLifecycle = selectedLifecycle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final TableModel makeModel(final Table table,
|
||||
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 final List<PhaseDefinition> phases;
|
||||
private int index = -1;
|
||||
private PhaseDefinition phase;
|
||||
private final Iterator<PhaseDefinition> iterator;
|
||||
private PhaseDefinition currentPhaseDef;
|
||||
|
||||
public PhaseTableModel(final LifecycleDefinition cycle) {
|
||||
phases = cycle.getPhaseDefinitions();
|
||||
public PhaseTableModel(final List<PhaseDefinition> phaseDefinitions) {
|
||||
iterator = phaseDefinitions.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -68,10 +76,8 @@ class PhaseTableModelBuilder extends LockableImpl
|
|||
|
||||
@Override
|
||||
public final boolean nextRow() {
|
||||
index++;
|
||||
if (index < phases.size()) {
|
||||
phase = phases.get(index);
|
||||
|
||||
if (iterator.hasNext()) {
|
||||
currentPhaseDef = iterator.next();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
|
@ -80,19 +86,23 @@ class PhaseTableModelBuilder extends LockableImpl
|
|||
|
||||
@Override
|
||||
public final Object getElementAt(final int column) {
|
||||
Assert.exists(phase, "PhaseDefinition m_phase");
|
||||
|
||||
switch (column) {
|
||||
case 0:
|
||||
return phase.getLabel();
|
||||
return currentPhaseDef
|
||||
.getLabel()
|
||||
.getValue(KernelConfig.getConfig().getDefaultLocale());
|
||||
case 1:
|
||||
return phase.getDescription();
|
||||
return currentPhaseDef
|
||||
.getDescription()
|
||||
.getValue(KernelConfig.getConfig().getDefaultLocale());
|
||||
case 2:
|
||||
return Duration.formatDuration(phase.getDefaultDelay());
|
||||
return Duration.formatDuration(currentPhaseDef
|
||||
.getDefaultDelay());
|
||||
case 3:
|
||||
final Long duration = phase.getDefaultDuration();
|
||||
final Long duration = currentPhaseDef.getDefaultDuration();
|
||||
|
||||
if (duration == null) {
|
||||
if (duration == 0) {
|
||||
return lz("cms.ui.lifecycle.forever");
|
||||
} else {
|
||||
return Duration.formatDuration(duration);
|
||||
|
|
@ -107,13 +117,14 @@ class PhaseTableModelBuilder extends LockableImpl
|
|||
}
|
||||
|
||||
@Override
|
||||
public Object getKeyAt(int columnIndex) {
|
||||
if (phase == null) {
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
if (currentPhaseDef == null) {
|
||||
throw new IllegalStateException();
|
||||
} else {
|
||||
return phase.getDefinitionId();
|
||||
return currentPhaseDef.getDefinitionId();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static GlobalizedMessage gz(final String key) {
|
||||
|
|
@ -123,4 +134,5 @@ class PhaseTableModelBuilder extends LockableImpl
|
|||
private static String lz(final String key) {
|
||||
return (String) gz(key).localize();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -195,15 +195,11 @@ public class LifecycleDefinition implements Serializable {
|
|||
+ "definitionId = %d, "
|
||||
+ "label = %s, "
|
||||
+ "description = %s, "
|
||||
+ "defaultListener = \"%s\", "
|
||||
+ "phaseDefinitions = { %s }%s"
|
||||
+ " }",
|
||||
super.toString(),
|
||||
definitionId,
|
||||
Objects.toString(label),
|
||||
Objects.toString(description),
|
||||
defaultListener,
|
||||
Objects.toString(phaseDefinitions),
|
||||
data);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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.delete=Remove
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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.delete=Entfernen
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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.delete=Remove
|
||||
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
|
||||
|
|
|
|||
Loading…
Reference in New Issue