diff --git a/source/java/org/alfresco/web/bean/generator/AssociationGenerator.java b/source/java/org/alfresco/web/bean/generator/AssociationGenerator.java index f7cbafe3b9..99cae84335 100644 --- a/source/java/org/alfresco/web/bean/generator/AssociationGenerator.java +++ b/source/java/org/alfresco/web/bean/generator/AssociationGenerator.java @@ -1,12 +1,19 @@ package org.alfresco.web.bean.generator; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; + import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; +import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.FacesHelper; +import org.alfresco.web.ui.common.Utils; import org.alfresco.web.ui.repo.RepoConstants; import org.alfresco.web.ui.repo.component.property.PropertySheetItem; import org.alfresco.web.ui.repo.component.property.UIPropertySheet; +import org.alfresco.web.ui.repo.component.property.UIPropertySheet.ClientValidation; /** * Generates a component to manage associations. @@ -28,9 +35,29 @@ public class AssociationGenerator extends BaseComponentGenerator protected void setupMandatoryValidation(FacesContext context, UIPropertySheet propertySheet, PropertySheetItem item, UIComponent component, boolean realTimeChecking) { - // TODO: the association editor component needs to use the - // 'current_value' hidden field rather than the standard - // 'value' field as this is always null (it's used internally - // by the component) for now disable mandatory checks completely + // Override the setup of the mandatory validation as the + // [form][element] approach needs to be used to locate the + // field and the _current_value hidden field needs + // to be used. We also enable real time so the page load + // check disables the ok button if necessary, as the user + // adds or removes items from the multi value list the + // page will be refreshed and therefore re-check the status. + + List params = new ArrayList(3); + + // add the value parameter + String value = "document.forms['" + + Utils.getParentForm(context, component).getId() + "']['" + + component.getClientId(context) + "_current_value'].value"; + params.add(value); + + // add the validation failed message to show (use the value of the + // label component of the given item) + String msg = Application.getMessage(context, "validation_mandatory"); + params.add("'" + MessageFormat.format(msg, new Object[] {item.getResolvedDisplayLabel()}) + "'"); + + // add the validation case to the property sheet + propertySheet.addClientValidation(new ClientValidation("validateMandatory", + params, true)); } } diff --git a/source/java/org/alfresco/web/bean/generator/CategorySelectorGenerator.java b/source/java/org/alfresco/web/bean/generator/CategorySelectorGenerator.java index 1c611f5718..d8e4428525 100644 --- a/source/java/org/alfresco/web/bean/generator/CategorySelectorGenerator.java +++ b/source/java/org/alfresco/web/bean/generator/CategorySelectorGenerator.java @@ -1,12 +1,19 @@ package org.alfresco.web.bean.generator; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; + import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; +import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.FacesHelper; +import org.alfresco.web.ui.common.Utils; import org.alfresco.web.ui.repo.RepoConstants; import org.alfresco.web.ui.repo.component.property.PropertySheetItem; import org.alfresco.web.ui.repo.component.property.UIPropertySheet; +import org.alfresco.web.ui.repo.component.property.UIPropertySheet.ClientValidation; /** * Generates a category selector component. @@ -37,10 +44,29 @@ public class CategorySelectorGenerator extends BaseComponentGenerator protected void setupMandatoryValidation(FacesContext context, UIPropertySheet propertySheet, PropertySheetItem item, UIComponent component, boolean realTimeChecking) { - // TODO: the category selector component needs to use the - // 'current_value' hidden field rather than the standard - // 'value' field as this is always null (it's used internally - // by the component) for now disable mandatory checks completely + // Override the setup of the mandatory validation as the + // [form][element] approach needs to be used to locate the field + // and the _selected hidden field needs to be + // used. We also enable real time so the page load check disabled + // the ok button if necessary, as the control is used the + // page will be refreshed and therefore re-check the status. + + List params = new ArrayList(3); + + // add the value parameter + String value = "document.forms['" + + Utils.getParentForm(context, component).getId() + "']['" + + component.getClientId(context) + "_selected'].value"; + params.add(value); + + // add the validation failed message to show (use the value of the + // label component of the given item) + String msg = Application.getMessage(context, "validation_mandatory"); + params.add("'" + MessageFormat.format(msg, new Object[] {item.getResolvedDisplayLabel()}) + "'"); + + // add the validation case to the property sheet + propertySheet.addClientValidation(new ClientValidation("validateMandatory", + params, true)); } @Override diff --git a/source/java/org/alfresco/web/bean/generator/ChildAssociationGenerator.java b/source/java/org/alfresco/web/bean/generator/ChildAssociationGenerator.java index 90df1f92fe..2b98575bcf 100644 --- a/source/java/org/alfresco/web/bean/generator/ChildAssociationGenerator.java +++ b/source/java/org/alfresco/web/bean/generator/ChildAssociationGenerator.java @@ -1,12 +1,19 @@ package org.alfresco.web.bean.generator; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; + import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; +import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.FacesHelper; +import org.alfresco.web.ui.common.Utils; import org.alfresco.web.ui.repo.RepoConstants; import org.alfresco.web.ui.repo.component.property.PropertySheetItem; import org.alfresco.web.ui.repo.component.property.UIPropertySheet; +import org.alfresco.web.ui.repo.component.property.UIPropertySheet.ClientValidation; /** * Generates a component to manage child associations. @@ -28,9 +35,29 @@ public class ChildAssociationGenerator extends BaseComponentGenerator protected void setupMandatoryValidation(FacesContext context, UIPropertySheet propertySheet, PropertySheetItem item, UIComponent component, boolean realTimeChecking) { - // TODO: the child assocation editor component needs to use the - // 'current_value' hidden field rather than the standard - // 'value' field as this is always null (it's used internally - // by the component) for now disable mandatory checks completely + // Override the setup of the mandatory validation as the + // [form][element] approach needs to be used to locate the + // field and the _current_value hidden field needs + // to be used. We also enable real time so the page load + // check disables the ok button if necessary, as the user + // adds or removes items from the multi value list the + // page will be refreshed and therefore re-check the status. + + List params = new ArrayList(3); + + // add the value parameter + String value = "document.forms['" + + Utils.getParentForm(context, component).getId() + "']['" + + component.getClientId(context) + "_current_value'].value"; + params.add(value); + + // add the validation failed message to show (use the value of the + // label component of the given item) + String msg = Application.getMessage(context, "validation_mandatory"); + params.add("'" + MessageFormat.format(msg, new Object[] {item.getResolvedDisplayLabel()}) + "'"); + + // add the validation case to the property sheet + propertySheet.addClientValidation(new ClientValidation("validateMandatory", + params, true)); } } diff --git a/source/java/org/alfresco/web/bean/generator/TextFieldGenerator.java b/source/java/org/alfresco/web/bean/generator/TextFieldGenerator.java index 253531236d..8cab273d08 100644 --- a/source/java/org/alfresco/web/bean/generator/TextFieldGenerator.java +++ b/source/java/org/alfresco/web/bean/generator/TextFieldGenerator.java @@ -1,13 +1,20 @@ package org.alfresco.web.bean.generator; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; + import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; +import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.FacesHelper; import org.alfresco.web.ui.common.ComponentConstants; +import org.alfresco.web.ui.common.Utils; import org.alfresco.web.ui.repo.component.UIMultiValueEditor; import org.alfresco.web.ui.repo.component.property.PropertySheetItem; import org.alfresco.web.ui.repo.component.property.UIPropertySheet; +import org.alfresco.web.ui.repo.component.property.UIPropertySheet.ClientValidation; /** * Generates a text field component. @@ -37,15 +44,30 @@ public class TextFieldGenerator extends BaseComponentGenerator { if (component instanceof UIMultiValueEditor) { - // if the text field has multiple values don't allow real time - // checking of the mandatory status + // Override the setup of the mandatory validation as the + // [form][element] approach needs to be used to locate the + // field and the _current_value hidden field needs + // to be used. We also enable real time so the page load + // check disables the ok button if necessary, as the user + // adds or removes items from the multi value list the + // page will be refreshed and therefore re-check the status. - // TODO: the multi-value editor component needs to use the - // 'current_value' hidden field rather than the standard - // 'value' field as this is always null (it's used internally - // by the component) for now disable mandatory checks completely + List params = new ArrayList(3); + + // add the value parameter + String value = "document.forms['" + + Utils.getParentForm(context, component).getId() + "']['" + + component.getClientId(context) + "_current_value'].value"; + params.add(value); - //super.setupMandatoryValidation(context, propertySheet, item, component, false); + // add the validation failed message to show (use the value of the + // label component of the given item) + String msg = Application.getMessage(context, "validation_mandatory"); + params.add("'" + MessageFormat.format(msg, new Object[] {item.getResolvedDisplayLabel()}) + "'"); + + // add the validation case to the property sheet + propertySheet.addClientValidation(new ClientValidation("validateMandatory", + params, true)); } else { diff --git a/source/java/org/alfresco/web/ui/repo/component/property/BaseAssociationEditor.java b/source/java/org/alfresco/web/ui/repo/component/property/BaseAssociationEditor.java index b2e8069314..6bcb27d848 100644 --- a/source/java/org/alfresco/web/ui/repo/component/property/BaseAssociationEditor.java +++ b/source/java/org/alfresco/web/ui/repo/component/property/BaseAssociationEditor.java @@ -392,6 +392,20 @@ public abstract class BaseAssociationEditor extends UIInput // close table out.write(""); + + // output a hidden field containing the current value + out.write(""); } } } diff --git a/source/java/org/alfresco/web/ui/repo/renderer/BaseMultiValueRenderer.java b/source/java/org/alfresco/web/ui/repo/renderer/BaseMultiValueRenderer.java index 41e8164c8f..480d765caa 100644 --- a/source/java/org/alfresco/web/ui/repo/renderer/BaseMultiValueRenderer.java +++ b/source/java/org/alfresco/web/ui/repo/renderer/BaseMultiValueRenderer.java @@ -25,13 +25,10 @@ import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.convert.Converter; -import javax.faces.convert.DateTimeConverter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.util.ISO8601DateFormat; import org.alfresco.web.app.Application; -import org.alfresco.web.app.servlet.FacesHelper; import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.ui.common.Utils; import org.alfresco.web.ui.common.converter.XMLDateConverter; @@ -39,8 +36,6 @@ import org.alfresco.web.ui.common.renderer.BaseRenderer; import org.alfresco.web.ui.repo.RepoConstants; import org.alfresco.web.ui.repo.component.UIMultiValueEditor; import org.alfresco.web.ui.repo.component.UIMultiValueEditor.MultiValueEditorEvent; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** * Base class for renderers of the MultiValueEditor component. @@ -51,8 +46,6 @@ import org.apache.commons.logging.LogFactory; */ public abstract class BaseMultiValueRenderer extends BaseRenderer { - private static Log logger = LogFactory.getLog(BaseMultiValueRenderer.class); - /** I18N message strings */ protected final static String MSG_REMOVE = "remove"; protected final static String MSG_SELECT_BUTTON = "select_button"; @@ -68,10 +61,7 @@ public abstract class BaseMultiValueRenderer extends BaseRenderer */ public void decode(FacesContext context, UIComponent component) { - Object obj = FacesHelper.getManagedBean(context, "MultiValueEditorBean"); - Map requestMap = context.getExternalContext().getRequestParameterMap(); - Map valuesMap = context.getExternalContext().getRequestParameterValuesMap(); String fieldId = getHiddenFieldName(component); String value = (String)requestMap.get(fieldId); @@ -104,6 +94,7 @@ public abstract class BaseMultiValueRenderer extends BaseRenderer /** * @see javax.faces.render.Renderer#encodeBegin(javax.faces.context.FacesContext, javax.faces.component.UIComponent) */ + @SuppressWarnings("static-access") public void encodeBegin(FacesContext context, UIComponent component) throws IOException { if (component.isRendered() == false) @@ -118,7 +109,6 @@ public abstract class BaseMultiValueRenderer extends BaseRenderer { ResponseWriter out = context.getResponseWriter(); Map attrs = component.getAttributes(); - String clientId = component.getClientId(context); UIMultiValueEditor editor = (UIMultiValueEditor)component; // start outer table @@ -137,6 +127,11 @@ public abstract class BaseMultiValueRenderer extends BaseRenderer */ public void encodeEnd(FacesContext context, UIComponent component) throws IOException { + if (component.isRendered() == false) + { + return; + } + if (component instanceof UIMultiValueEditor) { ResponseWriter out = context.getResponseWriter(); @@ -193,7 +188,18 @@ public abstract class BaseMultiValueRenderer extends BaseRenderer } // close tables - out.write(""); + out.write("\n"); + + // output a hidden field containing the current value + out.write(""); } } diff --git a/source/java/org/alfresco/web/ui/repo/renderer/MultiValueFieldRenderer.java b/source/java/org/alfresco/web/ui/repo/renderer/MultiValueFieldRenderer.java index 8f1cefc356..4da56879ae 100644 --- a/source/java/org/alfresco/web/ui/repo/renderer/MultiValueFieldRenderer.java +++ b/source/java/org/alfresco/web/ui/repo/renderer/MultiValueFieldRenderer.java @@ -1,7 +1,6 @@ package org.alfresco.web.ui.repo.renderer; import java.io.IOException; -import java.util.List; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter;