diff --git a/project-build.xml b/project-build.xml
index 5db2fcca16..53cfc3ebcf 100644
--- a/project-build.xml
+++ b/project-build.xml
@@ -48,16 +48,18 @@
-
+
+
-
-
+
+
-
+
diff --git a/source/java/org/alfresco/web/bean/generator/DatePickerGenerator.java b/source/java/org/alfresco/web/bean/generator/DatePickerGenerator.java
index 7138673285..9f1ddda711 100644
--- a/source/java/org/alfresco/web/bean/generator/DatePickerGenerator.java
+++ b/source/java/org/alfresco/web/bean/generator/DatePickerGenerator.java
@@ -1,6 +1,6 @@
package org.alfresco.web.bean.generator;
-import java.util.Date;
+import java.util.Calendar;
import javax.faces.component.UIComponent;
import javax.faces.component.UIOutput;
@@ -26,7 +26,7 @@ public class DatePickerGenerator extends BaseComponentGenerator
{
private boolean initialiseIfNull = false;
private int yearCount = 30;
- private int startYear = new Date().getYear() + 1900 + 2;
+ private int startYear = Calendar.getInstance().get(Calendar.YEAR) + 2;
private static final String MSG_DATE = "date_pattern";
diff --git a/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java b/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java
index 3f5e82ba5f..32cfde317e 100644
--- a/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java
+++ b/source/java/org/alfresco/web/forms/xforms/SchemaFormBuilder.java
@@ -624,7 +624,6 @@ public class SchemaFormBuilder
choicesElement.appendChild(item);
/// action in the case
-
final Element action = xForm.createElementNS(NamespaceConstants.XFORMS_NS,
NamespaceConstants.XFORMS_PREFIX + ":action");
this.setXFormsId(action);
@@ -1291,8 +1290,8 @@ public class SchemaFormBuilder
final Element dispatchTrigger = xformsDocument.createElementNS(NamespaceConstants.XFORMS_NS,
NamespaceConstants.XFORMS_PREFIX + ":dispatch");
dispatchTrigger.setAttributeNS(NamespaceConstants.XFORMS_NS,
- NamespaceConstants.XFORMS_PREFIX + ":name",
- "DOMActivate");
+ NamespaceConstants.XFORMS_PREFIX + ":name",
+ "DOMActivate");
dispatchTrigger.setAttributeNS(NamespaceConstants.XFORMS_NS,
NamespaceConstants.XFORMS_PREFIX + ":target",
select1Id);
@@ -1305,7 +1304,10 @@ public class SchemaFormBuilder
//add switch
final Element switchElement = xformsDocument.createElementNS(NamespaceConstants.XFORMS_NS,
NamespaceConstants.XFORMS_PREFIX + ":switch");
- this.setXFormsId(switchElement);
+ this.setXFormsId(switchElement, select1Id + "-" + this.setXFormsId(switchElement));
+ switchElement.setAttributeNS(NamespaceConstants.XFORMS_NS,
+ NamespaceConstants.XFORMS_PREFIX + ":bind",
+ bindId);
formSection.appendChild(switchElement);
//formSection.appendChild(switchElement);
@@ -1739,7 +1741,6 @@ public class SchemaFormBuilder
final SchemaUtil.Occurance o,
final ResourceBundle resourceBundle)
{
-
if (LOGGER.isDebugEnabled())
{
LOGGER.debug("addSimpleType for " + controlType.getName() +
@@ -1753,7 +1754,7 @@ public class SchemaFormBuilder
// create the element and add it to the model.
Element bindElement = xformsDocument.createElementNS(NamespaceConstants.XFORMS_NS,
- NamespaceConstants.XFORMS_PREFIX + ":bind");
+ NamespaceConstants.XFORMS_PREFIX + ":bind");
String bindId = this.setXFormsId(bindElement);
modelSection.appendChild(bindElement);
bindElement = this.startBindElement(bindElement, schema, controlType, owner, pathToRoot, o);
@@ -1787,15 +1788,14 @@ public class SchemaFormBuilder
if (repeatSection != formSection)
{
//if there is a repeat -> create another bind with "."
- Element bindElement2 =
+ final Element bindElement2 =
xformsDocument.createElementNS(NamespaceConstants.XFORMS_NS,
- NamespaceConstants.XFORMS_PREFIX + ":bind");
- String bindId2 = this.setXFormsId(bindElement2);
+ NamespaceConstants.XFORMS_PREFIX + ":bind");
+ final String bindId2 = this.setXFormsId(bindElement2);
bindElement2.setAttributeNS(NamespaceConstants.XFORMS_NS,
NamespaceConstants.XFORMS_PREFIX + ":nodeset",
".");
bindElement.appendChild(bindElement2);
-
bindElement = bindElement2;
bindId = bindId2;
}
diff --git a/source/test-resources/xforms/unit-tests/simple-test/components-test.xsd b/source/test-resources/xforms/unit-tests/simple-test/components-test.xsd
index 61e6ecb897..097f423710 100644
--- a/source/test-resources/xforms/unit-tests/simple-test/components-test.xsd
+++ b/source/test-resources/xforms/unit-tests/simple-test/components-test.xsd
@@ -96,7 +96,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -134,6 +146,7 @@
+
diff --git a/source/test-resources/xforms/unit-tests/simple-test/datetime-test.xsd b/source/test-resources/xforms/unit-tests/simple-test/datetime-test.xsd
index 007c76db3c..bedcf3e8b1 100644
--- a/source/test-resources/xforms/unit-tests/simple-test/datetime-test.xsd
+++ b/source/test-resources/xforms/unit-tests/simple-test/datetime-test.xsd
@@ -11,6 +11,8 @@
+
+
diff --git a/source/web/css/xforms.css b/source/web/css/xforms.css
index 0b75298b4a..e7518f53a6 100644
--- a/source/web/css/xforms.css
+++ b/source/web/css/xforms.css
@@ -2,6 +2,12 @@
{
/* border: 1px dashed blue; */
margin-right: 2px;
+ clear: both;
+}
+
+.xformsItemLabelSubmitError
+{
+ color: red;
}
.xformsItemDOMContainer
@@ -22,6 +28,7 @@
/* margin-bottom: 10px; */
/* border: 1px solid #67a4e6; */
border: 1px solid #d2d2d9;
+ clear: both;
}
.xformsGroupItem
@@ -29,6 +36,7 @@
position: relative;
margin: 5px 0px;
max-width: 100%;
+ clear: both;
}
.xformsGroupHeader
diff --git a/source/web/scripts/ajax/xforms.js b/source/web/scripts/ajax/xforms.js
index 807d7c2388..cf5fd52e71 100644
--- a/source/web/scripts/ajax/xforms.js
+++ b/source/web/scripts/ajax/xforms.js
@@ -28,8 +28,10 @@
//
// Initiliaze dojo requirements, tinymce, and add a hook to load the xform.
////////////////////////////////////////////////////////////////////////////////
+dojo.require("dojo.date");
dojo.require("dojo.widget.DebugConsole");
dojo.require("dojo.widget.DatePicker");
+dojo.require("dojo.widget.TimePicker");
dojo.require("dojo.widget.Button");
dojo.require("dojo.lfx.html");
dojo.hostenv.writeIncludes();
@@ -132,6 +134,9 @@ dojo.declare("alfresco.xforms.Widget",
/** The dom node containing this widget. */
domContainer: null,
+ /** The parent widget which is using this as a composite. */
+ _compositeParent: null,
+
/////////////////////////////////////////////////////////////////
// methods
/////////////////////////////////////////////////////////////////
@@ -277,11 +282,43 @@ dojo.declare("alfresco.xforms.Widget",
return true;
},
+ /** Commits the changed value to the server */
+ _commitValueChange: function()
+ {
+ if (this._compositeParent)
+ {
+ this._compositeParent._commitValueChange();
+ }
+ else
+ {
+ this.xform.setXFormsValue(this.id, this.getValue());
+ }
+ },
+
+ /** Sets the value contained by the widget */
+ setValue: function(value, forceCommit)
+ {
+ if (forceCommit)
+ {
+ this.xform.setXFormsValue(this.id, value);
+ }
+ },
+
+ /** Returns the value contained by the widget, or null if none is set */
+ getValue: function()
+ {
+ return null;
+ },
+
/** Sets the widget's initial value. */
- setInitialValue: function(value)
+ setInitialValue: function(value, forceCommit)
{
this.initialValue =
(typeof value == "string" && value.length == 0 ? null : value);
+ if (forceCommit)
+ {
+ this.xform.setXFormsValue(this.id, value);
+ }
},
/**
@@ -394,19 +431,18 @@ dojo.declare("alfresco.xforms.Widget",
/** Makes the label red. */
showAlert: function()
{
- if (this.labelNode._backupColor != "red")
+ if (!dojo.html.hasClass(this.labelNode, "xformsItemLabelSubmitError"))
{
- this.labelNode._backupColor = this.labelNode.style.color;
+ dojo.html.addClass(this.labelNode, "xformsItemLabelSubmitError");
}
- this.labelNode.style.color = "red";
},
/** Restores the label to its original color. */
hideAlert: function()
{
- if (this.labelNode.style.color == "red")
+ if (dojo.html.hasClass(this.labelNode, "xformsItemLabelSubmitError"))
{
- this.labelNode.style.color = this.labelNode._backupColor;
+ dojo.html.removeClass(this.labelNode, "xformsItemLabelSubmitError");
}
},
@@ -501,12 +537,17 @@ dojo.declare("alfresco.xforms.FilePicker",
return this.widget.getValue();
},
- setValue: function(value)
+ setValue: function(value, forceCommit)
{
if (!this.widget)
- this.setInitialValue(value);
+ {
+ this.setInitialValue(value, forceCommit);
+ }
else
+ {
+ this.inherited("setValue", [ value, forceCommit ]);
this.widget.setValue(value);
+ }
},
/////////////////////////////////////////////////////////////////
@@ -515,8 +556,7 @@ dojo.declare("alfresco.xforms.FilePicker",
_filePicker_changeHandler: function(fpw)
{
- var w = fpw.node.widget;
- w.xform.setXFormsValue(w.id, w.getValue());
+ fpw.node.widget._commitValueChange();
},
_filePicker_resizeHandler: function(fpw)
@@ -529,96 +569,6 @@ dojo.declare("alfresco.xforms.FilePicker",
}
});
-/** The date picker widget which handles xforms widget xf:input with type xf:date */
-dojo.declare("alfresco.xforms.DatePicker",
- alfresco.xforms.Widget,
- {
- initializer: function(xform, xformsNode)
- {
- },
-
- /////////////////////////////////////////////////////////////////
- // overridden methods
- /////////////////////////////////////////////////////////////////
-
- render: function(attach_point)
- {
- var initial_value = this.getInitialValue() || "";
-
- attach_point.appendChild(this.domNode);
- this.widget = document.createElement("input");
- this.widget.setAttribute("id", this.id + "-widget");
- this.widget.setAttribute("type", "text");
- this.widget.setAttribute("value", initial_value);
- this.domNode.appendChild(this.widget);
- dojo.event.connect(this.widget, "onfocus", this, this._dateTextBox_focusHandler);
-
- var datePickerDiv = document.createElement("div");
- attach_point.appendChild(datePickerDiv);
-
- var dp_initial_value = (initial_value
- ? initial_value
- : dojo.widget.DatePicker.util.toRfcDate(new Date()));
- this.widget.picker = dojo.widget.createWidget("DatePicker",
- {
- isHidden: true,
- storedDate: dp_initial_value
- },
- datePickerDiv);
- this.widget.picker.hide();
- dojo.event.connect(this.widget.picker,
- "onSetDate",
- this,
- this._datePicker_setDateHandler);
- },
-
- setValue: function(value)
- {
- if (!this.widget)
- {
- this.setInitialValue(value);
- }
- else
- {
- this.widget.setAttribute("value", value);
- this.widget.picker.setDate(value);
- }
- },
-
- getValue: function()
- {
- return (this.widget.value == null || this.widget.value.length == 0
- ? null
- : this.widget.value);
- },
-
- /////////////////////////////////////////////////////////////////
- // DOM event handlers
- /////////////////////////////////////////////////////////////////
-
- _dateTextBox_focusHandler: function(event)
- {
- dojo.style.hide(this.widget);
- this.widget.picker.show();
- this.domContainer.style.height =
- Math.max(this.widget.picker.domNode.offsetHeight +
- dojo.style.getMarginHeight(this.domNode.parentNode),
- 20) + "px";
- },
-
- _datePicker_setDateHandler: function(event)
- {
- this.widget.picker.hide();
- dojo.style.show(this.widget);
- this.domContainer.style.height =
- Math.max(this.domNode.parentNode.offsetHeight +
- dojo.style.getMarginHeight(this.domNode.parentNode),
- 20) + "px";
- this.widget.value = dojo.widget.DatePicker.util.toRfcDate(this.widget.picker.date);
- this.xform.setXFormsValue(this.id, this.getValue());
- }
- });
-
/** The textfield widget which handle xforms widget xf:input with any string or numerical type */
dojo.declare("alfresco.xforms.TextField",
alfresco.xforms.Widget,
@@ -657,20 +607,24 @@ dojo.declare("alfresco.xforms.TextField",
}
},
- setValue: function(value)
+ setValue: function(value, forceCommit)
{
if (!this.widget)
- this.setInitialValue(value);
+ {
+ this.setInitialValue(value, forceCommit);
+ }
else
+ {
+ this.inherited("setValue", [ value, forceCommit ]);
this.widget.value = value;
+ }
},
getValue: function()
{
- var result = this.widget.value;
- if (result != null && result.length == 0)
- result = null;
- return result;
+ return (this.widget.value != null && this.widget.value.length == 0
+ ? null
+ : this.widget.value);
},
/////////////////////////////////////////////////////////////////
@@ -679,7 +633,7 @@ dojo.declare("alfresco.xforms.TextField",
_widget_changeHandler: function(event)
{
- this.xform.setXFormsValue(this.id, this.getValue());
+ this._commitValueChange();
}
});
@@ -794,7 +748,7 @@ dojo.declare("alfresco.xforms.TextArea",
event.target = event.srcElement.ownerDocument;
}
var widget = event.target.widget;
- widget.xform.setXFormsValue(widget.id, widget.getValue());
+ widget._commitValueChange();
this.focused = false;
},
_tinyMCE_focusHandler: function(event)
@@ -869,7 +823,7 @@ dojo.declare("alfresco.xforms.AbstractSelectWidget",
result.push({
id: value.getAttribute("id"),
label: valid ? dojo.dom.textContent(label) : "",
- value: valid ? dojo.dom.textContent(value) : "xxx",
+ value: valid ? dojo.dom.textContent(value) : "_invalid_value_",
valid: valid
});
}
@@ -951,16 +905,17 @@ dojo.declare("alfresco.xforms.Select",
}
},
- setValue: function(value)
+ setValue: function(value, forceCommit)
{
if (!this.widget)
{
- this.setInitialValue(value);
+ this.setInitialValue(value, forceCommit);
}
else
{
+ this.inherited("setValue", [ value, forceCommit ]);
this._selectedValues = value.split(' ');
- if (this.widget.nodeName == "div")
+ if (this.widget.nodeName.toLowerCase() == "div")
{
var checkboxes = this.widgets.getElementsByTagName("input");
for (var i = 0; i < checkboxes.length; i++)
@@ -969,7 +924,7 @@ dojo.declare("alfresco.xforms.Select",
this._selectedValues.indexOf(checkboxes[i].getAttribute("value")) != -1;
}
}
- else if (this.widget.nodeName == "select")
+ else if (this.widget.nodeName.toLowerCase() == "select")
{
var options = this.widgets.getElementsByTagName("option");
for (var i = 0; i < options.length; i++)
@@ -1004,7 +959,7 @@ dojo.declare("alfresco.xforms.Select",
this._selectedValues.push(event.target.options[i].value);
}
}
- this.xform.setXFormsValue(this.id, this._selectedValues.join(" "));
+ this._commitValueChange();
},
_checkbox_clickHandler: function(event)
@@ -1018,7 +973,7 @@ dojo.declare("alfresco.xforms.Select",
this._selectedValues.push(checkbox.value);
}
}
- this.xform.setXFormsValue(this.id, this._selectedValues.join(" "));
+ this._commitValueChange();
}
});
@@ -1099,16 +1054,18 @@ dojo.declare("alfresco.xforms.Select1",
}
},
- setValue: function(value)
+ /** */
+ setValue: function(value, forceCommit)
{
if (!this.widget)
{
- this.setInitialValue(value);
+ this.setInitialValue(value, forceCommit);
}
else
{
+ this.inherited("setValue", [ value, forceCommit ]);
this._selectedValue = value;
- if (this.widget.nodeName == "div")
+ if (this.widget.nodeName.toLowerCase() == "div")
{
var radios = this.widget.getElementsByTagName("input");
for (var i = 0; i < radios.length; i++)
@@ -1116,7 +1073,7 @@ dojo.declare("alfresco.xforms.Select1",
radios[i].checked = radios[i].getAttribute("value") == this._selectedValue;
}
}
- else if (this.widget.nodeName == "select")
+ else if (this.widget.nodeName.toLowerCase() == "select")
{
var options = this.widget.getElementsByTagName("option");
for (var i = 0; i < options.length; i++)
@@ -1143,7 +1100,7 @@ dojo.declare("alfresco.xforms.Select1",
_combobox_changeHandler: function(event)
{
this._selectedValue = event.target.options[event.target.selectedIndex].value;
- this.xform.setXFormsValue(this.id, this._selectedValue);
+ this._commitValueChange();
},
_radio_clickHandler: function(event)
@@ -1160,7 +1117,7 @@ dojo.declare("alfresco.xforms.Select1",
}
}
this._selectedValue = event.target.value;
- this.xform.setXFormsValue(this.id, event.target.value);
+ this._commitValueChange();
}
});
@@ -1193,14 +1150,15 @@ dojo.declare("alfresco.xforms.Checkbox",
dojo.event.connect(this.widget, "onclick", this, this._checkbox_clickHandler);
},
- setValue: function(value)
+ setValue: function(value, forceCommit)
{
if (!this.widget)
{
- this.setInitialValue(value);
+ this.setInitialValue(value, forceCommit);
}
else
{
+ this.inherited("setValue", [ value, forceCommit ]);
this.widget.checked = value == "true";
}
},
@@ -1216,7 +1174,354 @@ dojo.declare("alfresco.xforms.Checkbox",
_checkbox_clickHandler: function(event)
{
- this.xform.setXFormsValue(this.id, this.widget.checked);
+ this._commitValueChange();
+ }
+ });
+
+////////////////////////////////////////////////////////////////////////////////
+// widgets for date types
+////////////////////////////////////////////////////////////////////////////////
+
+/** The date picker widget which handles xforms widget xf:input with type xf:date */
+dojo.declare("alfresco.xforms.DatePicker",
+ alfresco.xforms.Widget,
+ {
+ initializer: function(xform, xformsNode)
+ {
+ },
+
+ /////////////////////////////////////////////////////////////////
+ // overridden methods
+ /////////////////////////////////////////////////////////////////
+
+ render: function(attach_point)
+ {
+ var initial_value = this.getInitialValue() || "";
+
+ attach_point.appendChild(this.domNode);
+ this.widget = document.createElement("input");
+ this.widget.setAttribute("id", this.id + "-widget");
+ this.widget.setAttribute("type", "text");
+ this.widget.setAttribute("value", initial_value);
+ this.domNode.appendChild(this.widget);
+ dojo.event.connect(this.widget, "onfocus", this, this._dateTextBox_focusHandler);
+
+ var datePickerDiv = document.createElement("div");
+ attach_point.appendChild(datePickerDiv);
+
+ var dp_initial_value = (initial_value
+ ? initial_value
+ : dojo.widget.DatePicker.util.toRfcDate(new Date()));
+ this.widget.picker = dojo.widget.createWidget("DatePicker",
+ {
+ isHidden: true,
+ storedDate: dp_initial_value
+ },
+ datePickerDiv);
+ this.widget.picker.hide();
+ dojo.event.connect(this.widget.picker,
+ "onSetDate",
+ this,
+ this._datePicker_setDateHandler);
+ },
+
+ setValue: function(value, forceCommit)
+ {
+ if (!this.widget)
+ {
+ this.setInitialValue(value, forceCommit);
+ }
+ else
+ {
+ this.inherited("setValue", [ value, forceCommit ]);
+ this.widget.setAttribute("value", value);
+ this.widget.picker.setDate(value);
+ }
+ },
+
+ getValue: function()
+ {
+ return (this.widget.value == null || this.widget.value.length == 0
+ ? null
+ : this.widget.value);
+ },
+
+ /////////////////////////////////////////////////////////////////
+ // DOM event handlers
+ /////////////////////////////////////////////////////////////////
+
+ _dateTextBox_focusHandler: function(event)
+ {
+ dojo.style.hide(this.widget);
+ this.widget.picker.show();
+ this.domContainer.style.height =
+ Math.max(this.widget.picker.domNode.offsetHeight +
+ dojo.style.getMarginHeight(this.domNode.parentNode),
+ 20) + "px";
+ },
+
+ _datePicker_setDateHandler: function(event)
+ {
+ this.widget.picker.hide();
+ dojo.style.show(this.widget);
+ this.domContainer.style.height =
+ Math.max(this.domNode.parentNode.offsetHeight +
+ dojo.style.getMarginHeight(this.domNode.parentNode),
+ 20) + "px";
+ this.widget.value = dojo.widget.DatePicker.util.toRfcDate(this.widget.picker.date);
+ this._commitValueChange();
+ }
+ });
+
+/** The date picker widget which handles xforms widget xf:input with type xf:date */
+dojo.declare("alfresco.xforms.TimePicker",
+ alfresco.xforms.Widget,
+ {
+ initializer: function(xform, xformsNode)
+ {
+ },
+
+ /////////////////////////////////////////////////////////////////
+ // overridden methods
+ /////////////////////////////////////////////////////////////////
+
+ render: function(attach_point)
+ {
+ var initial_value = this.getInitialValue() || "";
+
+ attach_point.appendChild(this.domNode);
+ this.widget = document.createElement("div");
+// this.widget.setAttribute("id", this.id + "-widget");
+ this.domNode.appendChild(this.widget);
+
+ if (initial_value)
+ {
+ initial_value = initial_value.split(":");
+ var date = new Date();
+ date.setHours(initial_value[0]);
+ date.setMinutes(initial_value[1]);
+ initial_value = dojo.widget.TimePicker.util.toRfcDateTime(date);
+ }
+
+ this.widget.picker = dojo.widget.createWidget("TimePicker",
+ {
+ widgetId: this.id + "-widget",
+ storedTime: initial_value
+ },
+ this.widget);
+ this.widget.picker.anyTimeContainerNode.innerHTML = "";
+
+ // don't let it float - it screws up layout somehow
+ this.widget.picker.domNode.style.cssFloat = "none";
+ this.domNode.style.height = dojo.style.getMarginBoxHeight(this.widget.picker.domNode) + "px";
+ dojo.event.connect(this.widget.picker,
+ "onSetTime",
+ this,
+ this._timePicker_setTimeHandler);
+ },
+
+ setValue: function(value, forceCommit)
+ {
+ if (!this.widget)
+ {
+ this.setInitialValue(value, forceCommit);
+ }
+ else
+ {
+ this.inherited("setValue", [ value, forceCommit ]);
+ this.widget.picker.setDateTime(value);
+ }
+ },
+
+ getValue: function()
+ {
+ return dojo.date.format(this.widget.picker.time, "%H:%M:00");
+ },
+
+ /////////////////////////////////////////////////////////////////
+ // DOM event handlers
+ /////////////////////////////////////////////////////////////////
+
+ _timePicker_setTimeHandler: function(event)
+ {
+ this._commitValueChange();
+ }
+ });
+
+/** The year picker handles xforms widget xf:input with a gYear type */
+dojo.declare("alfresco.xforms.YearPicker",
+ alfresco.xforms.TextField,
+ {
+ initializer: function(xform, xformsNode)
+ {
+ },
+
+ /////////////////////////////////////////////////////////////////
+ // overridden methods
+ /////////////////////////////////////////////////////////////////
+
+ render: function(attach_point)
+ {
+ this.inherited("render", [ attach_point ]);
+ this.widget.size = "4";
+ this.widget.setAttribute("maxlength", "4");
+ },
+
+ getInitialValue: function()
+ {
+ var result = this.inherited("getInitialValue", []);
+ return result ? result.replace(/^0*([^0]+)$/, "$1") : result;
+ },
+
+ setValue: function(value, forceCommit)
+ {
+ this.inherited("setValue",
+ [ value ? value.replace(/^0*([^0]+)$/, "$1") : null, forceCommit ]);
+ },
+
+ getValue: function()
+ {
+ var result = this.inherited("getValue", []);
+ return result ? dojo.string.padLeft(result, 4, "0") : null;
+ }
+ });
+
+/** The day picker widget which handles xforms widget xf:input with type xf:gDay */
+dojo.declare("alfresco.xforms.DayPicker",
+ alfresco.xforms.Select1,
+ {
+ initializer: function(xform, xformsNode)
+ {
+ },
+
+ /////////////////////////////////////////////////////////////////
+ // overridden methods
+ /////////////////////////////////////////////////////////////////
+ _getItemValues: function()
+ {
+ var result = [];
+ result.push({id: "day_empty", label: "", value: "", valid: false});
+ for (var i = 1; i <= 31; i++)
+ {
+ result.push({
+ id: "day_" + i,
+ label: i,
+ value: "---" + (i < 10 ? "0" + i : i),
+ valid: true});
+ }
+ return result;
+ }
+ });
+
+/** The month picker widget which handles xforms widget xf:input with type xf:gMonth */
+dojo.declare("alfresco.xforms.MonthPicker",
+ alfresco.xforms.Select1,
+ {
+ initializer: function(xform, xformsNode)
+ {
+ },
+
+ /////////////////////////////////////////////////////////////////
+ // overridden methods
+ /////////////////////////////////////////////////////////////////
+ _getItemValues: function()
+ {
+ var result = [];
+ result.push({id: "month_empty", label: "", value: "", valid: false});
+ for (var i = 0; i <= dojo.date.months.length; i++)
+ {
+ if (typeof dojo.date.months[i] != "string")
+ {
+ continue;
+ }
+ result.push({
+ id: "month_" + i,
+ label: dojo.date.months[i],
+ value: "--" + (i + 1 < 10 ? "0" + (i + 1) : i + 1),
+ valid: true});
+ }
+ return result;
+ }
+ });
+
+/** The month day picker widget which handles xforms widget xf:input with type xf:gMonthDay */
+dojo.declare("alfresco.xforms.MonthDayPicker",
+ alfresco.xforms.Widget,
+ {
+ initializer: function(xform, xformsNode)
+ {
+ this.monthPicker = new alfresco.xforms.MonthPicker(xform, xformsNode);
+ this.monthPicker._compositeParent = this;
+
+ this.dayPicker = new alfresco.xforms.DayPicker(xform, xformsNode);
+ this.dayPicker._compositeParent = this;
+ },
+
+ /////////////////////////////////////////////////////////////////
+ // overridden methods
+ /////////////////////////////////////////////////////////////////
+ render: function(attach_point)
+ {
+ this.setValue(this.getInitialValue());
+ attach_point.appendChild(this.domNode);
+ this.dayPicker.render(this.domNode);
+ this.dayPicker.widget.style.marginRight = "10px";
+ this.monthPicker.render(this.domNode);
+ },
+
+ setValue: function(value)
+ {
+ this.monthPicker.setValue(value ? value.match(/^--[^-]+/)[0] : null);
+ this.dayPicker.setValue(value ? "---" + value.replace(/^--[^-]+-/, "") : null);
+ },
+
+ getValue: function()
+ {
+ // format is --MM-DD
+ var day = this.dayPicker.getValue();
+ var month = this.monthPicker.getValue();
+ return month && day ? day.replace(/^--/, month) : null;
+ }
+ });
+
+/** The year month picker widget which handles xforms widget xf:input with type xf:gYearMonth */
+dojo.declare("alfresco.xforms.YearMonthPicker",
+ alfresco.xforms.Widget,
+ {
+ initializer: function(xform, xformsNode)
+ {
+ this.yearPicker = new alfresco.xforms.YearPicker(xform, xformsNode);
+ this.yearPicker._compositeParent = this;
+
+ this.monthPicker = new alfresco.xforms.MonthPicker(xform, xformsNode);
+ this.monthPicker._compositeParent = this;
+ },
+
+ /////////////////////////////////////////////////////////////////
+ // overridden methods
+ /////////////////////////////////////////////////////////////////
+ render: function(attach_point)
+ {
+ this.setValue(this.getInitialValue());
+ attach_point.appendChild(this.domNode);
+ this.monthPicker.render(this.domNode);
+ this.monthPicker.widget.style.marginRight = "10px";
+ this.yearPicker.domNode.style.display = "inline";
+ this.yearPicker.render(this.domNode);
+ },
+
+ setValue: function(value)
+ {
+ this.monthPicker.setValue(value ? value.replace(/^[^-]+-/, "--") : null);
+ this.yearPicker.setValue(value ? value.match(/^[^-]+/)[0] : null);
+ },
+
+ getValue: function()
+ {
+ // format is CCYY-MM
+ var year = this.yearPicker.getValue();
+ var month = this.monthPicker.getValue();
+ return year && month ? month.replace(/^-/, year) : null;
}
});
@@ -1329,6 +1634,7 @@ dojo.declare("alfresco.xforms.Group",
var labelDiv = document.createElement("div");
labelDiv.setAttribute("id", child.id + "-label");
labelDiv.style.position = "relative";
+ labelDiv.style.left = "0px";
child.domContainer.appendChild(labelDiv);
var requiredImage = document.createElement("img");
@@ -1337,6 +1643,9 @@ dojo.declare("alfresco.xforms.Group",
requiredImage.style.verticalAlign = "middle";
requiredImage.style.marginLeft = "5px";
requiredImage.style.marginRight = "5px";
+ requiredImage.style.left = "0px";
+ requiredImage.style.position = "relative";
+ requiredImage.style.top = "0px";
labelDiv.appendChild(requiredImage);
if (!child.isRequired())
@@ -1634,14 +1943,27 @@ dojo.declare("alfresco.xforms.Group",
dojo.declare("alfresco.xforms.SwitchGroup",
alfresco.xforms.Group,
{
- initializer: function()
+ initializer: function(xform, xformsNode)
{
this.selectedCaseId = null;
+ var widgets = this.xform.getBinding(this.xformsNode).widgets;
+ for (var i in widgets)
+ {
+ if (widgets[i] instanceof alfresco.xforms.Select1)
+ {
+ widgets[i].setValue(this.getInitialValue(), "true");
+ }
+ }
},
+
+ /////////////////////////////////////////////////////////////////
+ // overridden methods & properties
+ /////////////////////////////////////////////////////////////////
+
+ /** */
_insertChildAt: function(child, position)
{
var childDomContainer = this.inherited("_insertChildAt", [child, position]);
- alert("adding case " + child.id);
this.selectedCaseId = this.selectedCaseId || child.id;
if (this.selectedCaseId != child.id)
{
@@ -1650,6 +1972,7 @@ dojo.declare("alfresco.xforms.SwitchGroup",
return childDomContainer;
},
+
/////////////////////////////////////////////////////////////////
// XForms event handlers
/////////////////////////////////////////////////////////////////
@@ -2331,6 +2654,11 @@ dojo.declare("alfresco.xforms.Submit",
"onclick",
function(event)
{
+ if (!event.target.widget)
+ {
+ return true;
+ }
+
var xform = event.target.widget.xform;
if (xform.submitWidget && xform.submitWidget.done)
{
@@ -2466,8 +2794,8 @@ dojo.declare("alfresco.xforms.Binding",
: null);
this.maximum = parseInt(this.xformsNode.getAttribute(alfresco_xforms_constants.ALFRESCO_PREFIX + ":maximum"));
this.minimum = parseInt(this.xformsNode.getAttribute(alfresco_xforms_constants.ALFRESCO_PREFIX + ":minimum"));
- this.parent = parent;
- this.widgets = {};
+ this.parent = parent;
+ this.widgets = {};
},
/** Returns the expected schema type for this binding. */
@@ -2549,7 +2877,7 @@ dojo.declare("alfresco.xforms.XForm",
this.rootWidget = new alfresco.xforms.ViewRoot(this, rootGroup);
this.rootWidget.render(alfUI);
this.loadWidgets(rootGroup, this.rootWidget);
- this.rootWidget._updateDisplay();
+// this.rootWidget._updateDisplay();
},
/** Creates the widget for the provided xforms node. */
@@ -2571,8 +2899,25 @@ dojo.declare("alfresco.xforms.XForm",
var type = this.getBinding(xformsNode).getType();
switch (type)
{
+ // date types
case "date":
return new alfresco.xforms.DatePicker(this, xformsNode);
+ case "time":
+ return new alfresco.xforms.TimePicker(this, xformsNode);
+ case "gMonth":
+ return new alfresco.xforms.MonthPicker(this, xformsNode);
+ case "gDay":
+ return new alfresco.xforms.DayPicker(this, xformsNode);
+ case "gYear":
+ return new alfresco.xforms.YearPicker(this, xformsNode);
+ case "gYearMonth":
+ return new alfresco.xforms.YearMonthPicker(this, xformsNode);
+ case "gMonthDay":
+ return new alfresco.xforms.MonthDayPicker(this, xformsNode);
+ case "dateTime":
+ case "yearMonthDuration":
+ case "dayTimeDuration":
+ // number types
case "byte":
case "double":
case "float":
@@ -2588,7 +2933,9 @@ dojo.declare("alfresco.xforms.XForm",
case "unsignedLong":
case "unsignedShort":
case "positiveInteger":
+ // string types
case "string":
+ case "normalizedString":
default:
return new alfresco.xforms.TextField(this, xformsNode);
}