mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5282 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
314 lines
8.7 KiB
JavaScript
314 lines
8.7 KiB
JavaScript
/*
|
|
Copyright (c) 2004-2006, The Dojo Foundation
|
|
All Rights Reserved.
|
|
|
|
Licensed under the Academic Free License version 2.1 or above OR the
|
|
modified BSD license. For more information on Dojo licensing, see:
|
|
|
|
http://dojotoolkit.org/community/licensing.shtml
|
|
*/
|
|
|
|
dojo.provide("dojo.widget.Form");
|
|
|
|
dojo.require("dojo.widget.*");
|
|
dojo.require("dojo.widget.HtmlWidget");
|
|
|
|
dojo.widget.defineWidget("dojo.widget.Form", dojo.widget.HtmlWidget,
|
|
{
|
|
/*
|
|
summary:
|
|
Widget for easily moving data to/from form
|
|
|
|
description:
|
|
gets and sets data to and from js-object. With
|
|
this it's easy to create forms to application.
|
|
Just create empty form, then set it's values
|
|
with this and after user pushes submit,
|
|
getValues and send them as json-notation to
|
|
server.
|
|
|
|
Note: not all Form widgets are supported ATM
|
|
|
|
usage:
|
|
<form dojoType="Form" id="myForm">
|
|
Name: <input type="text" name="name" />
|
|
</form>
|
|
myObj={name: "John Doe"};
|
|
dojo.widget.byId('myForm').setValues(myObj);
|
|
|
|
myObj=dojo.widget.byId('myForm').getValues();
|
|
|
|
*/
|
|
|
|
isContainer: true,
|
|
templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onSubmit:onSubmit'></form>",
|
|
formElements: [],
|
|
// ignoreNullValue:
|
|
// if true, then only fields that has data is set to form
|
|
// if false, fields that does not have corresponding object, is set to empty
|
|
ignoreNullValues: false,
|
|
|
|
postCreate: function(args,frag){
|
|
for (var key in args) {
|
|
if (key == "dojotype") continue;
|
|
var attr= document.createAttribute(key);
|
|
attr.nodeValue=args[key];
|
|
this.containerNode.setAttributeNode(attr);
|
|
}
|
|
},
|
|
_createRepeaters: function (/*object*/obj, /*widget*/widget) {
|
|
for(var i=0; i<widget.children.length; ++i) {
|
|
if (widget.children[i].widgetType == "RepeaterContainer") {
|
|
var rIndex=widget.children[i].index;
|
|
var rIndexPos=rIndex.indexOf("%{index}");
|
|
rIndex=rIndex.substr(0,rIndexPos-1);
|
|
var myObj = this._getObject(obj, rIndex);
|
|
if (typeof(myObj) == "object" && myObj.length == 0) {
|
|
myObj=new Array();
|
|
}
|
|
var rowCount = widget.children[i].getRowCount();
|
|
for (var j=0,len=rowCount; j<len; ++j) {
|
|
widget.children[i].deleteRow(0);
|
|
}
|
|
for (var j=0; j<myObj.length; j++) {
|
|
widget.children[i].addRow(false);
|
|
}
|
|
}
|
|
if (widget.children[i].isContainer) {
|
|
this._createRepeaters(obj, widget.children[i]);
|
|
}
|
|
}
|
|
},
|
|
|
|
_createFormElements: function() {
|
|
if(dojo.render.html.safari) {
|
|
// bug in safari (not registering form-elements)
|
|
this.formElements=[];
|
|
var elems = ["INPUT", "SELECT", "TEXTAREA"];
|
|
for (var k=0; k < elems.length; k++) {
|
|
var list = this.containerNode.getElementsByTagName(elems[k]);
|
|
for (var j=0,len2=list.length; j<len2; j++) {
|
|
this.formElements.push(list[j]);
|
|
}
|
|
}
|
|
// fixed in safari nightly
|
|
} else {
|
|
this.formElements=this.containerNode.elements;
|
|
}
|
|
},
|
|
onSubmit: function(/*event*/e) {
|
|
e.preventDefault();
|
|
},
|
|
|
|
submit: function() {
|
|
this.containerNode.submit();
|
|
},
|
|
|
|
_getFormElement: function(/*form elements name*/name) {
|
|
if(dojo.render.html.ie) {
|
|
for(var i=0, len=this.formElements.length; i<len; i++) {
|
|
var element = this.formElements[i];
|
|
if (element.name == name) {
|
|
return element;
|
|
} // if
|
|
} // for
|
|
} else {
|
|
var elem = this.formElements[name];
|
|
if (typeof(elem) != "undefined") {
|
|
return elem;
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
|
|
_getObject: function(/*object*/obj, /*string*/searchString) {
|
|
var namePath = [];
|
|
namePath=searchString.split(".");
|
|
var myObj=obj;
|
|
var name=namePath[namePath.length-1];
|
|
|
|
for(var j=0, len=namePath.length;j<len;++j) {
|
|
var p=namePath[j];
|
|
if (typeof(myObj[p]) == "undefined") {
|
|
myObj[p]={};
|
|
}
|
|
myObj=myObj[p];
|
|
}
|
|
return myObj;
|
|
},
|
|
_setToContainers: function (/*object*/obj,/*widget*/widget) {
|
|
for(var i=0, len=widget.children.length; i<len; ++i) {
|
|
var currentWidget=widget.children[i];
|
|
if (currentWidget.widgetType == "Repeater") {
|
|
for(var j=0,len=currentWidget.getRowCount(); j<len; ++j) {
|
|
currentWidget._initRow(j);
|
|
}
|
|
}
|
|
|
|
if (currentWidget.isContainer) {
|
|
this._setToContainers (obj, currentWidget);
|
|
continue;
|
|
}
|
|
|
|
switch(currentWidget.widgetType) {
|
|
case "Checkbox":
|
|
currentWidget.setValue(currentWidget.inputNode.checked);
|
|
break;
|
|
case "DropdownDatePicker":
|
|
currentWidget.setValue(currentWidget.getValue());
|
|
break;
|
|
case "Select":
|
|
//widget.children[i].setValue(myObj[name]);
|
|
continue;
|
|
break;
|
|
case "ComboBox":
|
|
//widget.children[i].setSelectedValue(myObj[name]);
|
|
continue;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
setValues: function(/*object*/obj) {
|
|
this._createFormElements();
|
|
this._createRepeaters(obj,this);
|
|
for(var i=0, len=this.formElements.length; i<len; i++) {
|
|
var element = this.formElements[i];
|
|
if (element.name == '') {continue};
|
|
var namePath = new Array();
|
|
namePath=element.name.split(".");
|
|
var myObj=obj;
|
|
var name=namePath[namePath.length-1];
|
|
for(var j=1,len2=namePath.length;j<len2;++j) {
|
|
var p=namePath[j - 1];
|
|
if(typeof(myObj[p]) == "undefined") {
|
|
myObj=undefined;
|
|
break;
|
|
};
|
|
myObj=myObj[p];
|
|
}
|
|
|
|
if (typeof(myObj) == "undefined") {
|
|
continue;
|
|
}
|
|
if (typeof(myObj[name]) == "undefined" && this.ignoreNullValues) {
|
|
continue;
|
|
}
|
|
var type=element.type;
|
|
if (type == "hidden" || type == "text" || type == "textarea" || type == "password") {
|
|
type = "text";
|
|
}
|
|
switch(type) {
|
|
case "checkbox":
|
|
element.checked=false;
|
|
if (typeof(myObj[name]) == 'undefined') continue;
|
|
for (var j=0,len2=myObj[name].length; j<len2; ++j) {
|
|
if(element.value == myObj[name][j]) {
|
|
element.checked=true;
|
|
}
|
|
}
|
|
break;
|
|
case "radio":
|
|
element.checked=false;
|
|
if (typeof(myObj[name]) == 'undefined') {continue};
|
|
if (myObj[name] == element.value) {
|
|
element.checked=true;
|
|
}
|
|
break;
|
|
case "select-multiple":
|
|
element.selectedIndex=-1;
|
|
for (var j=0,len2=element.options.length; j<len2; ++j) {
|
|
for (var k=0,len3=myObj[name].length;k<len3;++k) {
|
|
if (element.options[j].value == myObj[name][k]) {
|
|
element.options[j].selected=true;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case "select-one":
|
|
element.selectedIndex="0";
|
|
for (var j=0,len2=element.options.length; j<len2; ++j) {
|
|
if (element.options[j].value == myObj[name]) {
|
|
element.options[j].selected=true;
|
|
} else {
|
|
// element.options[j].selected=false;
|
|
}
|
|
}
|
|
break;
|
|
case "text":
|
|
var value="";
|
|
if (typeof(myObj[name]) != 'undefined') {
|
|
value = myObj[name];
|
|
}
|
|
element.value=value;
|
|
break;
|
|
default:
|
|
dojo.debug("Not supported type ("+type+")");
|
|
break;
|
|
}
|
|
}
|
|
this._setToContainers(obj,this);
|
|
},
|
|
getValues: function() {
|
|
this._createFormElements();
|
|
var obj = { };
|
|
|
|
for(var i=0,len=this.formElements.length; i<len; i++) {
|
|
// FIXME: would be better to give it an attachPoint:
|
|
var elm = this.formElements[i];
|
|
var namePath = [];
|
|
if (elm.name == '') { continue;}
|
|
namePath=elm.name.split(".");
|
|
var myObj=obj;
|
|
var name=namePath[namePath.length-1];
|
|
for(var j=1,len2=namePath.length;j<len2;++j) {
|
|
var nameIndex = null;
|
|
var p=namePath[j - 1];
|
|
var nameA=p.split("[");
|
|
if (nameA.length > 1) {
|
|
if(typeof(myObj[nameA[0]]) == "undefined") {
|
|
myObj[nameA[0]]=[ ];
|
|
} // if
|
|
nameIndex=parseInt(nameA[1]);
|
|
if(typeof(myObj[nameA[0]][nameIndex]) == "undefined") {
|
|
myObj[nameA[0]][nameIndex]={};
|
|
}
|
|
} else if(typeof(myObj[nameA[0]]) == "undefined") {
|
|
myObj[nameA[0]]={}
|
|
} // if
|
|
|
|
if (nameA.length == 1) {
|
|
myObj=myObj[nameA[0]];
|
|
} else {
|
|
myObj=myObj[nameA[0]][nameIndex];
|
|
} // if
|
|
} // for
|
|
|
|
if ((elm.type != "select-multiple" && elm.type != "checkbox" && elm.type != "radio") || (elm.type=="radio" && elm.checked)) {
|
|
if(name == name.split("[")[0]) {
|
|
myObj[name]=elm.value;
|
|
} else {
|
|
// can not set value when there is no name
|
|
}
|
|
} else if (elm.type == "checkbox" && elm.checked) {
|
|
if(typeof(myObj[name]) == 'undefined') {
|
|
myObj[name]=[ ];
|
|
}
|
|
myObj[name].push(elm.value);
|
|
} else if (elm.type == "select-multiple") {
|
|
if(typeof(myObj[name]) == 'undefined') {
|
|
myObj[name]=[ ];
|
|
}
|
|
for (var jdx=0,len3=elm.options.length; jdx<len3; ++jdx) {
|
|
if (elm.options[jdx].selected) {
|
|
myObj[name].push(elm.options[jdx].value);
|
|
}
|
|
}
|
|
} // if
|
|
name=undefined;
|
|
} // for
|
|
return obj;
|
|
}
|
|
});
|