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