checkpoint of xforms improvements

- mostly functional hgroup implementation
- refactoring to support hgroups, make widgets behave better as inline elements
- figured out a way to get rid of dojo's inflight error watcher
- partial support for totalDigits (blocked by a dojo bug)
- improved support for length schema constraint
- refactoring of create widget code on the way to supporting config based on schema type, xform type, and appearance
- fix for silly bug in select workflow portion of create form wizard

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5573 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Ariel Backenroth
2007-04-27 22:33:37 +00:00
parent ab77d65cfa
commit 1b898fb23e
11 changed files with 827 additions and 476 deletions

View File

@@ -20,7 +20,7 @@
* and Open Source Software ("FLOSS") applications as described in Alfresco's * and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing * FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here: * the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" * http://www.alfresco.com/legal/licensing
*/ */
package org.alfresco.web.bean.wcm; package org.alfresco.web.bean.wcm;
@@ -657,7 +657,7 @@ public class CreateWebContentWizard extends BaseContentWizard
} }
/** /**
* @param formName Sets the currently selected form * @param form Sets the currently selected form
*/ */
public void setFormName(final String formName) public void setFormName(final String formName)
{ {

View File

@@ -19,7 +19,7 @@
* and Open Source Software ("FLOSS") applications as described in Alfresco's * and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing * FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here: * the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" */ * http://www.alfresco.com/legal/licensing */
package org.alfresco.web.forms; package org.alfresco.web.forms;
import freemarker.ext.dom.NodeModel; import freemarker.ext.dom.NodeModel;

View File

@@ -19,7 +19,7 @@
* and Open Source Software ("FLOSS") applications as described in Alfresco's * and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing * FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here: * the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" */ * http://www.alfresco.com/legal/licensing */
package org.alfresco.web.forms; package org.alfresco.web.forms;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;

View File

@@ -19,27 +19,22 @@
* and Open Source Software ("FLOSS") applications as described in Alfresco's * and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing * FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here: * the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" */ * http://www.alfresco.com/legal/licensing */
package org.alfresco.web.forms; package org.alfresco.web.forms;
import java.io.IOException; import freemarker.ext.dom.NodeModel;
import java.io.InputStream; import freemarker.template.SimpleDate;
import java.io.OutputStream; import freemarker.template.SimpleHash;
import java.io.Serializable; import freemarker.template.SimpleScalar;
import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import java.io.*;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.model.WCMAppModel; import org.alfresco.model.WCMAppModel;
@@ -49,16 +44,16 @@ import org.alfresco.repo.template.TemplateNode;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.avm.AVMService; import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.remote.AVMRemote; import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.TemplateException; import org.alfresco.service.cmr.repository.TemplateException;
import org.alfresco.service.cmr.repository.TemplateService; import org.alfresco.service.cmr.repository.TemplateService;
import org.alfresco.service.namespace.DynamicNamespacePrefixResolver; import org.alfresco.service.namespace.*;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.cmr.remote.AVMRemote;
import org.alfresco.service.namespace.QName;
import org.alfresco.web.app.Application; import org.alfresco.web.app.Application;
import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.bean.repository.Repository;
import org.alfresco.web.bean.wcm.AVMConstants; import org.alfresco.web.bean.wcm.AVMConstants;
@@ -66,15 +61,9 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.jsf.FacesContextUtils; import org.springframework.web.jsf.FacesContextUtils;
import org.w3c.dom.Document; import org.w3c.dom.*;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import freemarker.ext.dom.NodeModel;
import freemarker.template.SimpleDate;
import freemarker.template.SimpleHash;
/** /**
* Implementation of a rendering engine template * Implementation of a rendering engine template

View File

@@ -2320,6 +2320,10 @@ public class Schema2XForms
", maxInc: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXINCLUSIVE) + ", maxInc: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXINCLUSIVE) +
", minExc: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MINEXCLUSIVE) + ", minExc: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MINEXCLUSIVE) +
", maxExc: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXEXCLUSIVE) + ", maxExc: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXEXCLUSIVE) +
", totalDigits: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_TOTALDIGITS) +
", length: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_LENGTH) +
", minLength: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MINLENGTH) +
", maxLength: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXLENGTH) +
", fractionDigits: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_FRACTIONDIGITS) + ", fractionDigits: " + controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_FRACTIONDIGITS) +
", builtInTypeName: " + SchemaUtil.getBuiltInTypeName(controlType) + ", builtInTypeName: " + SchemaUtil.getBuiltInTypeName(controlType) +
", builtInType: " + SchemaUtil.getBuiltInType(controlType) + ", builtInType: " + SchemaUtil.getBuiltInType(controlType) +
@@ -2362,8 +2366,9 @@ public class Schema2XForms
NamespaceConstants.XFORMS_PREFIX + ":ref", NamespaceConstants.XFORMS_PREFIX + ":ref",
"."); ".");
} }
else if (controlType.getBounded() && else if (controlType.getNumeric())
controlType.getNumeric() && {
if (controlType.getBounded() &&
controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXINCLUSIVE) != null && controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXINCLUSIVE) != null &&
controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MININCLUSIVE) != null) controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MININCLUSIVE) != null)
{ {
@@ -2375,6 +2380,14 @@ public class Schema2XForms
result.setAttributeNS(NamespaceConstants.XFORMS_NS, result.setAttributeNS(NamespaceConstants.XFORMS_NS,
NamespaceConstants.XFORMS_PREFIX + ":end", NamespaceConstants.XFORMS_PREFIX + ":end",
controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXINCLUSIVE)); controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXINCLUSIVE));
}
else
{
result = xformsDocument.createElementNS(NamespaceConstants.XFORMS_NS,
NamespaceConstants.XFORMS_PREFIX + ":input");
}
if (controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_FRACTIONDIGITS))
{
String fractionDigits = controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_FRACTIONDIGITS); String fractionDigits = controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_FRACTIONDIGITS);
if (fractionDigits == null || fractionDigits.length() == 0) if (fractionDigits == null || fractionDigits.length() == 0)
{ {
@@ -2390,6 +2403,14 @@ public class Schema2XForms
fractionDigits); fractionDigits);
} }
} }
if (controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_TOTALDIGITS))
{
result.setAttributeNS(NamespaceService.ALFRESCO_URI,
NamespaceService.ALFRESCO_PREFIX + ":totalDigits",
controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_TOTALDIGITS));
}
}
else else
{ {
result = xformsDocument.createElementNS(NamespaceConstants.XFORMS_NS, result = xformsDocument.createElementNS(NamespaceConstants.XFORMS_NS,
@@ -2399,14 +2420,27 @@ public class Schema2XForms
{ {
appearance = "full"; appearance = "full";
} }
if (controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_MAXLENGTH) || if (controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_LENGTH))
controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_LENGTH))
{ {
result.setAttributeNS(NamespaceService.ALFRESCO_URI, result.setAttributeNS(NamespaceService.ALFRESCO_URI,
NamespaceService.ALFRESCO_PREFIX + ":maxLength", NamespaceService.ALFRESCO_PREFIX + ":length",
(controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_MAXLENGTH) controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_LENGTH));
? controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXLENGTH) }
: controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXLENGTH))); else if(controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_MINLENGTH) ||
controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_MAXLENGTH))
{
if (controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_MINLENGTH))
{
result.setAttributeNS(NamespaceService.ALFRESCO_URI,
NamespaceService.ALFRESCO_PREFIX + ":minlength",
controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MINLENGTH));
}
if (controlType.isDefinedFacet(XSSimpleTypeDefinition.FACET_MAXLENGTH))
{
result.setAttributeNS(NamespaceService.ALFRESCO_URI,
NamespaceService.ALFRESCO_PREFIX + ":maxlength",
controlType.getLexicalFacetValue(XSSimpleTypeDefinition.FACET_MAXLENGTH));
}
} }
} }
this.setXFormsId(result); this.setXFormsId(result);

View File

@@ -231,7 +231,7 @@ public class SchemaUtil
final XSImplementation xsImpl = (XSImplementation) final XSImplementation xsImpl = (XSImplementation)
registry.getDOMImplementation("XS-Loader"); registry.getDOMImplementation("XS-Loader");
final XSLoader schemaLoader = xsImpl.createXSLoader(null); final XSLoader schemaLoader = xsImpl.createXSLoader(null);
final DOMConfiguration config = schemaLoader.getConfig(); final DOMConfiguration config = (DOMConfiguration)schemaLoader.getConfig();
final LinkedList<DOMError> errors = new LinkedList<DOMError>(); final LinkedList<DOMError> errors = new LinkedList<DOMError>();
config.setParameter("error-handler", new DOMErrorHandler() config.setParameter("error-handler", new DOMErrorHandler()
{ {

View File

@@ -0,0 +1,39 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:alf="http://www.alfresco.org"
elementFormDefault="qualified">
<xs:complexType name="fields">
<xs:sequence>
<xs:element name="unbounded_string" type="xs:normalizedString" default="unbounded string value"/>
<xs:element name="one_char" default="A">
<xs:simpleType>
<xs:restriction base="xs:normalizedString">
<xs:length value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="five_digits" default="12345">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:totalDigits value="5"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="root_group">
<xs:complexType>
<xs:sequence>
<xs:element name="full_group" type="fields">
<xs:annotation><xs:appinfo><alf:appearance>full</alf:appearance></xs:appinfo></xs:annotation>
</xs:element>
<xs:element name="compact_group" type="fields">
<xs:annotation><xs:appinfo><alf:appearance>compact</alf:appearance></xs:appinfo></xs:annotation>
</xs:element>
<xs:element name="minimal_group" type="fields">
<xs:annotation><xs:appinfo><alf:appearance>minimal</alf:appearance></xs:appinfo></xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -5,6 +5,15 @@
clear: both; clear: both;
} }
.xformsItemRequiredImage
{
vertical-align: middle;
margin: 0px 5px;
left: 0px;
position: relative;
top: 0px;
}
.xformsItemLabelSubmitError .xformsItemLabelSubmitError
{ {
color: red; color: red;
@@ -229,3 +238,4 @@
{ {
color: grey; color: grey;
} }

View File

@@ -18,7 +18,7 @@
* and Open Source Software ("FLOSS") applications as described in Alfresco's * and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing * FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here: * the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing" * http://www.alfresco.com/legal/licensing
--%> --%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
@@ -27,22 +27,23 @@
<script type="text/javascript"> <script type="text/javascript">
function apply_default_workflow_changed(value) function apply_default_workflow_changed(value)
{ {
document.getElementById("wizard:wizard-body:sdw-pg-2").style.display = value == 'true' ? "block" : "none"; value = String(value) == 'true';
document.getElementById("wizard:wizard-body:sdw-pg-2").style.display = value ? "block" : "none";
} }
</script> </script>
<h:panelGroup id="sdw-pg-1"> <h:panelGroup id="sdw-pg-1">
<h:outputText id="sdw-question" <h:outputText id="sdw-question"
value="#{msg.create_form_select_default_workflow_apply_default_workflow}" value="#{msg.create_form_select_default_workflow_apply_default_workflow}"
escape="false" /> escape="false" />
<h:selectOneRadio id="sdw-apply-default-workflow-yes"
<h:selectOneRadio id="sdw-apply-default-workflow-select-one"
required="false" required="false"
onchange="apply_default_workflow_changed(this.value)" onchange="apply_default_workflow_changed(this.value)"
value="#{WizardManager.bean.applyDefaultWorkflow}"> value="#{WizardManager.bean.applyDefaultWorkflow}">
<f:selectItem id="sdw-apply-default-workflow-yes-item" <f:selectItem itemLabel="#{msg.yes}" itemValue="#{true}"/>
itemLabel="#{msg.yes}" itemValue="true"/> <f:selectItem itemLabel="#{msg.no_not_now}" itemValue="#{false}"/>
<f:selectItem id="sdw-apply-defalt-workflow-no-item"
itemLabel="#{msg.no_not_now}" itemValue="false"/>
</h:selectOneRadio> </h:selectOneRadio>
<f:verbatim><div style="margin-top:10px">&nbsp;</div></f:verbatim> <f:verbatim><div style="margin-top:10px">&nbsp;</div></f:verbatim>
<h:panelGroup id="sdw-pg-2" style="#{WizardManager.bean.applyDefaultWorkflow?'display:block':'display:none'}"> <h:panelGroup id="sdw-pg-2" style="#{WizardManager.bean.applyDefaultWorkflow?'display:block':'display:none'}">
<h:outputText id="sdw-select-workflow" <h:outputText id="sdw-select-workflow"

View File

@@ -45,7 +45,12 @@ alfresco.AjaxHelper.createRequest = function(target, serverMethod, methodArgs, l
result.target = target; result.target = target;
result.content = methodArgs; result.content = methodArgs;
result.method = "POST"; result.method = "POST";
result.load = load; result._baseLoadHandler = load;
result.load = function(type, data, event, kwArgs)
{
// escape from dojo's watchInFlight errors so we get real javascript errors thrown
setTimeout(function() { result._baseLoadHandler(type, data, event, kwArgs); }, 10);
}
dojo.event.connect(result, "load", function(type, data, evt) dojo.event.connect(result, "load", function(type, data, evt)
{ {
alfresco.AjaxHelper._loadHandler(result); alfresco.AjaxHelper._loadHandler(result);

File diff suppressed because it is too large Load Diff