CCM NG/ccm-cms: Lifecycles tab
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4634 8810af33-2d31-482b-a856-94f89814c4df
parent
61c6859a3a
commit
965d6d3ce1
|
|
@ -23,19 +23,15 @@ import com.arsdigita.bebop.FormProcessException;
|
||||||
import com.arsdigita.bebop.Label;
|
import com.arsdigita.bebop.Label;
|
||||||
import com.arsdigita.bebop.PageState;
|
import com.arsdigita.bebop.PageState;
|
||||||
import com.arsdigita.bebop.SimpleContainer;
|
import com.arsdigita.bebop.SimpleContainer;
|
||||||
import com.arsdigita.bebop.event.FormInitListener;
|
|
||||||
import com.arsdigita.bebop.event.FormProcessListener;
|
import com.arsdigita.bebop.event.FormProcessListener;
|
||||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||||
import com.arsdigita.bebop.event.FormValidationListener;
|
import com.arsdigita.bebop.event.FormValidationListener;
|
||||||
import com.arsdigita.bebop.form.FormErrorDisplay;
|
import com.arsdigita.bebop.form.FormErrorDisplay;
|
||||||
import com.arsdigita.bebop.form.Hidden;
|
|
||||||
import com.arsdigita.bebop.form.Submit;
|
import com.arsdigita.bebop.form.Submit;
|
||||||
import com.arsdigita.bebop.form.TextArea;
|
import com.arsdigita.bebop.form.TextArea;
|
||||||
import com.arsdigita.bebop.form.TextField;
|
import com.arsdigita.bebop.form.TextField;
|
||||||
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
|
||||||
import com.arsdigita.bebop.parameters.IntegerParameter;
|
import com.arsdigita.bebop.parameters.IntegerParameter;
|
||||||
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
|
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
|
||||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
|
||||||
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
|
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
|
||||||
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
|
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
|
||||||
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
||||||
|
|
@ -52,11 +48,10 @@ import org.libreccm.cdi.utils.CdiUtil;
|
||||||
import org.libreccm.configuration.ConfigurationManager;
|
import org.libreccm.configuration.ConfigurationManager;
|
||||||
import org.librecms.CmsConstants;
|
import org.librecms.CmsConstants;
|
||||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||||
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
|
||||||
import org.librecms.lifecycle.PhaseDefinititionRepository;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class contains a form component to add a lifecycle phase definition.
|
* This class contains a form component to add a lifecycle phase definition.
|
||||||
|
|
@ -68,7 +63,6 @@ import java.util.Locale;
|
||||||
*/
|
*/
|
||||||
class AddPhaseForm extends CMSForm {
|
class AddPhaseForm extends CMSForm {
|
||||||
|
|
||||||
private final static String PHASE_ID = "id";
|
|
||||||
private final static String LABEL = "label";
|
private final static String LABEL = "label";
|
||||||
private final static String DESCRIPTION = "description";
|
private final static String DESCRIPTION = "description";
|
||||||
private final static String DELAY_DAYS = "delay_days";
|
private final static String DELAY_DAYS = "delay_days";
|
||||||
|
|
@ -80,19 +74,18 @@ class AddPhaseForm extends CMSForm {
|
||||||
private final static String SUBMIT = "submit";
|
private final static String SUBMIT = "submit";
|
||||||
private final static String CANCEL = "cancel";
|
private final static String CANCEL = "cancel";
|
||||||
|
|
||||||
private final LifecycleDefinitionRequestLocal m_cycle;
|
private final LifecycleDefinitionRequestLocal selectedLifecycle;
|
||||||
|
|
||||||
private final Hidden m_id;
|
private final TextField phaseLabel;
|
||||||
private final TextField m_label;
|
private final TextArea phaseDescription;
|
||||||
private final TextArea m_description;
|
private final TextField delayDays;
|
||||||
private final TextField m_delay_days;
|
private final TextField delayHours;
|
||||||
private final TextField m_delay_hours;
|
private final TextField delayMinutes;
|
||||||
private final TextField m_delay_minutes;
|
private final TextField durationDays;
|
||||||
private final TextField m_duration_days;
|
private final TextField durationHours;
|
||||||
private final TextField m_duration_hours;
|
private final TextField durationMinutes;
|
||||||
private final TextField m_duration_minutes;
|
private final Submit submit;
|
||||||
private final Submit m_submit;
|
private final Submit cancel;
|
||||||
private final Submit m_cancel;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
|
|
@ -101,112 +94,98 @@ class AddPhaseForm extends CMSForm {
|
||||||
* cycle definition is selected since phase definitions are
|
* cycle definition is selected since phase definitions are
|
||||||
* associated to cycle definitions
|
* associated to cycle definitions
|
||||||
*/
|
*/
|
||||||
public AddPhaseForm(final LifecycleDefinitionRequestLocal cycle) {
|
public AddPhaseForm(final LifecycleDefinitionRequestLocal selectedLifecycle) {
|
||||||
super("LifecyclePhaseDefinition");
|
super("LifecyclePhaseDefinition");
|
||||||
|
|
||||||
m_cycle = cycle;
|
this.selectedLifecycle = selectedLifecycle;
|
||||||
|
|
||||||
m_id = new Hidden(new BigDecimalParameter(PHASE_ID));
|
final Label heading = new Label(gz("cms.ui.lifecycle.phase_add"));
|
||||||
add(m_id);
|
|
||||||
m_id.addValidationListener(new NotNullValidationListener());
|
|
||||||
|
|
||||||
Label heading = new Label(gz("cms.ui.lifecycle.phase_add"));
|
|
||||||
heading.setFontWeight(Label.BOLD);
|
heading.setFontWeight(Label.BOLD);
|
||||||
add(heading, ColumnPanel.FULL_WIDTH);
|
add(heading, ColumnPanel.FULL_WIDTH);
|
||||||
add(new FormErrorDisplay(this), ColumnPanel.FULL_WIDTH);
|
add(new FormErrorDisplay(this), ColumnPanel.FULL_WIDTH);
|
||||||
|
|
||||||
add(new Label(gz("cms.ui.name")));
|
add(new Label(gz("cms.ui.lifecycle.phase.name")));
|
||||||
m_label = new TextField(new TrimmedStringParameter(LABEL));
|
phaseLabel = new TextField(new TrimmedStringParameter(LABEL));
|
||||||
m_label.addValidationListener(new NotEmptyValidationListener());
|
phaseLabel.addValidationListener(new NotEmptyValidationListener());
|
||||||
m_label.setSize(40);
|
phaseLabel.setSize(40);
|
||||||
m_label.setMaxLength(1000);
|
phaseLabel.setMaxLength(1000);
|
||||||
add(m_label);
|
add(phaseLabel);
|
||||||
|
|
||||||
add(new Label(gz("cms.ui.description")));
|
add(new Label(gz("cms.ui.lifecycle.phase.description")));
|
||||||
m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
||||||
m_description.addValidationListener(new StringLengthValidationListener(
|
phaseDescription.addValidationListener(
|
||||||
4000));
|
new StringLengthValidationListener(
|
||||||
m_description.setCols(40);
|
4000));
|
||||||
m_description.setRows(5);
|
phaseDescription.setCols(40);
|
||||||
m_description.setWrap(TextArea.SOFT);
|
phaseDescription.setRows(5);
|
||||||
add(m_description);
|
phaseDescription.setWrap(TextArea.SOFT);
|
||||||
|
add(phaseDescription);
|
||||||
|
|
||||||
// phase delay
|
// phase delay
|
||||||
add(new Label(gz("cms.ui.lifecycle.phase_start_delay")));
|
add(new Label(gz("cms.ui.lifecycle.phase_start_delay")));
|
||||||
m_delay_days = new TextField(new IntegerParameter(DELAY_DAYS));
|
delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
|
||||||
m_delay_hours = new TextField(new IntegerParameter(DELAY_HOURS));
|
delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
|
||||||
m_delay_minutes = new TextField(new IntegerParameter(DELAY_MINUTES));
|
delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
|
||||||
|
|
||||||
//max value: days: 60 years, hours: 7 days, minutes: 1 day
|
//max value: days: 60 years, hours: 7 days, minutes: 1 day
|
||||||
m_delay_days.addValidationListener(
|
delayDays.addValidationListener(
|
||||||
new NumberInRangeValidationListener(0, 21900));
|
new NumberInRangeValidationListener(0, 21900));
|
||||||
m_delay_hours.addValidationListener(new NumberInRangeValidationListener(
|
delayHours.addValidationListener(new NumberInRangeValidationListener(
|
||||||
0, 168));
|
0, 168));
|
||||||
m_delay_minutes.addValidationListener(
|
delayMinutes.addValidationListener(
|
||||||
new NumberInRangeValidationListener(0, 1440));
|
new NumberInRangeValidationListener(0, 1440));
|
||||||
m_delay_days.setSize(7);
|
delayDays.setSize(7);
|
||||||
m_delay_hours.setSize(7);
|
delayHours.setSize(7);
|
||||||
m_delay_minutes.setSize(7);
|
delayMinutes.setSize(7);
|
||||||
m_delay_days.setClassAttr("DaysField");
|
delayDays.setClassAttr("DaysField");
|
||||||
m_delay_hours.setClassAttr("HoursField");
|
delayHours.setClassAttr("HoursField");
|
||||||
m_delay_minutes.setClassAttr("MinutesField");
|
delayMinutes.setClassAttr("MinutesField");
|
||||||
|
|
||||||
SimpleContainer de = new SimpleContainer();
|
final SimpleContainer delayContainer = new SimpleContainer();
|
||||||
de.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
||||||
de.add(m_delay_days);
|
delayContainer.add(delayDays);
|
||||||
de.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
||||||
de.add(m_delay_hours);
|
delayContainer.add(delayHours);
|
||||||
de.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
|
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
|
||||||
de.add(m_delay_minutes);
|
delayContainer.add(delayMinutes);
|
||||||
add(de);
|
add(delayContainer);
|
||||||
|
|
||||||
// phase duration
|
// phase duration
|
||||||
add(new Label(gz("cms.ui.lifecycle.phase_duration")));
|
add(new Label(gz("cms.ui.lifecycle.phase_duration")));
|
||||||
m_duration_days = new TextField(new IntegerParameter(DURATION_DAYS));
|
durationDays = new TextField(new IntegerParameter(DURATION_DAYS));
|
||||||
m_duration_hours = new TextField(new IntegerParameter(DURATION_HOURS));
|
durationHours = new TextField(new IntegerParameter(DURATION_HOURS));
|
||||||
m_duration_minutes = new TextField(
|
durationMinutes = new TextField(
|
||||||
new IntegerParameter(DURATION_MINUTES));
|
new IntegerParameter(DURATION_MINUTES));
|
||||||
|
|
||||||
//max value: days: 60 years, hours: 7 days, minutes: 1 day
|
//max value: days: 60 years, hours: 7 days, minutes: 1 day
|
||||||
m_duration_days.addValidationListener(
|
durationDays.addValidationListener(
|
||||||
new NumberInRangeValidationListener(0, 21900));
|
new NumberInRangeValidationListener(0, 21900));
|
||||||
m_duration_hours.addValidationListener(
|
durationHours.addValidationListener(
|
||||||
new NumberInRangeValidationListener(0, 168));
|
new NumberInRangeValidationListener(0, 168));
|
||||||
m_duration_minutes.addValidationListener(
|
durationMinutes.addValidationListener(
|
||||||
new NumberInRangeValidationListener(0, 1440));
|
new NumberInRangeValidationListener(0, 1440));
|
||||||
m_duration_days.setSize(7);
|
durationDays.setSize(7);
|
||||||
m_duration_hours.setSize(7);
|
durationHours.setSize(7);
|
||||||
m_duration_minutes.setSize(7);
|
durationMinutes.setSize(7);
|
||||||
m_duration_days.setClassAttr("DaysField");
|
durationDays.setClassAttr("DaysField");
|
||||||
m_duration_hours.setClassAttr("HoursField");
|
durationHours.setClassAttr("HoursField");
|
||||||
m_duration_minutes.setClassAttr("MinutesField");
|
durationMinutes.setClassAttr("MinutesField");
|
||||||
|
|
||||||
SimpleContainer du = new SimpleContainer();
|
final SimpleContainer durationContainer = new SimpleContainer();
|
||||||
du.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
||||||
du.add(m_duration_days);
|
durationContainer.add(durationDays);
|
||||||
du.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
||||||
du.add(m_duration_hours);
|
durationContainer.add(durationHours);
|
||||||
du.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
|
durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
|
||||||
du.add(m_duration_minutes);
|
durationContainer.add(durationMinutes);
|
||||||
add(du);
|
add(durationContainer);
|
||||||
|
|
||||||
SimpleContainer s = new SimpleContainer();
|
final SimpleContainer submitCancel = new SimpleContainer();
|
||||||
m_submit = new Submit(SUBMIT);
|
submit = new Submit(SUBMIT, gz("cms.ui.lifecycle.phase.add_submit"));
|
||||||
m_submit.setButtonLabel("Add Phase");
|
submitCancel.add(submit);
|
||||||
s.add(m_submit);
|
cancel = new Submit(CANCEL, gz("cms.ui.lifecycle.phase.add_cancel"));
|
||||||
m_cancel = new Submit(CANCEL);
|
submitCancel.add(cancel);
|
||||||
m_cancel.setButtonLabel("Cancel");
|
add(submitCancel, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
|
||||||
s.add(m_cancel);
|
|
||||||
add(s, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
|
|
||||||
|
|
||||||
addInitListener(new FormInitListener() {
|
|
||||||
|
|
||||||
public final void init(final FormSectionEvent event)
|
|
||||||
throws FormProcessException {
|
|
||||||
initializePhase(event.getPageState());
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
addSubmissionListener(new FormSecurityListener(
|
addSubmissionListener(new FormSecurityListener(
|
||||||
AdminPrivileges.ADMINISTER_LIFECYLES));
|
AdminPrivileges.ADMINISTER_LIFECYLES));
|
||||||
|
|
@ -225,6 +204,7 @@ class AddPhaseForm extends CMSForm {
|
||||||
|
|
||||||
addProcessListener(new FormProcessListener() {
|
addProcessListener(new FormProcessListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
public final void process(final FormSectionEvent event)
|
public final void process(final FormSectionEvent event)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
addPhase(event.getPageState());
|
addPhase(event.getPageState());
|
||||||
|
|
@ -244,26 +224,7 @@ class AddPhaseForm extends CMSForm {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isCancelled(final PageState state) {
|
public boolean isCancelled(final PageState state) {
|
||||||
return m_cancel.isSelected(state);
|
return cancel.isSelected(state);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a unique ID for the new phase.
|
|
||||||
*
|
|
||||||
* @param state The page state
|
|
||||||
*
|
|
||||||
* @pre state != null
|
|
||||||
*/
|
|
||||||
protected void initializePhase(final PageState state)
|
|
||||||
throws FormProcessException {
|
|
||||||
// Not neccessary with JPA
|
|
||||||
// if (m_id.getValue(state) == null) {
|
|
||||||
// try {
|
|
||||||
// m_id.setValue(state, Sequences.getNextValue());
|
|
||||||
// } catch (SQLException e) {
|
|
||||||
// throw new UncheckedWrapperException(e);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -274,39 +235,40 @@ class AddPhaseForm extends CMSForm {
|
||||||
* @pre state != null
|
* @pre state != null
|
||||||
*/
|
*/
|
||||||
protected void addPhase(final PageState state) throws FormProcessException {
|
protected void addPhase(final PageState state) throws FormProcessException {
|
||||||
final String label = (String) m_label.getValue(state);
|
final String label = (String) phaseLabel.getValue(state);
|
||||||
final String description = (String) m_description.getValue(state);
|
final String description = (String) phaseDescription.getValue(state);
|
||||||
final Integer delDays = (Integer) m_delay_days.getValue(state);
|
final int delDays = (int) Optional
|
||||||
final Integer delHours = (Integer) m_delay_hours.getValue(state);
|
.ofNullable(delayDays.getValue(state))
|
||||||
final Integer delMinutes = (Integer) m_delay_minutes.getValue(state);
|
.orElseGet(() -> 0);
|
||||||
final Integer durDays = (Integer) m_duration_days.getValue(state);
|
final int delHours = (int) Optional
|
||||||
final Integer durHours = (Integer) m_duration_hours.getValue(state);
|
.ofNullable(delayHours.getValue(state))
|
||||||
final Integer durMinutes = (Integer) m_duration_minutes.getValue(state);
|
.orElseGet(() -> 0);
|
||||||
|
final int delMinutes = (int) Optional
|
||||||
|
.ofNullable(delayMinutes.getValue(state))
|
||||||
|
.orElseGet(() -> 0);
|
||||||
|
final int durDays = (int) Optional
|
||||||
|
.ofNullable(durationDays.getValue(state))
|
||||||
|
.orElseGet(() -> 0);
|
||||||
|
final int durHours = (int) Optional
|
||||||
|
.ofNullable(durationHours.getValue(state))
|
||||||
|
.orElseGet(() -> 0);
|
||||||
|
final int durMinutes = (int) Optional
|
||||||
|
.ofNullable(durationMinutes.getValue(state))
|
||||||
|
.orElseGet(() -> 0);
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil.findBean(
|
final LifecycleAdminPaneController controller = cdiUtil
|
||||||
LifecycleDefinitionRepository.class);
|
.findBean(LifecycleAdminPaneController.class);
|
||||||
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
|
controller.addPhaseDefinition(
|
||||||
PhaseDefinititionRepository.class);
|
selectedLifecycle.getLifecycleDefinition(state),
|
||||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
label,
|
||||||
ConfigurationManager.class);
|
description,
|
||||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
delDays,
|
||||||
KernelConfig.class);
|
delHours,
|
||||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
delMinutes,
|
||||||
|
durDays,
|
||||||
// Check if the object already exists for double click protection.
|
durHours,
|
||||||
final PhaseDefinition phaseDef = new PhaseDefinition();
|
durMinutes);
|
||||||
final LifecycleDefinition cycleDef = m_cycle.getLifecycleDefinition(
|
|
||||||
state);
|
|
||||||
cycleDef.addPhaseDefinition(phaseDef);
|
|
||||||
|
|
||||||
phaseDef.getLabel().addValue(defaultLocale, label);
|
|
||||||
phaseDef.getDescription().addValue(defaultLocale, description);
|
|
||||||
phaseDef.setDefaultDelay(delDays * delHours * delMinutes * 60);
|
|
||||||
phaseDef.setDefaultDuration(durDays * durHours * durMinutes * 60);
|
|
||||||
|
|
||||||
phaseDefRepo.save(phaseDef);
|
|
||||||
lifecycleDefRepo.save(cycleDef);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -316,27 +278,34 @@ class AddPhaseForm extends CMSForm {
|
||||||
*
|
*
|
||||||
* @pre state != null
|
* @pre state != null
|
||||||
*/
|
*/
|
||||||
protected void validateUniqueName(PageState state)
|
protected void validateUniqueName(final PageState state)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
String label = (String) m_label.getValue(state);
|
|
||||||
|
|
||||||
final LifecycleDefinition cycleDef = m_cycle.getLifecycleDefinition(
|
final String label = (String) phaseLabel.getValue(state);
|
||||||
state);
|
|
||||||
final List<PhaseDefinition> phaseDefs = cycleDef.getPhaseDefinitions();
|
final LifecycleDefinition cycleDef = selectedLifecycle
|
||||||
|
.getLifecycleDefinition(state);
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
final LifecycleAdminPaneController controller = cdiUtil
|
||||||
|
.findBean(LifecycleAdminPaneController.class);
|
||||||
|
final List<PhaseDefinition> phaseDefs = controller
|
||||||
|
.getPhaseDefinitions(cycleDef);
|
||||||
|
|
||||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||||
ConfigurationManager.class);
|
ConfigurationManager.class);
|
||||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
final KernelConfig kernelConfig = confManager.findConfiguration(
|
||||||
KernelConfig.class);
|
KernelConfig.class);
|
||||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
||||||
|
|
||||||
for (final PhaseDefinition phaseDef : phaseDefs) {
|
final boolean duplicateLabel = phaseDefs
|
||||||
if (phaseDef.getLabel().getValue(defaultLocale).equalsIgnoreCase(
|
.stream()
|
||||||
label)) {
|
.map(phaseDef -> phaseDef.getLabel().getValue(defaultLocale))
|
||||||
throw new FormProcessException(new GlobalizedMessage(
|
.anyMatch(phaseDefLabel -> phaseDefLabel.equalsIgnoreCase(label));
|
||||||
"cms.ui.lifecycle.phase_name_not_unique",
|
|
||||||
CmsConstants.CMS_BUNDLE));
|
if (duplicateLabel) {
|
||||||
}
|
throw new FormProcessException(new GlobalizedMessage(
|
||||||
|
"cms.ui.lifecycle.phase_name_not_unique",
|
||||||
|
CmsConstants.CMS_BUNDLE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -347,11 +316,12 @@ class AddPhaseForm extends CMSForm {
|
||||||
*
|
*
|
||||||
* @pre state != null
|
* @pre state != null
|
||||||
*/
|
*/
|
||||||
protected void validateDuration(PageState state)
|
protected void validateDuration(final PageState state)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
Integer durDays = (Integer) m_duration_days.getValue(state);
|
|
||||||
Integer durHours = (Integer) m_duration_hours.getValue(state);
|
final Integer durDays = (Integer) durationDays.getValue(state);
|
||||||
Integer durMinutes = (Integer) m_duration_minutes.getValue(state);
|
final Integer durHours = (Integer) durationHours.getValue(state);
|
||||||
|
final Integer durMinutes = (Integer) durationMinutes.getValue(state);
|
||||||
|
|
||||||
// Phase duration is infinite, so the duration is valid.
|
// Phase duration is infinite, so the duration is valid.
|
||||||
if (durDays == null && durHours == null && durMinutes == null) {
|
if (durDays == null && durHours == null && durMinutes == null) {
|
||||||
|
|
@ -360,19 +330,19 @@ class AddPhaseForm extends CMSForm {
|
||||||
|
|
||||||
int days, hours, minutes;
|
int days, hours, minutes;
|
||||||
if (durDays != null) {
|
if (durDays != null) {
|
||||||
days = durDays.intValue();
|
days = durDays;
|
||||||
} else {
|
} else {
|
||||||
days = 0;
|
days = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (durHours != null) {
|
if (durHours != null) {
|
||||||
hours = durHours.intValue();
|
hours = durHours;
|
||||||
} else {
|
} else {
|
||||||
hours = 0;
|
hours = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (durMinutes != null) {
|
if (durMinutes != null) {
|
||||||
minutes = durMinutes.intValue();
|
minutes = durMinutes;
|
||||||
} else {
|
} else {
|
||||||
minutes = 0;
|
minutes = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -389,8 +359,4 @@ class AddPhaseForm extends CMSForm {
|
||||||
CmsConstants.CMS_BUNDLE);
|
CmsConstants.CMS_BUNDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String lz(final String key) {
|
|
||||||
return (String) gz(key).localize();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,29 +18,17 @@
|
||||||
*/
|
*/
|
||||||
package com.arsdigita.cms.ui.lifecycle;
|
package com.arsdigita.cms.ui.lifecycle;
|
||||||
|
|
||||||
import com.arsdigita.bebop.FormProcessException;
|
|
||||||
import com.arsdigita.bebop.PageState;
|
|
||||||
import com.arsdigita.bebop.event.ParameterEvent;
|
|
||||||
import com.arsdigita.bebop.event.ParameterListener;
|
|
||||||
import com.arsdigita.bebop.form.TextArea;
|
import com.arsdigita.bebop.form.TextArea;
|
||||||
import com.arsdigita.bebop.form.TextField;
|
import com.arsdigita.bebop.form.TextField;
|
||||||
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
|
import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
|
||||||
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
|
import com.arsdigita.bebop.parameters.StringLengthValidationListener;
|
||||||
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
||||||
import com.arsdigita.cms.CMS;
|
|
||||||
|
|
||||||
import com.arsdigita.cms.ui.BaseForm;
|
import com.arsdigita.cms.ui.BaseForm;
|
||||||
import com.arsdigita.cms.ui.FormSecurityListener;
|
import com.arsdigita.cms.ui.FormSecurityListener;
|
||||||
import com.arsdigita.globalization.GlobalizedMessage;
|
import com.arsdigita.globalization.GlobalizedMessage;
|
||||||
import com.arsdigita.kernel.KernelConfig;
|
|
||||||
|
|
||||||
import org.libreccm.cdi.utils.CdiUtil;
|
|
||||||
import org.libreccm.configuration.ConfigurationManager;
|
|
||||||
import org.librecms.CmsConstants;
|
|
||||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||||
import org.librecms.lifecycle.LifecycleDefinition;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="mailto:jross@redhat.com">Justin Ross</a>
|
* @author <a href="mailto:jross@redhat.com">Justin Ross</a>
|
||||||
|
|
@ -48,27 +36,28 @@ import java.util.Locale;
|
||||||
*/
|
*/
|
||||||
class BaseLifecycleForm extends BaseForm {
|
class BaseLifecycleForm extends BaseForm {
|
||||||
|
|
||||||
final TextField m_name;
|
private final TextField lifecycleName;
|
||||||
final TextArea m_description;
|
private final TextArea lifecycleDescription;
|
||||||
|
|
||||||
BaseLifecycleForm(final String key, final GlobalizedMessage message) {
|
BaseLifecycleForm(final String key, final GlobalizedMessage message) {
|
||||||
super(key, message);
|
super(key, message);
|
||||||
|
|
||||||
m_name = new TextField(new TrimmedStringParameter("label"));
|
lifecycleName = new TextField(new TrimmedStringParameter("label"));
|
||||||
addField(gz("cms.ui.name"), m_name);
|
addField(gz("cms.ui.lifecycle.name"), lifecycleName);
|
||||||
|
|
||||||
m_name.addValidationListener(new NotEmptyValidationListener());
|
lifecycleName.addValidationListener(new NotEmptyValidationListener());
|
||||||
m_name.setSize(40);
|
lifecycleName.setSize(40);
|
||||||
m_name.setMaxLength(1000);
|
lifecycleName.setMaxLength(1000);
|
||||||
|
|
||||||
m_description = new TextArea(new TrimmedStringParameter("description"));
|
lifecycleDescription = new TextArea(
|
||||||
addField(gz("cms.ui.description"), m_description);
|
new TrimmedStringParameter("description"));
|
||||||
|
addField(gz("cms.ui.lifecycle.description"), lifecycleDescription);
|
||||||
|
|
||||||
m_description.addValidationListener(new StringLengthValidationListener(
|
lifecycleDescription.addValidationListener(
|
||||||
4000));
|
new StringLengthValidationListener(4000));
|
||||||
m_description.setCols(40);
|
lifecycleDescription.setCols(40);
|
||||||
m_description.setRows(5);
|
lifecycleDescription.setRows(5);
|
||||||
m_description.setWrap(TextArea.SOFT);
|
lifecycleDescription.setWrap(TextArea.SOFT);
|
||||||
|
|
||||||
addAction(new Finish());
|
addAction(new Finish());
|
||||||
addAction(new Cancel());
|
addAction(new Cancel());
|
||||||
|
|
@ -77,43 +66,12 @@ class BaseLifecycleForm extends BaseForm {
|
||||||
AdminPrivileges.ADMINISTER_LIFECYLES));
|
AdminPrivileges.ADMINISTER_LIFECYLES));
|
||||||
}
|
}
|
||||||
|
|
||||||
class NameUniqueListener implements ParameterListener {
|
protected TextField getLifecycleName() {
|
||||||
|
return lifecycleName;
|
||||||
private final LifecycleDefinitionRequestLocal m_definition;
|
}
|
||||||
|
|
||||||
NameUniqueListener(final LifecycleDefinitionRequestLocal definition) {
|
|
||||||
m_definition = definition;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public final void validate(final ParameterEvent e)
|
|
||||||
throws FormProcessException {
|
|
||||||
|
|
||||||
final PageState state = e.getPageState();
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
|
||||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
|
||||||
ConfigurationManager.class);
|
|
||||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
|
||||||
KernelConfig.class);
|
|
||||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
|
||||||
final String label = (String) m_name.getValue(state);
|
|
||||||
|
|
||||||
final java.util.List<LifecycleDefinition> definitions = CMS
|
|
||||||
.getContext().getContentSection().getLifecycleDefinitions();
|
|
||||||
|
|
||||||
for (final LifecycleDefinition definition : definitions) {
|
|
||||||
if (definition.getLabel().getValue(defaultLocale)
|
|
||||||
.equalsIgnoreCase(label)
|
|
||||||
&& (m_definition == null
|
|
||||||
|| !m_definition.getLifecycleDefinition(state)
|
|
||||||
.equals(definition))) {
|
|
||||||
throw new FormProcessException(new GlobalizedMessage(
|
|
||||||
"cms.ui.lifecycle.name_not_unique",
|
|
||||||
CmsConstants.CMS_BUNDLE));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
protected TextArea getLifecycleDescription() {
|
||||||
|
return lifecycleDescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,19 +28,20 @@ import com.arsdigita.bebop.event.FormProcessListener;
|
||||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||||
import com.arsdigita.bebop.form.Hidden;
|
import com.arsdigita.bebop.form.Hidden;
|
||||||
import com.arsdigita.bebop.form.Submit;
|
import com.arsdigita.bebop.form.Submit;
|
||||||
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
import com.arsdigita.bebop.parameters.LongParameter;
|
||||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
||||||
|
|
||||||
import org.librecms.lifecycle.PhaseDefinition;
|
import org.librecms.lifecycle.PhaseDefinition;
|
||||||
|
|
||||||
import com.arsdigita.cms.ui.CMSForm;
|
import com.arsdigita.cms.ui.CMSForm;
|
||||||
import com.arsdigita.cms.ui.FormSecurityListener;
|
import com.arsdigita.cms.ui.FormSecurityListener;
|
||||||
|
import com.arsdigita.globalization.GlobalizedMessage;
|
||||||
|
|
||||||
import org.libreccm.cdi.utils.CdiUtil;
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
import org.librecms.CmsConstants;
|
||||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||||
import org.librecms.lifecycle.PhaseDefinititionRepository;
|
import org.librecms.lifecycle.PhaseDefinititionRepository;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class handles the deleting of a phase definition.
|
* This class handles the deleting of a phase definition.
|
||||||
*
|
*
|
||||||
|
|
@ -50,35 +51,40 @@ import org.librecms.lifecycle.PhaseDefinititionRepository;
|
||||||
class DeletePhaseForm extends CMSForm
|
class DeletePhaseForm extends CMSForm
|
||||||
implements FormProcessListener, FormInitListener {
|
implements FormProcessListener, FormInitListener {
|
||||||
|
|
||||||
private final PhaseRequestLocal m_phase;
|
private final PhaseRequestLocal selectedPhaseDef;
|
||||||
|
|
||||||
private final Hidden m_id;
|
private final Hidden selectedPhaseDefId;
|
||||||
private final Submit m_deleteWidget;
|
private final Submit deleteWidget;
|
||||||
private final Submit m_cancelWidget;
|
private final Submit cancelWidget;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param m The phase selection model. This tells the form which phase
|
* @param m The phase selection model. This tells the form which phase
|
||||||
* definition is selected.
|
* definition is selected.
|
||||||
*/
|
*/
|
||||||
public DeletePhaseForm(final PhaseRequestLocal phase) {
|
public DeletePhaseForm(final PhaseRequestLocal selectedPhaseDef) {
|
||||||
super("PhaseDefinitionDelete");
|
super("PhaseDefinitionDelete");
|
||||||
|
|
||||||
m_phase = phase;
|
this.selectedPhaseDef = selectedPhaseDef;
|
||||||
|
|
||||||
m_id = new Hidden(new BigDecimalParameter("id"));
|
selectedPhaseDefId = new Hidden(new LongParameter("id"));
|
||||||
add(m_id);
|
add(selectedPhaseDefId);
|
||||||
m_id.addValidationListener(new NotNullValidationListener());
|
selectedPhaseDefId
|
||||||
|
.addValidationListener(new NotNullValidationListener());
|
||||||
|
|
||||||
final BoxPanel buttons = new BoxPanel(BoxPanel.HORIZONTAL);
|
final BoxPanel buttons = new BoxPanel(BoxPanel.HORIZONTAL);
|
||||||
m_deleteWidget = new Submit("delete");
|
deleteWidget = new Submit("delete",
|
||||||
m_deleteWidget.setButtonLabel("Delete");
|
new GlobalizedMessage(
|
||||||
m_deleteWidget.setClassAttr("deletePhase");
|
"cms.ui.lifecycle.phase.delete_submit",
|
||||||
buttons.add(m_deleteWidget);
|
CmsConstants.CMS_BUNDLE));
|
||||||
|
deleteWidget.setClassAttr("deletePhase");
|
||||||
|
buttons.add(deleteWidget);
|
||||||
|
|
||||||
m_cancelWidget = new Submit("cancel");
|
cancelWidget = new Submit("cancel",
|
||||||
m_cancelWidget.setButtonLabel("Cancel");
|
new GlobalizedMessage(
|
||||||
m_cancelWidget.setClassAttr("canceldeletePhase");
|
"cms.ui.lifecycle.phase.delete_cancel",
|
||||||
buttons.add(m_cancelWidget);
|
CmsConstants.CMS_BUNDLE));
|
||||||
|
cancelWidget.setClassAttr("canceldeletePhase");
|
||||||
|
buttons.add(cancelWidget);
|
||||||
|
|
||||||
add(buttons, ColumnPanel.CENTER | ColumnPanel.FULL_WIDTH);
|
add(buttons, ColumnPanel.CENTER | ColumnPanel.FULL_WIDTH);
|
||||||
|
|
||||||
|
|
@ -99,7 +105,7 @@ class DeletePhaseForm extends CMSForm
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isCancelled(final PageState state) {
|
public boolean isCancelled(final PageState state) {
|
||||||
return m_cancelWidget.isSelected(state);
|
return cancelWidget.isSelected(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -112,8 +118,9 @@ class DeletePhaseForm extends CMSForm
|
||||||
@Override
|
@Override
|
||||||
public final void process(final FormSectionEvent event)
|
public final void process(final FormSectionEvent event)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
|
|
||||||
final FormData data = event.getFormData();
|
final FormData data = event.getFormData();
|
||||||
final Long key = (Long) data.get(m_id.getName());
|
final Long key = (Long) data.get(selectedPhaseDefId.getName());
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
|
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
|
||||||
|
|
@ -138,9 +145,10 @@ class DeletePhaseForm extends CMSForm
|
||||||
final FormData data = event.getFormData();
|
final FormData data = event.getFormData();
|
||||||
final PageState state = event.getPageState();
|
final PageState state = event.getPageState();
|
||||||
|
|
||||||
final Long id = m_phase.getPhase(state).getDefinitionId();
|
final Long phaseDefId = selectedPhaseDef.getPhase(state)
|
||||||
|
.getDefinitionId();
|
||||||
|
|
||||||
data.put(m_id.getName(), id);
|
data.put(selectedPhaseDefId.getName(), phaseDefId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,9 +49,11 @@ import org.libreccm.cdi.utils.CdiUtil;
|
||||||
import org.libreccm.configuration.ConfigurationManager;
|
import org.libreccm.configuration.ConfigurationManager;
|
||||||
import org.librecms.CmsConstants;
|
import org.librecms.CmsConstants;
|
||||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||||
import org.librecms.lifecycle.PhaseDefinititionRepository;
|
import org.librecms.lifecycle.LifecycleDefinition;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class contains a form component to edit a lifecycle phase definition.
|
* This class contains a form component to edit a lifecycle phase definition.
|
||||||
|
|
@ -63,7 +65,6 @@ import java.util.Locale;
|
||||||
*/
|
*/
|
||||||
class EditPhaseForm extends CMSForm {
|
class EditPhaseForm extends CMSForm {
|
||||||
|
|
||||||
private final static String PHASE_ID = "id";
|
|
||||||
private final static String LABEL = "label";
|
private final static String LABEL = "label";
|
||||||
private final static String DESCRIPTION = "description";
|
private final static String DESCRIPTION = "description";
|
||||||
private final static String DELAY_DAYS = "delay_days";
|
private final static String DELAY_DAYS = "delay_days";
|
||||||
|
|
@ -75,18 +76,19 @@ class EditPhaseForm extends CMSForm {
|
||||||
private final static String SUBMIT = "submit";
|
private final static String SUBMIT = "submit";
|
||||||
private final static String CANCEL = "cancel";
|
private final static String CANCEL = "cancel";
|
||||||
|
|
||||||
private final PhaseRequestLocal m_phase;
|
private final LifecycleDefinitionRequestLocal selectedLifecycle;
|
||||||
|
private final PhaseRequestLocal selectedPhase;
|
||||||
|
|
||||||
private final TextField m_label;
|
private final TextField phaseLabel;
|
||||||
private final TextArea m_description;
|
private final TextArea phaseDescription;
|
||||||
private final TextField m_delayDays;
|
private final TextField delayDays;
|
||||||
private final TextField m_delayHours;
|
private final TextField delayHours;
|
||||||
private final TextField m_delayMinutes;
|
private final TextField delayMinutes;
|
||||||
private final TextField m_durDays;
|
private final TextField durationDays;
|
||||||
private final TextField m_durHours;
|
private final TextField durationHours;
|
||||||
private final TextField m_durMinutes;
|
private final TextField durationMinutes;
|
||||||
private final Submit m_submit;
|
private final Submit submit;
|
||||||
private final Submit m_cancel;
|
private final Submit cancel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
|
|
@ -96,100 +98,106 @@ class EditPhaseForm extends CMSForm {
|
||||||
*
|
*
|
||||||
* @pre phases != null
|
* @pre phases != null
|
||||||
*/
|
*/
|
||||||
public EditPhaseForm(final PhaseRequestLocal phase) {
|
public EditPhaseForm(
|
||||||
|
final LifecycleDefinitionRequestLocal selectedLifecycle,
|
||||||
|
final PhaseRequestLocal selectedPhase) {
|
||||||
|
|
||||||
super("EditPhaseDefinition");
|
super("EditPhaseDefinition");
|
||||||
|
|
||||||
m_phase = phase;
|
this.selectedLifecycle = selectedLifecycle;
|
||||||
|
this.selectedPhase = selectedPhase;
|
||||||
|
|
||||||
add(new Label());
|
add(new Label());
|
||||||
add(new FormErrorDisplay(this));
|
add(new FormErrorDisplay(this));
|
||||||
|
|
||||||
add(new Label(gz("cms.ui.name")));
|
add(new Label(gz("cms.ui.lifecycle.phase.name")));
|
||||||
m_label = new TextField(new TrimmedStringParameter(LABEL));
|
phaseLabel = new TextField(new TrimmedStringParameter(LABEL));
|
||||||
m_label.addValidationListener(new NotEmptyValidationListener());
|
phaseLabel.addValidationListener(new NotEmptyValidationListener());
|
||||||
m_label.setSize(40);
|
phaseLabel.setSize(40);
|
||||||
m_label.setMaxLength(1000);
|
phaseLabel.setMaxLength(1000);
|
||||||
add(m_label);
|
add(phaseLabel);
|
||||||
|
|
||||||
add(new Label(gz("cms.ui.description")));
|
add(new Label(gz("cms.ui.lifecycle.phase.description")));
|
||||||
m_description = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
phaseDescription = new TextArea(new TrimmedStringParameter(DESCRIPTION));
|
||||||
m_description.addValidationListener(new StringLengthValidationListener(
|
phaseDescription.addValidationListener(
|
||||||
4000));
|
new StringLengthValidationListener(
|
||||||
m_description.setCols(40);
|
4000));
|
||||||
m_description.setRows(5);
|
phaseDescription.setCols(40);
|
||||||
m_description.setWrap(TextArea.SOFT);
|
phaseDescription.setRows(5);
|
||||||
add(m_description);
|
phaseDescription.setWrap(TextArea.SOFT);
|
||||||
|
add(phaseDescription);
|
||||||
|
|
||||||
// Phase duration
|
// Phase duration
|
||||||
// Max value: days: 60 years, hours: 7 days, minutes: 1 day
|
// Max value: days: 60 years, hours: 7 days, minutes: 1 day
|
||||||
m_delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
|
delayDays = new TextField(new IntegerParameter(DELAY_DAYS));
|
||||||
m_delayDays.addValidationListener(new NumberInRangeValidationListener(0,
|
delayDays.addValidationListener(new NumberInRangeValidationListener(0,
|
||||||
21900));
|
|
||||||
m_delayDays.setSize(7);
|
|
||||||
m_delayDays.setClassAttr("DaysField");
|
|
||||||
|
|
||||||
m_delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
|
|
||||||
m_delayHours.addValidationListener(
|
|
||||||
new NumberInRangeValidationListener(0, 168));
|
|
||||||
m_delayHours.setClassAttr("HoursField");
|
|
||||||
m_delayHours.setSize(7);
|
|
||||||
|
|
||||||
m_delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
|
|
||||||
m_delayMinutes.addValidationListener(
|
|
||||||
new NumberInRangeValidationListener(0, 1440));
|
|
||||||
m_delayMinutes.setSize(7);
|
|
||||||
m_delayMinutes.setClassAttr("MinutesField");
|
|
||||||
|
|
||||||
add(new Label(new GlobalizedMessage("cms.ui.lifecycle.start_delay",
|
|
||||||
CmsConstants.CMS_BUNDLE)));
|
|
||||||
SimpleContainer de = new SimpleContainer();
|
|
||||||
de.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
|
||||||
de.add(m_delayDays);
|
|
||||||
de.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
|
||||||
de.add(m_delayHours);
|
|
||||||
de.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
|
|
||||||
de.add(m_delayMinutes);
|
|
||||||
add(de);
|
|
||||||
|
|
||||||
// Phase duration
|
|
||||||
// Max value: days: 60 years, hours: 7 days, minutes: 1 day
|
|
||||||
m_durDays = new TextField(new IntegerParameter(DURATION_DAYS));
|
|
||||||
m_durDays.addValidationListener(new NumberInRangeValidationListener(0,
|
|
||||||
21900));
|
21900));
|
||||||
m_durDays.setSize(7);
|
delayDays.setSize(7);
|
||||||
m_durDays.setClassAttr("DaysField");
|
delayDays.setClassAttr("DaysField");
|
||||||
|
|
||||||
m_durHours = new TextField(new IntegerParameter(DURATION_HOURS));
|
delayHours = new TextField(new IntegerParameter(DELAY_HOURS));
|
||||||
m_durHours.addValidationListener(new NumberInRangeValidationListener(0,
|
delayHours.addValidationListener(
|
||||||
168));
|
new NumberInRangeValidationListener(0, 168));
|
||||||
m_durHours.setSize(7);
|
delayHours.setClassAttr("HoursField");
|
||||||
m_durHours.setClassAttr("HoursField");
|
delayHours.setSize(7);
|
||||||
|
|
||||||
m_durMinutes = new TextField(new IntegerParameter(DURATION_MINUTES));
|
delayMinutes = new TextField(new IntegerParameter(DELAY_MINUTES));
|
||||||
m_durMinutes.addValidationListener(
|
delayMinutes.addValidationListener(
|
||||||
new NumberInRangeValidationListener(0, 1440));
|
new NumberInRangeValidationListener(0, 1440));
|
||||||
m_durMinutes.setSize(7);
|
delayMinutes.setSize(7);
|
||||||
m_durMinutes.setClassAttr("MinutesField");
|
delayMinutes.setClassAttr("MinutesField");
|
||||||
|
|
||||||
add(new Label(gz("cms.ui.lifecycle.duration")));
|
add(new Label(
|
||||||
SimpleContainer du = new SimpleContainer();
|
new GlobalizedMessage("cms.ui.lifecycle.phase_start_delay",
|
||||||
du.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
CmsConstants.CMS_BUNDLE)));
|
||||||
du.add(m_durDays);
|
final SimpleContainer delayContainer = new SimpleContainer();
|
||||||
du.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
||||||
du.add(m_durHours);
|
delayContainer.add(delayDays);
|
||||||
du.add(new Label(gz("cms.ui.lifecycle.phase_mins")));
|
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
||||||
du.add(m_durMinutes);
|
delayContainer.add(delayHours);
|
||||||
add(du);
|
delayContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
|
||||||
|
delayContainer.add(delayMinutes);
|
||||||
|
add(delayContainer);
|
||||||
|
|
||||||
|
// Phase duration
|
||||||
|
// Max value: days: 60 years, hours: 7 days, minutes: 1 day
|
||||||
|
durationDays = new TextField(new IntegerParameter(DURATION_DAYS));
|
||||||
|
durationDays.addValidationListener(
|
||||||
|
new NumberInRangeValidationListener(0,
|
||||||
|
21900));
|
||||||
|
durationDays.setSize(7);
|
||||||
|
durationDays.setClassAttr("DaysField");
|
||||||
|
|
||||||
|
durationHours = new TextField(new IntegerParameter(DURATION_HOURS));
|
||||||
|
durationHours.addValidationListener(new NumberInRangeValidationListener(
|
||||||
|
0,
|
||||||
|
168));
|
||||||
|
durationHours.setSize(7);
|
||||||
|
durationHours.setClassAttr("HoursField");
|
||||||
|
|
||||||
|
durationMinutes = new TextField(new IntegerParameter(DURATION_MINUTES));
|
||||||
|
durationMinutes.addValidationListener(
|
||||||
|
new NumberInRangeValidationListener(0, 1440));
|
||||||
|
durationMinutes.setSize(7);
|
||||||
|
durationMinutes.setClassAttr("MinutesField");
|
||||||
|
|
||||||
|
add(new Label(gz("cms.ui.lifecycle.phase_duration")));
|
||||||
|
final SimpleContainer durationContainer = new SimpleContainer();
|
||||||
|
durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_days")));
|
||||||
|
durationContainer.add(durationDays);
|
||||||
|
durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_hours")));
|
||||||
|
durationContainer.add(durationHours);
|
||||||
|
durationContainer.add(new Label(gz("cms.ui.lifecycle.phase_minutes")));
|
||||||
|
durationContainer.add(durationMinutes);
|
||||||
|
add(durationContainer);
|
||||||
|
|
||||||
// Submit and cancel buttons
|
// Submit and cancel buttons
|
||||||
SimpleContainer s = new SimpleContainer();
|
final SimpleContainer submitCancelContainer = new SimpleContainer();
|
||||||
m_submit = new Submit(SUBMIT);
|
submit = new Submit(SUBMIT, gz("cms.ui.lifecycle.phase.edit_submit"));
|
||||||
m_submit.setButtonLabel("Edit Phase");
|
submitCancelContainer.add(submit);
|
||||||
s.add(m_submit);
|
cancel = new Submit(CANCEL, gz("cms.ui.lifecycle.phase.edit_cancel"));
|
||||||
m_cancel = new Submit(CANCEL);
|
submitCancelContainer.add(cancel);
|
||||||
m_cancel.setButtonLabel("Cancel");
|
add(submitCancelContainer, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
|
||||||
s.add(m_cancel);
|
|
||||||
add(s, ColumnPanel.FULL_WIDTH | ColumnPanel.CENTER);
|
|
||||||
|
|
||||||
// Add form listeners.
|
// Add form listeners.
|
||||||
addInitListener(new FormInitListener() {
|
addInitListener(new FormInitListener() {
|
||||||
|
|
@ -240,7 +248,7 @@ class EditPhaseForm extends CMSForm {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isCancelled(final PageState state) {
|
public boolean isCancelled(final PageState state) {
|
||||||
return m_cancel.isSelected(state);
|
return cancel.isSelected(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -253,21 +261,27 @@ class EditPhaseForm extends CMSForm {
|
||||||
*/
|
*/
|
||||||
private void initializePhaseDefinition(final PageState state)
|
private void initializePhaseDefinition(final PageState state)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
PhaseDefinition pd = m_phase.getPhase(state);
|
|
||||||
m_label.setValue(state, pd.getLabel());
|
|
||||||
m_description.setValue(state, pd.getDescription());
|
|
||||||
|
|
||||||
long[] delay = Duration.formatDHM(pd.getDefaultDelay());
|
final Locale defaultLocale = KernelConfig.getConfig().getDefaultLocale();
|
||||||
m_delayDays.setValue(state, delay[0]);
|
|
||||||
m_delayHours.setValue(state, delay[1]);
|
|
||||||
m_delayMinutes.setValue(state, delay[2]);
|
|
||||||
|
|
||||||
Long duration = pd.getDefaultDuration();
|
final PhaseDefinition phaseDef = selectedPhase.getPhase(state);
|
||||||
if (duration != null) {
|
phaseLabel.setValue(state, phaseDef.getLabel().getValue(defaultLocale));
|
||||||
Long[] dhm = Duration.formatDHM(duration);
|
phaseDescription.setValue(state,
|
||||||
m_durDays.setValue(state, dhm[0]);
|
phaseDef
|
||||||
m_durHours.setValue(state, dhm[1]);
|
.getDescription()
|
||||||
m_durMinutes.setValue(state, dhm[2]);
|
.getValue(defaultLocale));
|
||||||
|
|
||||||
|
final long[] delay = Duration.formatDHM(phaseDef.getDefaultDelay());
|
||||||
|
delayDays.setValue(state, delay[0]);
|
||||||
|
delayHours.setValue(state, delay[1]);
|
||||||
|
delayMinutes.setValue(state, delay[2]);
|
||||||
|
|
||||||
|
final Long duration = phaseDef.getDefaultDuration();
|
||||||
|
if (duration != 0) {
|
||||||
|
final Long[] dhm = Duration.formatDHM(duration);
|
||||||
|
durationDays.setValue(state, dhm[0]);
|
||||||
|
durationHours.setValue(state, dhm[1]);
|
||||||
|
durationMinutes.setValue(state, dhm[2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -281,31 +295,40 @@ class EditPhaseForm extends CMSForm {
|
||||||
private void updatePhaseDefinition(final PageState state)
|
private void updatePhaseDefinition(final PageState state)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
|
|
||||||
final String label = (String) m_label.getValue(state);
|
final String label = (String) phaseLabel.getValue(state);
|
||||||
final String description = (String) m_description.getValue(state);
|
final String description = (String) phaseDescription.getValue(state);
|
||||||
final Integer delayDays = (Integer) m_delayDays.getValue(state);
|
final int delDays = (int) Optional
|
||||||
final Integer delayHours = (Integer) m_delayHours.getValue(state);
|
.ofNullable(delayDays.getValue(state))
|
||||||
final Integer delayMinutes = (Integer) m_delayMinutes.getValue(state);
|
.orElseGet(() -> 0);
|
||||||
final Integer durDays = (Integer) m_durDays.getValue(state);
|
final int delHours = (int) Optional
|
||||||
final Integer durHours = (Integer) m_durHours.getValue(state);
|
.ofNullable(delayHours.getValue(state))
|
||||||
final Integer durMinutes = (Integer) m_durMinutes.getValue(state);
|
.orElseGet(() -> 0);;
|
||||||
|
final int delMinutes = (int) Optional
|
||||||
|
.ofNullable(delayMinutes.getValue(state))
|
||||||
|
.orElseGet(() -> 0);;
|
||||||
|
final int durDays = (int) Optional
|
||||||
|
.ofNullable(durationDays.getValue(state))
|
||||||
|
.orElseGet(() -> 0);;
|
||||||
|
final int durHours = (int) Optional
|
||||||
|
.ofNullable(durationHours.getValue(state))
|
||||||
|
.orElseGet(() -> 0);;
|
||||||
|
final int durMinutes = (int) Optional
|
||||||
|
.ofNullable(durationMinutes.getValue(state))
|
||||||
|
.orElseGet(() -> 0);;
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
final LifecycleAdminPaneController controller = cdiUtil
|
||||||
ConfigurationManager.class);
|
.findBean(LifecycleAdminPaneController.class);
|
||||||
final PhaseDefinititionRepository phaseDefRepo = cdiUtil.findBean(
|
|
||||||
PhaseDefinititionRepository.class);
|
|
||||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
|
||||||
KernelConfig.class);
|
|
||||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
|
||||||
|
|
||||||
final PhaseDefinition phaseDefinition = m_phase.getPhase(state);
|
controller.updatePhaseDefinition(selectedPhase.getPhase(state),
|
||||||
phaseDefinition.getLabel().addValue(defaultLocale, label);
|
label,
|
||||||
phaseDefinition.getDescription().addValue(defaultLocale, description);
|
description,
|
||||||
phaseDefinition.setDefaultDelay(delayDays * delayHours * delayMinutes
|
delDays,
|
||||||
* 60);
|
delHours,
|
||||||
phaseDefinition.setDefaultDuration(durDays * durHours * durMinutes * 60);
|
delMinutes,
|
||||||
phaseDefRepo.save(phaseDefinition);
|
durDays,
|
||||||
|
durHours,
|
||||||
|
durMinutes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -318,24 +341,46 @@ class EditPhaseForm extends CMSForm {
|
||||||
*/
|
*/
|
||||||
private void validateUniqueName(final PageState state)
|
private void validateUniqueName(final PageState state)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
final String newLabel = (String) m_label.getValue(state);
|
|
||||||
|
|
||||||
// PhaseDefinition pd = m_phase.getPhase(state);
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
// PhaseDefinitionCollection phaseDefs = pd.getLifecycleDefinition()
|
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||||
// .getPhaseDefinitions();
|
ConfigurationManager.class);
|
||||||
//
|
final KernelConfig kernelConfig = confManager.findConfiguration(
|
||||||
// // If the name has changed, check for uniqueness.
|
KernelConfig.class);
|
||||||
// if (!pd.getLabel().equalsIgnoreCase(newLabel)) {
|
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
||||||
// while (phaseDefs.next()) {
|
|
||||||
// PhaseDefinition phaseDef = phaseDefs.getPhaseDefinition();
|
final String oldLabel = selectedPhase
|
||||||
//
|
.getPhase(state)
|
||||||
// if (phaseDef.getLabel().equalsIgnoreCase(newLabel)) {
|
.getLabel()
|
||||||
// phaseDefs.close();
|
.getValue(defaultLocale);
|
||||||
// throw new FormProcessException(GlobalizationUtil.globalize(
|
final String newLabel = (String) phaseLabel.getValue(state);
|
||||||
// "cms.ui.lifecycle.phase_name_not_unique"));
|
|
||||||
// }
|
if (oldLabel.equals(newLabel)) {
|
||||||
// }
|
//Label has node changed, no validation required.
|
||||||
// }
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final LifecycleDefinition cycleDef = selectedLifecycle
|
||||||
|
.getLifecycleDefinition(state);
|
||||||
|
final LifecycleAdminPaneController controller = cdiUtil
|
||||||
|
.findBean(LifecycleAdminPaneController.class);
|
||||||
|
final List<PhaseDefinition> phaseDefs = controller
|
||||||
|
.getPhaseDefinitions(cycleDef);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
final boolean duplicateLabel = phaseDefs
|
||||||
|
.stream()
|
||||||
|
.map(phaseDef -> phaseDef.getLabel().getValue(defaultLocale))
|
||||||
|
.anyMatch(phaseDefLabel -> {
|
||||||
|
return phaseDefLabel.equalsIgnoreCase(newLabel);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (duplicateLabel) {
|
||||||
|
throw new FormProcessException(new GlobalizedMessage(
|
||||||
|
"cms.ui.lifecycle.phase_name_not_unique",
|
||||||
|
CmsConstants.CMS_BUNDLE));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -343,13 +388,14 @@ class EditPhaseForm extends CMSForm {
|
||||||
*
|
*
|
||||||
* @param state The page state
|
* @param state The page state
|
||||||
*
|
*
|
||||||
* @pre state != null
|
*
|
||||||
*/
|
*/
|
||||||
private void validateDuration(final PageState state)
|
private void validateDuration(final PageState state)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
final Integer durDays = (Integer) m_durDays.getValue(state);
|
|
||||||
final Integer durHours = (Integer) m_durHours.getValue(state);
|
final Integer durDays = (Integer) durationDays.getValue(state);
|
||||||
final Integer durMinutes = (Integer) m_durMinutes.getValue(state);
|
final Integer durHours = (Integer) durationHours.getValue(state);
|
||||||
|
final Integer durMinutes = (Integer) durationMinutes.getValue(state);
|
||||||
|
|
||||||
// Phase duration is infinite, so the duration is valid.
|
// Phase duration is infinite, so the duration is valid.
|
||||||
if (durDays == null && durHours == null && durMinutes == null) {
|
if (durDays == null && durHours == null && durMinutes == null) {
|
||||||
|
|
@ -357,22 +403,22 @@ class EditPhaseForm extends CMSForm {
|
||||||
}
|
}
|
||||||
|
|
||||||
int days, hours, minutes;
|
int days, hours, minutes;
|
||||||
if (durDays != null) {
|
if (durDays == null) {
|
||||||
days = durDays.intValue();
|
|
||||||
} else {
|
|
||||||
days = 0;
|
days = 0;
|
||||||
|
} else {
|
||||||
|
days = durDays;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (durHours != null) {
|
if (durHours == null) {
|
||||||
hours = durHours.intValue();
|
|
||||||
} else {
|
|
||||||
hours = 0;
|
hours = 0;
|
||||||
|
} else {
|
||||||
|
hours = durHours;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (durMinutes != null) {
|
if (durMinutes == null) {
|
||||||
minutes = durMinutes.intValue();
|
|
||||||
} else {
|
|
||||||
minutes = 0;
|
minutes = 0;
|
||||||
|
} else {
|
||||||
|
minutes = durMinutes;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((days + hours + minutes) == 0) {
|
if ((days + hours + minutes) == 0) {
|
||||||
|
|
@ -386,8 +432,4 @@ class EditPhaseForm extends CMSForm {
|
||||||
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
|
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String lz(final String key) {
|
|
||||||
return (String) gz(key).localize();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,6 @@ import com.arsdigita.bebop.parameters.DateParameter;
|
||||||
import com.arsdigita.bebop.parameters.IntegerParameter;
|
import com.arsdigita.bebop.parameters.IntegerParameter;
|
||||||
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
|
import com.arsdigita.bebop.parameters.NumberInRangeValidationListener;
|
||||||
import com.arsdigita.cms.CMS;
|
import com.arsdigita.cms.CMS;
|
||||||
import com.arsdigita.cms.ContentCenter;
|
|
||||||
import com.arsdigita.cms.ui.BaseForm;
|
import com.arsdigita.cms.ui.BaseForm;
|
||||||
import com.arsdigita.cms.ui.ContentItemPage;
|
import com.arsdigita.cms.ui.ContentItemPage;
|
||||||
import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
|
import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
|
||||||
|
|
@ -51,15 +50,12 @@ import com.arsdigita.mail.Mail;
|
||||||
import com.arsdigita.util.UncheckedWrapperException;
|
import com.arsdigita.util.UncheckedWrapperException;
|
||||||
import com.arsdigita.web.RedirectSignal;
|
import com.arsdigita.web.RedirectSignal;
|
||||||
import com.arsdigita.web.URL;
|
import com.arsdigita.web.URL;
|
||||||
import com.arsdigita.web.Web;
|
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.arsdigita.cms.CMSConfig;
|
import org.arsdigita.cms.CMSConfig;
|
||||||
import org.libreccm.cdi.utils.CdiUtil;
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
import org.libreccm.l10n.GlobalizationHelper;
|
import org.libreccm.l10n.GlobalizationHelper;
|
||||||
import org.libreccm.notification.Notification;
|
|
||||||
import org.libreccm.security.Party;
|
|
||||||
import org.libreccm.security.Shiro;
|
import org.libreccm.security.Shiro;
|
||||||
import org.libreccm.security.User;
|
import org.libreccm.security.User;
|
||||||
import org.libreccm.security.UserRepository;
|
import org.libreccm.security.UserRepository;
|
||||||
|
|
@ -74,13 +70,11 @@ import org.librecms.contentsection.ContentItem;
|
||||||
import org.librecms.contentsection.ContentItemManager;
|
import org.librecms.contentsection.ContentItemManager;
|
||||||
import org.librecms.contentsection.ContentItemRepository;
|
import org.librecms.contentsection.ContentItemRepository;
|
||||||
import org.librecms.contentsection.ContentSection;
|
import org.librecms.contentsection.ContentSection;
|
||||||
import org.librecms.contentsection.ContentSectionConfig;
|
|
||||||
import org.librecms.contentsection.privileges.ItemPrivileges;
|
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||||
import org.librecms.lifecycle.Lifecycle;
|
import org.librecms.lifecycle.Lifecycle;
|
||||||
import org.librecms.lifecycle.LifecycleDefinition;
|
import org.librecms.lifecycle.LifecycleDefinition;
|
||||||
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
||||||
import org.librecms.lifecycle.LifecycleManager;
|
import org.librecms.lifecycle.LifecycleManager;
|
||||||
import org.librecms.lifecycle.LifecycleRepository;
|
|
||||||
import org.librecms.lifecycle.Phase;
|
import org.librecms.lifecycle.Phase;
|
||||||
import org.librecms.lifecycle.PhaseDefinition;
|
import org.librecms.lifecycle.PhaseDefinition;
|
||||||
import org.librecms.lifecycle.PhaseRepository;
|
import org.librecms.lifecycle.PhaseRepository;
|
||||||
|
|
@ -91,10 +85,7 @@ import org.librecms.workflow.CmsTaskType;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.math.BigInteger;
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
|
||||||
|
|
@ -24,18 +24,9 @@ import com.arsdigita.bebop.SingleSelectionModel;
|
||||||
import com.arsdigita.bebop.event.FormProcessListener;
|
import com.arsdigita.bebop.event.FormProcessListener;
|
||||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||||
import com.arsdigita.cms.CMS;
|
import com.arsdigita.cms.CMS;
|
||||||
import com.arsdigita.kernel.KernelConfig;
|
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.librecms.contentsection.ContentSection;
|
|
||||||
import org.librecms.lifecycle.LifecycleDefinition;
|
import org.librecms.lifecycle.LifecycleDefinition;
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.libreccm.cdi.utils.CdiUtil;
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
import org.libreccm.configuration.ConfigurationManager;
|
|
||||||
import org.librecms.contentsection.ContentSectionManager;
|
|
||||||
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Michael Pih
|
* @author Michael Pih
|
||||||
|
|
@ -46,16 +37,15 @@ import java.util.Locale;
|
||||||
*/
|
*/
|
||||||
class LifecycleAddForm extends BaseLifecycleForm {
|
class LifecycleAddForm extends BaseLifecycleForm {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger(LifecycleAddForm.class);
|
private final SingleSelectionModel<Long> selectedLifecycle;
|
||||||
|
|
||||||
private final SingleSelectionModel<Long> m_model;
|
LifecycleAddForm(final SingleSelectionModel<Long> selectedLifecycle) {
|
||||||
|
|
||||||
LifecycleAddForm(final SingleSelectionModel<Long> model) {
|
|
||||||
super("LifecycleDefinition", gz("cms.ui.lifecycle.add"));
|
super("LifecycleDefinition", gz("cms.ui.lifecycle.add"));
|
||||||
|
|
||||||
m_model = model;
|
this.selectedLifecycle = selectedLifecycle;
|
||||||
|
|
||||||
m_name.addValidationListener(new NameUniqueListener(null));
|
getLifecycleName().addValidationListener(
|
||||||
|
new LifecycleNameUniqueListener(this));
|
||||||
|
|
||||||
addProcessListener(new ProcessListener());
|
addProcessListener(new ProcessListener());
|
||||||
}
|
}
|
||||||
|
|
@ -63,35 +53,22 @@ class LifecycleAddForm extends BaseLifecycleForm {
|
||||||
private class ProcessListener implements FormProcessListener {
|
private class ProcessListener implements FormProcessListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void process(final FormSectionEvent e)
|
public final void process(final FormSectionEvent event)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
final PageState state = e.getPageState();
|
|
||||||
|
final PageState state = event.getPageState();
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
final LifecycleAdminPaneController controller = cdiUtil
|
||||||
ConfigurationManager.class);
|
.findBean(LifecycleAdminPaneController.class);
|
||||||
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil.findBean(
|
|
||||||
LifecycleDefinitionRepository.class);
|
|
||||||
final ContentSectionManager sectionManager = cdiUtil.findBean(
|
|
||||||
ContentSectionManager.class);
|
|
||||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
|
||||||
KernelConfig.class);
|
|
||||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
|
||||||
|
|
||||||
final LifecycleDefinition definition = new LifecycleDefinition();
|
final LifecycleDefinition definition = controller
|
||||||
|
.createLifecycleDefinition(
|
||||||
|
CMS.getContext().getContentSection(),
|
||||||
|
(String) getLifecycleName().getValue(state),
|
||||||
|
(String) getLifecycleDescription().getValue(state));
|
||||||
|
|
||||||
definition.getLabel().addValue(defaultLocale,
|
selectedLifecycle.setSelectedKey(state,
|
||||||
(String) m_name.getValue(state));
|
definition.getDefinitionId());
|
||||||
definition.getDescription().addValue(
|
|
||||||
defaultLocale,
|
|
||||||
(String) m_description.getValue(state));
|
|
||||||
lifecycleDefRepo.save(definition);
|
|
||||||
|
|
||||||
final ContentSection section = CMS.getContext().getContentSection();
|
|
||||||
sectionManager.addLifecycleDefinitionToContentSection(definition,
|
|
||||||
section);
|
|
||||||
|
|
||||||
m_model.setSelectedKey(state,
|
|
||||||
definition.getDefinitionId());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,48 +32,42 @@ import com.arsdigita.cms.ui.BaseAdminPane;
|
||||||
import com.arsdigita.cms.ui.BaseDeleteForm;
|
import com.arsdigita.cms.ui.BaseDeleteForm;
|
||||||
import com.arsdigita.cms.ui.FormSecurityListener;
|
import com.arsdigita.cms.ui.FormSecurityListener;
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.libreccm.cdi.utils.CdiUtil;
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
import org.librecms.contentsection.ContentSectionManager;
|
|
||||||
import org.librecms.contentsection.privileges.AdminPrivileges;
|
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||||
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class contains the split pane for the lifecycle administration
|
* This class contains the split pane for the lifecycle administration
|
||||||
* interface.
|
* interface.
|
||||||
*
|
*
|
||||||
|
*
|
||||||
* @author Michael Pih
|
* @author Michael Pih
|
||||||
* @author Jack Chung
|
* @author Jack Chung
|
||||||
* @author <a href="mailto:jross@redhat.com">Justin Ross</a>
|
* @author <a href="mailto:jross@redhat.com">Justin Ross</a>
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
*/
|
*/
|
||||||
public class LifecycleAdminPane extends BaseAdminPane {
|
public class LifecycleAdminPane extends BaseAdminPane {
|
||||||
|
|
||||||
private static Logger LOGGER = LogManager.getLogger(LifecycleAdminPane.class);
|
private final SingleSelectionModel selectionModel;
|
||||||
|
private final LifecycleDefinitionRequestLocal selectionLifecycleDefinition;
|
||||||
private final SingleSelectionModel m_model;
|
|
||||||
private final LifecycleDefinitionRequestLocal m_definition;
|
|
||||||
|
|
||||||
public LifecycleAdminPane() {
|
public LifecycleAdminPane() {
|
||||||
super(new Label(gz("cms.ui.lifecycles")),
|
super(new Label(gz("cms.ui.lifecycles")),
|
||||||
new LifecycleListModelBuilder());
|
new LifecycleListModelBuilder());
|
||||||
|
|
||||||
m_model = getSelectionModel();
|
selectionModel = getSelectionModel();
|
||||||
m_definition = new SelectionRequestLocal();
|
selectionLifecycleDefinition = new SelectionRequestLocal();
|
||||||
|
|
||||||
// XXX secvis
|
// XXX secvis
|
||||||
//add(new LifecycleAdminContainer(m_addLink));
|
//add(new LifecycleAdminContainer(m_addLink));
|
||||||
setAdd(gz("cms.ui.lifecycle.add"),
|
setAdd(gz("cms.ui.lifecycle.add"),
|
||||||
new LifecycleAddForm(m_model));
|
new LifecycleAddForm(selectionModel));
|
||||||
setEdit(gz("cms.ui.lifecycle.edit"),
|
setEdit(gz("cms.ui.lifecycle.edit"),
|
||||||
new LifecycleEditForm(m_definition));
|
new LifecycleEditForm(selectionLifecycleDefinition));
|
||||||
setDelete(gz("cms.ui.lifecycle.delete"), new DeleteForm());
|
setDelete(gz("cms.ui.lifecycle.delete"), new DeleteForm());
|
||||||
|
|
||||||
setIntroPane(new Label(gz("cms.ui.lifecycle.intro")));
|
setIntroPane(new Label(gz("cms.ui.lifecycle.intro")));
|
||||||
setItemPane(new LifecycleItemPane(m_definition,
|
setItemPane(new LifecycleItemPane(selectionLifecycleDefinition,
|
||||||
getEditLink(),
|
getEditLink(),
|
||||||
getDeleteLink()));
|
getDeleteLink()));
|
||||||
|
|
||||||
|
|
@ -85,7 +79,7 @@ public class LifecycleAdminPane extends BaseAdminPane {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected final Object initialValue(final PageState state) {
|
protected final Object initialValue(final PageState state) {
|
||||||
final String id = m_model.getSelectedKey(state).toString();
|
final String id = selectionModel.getSelectedKey(state).toString();
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
|
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
|
||||||
|
|
@ -105,24 +99,21 @@ public class LifecycleAdminPane extends BaseAdminPane {
|
||||||
AdminPrivileges.ADMINISTER_LIFECYLES));
|
AdminPrivileges.ADMINISTER_LIFECYLES));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public final void process(final FormSectionEvent event)
|
public final void process(final FormSectionEvent event)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
|
|
||||||
final PageState state = event.getPageState();
|
final PageState state = event.getPageState();
|
||||||
final ContentSection section = CMS.getContext().getContentSection();
|
final ContentSection section = CMS.getContext().getContentSection();
|
||||||
final LifecycleDefinition definition = m_definition
|
final LifecycleDefinition definition = selectionLifecycleDefinition
|
||||||
.getLifecycleDefinition(state);
|
.getLifecycleDefinition(state);
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
final ContentSectionManager sectionManager = cdiUtil.findBean(
|
final LifecycleAdminPaneController controller = cdiUtil
|
||||||
ContentSectionManager.class);
|
.findBean(LifecycleAdminPaneController.class);
|
||||||
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
|
controller.deleteLifecycleDefinition(definition, section);
|
||||||
.findBean(LifecycleDefinitionRepository.class);
|
|
||||||
|
|
||||||
sectionManager.removeLifecycleDefinitionFromContentSection(
|
selectionModel.clearSelection(state);
|
||||||
definition, section);
|
|
||||||
lifecycleDefRepo.delete(definition);
|
|
||||||
|
|
||||||
m_model.clearSelection(state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 org.librecms.lifecycle.LifecycleDefinition;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public abstract class LifecycleDefinitionRequestLocal extends RequestLocal {
|
public abstract class LifecycleDefinitionRequestLocal extends RequestLocal {
|
||||||
|
|
||||||
public final LifecycleDefinition getLifecycleDefinition(
|
public final LifecycleDefinition getLifecycleDefinition(
|
||||||
final PageState state) {
|
final PageState state) {
|
||||||
return (LifecycleDefinition) get(state);
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
final Optional<LifecycleDefinition> definition
|
||||||
|
= (Optional<LifecycleDefinition>) get(
|
||||||
|
state);
|
||||||
|
|
||||||
|
return definition.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,16 +23,9 @@ import com.arsdigita.bebop.PageState;
|
||||||
import com.arsdigita.bebop.event.FormInitListener;
|
import com.arsdigita.bebop.event.FormInitListener;
|
||||||
import com.arsdigita.bebop.event.FormProcessListener;
|
import com.arsdigita.bebop.event.FormProcessListener;
|
||||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||||
import com.arsdigita.kernel.KernelConfig;
|
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.librecms.lifecycle.LifecycleDefinition;
|
import org.librecms.lifecycle.LifecycleDefinition;
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.libreccm.cdi.utils.CdiUtil;
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
import org.libreccm.configuration.ConfigurationManager;
|
|
||||||
import org.librecms.lifecycle.LifecycleDefinitionRepository;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class contains a form component to edit a lifecycle definition.
|
* This class contains a form component to edit a lifecycle definition.
|
||||||
|
|
@ -40,20 +33,19 @@ import java.util.Locale;
|
||||||
* @author Jack Chung
|
* @author Jack Chung
|
||||||
* @author Xixi D'Moon <xdmoon@redhat.com>
|
* @author Xixi D'Moon <xdmoon@redhat.com>
|
||||||
* @author Justin Ross <jross@redhat.com>
|
* @author Justin Ross <jross@redhat.com>
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
*/
|
*/
|
||||||
class LifecycleEditForm extends BaseLifecycleForm {
|
class LifecycleEditForm extends BaseLifecycleForm {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger(
|
private final LifecycleDefinitionRequestLocal selectedDefinition;
|
||||||
LifecycleEditForm.class);
|
|
||||||
|
|
||||||
private final LifecycleDefinitionRequestLocal m_definition;
|
LifecycleEditForm(final LifecycleDefinitionRequestLocal selectedDefinition) {
|
||||||
|
|
||||||
LifecycleEditForm(final LifecycleDefinitionRequestLocal definition) {
|
|
||||||
super("LifecycleEdit", gz("cms.ui.lifecycle.edit"));
|
super("LifecycleEdit", gz("cms.ui.lifecycle.edit"));
|
||||||
|
|
||||||
m_definition = definition;
|
this.selectedDefinition = selectedDefinition;
|
||||||
|
|
||||||
m_name.addValidationListener(new NameUniqueListener(m_definition));
|
getLifecycleName().addValidationListener(
|
||||||
|
new LifecycleNameUniqueListener(this, selectedDefinition));
|
||||||
|
|
||||||
addInitListener(new InitListener());
|
addInitListener(new InitListener());
|
||||||
addProcessListener(new ProcessListener());
|
addProcessListener(new ProcessListener());
|
||||||
|
|
@ -61,13 +53,14 @@ class LifecycleEditForm extends BaseLifecycleForm {
|
||||||
|
|
||||||
private class InitListener implements FormInitListener {
|
private class InitListener implements FormInitListener {
|
||||||
|
|
||||||
public final void init(final FormSectionEvent e) {
|
@Override
|
||||||
final PageState state = e.getPageState();
|
public final void init(final FormSectionEvent event) {
|
||||||
final LifecycleDefinition cycle = m_definition
|
final PageState state = event.getPageState();
|
||||||
|
final LifecycleDefinition cycle = selectedDefinition
|
||||||
.getLifecycleDefinition(state);
|
.getLifecycleDefinition(state);
|
||||||
|
|
||||||
m_name.setValue(state, cycle.getLabel());
|
getLifecycleName().setValue(state, cycle.getLabel());
|
||||||
m_description.setValue(state, cycle.getDescription());
|
getLifecycleDescription().setValue(state, cycle.getDescription());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -78,24 +71,17 @@ class LifecycleEditForm extends BaseLifecycleForm {
|
||||||
public final void process(final FormSectionEvent event)
|
public final void process(final FormSectionEvent event)
|
||||||
throws FormProcessException {
|
throws FormProcessException {
|
||||||
final PageState state = event.getPageState();
|
final PageState state = event.getPageState();
|
||||||
final LifecycleDefinition definition = m_definition
|
final LifecycleDefinition definition = selectedDefinition
|
||||||
.getLifecycleDefinition(state);
|
.getLifecycleDefinition(state);
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
final LifecycleAdminPaneController controller = cdiUtil
|
||||||
ConfigurationManager.class);
|
.findBean(LifecycleAdminPaneController.class);
|
||||||
final LifecycleDefinitionRepository lifecycleDefRepo = cdiUtil
|
|
||||||
.findBean(LifecycleDefinitionRepository.class);
|
|
||||||
final KernelConfig kernelConfig = confManager.findConfiguration(
|
|
||||||
KernelConfig.class);
|
|
||||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
|
||||||
|
|
||||||
definition.getLabel().addValue(defaultLocale,
|
controller.updateLifecycleDefinition(
|
||||||
(String) m_name.getValue(state));
|
definition,
|
||||||
definition.getDescription().addValue(
|
(String) getLifecycleName().getValue(state),
|
||||||
defaultLocale,
|
(String) getLifecycleDescription().getValue(state));
|
||||||
(String) m_description.getValue(state));
|
|
||||||
lifecycleDefRepo.save(definition);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -60,34 +60,38 @@ import java.util.Locale;
|
||||||
*/
|
*/
|
||||||
class LifecycleItemPane extends BaseItemPane {
|
class LifecycleItemPane extends BaseItemPane {
|
||||||
|
|
||||||
private final LifecycleDefinitionRequestLocal m_cycle;
|
private final LifecycleDefinitionRequestLocal selectedLifecycle;
|
||||||
private final PhaseRequestLocal m_phase;
|
private final PhaseRequestLocal selectedPhase;
|
||||||
|
|
||||||
private final Container m_detailPane;
|
private final Container detailPane;
|
||||||
private final Table m_phases;
|
private final Table phasesTable;
|
||||||
|
|
||||||
public LifecycleItemPane(final LifecycleDefinitionRequestLocal cycle,
|
public LifecycleItemPane(
|
||||||
final ActionLink editLink,
|
final LifecycleDefinitionRequestLocal selectedLifecycle,
|
||||||
final ActionLink deleteLink) {
|
final ActionLink editLink,
|
||||||
m_cycle = cycle;
|
final ActionLink deleteLink) {
|
||||||
m_phase = new SelectionRequestLocal();
|
|
||||||
|
|
||||||
m_phases = new PhaseTable();
|
this.selectedLifecycle = selectedLifecycle;
|
||||||
|
selectedPhase = new SelectionRequestLocal();
|
||||||
|
|
||||||
m_detailPane = new SimpleContainer();
|
phasesTable = new PhaseTable();
|
||||||
add(m_detailPane);
|
|
||||||
setDefault(m_detailPane);
|
|
||||||
|
|
||||||
m_detailPane.add(new SummarySection(editLink, deleteLink));
|
detailPane = new SimpleContainer();
|
||||||
|
add(detailPane);
|
||||||
|
setDefault(detailPane);
|
||||||
|
|
||||||
|
detailPane.add(new SummarySection(editLink, deleteLink));
|
||||||
|
|
||||||
final ActionLink phaseAddLink = new ActionLink(new Label(gz(
|
final ActionLink phaseAddLink = new ActionLink(new Label(gz(
|
||||||
"cms.ui.lifecycle.phase_add")));
|
"cms.ui.lifecycle.phase_add")));
|
||||||
|
|
||||||
m_detailPane.add(new PhaseSection(phaseAddLink));
|
detailPane.add(new PhaseSection(phaseAddLink));
|
||||||
|
|
||||||
final AddPhaseForm phaseAddForm = new AddPhaseForm(m_cycle);
|
final AddPhaseForm phaseAddForm = new AddPhaseForm(selectedLifecycle);
|
||||||
final EditPhaseForm phaseEditForm = new EditPhaseForm(m_phase);
|
final EditPhaseForm phaseEditForm = new EditPhaseForm(selectedLifecycle,
|
||||||
final DeletePhaseForm phaseDeleteForm = new DeletePhaseForm(m_phase);
|
selectedPhase);
|
||||||
|
final DeletePhaseForm phaseDeleteForm = new DeletePhaseForm(
|
||||||
|
selectedPhase);
|
||||||
|
|
||||||
add(phaseAddForm);
|
add(phaseAddForm);
|
||||||
add(phaseEditForm);
|
add(phaseEditForm);
|
||||||
|
|
@ -95,17 +99,17 @@ class LifecycleItemPane extends BaseItemPane {
|
||||||
|
|
||||||
connect(phaseAddLink, phaseAddForm);
|
connect(phaseAddLink, phaseAddForm);
|
||||||
connect(phaseAddForm);
|
connect(phaseAddForm);
|
||||||
connect(m_phases, 4, phaseEditForm);
|
connect(phasesTable, 4, phaseEditForm);
|
||||||
connect(phaseEditForm, m_phases.getRowSelectionModel());
|
connect(phaseEditForm, phasesTable.getRowSelectionModel());
|
||||||
connect(m_phases, 5, phaseDeleteForm);
|
connect(phasesTable, 5, phaseDeleteForm);
|
||||||
connect(phaseDeleteForm, m_phases.getRowSelectionModel());
|
connect(phaseDeleteForm, phasesTable.getRowSelectionModel());
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SelectionRequestLocal extends PhaseRequestLocal {
|
private class SelectionRequestLocal extends PhaseRequestLocal {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected final Object initialValue(final PageState state) {
|
protected final Object initialValue(final PageState state) {
|
||||||
final String id = m_phases.getRowSelectionModel().getSelectedKey(
|
final String id = phasesTable.getRowSelectionModel().getSelectedKey(
|
||||||
state).toString();
|
state).toString();
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
|
@ -136,7 +140,8 @@ class LifecycleItemPane extends BaseItemPane {
|
||||||
private class Properties extends PropertyList {
|
private class Properties extends PropertyList {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected final java.util.List properties(final PageState state) {
|
protected final java.util.List<Property> properties(
|
||||||
|
final PageState state) {
|
||||||
|
|
||||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||||
|
|
@ -145,15 +150,15 @@ class LifecycleItemPane extends BaseItemPane {
|
||||||
KernelConfig.class);
|
KernelConfig.class);
|
||||||
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
final Locale defaultLocale = kernelConfig.getDefaultLocale();
|
||||||
|
|
||||||
final java.util.List props = super.properties(state);
|
final java.util.List<Property> props = super.properties(state);
|
||||||
final LifecycleDefinition cycle = m_cycle
|
final LifecycleDefinition cycle = selectedLifecycle
|
||||||
.getLifecycleDefinition(state);
|
.getLifecycleDefinition(state);
|
||||||
|
|
||||||
props.add(new Property(
|
props.add(new Property(
|
||||||
gz("cms.ui.name"),
|
gz("cms.ui.lifecycle.name"),
|
||||||
cycle.getLabel().getValue(defaultLocale)));
|
cycle.getLabel().getValue(defaultLocale)));
|
||||||
props.add(new Property(
|
props.add(new Property(
|
||||||
gz("cms.ui.description"),
|
gz("cms.ui.lifecycle.description"),
|
||||||
cycle.getDescription().getValue(defaultLocale)));
|
cycle.getDescription().getValue(defaultLocale)));
|
||||||
|
|
||||||
return props;
|
return props;
|
||||||
|
|
@ -171,7 +176,7 @@ class LifecycleItemPane extends BaseItemPane {
|
||||||
final ActionGroup group = new ActionGroup();
|
final ActionGroup group = new ActionGroup();
|
||||||
setBody(group);
|
setBody(group);
|
||||||
|
|
||||||
group.setSubject(m_phases);
|
group.setSubject(phasesTable);
|
||||||
group.addAction(new LifecycleAdminContainer(addLink),
|
group.addAction(new LifecycleAdminContainer(addLink),
|
||||||
ActionGroup.ADD);
|
ActionGroup.ADD);
|
||||||
}
|
}
|
||||||
|
|
@ -179,9 +184,9 @@ class LifecycleItemPane extends BaseItemPane {
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX fix this
|
// XXX fix this
|
||||||
private static final String[] s_headers = {
|
private static final String[] HEADERS = {
|
||||||
lz("cms.ui.name"),
|
lz("cms.ui.lifecycle.phase.name"),
|
||||||
lz("cms.ui.description"),
|
lz("cms.ui.lifecycle.phase.description"),
|
||||||
lz("cms.ui.lifecycle.phase_delay"),
|
lz("cms.ui.lifecycle.phase_delay"),
|
||||||
lz("cms.ui.lifecycle.phase_duration"),
|
lz("cms.ui.lifecycle.phase_duration"),
|
||||||
"",
|
"",
|
||||||
|
|
@ -191,7 +196,7 @@ class LifecycleItemPane extends BaseItemPane {
|
||||||
private class PhaseTable extends Table {
|
private class PhaseTable extends Table {
|
||||||
|
|
||||||
public PhaseTable() {
|
public PhaseTable() {
|
||||||
super(new PhaseTableModelBuilder(m_cycle), s_headers);
|
super(new PhaseTableModelBuilder(selectedLifecycle), HEADERS);
|
||||||
|
|
||||||
setEmptyView(new Label(gz("cms.ui.lifecycle.phase_none")));
|
setEmptyView(new Label(gz("cms.ui.lifecycle.phase_none")));
|
||||||
|
|
||||||
|
|
@ -235,7 +240,7 @@ class LifecycleItemPane extends BaseItemPane {
|
||||||
public final void reset(final PageState state) {
|
public final void reset(final PageState state) {
|
||||||
super.reset(state);
|
super.reset(state);
|
||||||
|
|
||||||
m_phases.clearSelection(state);
|
phasesTable.clearSelection(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,13 +22,23 @@ import com.arsdigita.bebop.PageState;
|
||||||
import com.arsdigita.bebop.list.ListModel;
|
import com.arsdigita.bebop.list.ListModel;
|
||||||
import com.arsdigita.bebop.list.ListModelBuilder;
|
import com.arsdigita.bebop.list.ListModelBuilder;
|
||||||
import com.arsdigita.cms.CMS;
|
import com.arsdigita.cms.CMS;
|
||||||
|
import com.arsdigita.kernel.KernelConfig;
|
||||||
|
|
||||||
import org.librecms.contentsection.ContentSection;
|
import org.librecms.contentsection.ContentSection;
|
||||||
|
|
||||||
import com.arsdigita.util.LockableImpl;
|
import com.arsdigita.util.LockableImpl;
|
||||||
|
|
||||||
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
import org.librecms.lifecycle.LifecycleDefinition;
|
import org.librecms.lifecycle.LifecycleDefinition;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads all the current lifecycles from the database so that they may be
|
* Loads all the current lifecycles from the database so that they may be
|
||||||
* displayed in a list.
|
* displayed in a list.
|
||||||
|
|
@ -38,45 +48,48 @@ import org.librecms.lifecycle.LifecycleDefinition;
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
*/
|
*/
|
||||||
public final class LifecycleListModelBuilder extends LockableImpl
|
public final class LifecycleListModelBuilder extends LockableImpl
|
||||||
implements ListModelBuilder {
|
implements ListModelBuilder {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final ListModel makeModel(final com.arsdigita.bebop.List list,
|
public final ListModel makeModel(final com.arsdigita.bebop.List list,
|
||||||
final PageState state) {
|
final PageState state) {
|
||||||
return new Model(state);
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
final LifecycleAdminPaneController controller = cdiUtil
|
||||||
|
.findBean(LifecycleAdminPaneController.class);
|
||||||
|
final ContentSection section = CMS.getContext().getContentSection();
|
||||||
|
return new Model(controller.getLifecyclesForContentSection(section));
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Model implements ListModel {
|
private class Model implements ListModel {
|
||||||
|
|
||||||
private final List<LifecycleDefinition> m_cycles;
|
private final Iterator<LifecycleDefinition> iterator;
|
||||||
private int index = -1;
|
private LifecycleDefinition currentLifecycleDef;
|
||||||
|
private final Locale defaultLocale;
|
||||||
|
|
||||||
public Model(final PageState state) {
|
public Model(final List<LifecycleDefinition> lifecycles) {
|
||||||
m_cycles = getCollection(state);
|
iterator = lifecycles.iterator();
|
||||||
|
defaultLocale = KernelConfig.getConfig().getDefaultLocale();
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
private List<LifecycleDefinition> getCollection(final PageState state) {
|
|
||||||
final ContentSection section = CMS.getContext().getContentSection();
|
|
||||||
|
|
||||||
final List<LifecycleDefinition> cycles = section.getLifecycleDefinitions();
|
|
||||||
|
|
||||||
return cycles;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean next() throws NoSuchElementException {
|
public boolean next() throws NoSuchElementException {
|
||||||
index++;
|
if (iterator.hasNext()) {
|
||||||
return index < m_cycles.size();
|
currentLifecycleDef = iterator.next();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getElement() {
|
public Object getElement() {
|
||||||
return m_cycles.get(index).getLabel();
|
return currentLifecycleDef.getLabel().getValue(defaultLocale);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getKey() {
|
public String getKey() {
|
||||||
return Long.toString(m_cycles.get(index).getDefinitionId());
|
return Long.toString(currentLifecycleDef.getDefinitionId());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 org.librecms.lifecycle.PhaseDefinition;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public abstract class PhaseRequestLocal extends RequestLocal {
|
public abstract class PhaseRequestLocal extends RequestLocal {
|
||||||
|
|
||||||
|
|
||||||
public final PhaseDefinition getPhase(final PageState state) {
|
public final PhaseDefinition getPhase(final PageState state) {
|
||||||
return (PhaseDefinition) get(state);
|
@SuppressWarnings("unchecked")
|
||||||
|
final Optional<PhaseDefinition> phaseDef = (Optional<PhaseDefinition>) get(state);
|
||||||
|
return phaseDef.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,37 +28,45 @@ import org.librecms.lifecycle.LifecycleDefinition;
|
||||||
import org.librecms.lifecycle.PhaseDefinition;
|
import org.librecms.lifecycle.PhaseDefinition;
|
||||||
|
|
||||||
import com.arsdigita.globalization.GlobalizedMessage;
|
import com.arsdigita.globalization.GlobalizedMessage;
|
||||||
import com.arsdigita.util.Assert;
|
import com.arsdigita.kernel.KernelConfig;
|
||||||
import com.arsdigita.util.LockableImpl;
|
import com.arsdigita.util.LockableImpl;
|
||||||
|
|
||||||
import org.arsdigita.cms.CMSConfig;
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
import org.librecms.CmsConstants;
|
import org.librecms.CmsConstants;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
class PhaseTableModelBuilder extends LockableImpl
|
class PhaseTableModelBuilder extends LockableImpl
|
||||||
implements TableModelBuilder {
|
implements TableModelBuilder {
|
||||||
private final LifecycleDefinitionRequestLocal cycle;
|
|
||||||
|
|
||||||
public PhaseTableModelBuilder
|
private final LifecycleDefinitionRequestLocal selectedLifecycle;
|
||||||
(final LifecycleDefinitionRequestLocal cycle) {
|
|
||||||
this.cycle = cycle;
|
public PhaseTableModelBuilder(
|
||||||
|
final LifecycleDefinitionRequestLocal selectedLifecycle) {
|
||||||
|
this.selectedLifecycle = selectedLifecycle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final TableModel makeModel(final Table table,
|
public final TableModel makeModel(final Table table,
|
||||||
final PageState state) {
|
final PageState state) {
|
||||||
return new PhaseTableModel(cycle.getLifecycleDefinition(state));
|
|
||||||
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
final LifecycleAdminPaneController controller = cdiUtil
|
||||||
|
.findBean(LifecycleAdminPaneController.class);
|
||||||
|
final LifecycleDefinition definition = selectedLifecycle
|
||||||
|
.getLifecycleDefinition(state);
|
||||||
|
|
||||||
|
return new PhaseTableModel(controller.getPhaseDefinitions(definition));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class PhaseTableModel implements TableModel {
|
private static class PhaseTableModel implements TableModel {
|
||||||
|
|
||||||
private final List<PhaseDefinition> phases;
|
private final Iterator<PhaseDefinition> iterator;
|
||||||
private int index = -1;
|
private PhaseDefinition currentPhaseDef;
|
||||||
private PhaseDefinition phase;
|
|
||||||
|
|
||||||
public PhaseTableModel(final LifecycleDefinition cycle) {
|
public PhaseTableModel(final List<PhaseDefinition> phaseDefinitions) {
|
||||||
phases = cycle.getPhaseDefinitions();
|
iterator = phaseDefinitions.iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -68,10 +76,8 @@ class PhaseTableModelBuilder extends LockableImpl
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final boolean nextRow() {
|
public final boolean nextRow() {
|
||||||
index++;
|
if (iterator.hasNext()) {
|
||||||
if (index < phases.size()) {
|
currentPhaseDef = iterator.next();
|
||||||
phase = phases.get(index);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -80,40 +86,45 @@ class PhaseTableModelBuilder extends LockableImpl
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final Object getElementAt(final int column) {
|
public final Object getElementAt(final int column) {
|
||||||
Assert.exists(phase, "PhaseDefinition m_phase");
|
|
||||||
|
|
||||||
switch (column) {
|
switch (column) {
|
||||||
case 0:
|
case 0:
|
||||||
return phase.getLabel();
|
return currentPhaseDef
|
||||||
case 1:
|
.getLabel()
|
||||||
return phase.getDescription();
|
.getValue(KernelConfig.getConfig().getDefaultLocale());
|
||||||
case 2:
|
case 1:
|
||||||
return Duration.formatDuration(phase.getDefaultDelay());
|
return currentPhaseDef
|
||||||
case 3:
|
.getDescription()
|
||||||
final Long duration = phase.getDefaultDuration();
|
.getValue(KernelConfig.getConfig().getDefaultLocale());
|
||||||
|
case 2:
|
||||||
|
return Duration.formatDuration(currentPhaseDef
|
||||||
|
.getDefaultDelay());
|
||||||
|
case 3:
|
||||||
|
final Long duration = currentPhaseDef.getDefaultDuration();
|
||||||
|
|
||||||
if (duration == null) {
|
if (duration == 0) {
|
||||||
return lz("cms.ui.lifecycle.forever");
|
return lz("cms.ui.lifecycle.forever");
|
||||||
} else {
|
} else {
|
||||||
return Duration.formatDuration(duration);
|
return Duration.formatDuration(duration);
|
||||||
}
|
}
|
||||||
case 4:
|
case 4:
|
||||||
return lz("cms.ui.lifecycle.phase_edit");
|
return lz("cms.ui.lifecycle.phase_edit");
|
||||||
case 5:
|
case 5:
|
||||||
return lz("cms.ui.lifecycle.phase_delete");
|
return lz("cms.ui.lifecycle.phase_delete");
|
||||||
default:
|
default:
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getKeyAt(int columnIndex) {
|
public Object getKeyAt(final int columnIndex) {
|
||||||
if (phase == null) {
|
if (currentPhaseDef == null) {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
} else {
|
} else {
|
||||||
return phase.getDefinitionId();
|
return currentPhaseDef.getDefinitionId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GlobalizedMessage gz(final String key) {
|
private static GlobalizedMessage gz(final String key) {
|
||||||
|
|
@ -123,4 +134,5 @@ class PhaseTableModelBuilder extends LockableImpl
|
||||||
private static String lz(final String key) {
|
private static String lz(final String key) {
|
||||||
return (String) gz(key).localize();
|
return (String) gz(key).localize();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -195,15 +195,11 @@ public class LifecycleDefinition implements Serializable {
|
||||||
+ "definitionId = %d, "
|
+ "definitionId = %d, "
|
||||||
+ "label = %s, "
|
+ "label = %s, "
|
||||||
+ "description = %s, "
|
+ "description = %s, "
|
||||||
+ "defaultListener = \"%s\", "
|
|
||||||
+ "phaseDefinitions = { %s }%s"
|
|
||||||
+ " }",
|
+ " }",
|
||||||
super.toString(),
|
super.toString(),
|
||||||
definitionId,
|
definitionId,
|
||||||
Objects.toString(label),
|
Objects.toString(label),
|
||||||
Objects.toString(description),
|
Objects.toString(description),
|
||||||
defaultListener,
|
|
||||||
Objects.toString(phaseDefinitions),
|
|
||||||
data);
|
data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -181,3 +181,43 @@ cms.ui.workflow.task.role.none=This task has not been assigned to any roles
|
||||||
cms.ui.workflow.task.role.add=Assign this task to a role
|
cms.ui.workflow.task.role.add=Assign this task to a role
|
||||||
cms.ui.workflow.task.role.delete=Remove
|
cms.ui.workflow.task.role.delete=Remove
|
||||||
cms.ui.workflow.task.role.name=Role
|
cms.ui.workflow.task.role.name=Role
|
||||||
|
cms.ui.lifecycle.intro=Select an existing lifecycle or create a new one
|
||||||
|
cms.ui.lifecycle.add=Create new lifecycle
|
||||||
|
cms.ui.lifecycle.name=Name
|
||||||
|
cms.ui.lifecycle.description=Description
|
||||||
|
cms.ui.lifecycle.details=Lifecycle details
|
||||||
|
cms.ui.category.delete_category=Delete category
|
||||||
|
cms.ui.category.edit_links=Edit links
|
||||||
|
cms.ui.category.add_a_subcategory=Add a subcategory
|
||||||
|
cms.ui.category.current_category=Current category
|
||||||
|
cms.ui.category.extreme_actions=Delete
|
||||||
|
cms.ui.category.category_purposes=Category purpose
|
||||||
|
cms.ui.category.category_information=Details
|
||||||
|
cms.ui.category.linked_categories=Linked categories
|
||||||
|
cms.ui.category.restore_default_permissions=Restore default permissions
|
||||||
|
cms.ui.category.return_to_category_info=Back to category info
|
||||||
|
cms.ui.lifecycle.edit=Edit lifecycle
|
||||||
|
cms.ui.lifecycle.delete=Delete lifecycle
|
||||||
|
cms.ui.lifecycle.delete_prompt=Are you sure to delete this lifecycle?
|
||||||
|
cms.ui.lifecycle.phases=Phases
|
||||||
|
cms.ui.lifecycle.phase_none=This lifecycle has no phases
|
||||||
|
cms.ui.lifecycle.phase_add=Add phase
|
||||||
|
cms.ui.lifecycle.phase.name=Name
|
||||||
|
cms.ui.lifecycle.phase.description=Description
|
||||||
|
cms.ui.lifecycle.phase_start_delay=Start delay
|
||||||
|
cms.ui.lifecycle.phase_days=Days
|
||||||
|
cms.ui.lifecycle.phase_hours=Hours
|
||||||
|
cms.ui.lifecycle.phase_minutes=Minutes
|
||||||
|
cms.ui.lifecycle.phase_duration=Duration
|
||||||
|
cms.ui.lifecycle.phase.add_submit=Add phase
|
||||||
|
cms.ui.lifecycle.phase.add_cancel=Cancel
|
||||||
|
cms.ui.lifecycle.phase_duration_negative=The duration must be greater than zero
|
||||||
|
cms.ui.lifecycle.phase_name_not_unique=There is already a phase with this name
|
||||||
|
cms.ui.lifecycle.phase_delay=Delay
|
||||||
|
cms.ui.lifecycle.phase_edit=Edit
|
||||||
|
cms.ui.lifecycle.phase_delete=Delete
|
||||||
|
cms.ui.lifecycle.forever=Forever
|
||||||
|
cms.ui.lifecycle.phase.edit_submit=Save
|
||||||
|
cms.ui.lifecycle.phase.edit_cancel=Cancel
|
||||||
|
cms.ui.lifecycle.phase.delete_submit=Delete
|
||||||
|
cms.ui.lifecycle.phase.delete_cancel=Cancel
|
||||||
|
|
|
||||||
|
|
@ -180,3 +180,43 @@ cms.ui.workflow.task.role.none=Diese Aufgabe ist keiner Rolle zugeordnet
|
||||||
cms.ui.workflow.task.role.add=Diese Aufgabe einer Rolle zuordnen
|
cms.ui.workflow.task.role.add=Diese Aufgabe einer Rolle zuordnen
|
||||||
cms.ui.workflow.task.role.delete=Entfernen
|
cms.ui.workflow.task.role.delete=Entfernen
|
||||||
cms.ui.workflow.task.role.name=Rolle
|
cms.ui.workflow.task.role.name=Rolle
|
||||||
|
cms.ui.lifecycle.intro=Einen Ver\u00f6ffentlichungszyklus ausw\u00e4hlen oder neu erstellen
|
||||||
|
cms.ui.lifecycle.add=Neuen Ver\u00f6ffentlichungszyklus erstellen
|
||||||
|
cms.ui.lifecycle.name=Name
|
||||||
|
cms.ui.lifecycle.description=Beschreibung
|
||||||
|
cms.ui.lifecycle.details=Ver\u00f6ffentlichungszyklus Details
|
||||||
|
cms.ui.category.delete_category=Kategorie l\u00f6schen
|
||||||
|
cms.ui.category.edit_links=Links bearbeiten
|
||||||
|
cms.ui.category.add_a_subcategory=Unterkateogorie hinzuf\u00fcgen
|
||||||
|
cms.ui.category.current_category=Aktuelle Kategorie
|
||||||
|
cms.ui.category.extreme_actions=L\u00f6schen
|
||||||
|
cms.ui.category.category_purposes=Category purpose
|
||||||
|
cms.ui.category.category_information=Details
|
||||||
|
cms.ui.category.linked_categories=Verlinkte Kategorien
|
||||||
|
cms.ui.category.restore_default_permissions=Berechtigungen zur\u00fccksetzen
|
||||||
|
cms.ui.category.return_to_category_info=Zur\u00fcck zu den Details
|
||||||
|
cms.ui.lifecycle.edit=Ver\u00f6ffentlichungszyklus bearbeiten
|
||||||
|
cms.ui.lifecycle.delete=Ver\u00f6ffentlichungszyklus l\u00f6schen
|
||||||
|
cms.ui.lifecycle.delete_prompt=Sind Sie sicher, dass Sie den ausgew\u00e4hlten Ver\u00f6ffentlichungszyklus l\u00f6schen wollen?
|
||||||
|
cms.ui.lifecycle.phases=Phasen
|
||||||
|
cms.ui.lifecycle.phase_none=Dieser Ver\u00f6ffentlichungszyklus hat keine Phasen
|
||||||
|
cms.ui.lifecycle.phase_add=Phase hinzuf\u00fcgen
|
||||||
|
cms.ui.lifecycle.phase.name=Name
|
||||||
|
cms.ui.lifecycle.phase.description=Beschreibung
|
||||||
|
cms.ui.lifecycle.phase_start_delay=Beginn verz\u00f6gert um
|
||||||
|
cms.ui.lifecycle.phase_days=Tage
|
||||||
|
cms.ui.lifecycle.phase_hours=Stunden
|
||||||
|
cms.ui.lifecycle.phase_minutes=Minuten
|
||||||
|
cms.ui.lifecycle.phase_duration=Dauer
|
||||||
|
cms.ui.lifecycle.phase.add_submit=Phase hinzuf\u00fcgen
|
||||||
|
cms.ui.lifecycle.phase.add_cancel=Abbrechen
|
||||||
|
cms.ui.lifecycle.phase_duration_negative=Die Dauer muss gr\u00f6\u00dfer als Null sein
|
||||||
|
cms.ui.lifecycle.phase_name_not_unique=Es gibt bereits eine Phase mit diesem Namen
|
||||||
|
cms.ui.lifecycle.phase_delay=Verz\u00f6gerung
|
||||||
|
cms.ui.lifecycle.phase_edit=Bearbeiten
|
||||||
|
cms.ui.lifecycle.phase_delete=L\u00f6schen
|
||||||
|
cms.ui.lifecycle.forever=Unbegrenzt
|
||||||
|
cms.ui.lifecycle.phase.edit_submit=Speichern
|
||||||
|
cms.ui.lifecycle.phase.edit_cancel=Abbrechen
|
||||||
|
cms.ui.lifecycle.phase.delete_submit=L\u00f6schen
|
||||||
|
cms.ui.lifecycle.phase.delete_cancel=Abbrechen
|
||||||
|
|
|
||||||
|
|
@ -149,3 +149,33 @@ cms.ui.workflow.task.role.none=This task has not been assigned to any roles
|
||||||
cms.ui.workflow.task.role.add=Assign this task to a role
|
cms.ui.workflow.task.role.add=Assign this task to a role
|
||||||
cms.ui.workflow.task.role.delete=Remove
|
cms.ui.workflow.task.role.delete=Remove
|
||||||
cms.ui.workflow.task.role.name=Role
|
cms.ui.workflow.task.role.name=Role
|
||||||
|
cms.ui.lifecycle.intro=Select an existing lifecycle or create a new one
|
||||||
|
cms.ui.lifecycle.add=Create new lifecycle
|
||||||
|
cms.ui.lifecycle.name=Name
|
||||||
|
cms.ui.lifecycle.description=Description
|
||||||
|
cms.ui.lifecycle.details=Lifecycle details
|
||||||
|
cms.ui.lifecycle.edit=Edit lifecycle
|
||||||
|
cms.ui.lifecycle.delete=Delete lifecycle
|
||||||
|
cms.ui.lifecycle.delete_prompt=Are you sure to delete this lifecycle?
|
||||||
|
cms.ui.lifecycle.phases=Phases
|
||||||
|
cms.ui.lifecycle.phase_none=This lifecycle has no phases
|
||||||
|
cms.ui.lifecycle.phase_add=Add phase
|
||||||
|
cms.ui.lifecycle.phase.name=Name
|
||||||
|
cms.ui.lifecycle.phase.description=Description
|
||||||
|
cms.ui.lifecycle.phase_start_delay=Start delay
|
||||||
|
cms.ui.lifecycle.phase_days=Days
|
||||||
|
cms.ui.lifecycle.phase_hours=Hours
|
||||||
|
cms.ui.lifecycle.phase_minutes=Minutes
|
||||||
|
cms.ui.lifecycle.phase_duration=Duration
|
||||||
|
cms.ui.lifecycle.phase.add_submit=Add phase
|
||||||
|
cms.ui.lifecycle.phase.add_cancel=Cancel
|
||||||
|
cms.ui.lifecycle.phase_duration_negative=The duration must be greater than zero
|
||||||
|
cms.ui.lifecycle.phase_name_not_unique=There is already a phase with this name
|
||||||
|
cms.ui.lifecycle.phase_delay=Delay
|
||||||
|
cms.ui.lifecycle.phase_edit=Edit
|
||||||
|
cms.ui.lifecycle.phase_delete=Delete
|
||||||
|
cms.ui.lifecycle.forever=Forever
|
||||||
|
cms.ui.lifecycle.phase.edit_submit=Save
|
||||||
|
cms.ui.lifecycle.phase.edit_cancel=Cancel
|
||||||
|
cms.ui.lifecycle.phase.delete_submit=Delete
|
||||||
|
cms.ui.lifecycle.phase.delete_cancel=Cancel
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue