BUG 0000 "Problem in dependent fields with suggest field in grids" SOLVED

- Problem in dependent fields with suggest field in grids
- Solved problem in dependent fields with suggest field in grids
- The QA team should test with (in grids):
    suggest  -> suggest  -> suggest
    suggest  -> dropdown -> suggest
    dropdown -> suggest  -> suggest
    dropdown -> suggest  -> dropdown
    text     -> suggest  -> suggest
    text     -> suggest  -> text
    * Browsers IE7, IE8, IE9, Firefox and Chrome
* Available from version ProcessMaker-2.0.46
This commit is contained in:
Victor Saisa Lopez
2013-01-18 19:12:32 -04:00
parent e96e5cb77c
commit f871d9fded
5 changed files with 226 additions and 101 deletions

View File

@@ -105,15 +105,20 @@ function G_Field ( form, element, name )
var tempValue;
if (me.dependentFields.length===0) return true;
var fields=[],Fields = [],i,grid='',row=0;
var gridField = "";
for(i in me.dependentFields) {
if (me.dependentFields[i].dependentOf) {
for (var j = 0; j < me.dependentFields[i].dependentOf.length; j++) {
var oAux = me.dependentFields[i].dependentOf[j];
if (oAux.name.indexOf('][') > -1) {
var aAux = oAux.name.split('][');
grid = aAux[0];
row = aAux[1];
fieldName = aAux[2];
var arrayAux = oAux.name.split("][");
grid = arrayAux[0];
row = parseInt(arrayAux[1]);
fieldName = arrayAux[2];
gridField = gridGetAllFieldAndValue(oAux.name, 0); //Not get current field
if (Fields.length > 0){
aux = Fields;
aux.push('?');
@@ -145,15 +150,19 @@ function G_Field ( form, element, name )
}
}
}
var callServer;
callServer = new leimnud.module.rpc.xmlhttp({
url: me.form.ajaxServer,
async: false,
method: "POST",
args : "function=reloadField&" + 'form='+encodeURIComponent(me.form.id)+'&fields='+encodeURIComponent(fields.toJSONString())+(grid!=''?'&grid='+grid:'')+(row>0?'&row='+row:'')
args: "function=reloadField" + "&form=" + encodeURIComponent(me.form.id) + "&fields=" + encodeURIComponent(fields.toJSONString()) + ((grid != "")? "&grid=" + grid + ((gridField != "")? "&gridField=" + encodeURIComponent("{" + gridField + "}") : "") : "") + ((row > 0)? "&row=" + row: "")
});
callServer.make();
var response = callServer.xmlhttp.responseText;
//Validate the response
if (response.substr(0,1)==='[') {
var newcont;
@@ -316,6 +325,9 @@ function G_DropDown( form, element, name )
dd.options[key] = null;
}
}
dd.options.length = 0; //Delete options
// the remove function is no longer reliable
// while(dd.options.length>1) dd.remove(0);
for(var o=0;o<content.options.length;o++) {
@@ -324,6 +336,10 @@ function G_DropDown( form, element, name )
optn.value = content.options[o].key;
dd.options[o]=optn;
}
if (dd.options.length == 0) {
dd.options[0] = new Option("", "");
}
};
if (!element) return;
leimnud.event.add(this.element,'change',this.updateDepententFields);
@@ -3595,3 +3611,38 @@ function getNumericValue(val, decimalSeparator)
return num;
}
var gridGetAllFieldAndValue = function (fieldId, swCurrentField)
{
var frm = G.getObject(getField(fieldId).form);
var arrayAux = fieldId.split("][");
var gridName = arrayAux[0];
var row = parseInt(arrayAux[1]);
var fieldName = arrayAux[2];
var grid;
var gridField = "";
var fieldNameAux = "";
var fieldValueAux = "";
var i1 = 0;
var i2 = 0;
//Get all fields of grid
for (i1 = 0; i1 <= frm.aElements.length - 1; i1++) {
if (frm.aElements[i1].name == gridName) {
grid = frm.aElements[i1];
for (i2 = 0; i2 <= grid.aFields.length - 1; i2++) {
fieldNameAux = grid.aFields[i2].sFieldName;
fieldValueAux = grid.getElementByName(row, fieldNameAux).value();
if ((swCurrentField == 1 || fieldNameAux != fieldName) && typeof fieldValueAux != "undefined") {
gridField = gridField + ((gridField != "")? "," : "") + "\"" + fieldNameAux + "\":\"" + fieldValueAux + "\"";
}
}
}
}
return gridField;
};

View File

@@ -468,6 +468,7 @@ var G_Grid = function(oForm, sGridName){
var aObjectsScript = oNewRow.getElementsByTagName('td')[i].getElementsByTagName('script');
var sObjectType = this.aFields[i-1].sType;
if (aObjectsScript[0] != 'undefined' && sObjectType == 'suggest') {
if (this.determineBrowser() == "MSIE") {
@@ -489,15 +490,13 @@ var G_Grid = function(oForm, sGridName){
scriptElement.text = sScriptAdjustRow;
parentScript.removeChild(elementScript);
parentScript.appendChild(scriptElement);
} else {
var sObjScript = aObjectsScript[0].innerHTML;
var sNewObjScript = sObjScript.replace(/\[1\]/g, '\[' + currentRow + '\]');
var sNewObjScript = sObjScript.replace(/\[1\]/g, "\[" + currentRow + "\]");
aObjectsScript[0].innerHTML = sNewObjScript;
eval(aObjectsScript[0].innerHTML);
}
}
break;
case 'checkbox': //CHECKBOX
var attributeCheckBox = elementAttributesNS(aObjects[n], "");
@@ -599,10 +598,14 @@ var G_Grid = function(oForm, sGridName){
for (x=0; x < aDependents.length; x++){
if (aDependents[x] == sObject) sw = true;
}
//Delete Options if dropdow is dependent
//only remains empty value
if (sw){
oNewSelect.options.length = 0; //Delete options
var oAux = document.createElement(aObjects[0].tagName);
for ( var j = 0; j < aObjects[0].options.length; j++) {
if (aObjects[0].options[j].value == ''){
var oOption = document.createElement('OPTION');
@@ -611,8 +614,9 @@ var G_Grid = function(oForm, sGridName){
oAux.options.add(oOption);
}
}
oNewSelect.innerHTML = ''; //Delete options
//aObjects[0].innerHTML = ''; //Delete options
for (var r =0; r < oAux.options.length; r++){
var xOption = document.createElement('OPTION');
xOption.value = oAux.options[r].value;
@@ -620,6 +624,10 @@ var G_Grid = function(oForm, sGridName){
//aObjects[0].options.add(xOption);
oNewSelect.options.add(xOption);
}
if (oNewSelect.options.length == 0) {
oNewSelect.options[0] = new Option("", "");
}
}else{
//Set Default Value if it's not a Dependent Field
if (defaultValue != ''){
@@ -663,6 +671,7 @@ var G_Grid = function(oForm, sGridName){
}
//TODO: Implement Default Value and Dependent Fields Trigger for grid dropdowns
}
var parentSelect = aObjects[0].parentNode;
parentSelect.removeChild(aObjects[0]);
parentSelect.appendChild(oNewSelect);

View File

@@ -955,16 +955,17 @@ parent=parent.parentNode;parent.style.display='none';};this.show=function(parent
parent=parent.parentNode;parent.style.display='';};this.setDependentFields=function(dependentFields){var i;if(dependentFields.indexOf(',')>-1){dependentFields=dependentFields.split(',');}
else{dependentFields=dependentFields.split('|');}
for(i=0;i<dependentFields.length;i++){if(me.form.getElementIdByName(dependentFields[i])>=0){me.dependentFields[i]=me.form.getElementByName(dependentFields[i]);me.dependentFields[i].addDependencie(me);}}};this.addDependencie=function(field){var exists=false;for(i=0;i<me.dependentOf.length;i++)
if(me.dependentOf[i]===field)exists=true;if(!exists)me.dependentOf[i]=field;};this.updateDepententFields=function(event){var tempValue;if(me.dependentFields.length===0)return true;var fields=[],Fields=[],i,grid='',row=0;for(i in me.dependentFields){if(me.dependentFields[i].dependentOf){for(var j=0;j<me.dependentFields[i].dependentOf.length;j++){var oAux=me.dependentFields[i].dependentOf[j];if(oAux.name.indexOf('][')>-1){var aAux=oAux.name.split('][');grid=aAux[0];row=aAux[1];fieldName=aAux[2];if(Fields.length>0){aux=Fields;aux.push('?');if(aux.join('*').indexOf(fieldName+'*')==-1){Fields.push(fieldName);eval("var oAux2 = {"+fieldName+":'"+oAux.value()+"'}");fields=fields.concat(oAux2);}}else{Fields.push(fieldName);eval("var oAux2 = {"+fieldName+":'"+oAux.value()+"'}");fields=fields.concat(oAux2);}}
if(me.dependentOf[i]===field)exists=true;if(!exists)me.dependentOf[i]=field;};this.updateDepententFields=function(event){var tempValue;if(me.dependentFields.length===0)return true;var fields=[],Fields=[],i,grid='',row=0;var gridField="";for(i in me.dependentFields){if(me.dependentFields[i].dependentOf){for(var j=0;j<me.dependentFields[i].dependentOf.length;j++){var oAux=me.dependentFields[i].dependentOf[j];if(oAux.name.indexOf('][')>-1){var arrayAux=oAux.name.split("][");grid=arrayAux[0];row=parseInt(arrayAux[1]);fieldName=arrayAux[2];gridField=gridGetAllFieldAndValue(oAux.name,0);if(Fields.length>0){aux=Fields;aux.push('?');if(aux.join('*').indexOf(fieldName+'*')==-1){Fields.push(fieldName);eval("var oAux2 = {"+fieldName+":'"+oAux.value()+"'}");fields=fields.concat(oAux2);}}else{Fields.push(fieldName);eval("var oAux2 = {"+fieldName+":'"+oAux.value()+"'}");fields=fields.concat(oAux2);}}
else{aux=Fields;aux.push('?');oAux=me.dependentFields[i].dependentOf[0];if(Fields.length>0){if(aux.join('*').indexOf(oAux.name+'*')==-1){Fields.push(oAux.name);fields=fields.concat(me.dependentFields[i].dependentOf);}}else{Fields.push(oAux.name);fields=fields.concat(me.dependentFields[i].dependentOf);}}}}}
var callServer;callServer=new leimnud.module.rpc.xmlhttp({url:me.form.ajaxServer,async:false,method:"POST",args:"function=reloadField&"+'form='+encodeURIComponent(me.form.id)+'&fields='+encodeURIComponent(fields.toJSONString())+(grid!=''?'&grid='+grid:'')+(row>0?'&row='+row:'')});callServer.make();var response=callServer.xmlhttp.responseText;if(response.substr(0,1)==='['){var newcont;eval('newcont='+response+';');if(grid==''){for(var i=0;i<newcont.length;i++){var j=me.form.getElementIdByName(newcont[i].name);if(typeof(me.form.aElements[j])!='undefined'){me.form.aElements[j].setValue(newcont[i].value);me.form.aElements[j].setContent(newcont[i].content);me.form.aElements[j].updateDepententFields();}}}
var callServer;callServer=new leimnud.module.rpc.xmlhttp({url:me.form.ajaxServer,async:false,method:"POST",args:"function=reloadField"+"&form="+encodeURIComponent(me.form.id)+"&fields="+encodeURIComponent(fields.toJSONString())+((grid!="")?"&grid="+grid+((gridField!="")?"&gridField="+encodeURIComponent("{"+gridField+"}"):""):"")+((row>0)?"&row="+row:"")});callServer.make();var response=callServer.xmlhttp.responseText;if(response.substr(0,1)==='['){var newcont;eval('newcont='+response+';');if(grid==''){for(var i=0;i<newcont.length;i++){var j=me.form.getElementIdByName(newcont[i].name);if(typeof(me.form.aElements[j])!='undefined'){me.form.aElements[j].setValue(newcont[i].value);me.form.aElements[j].setContent(newcont[i].content);me.form.aElements[j].updateDepententFields();}}}
else{for(var i=0;i<newcont.length;i++){var oAux=me.form.getElementByName(grid);if(oAux){var oAux2=oAux.getElementByName(row,newcont[i].name);if(oAux2){oAux2.setValue(newcont[i].value);oAux2.setContent(newcont[i].content);oAux2.updateDepententFields();}}}}}else{alert('Invalid response: '+response);}
return true;};this.setValue=function(newValue){me.element.value=newValue;};this.setContent=function(newContent){};this.setAttributes=function(attributes){for(var a in attributes){if(a=='formula'&&attributes[a]){sumaformu(this.element,attributes[a],attributes['mask']);}
switch(typeof(attributes[a])){case'string':case'int':case'boolean':if(a!='strTo'){switch(true){case typeof(me[a])==='undefined':case typeof(me[a])==='object':case typeof(me[a])==='function':case a==='isObject':case a==='isArray':break;default:me[a]=attributes[a];}}
else{me[a]=attributes[a];}}}};this.value=function(){return me.element.value;};this.toJSONString=function(){return'{"'+me.name+'":'+me.element.value.toJSONString()+'}';};this.highLight=function(){try{G.highLight(me.element);if(G.autoFirstField){me.element.focus();G.autoFirstField=false;setTimeout("G.autoFirstField=true;",1000);}}catch(e){}};}
function G_DropDown(form,element,name)
{var me=this;this.parent=G_Field;this.parent(form,element,name);this.setContent=function(content){var dd=me.element;var browser=getBrowserClient();if((browser.name=='msie')||((browser.name=='firefox')&&(browser.version<12))){while(dd.options.length>1)dd.remove(0);}else{for(var key in dd.options){dd.options[key]=null;}}
for(var o=0;o<content.options.length;o++){var optn=$dce("OPTION");optn.text=content.options[o].value;optn.value=content.options[o].key;dd.options[o]=optn;}};if(!element)return;leimnud.event.add(this.element,'change',this.updateDepententFields);}
dd.options.length=0;for(var o=0;o<content.options.length;o++){var optn=$dce("OPTION");optn.text=content.options[o].value;optn.value=content.options[o].key;dd.options[o]=optn;}
if(dd.options.length==0){dd.options[0]=new Option("","");}};if(!element)return;leimnud.event.add(this.element,'change',this.updateDepententFields);}
G_DropDown.prototype=new G_Field();function G_Text(form,element,name)
{var me=this;this.mType="text";this.parent=G_Field;this.browser={};this.comma_separator=".";this.checkBrowser=function(){var nVer=navigator.appVersion;var nAgt=navigator.userAgent;var browserName=navigator.appName;var fullVersion=''+parseFloat(navigator.appVersion);var majorVersion=parseInt(navigator.appVersion,10);var nameOffset,verOffset,ix;if((verOffset=nAgt.indexOf("Opera"))!=-1){browserName="Opera";fullVersion=nAgt.substring(verOffset+6);if((verOffset=nAgt.indexOf("Version"))!=-1)
fullVersion=nAgt.substring(verOffset+8);}
@@ -1257,6 +1258,9 @@ return newStr;}
function getNumericValue(val,decimalSeparator)
{var arrayNum=val.split("");var num="";for(var i=0;i<=arrayNum.length-1;i++){switch(arrayNum[i]){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":num=num+arrayNum[i];break;case decimalSeparator:num=num+".";break;}}
return num;}
var gridGetAllFieldAndValue=function(fieldId,swCurrentField)
{var frm=G.getObject(getField(fieldId).form);var arrayAux=fieldId.split("][");var gridName=arrayAux[0];var row=parseInt(arrayAux[1]);var fieldName=arrayAux[2];var grid;var gridField="";var fieldNameAux="";var fieldValueAux="";var i1=0;var i2=0;for(i1=0;i1<=frm.aElements.length-1;i1++){if(frm.aElements[i1].name==gridName){grid=frm.aElements[i1];for(i2=0;i2<=grid.aFields.length-1;i2++){fieldNameAux=grid.aFields[i2].sFieldName;fieldValueAux=grid.getElementByName(row,fieldNameAux).value();if((swCurrentField==1||fieldNameAux!=fieldName)&&typeof fieldValueAux!="undefined"){gridField=gridField+((gridField!="")?",":"")+"\""+fieldNameAux+"\":\""+fieldValueAux+"\"";}}}}
return gridField;};
function G_PagedTable()
{this.id='';this.name='';this.event='';this.element=null;this.field='';this.ajaxUri='';this.currentOrder='';this.currentFilter='';this.currentPage=1;this.totalRows=0;this.rowsPerPage=25;this.onInsertField='';this.onDeleteField='';this.afterDeleteField='';this.onUpdateField='';this.form;var me=this;function loadTable(func,uri){var div=document.getElementById('table['+me.id+']');var newContent=ajax_function(me.ajaxUri,func,uri);if(div.outerHTML){div.outerHTML=div.outerHTML.split(div.innerHTML).join(newContent);}else{div.innerHTML=newContent;}
var myScripts=div.getElementsByTagName('SCRIPT');for(var rr=0;rr<myScripts.length;rr++){try{if(myScripts[rr].innerHTML!=='')
@@ -1341,7 +1345,7 @@ for(n=0;n<aObjects.length;n++){switch(aObjects[n].type){case'text':aObjects[n].c
var a2=document.createElement('a');if(a2.style.setAttribute){var styleText="position:relative;top:0px;left:-19px;";a2.style.setAttribute("cssText",styleText);}
else{var styleText="position:relative;top:0px;left:-22px;";a2.setAttribute("style",styleText);}
a2.id=datePickerTriggerId;a2.innerHTML=img2;oNewRow.getElementsByTagName('td')[i].appendChild(a2);datePicker4("",newID,attributes.mask,attributes.start,attributes.end,attributes.time);aObjects[n].value=defaultValue;}else{if(_BROWSER.name=='msie'&&aObjects.length==1){var oNewOBJ=this.cloneElement(aObjects[n]);oNewOBJ.value=defaultValue;var parentGG=aObjects[n].parentNode;parentGG.removeChild(aObjects[n]);parentGG.appendChild(oNewOBJ);}else{if((attributes.gridtype)&&attributes.gridtype=="currency"){var attributesCurrency=elementAttributesNS(aObjects[n],"");aObjects[n].value=attributesCurrency.value.replace(/[.,0-9\s]/g,"");}else{aObjects[n].value=defaultValue;}}}
var aObjectsScript=oNewRow.getElementsByTagName('td')[i].getElementsByTagName('script');var sObjectType=this.aFields[i-1].sType;if(aObjectsScript[0]!='undefined'&&sObjectType=='suggest'){if(this.determineBrowser()=="MSIE"){var firstNode=aCells[i];var firstScriptSuggest=firstNode.childNodes[2].innerHTML;var sScriptAdjustRow=firstScriptSuggest.replace(/\[1\]/g,'\['+currentRow+'\]');var elementTD=oNewRow.getElementsByTagName('td')[i];var elementLabel=elementTD.childNodes[0];var sNewLabelRow=elementLabel.getAttribute("id").replace(/\[1\]/g,'\['+currentRow+'\]');var elementHidden=elementTD.childNodes[1];var elementScript=elementTD.childNodes[2];var parentScript=elementScript.parentNode;var scriptElement=document.createElement("script");scriptElement.text=sScriptAdjustRow;parentScript.removeChild(elementScript);parentScript.appendChild(scriptElement);}else{var sObjScript=aObjectsScript[0].innerHTML;var sNewObjScript=sObjScript.replace(/\[1\]/g,'\['+currentRow+'\]');aObjectsScript[0].innerHTML=sNewObjScript;eval(aObjectsScript[0].innerHTML);}}
var aObjectsScript=oNewRow.getElementsByTagName('td')[i].getElementsByTagName('script');var sObjectType=this.aFields[i-1].sType;if(aObjectsScript[0]!='undefined'&&sObjectType=='suggest'){if(this.determineBrowser()=="MSIE"){var firstNode=aCells[i];var firstScriptSuggest=firstNode.childNodes[2].innerHTML;var sScriptAdjustRow=firstScriptSuggest.replace(/\[1\]/g,'\['+currentRow+'\]');var elementTD=oNewRow.getElementsByTagName('td')[i];var elementLabel=elementTD.childNodes[0];var sNewLabelRow=elementLabel.getAttribute("id").replace(/\[1\]/g,'\['+currentRow+'\]');var elementHidden=elementTD.childNodes[1];var elementScript=elementTD.childNodes[2];var parentScript=elementScript.parentNode;var scriptElement=document.createElement("script");scriptElement.text=sScriptAdjustRow;parentScript.removeChild(elementScript);parentScript.appendChild(scriptElement);}else{var sObjScript=aObjectsScript[0].innerHTML;var sNewObjScript=sObjScript.replace(/\[1\]/g,"\["+currentRow+"\]");aObjectsScript[0].innerHTML=sNewObjScript;eval(aObjectsScript[0].innerHTML);}}
break;case'checkbox':var attributeCheckBox=elementAttributesNS(aObjects[n],"");if(defaultValue==""||(typeof attributeCheckBox.falseValue!="undefined"&&defaultValue==attributeCheckBox.falseValue)||(typeof attributeCheckBox.falsevalue!="undefined"&&defaultValue==attributeCheckBox.falsevalue)){aObjects[n].checked=false;}else{aObjects[n].checked=true;}
break;case'hidden':if((attributes.gridtype!='yesno'&&attributes.gridtype!='dropdown')||typeof attributes.gridtype=='undefined'){aObjects[n].value=defaultValue;newID=aObjects[n].id.replace(/\[1\]/g,'\['+currentRow+'\]');aObjects[n].id=newID;aObjects[n].name=newID;}
break;case'button':if(aObjects[n].onclick){var onclickevn=new String(aObjects[n].onclick);eval('aObjects[n].onclick = '+onclickevn.replace(/\[1\]/g,'\['+currentRow+'\]')+';');}
@@ -1354,8 +1358,9 @@ else{oNewSelect.setAttribute(aAttributes[a].name,aAttributes[a].value);}}}
attributes=elementAttributesNS(aObjects[0],'pm');if(attributes.defaultvalue!=''&&typeof attributes.defaultvalue!='undefined'){defaultValue=attributes.defaultvalue;}else{defaultValue='';}
if(attributes.gridtype!=''&&typeof attributes.gridtype!='undefined'){gridType=attributes.gridtype;}else{gridType='';}
var aDependents=this.allDependentFields.split(',');sObject=this.getObjectName(newID);var sw=false;for(x=0;x<aDependents.length;x++){if(aDependents[x]==sObject)sw=true;}
if(sw){var oAux=document.createElement(aObjects[0].tagName);for(var j=0;j<aObjects[0].options.length;j++){if(aObjects[0].options[j].value==''){var oOption=document.createElement('OPTION');oOption.value=aObjects[0].options[j].value;oOption.text=aObjects[0].options[j].text;oAux.options.add(oOption);}}
oNewSelect.innerHTML='';for(var r=0;r<oAux.options.length;r++){var xOption=document.createElement('OPTION');xOption.value=oAux.options[r].value;xOption.text=oAux.options[r].text;oNewSelect.options.add(xOption);}}else{if(defaultValue!=''){var oAux=document.createElement(aObjects[0].tagName);for(var j=0;j<aObjects[0].options.length;j++){var oOption=document.createElement('OPTION');oOption.value=aObjects[0].options[j].value;oOption.text=aObjects[0].options[j].text;if(aObjects[0].options[j].value===defaultValue){oOption.setAttribute('selected','selected');}
if(sw){oNewSelect.options.length=0;var oAux=document.createElement(aObjects[0].tagName);for(var j=0;j<aObjects[0].options.length;j++){if(aObjects[0].options[j].value==''){var oOption=document.createElement('OPTION');oOption.value=aObjects[0].options[j].value;oOption.text=aObjects[0].options[j].text;oAux.options.add(oOption);}}
for(var r=0;r<oAux.options.length;r++){var xOption=document.createElement('OPTION');xOption.value=oAux.options[r].value;xOption.text=oAux.options[r].text;oNewSelect.options.add(xOption);}
if(oNewSelect.options.length==0){oNewSelect.options[0]=new Option("","");}}else{if(defaultValue!=''){var oAux=document.createElement(aObjects[0].tagName);for(var j=0;j<aObjects[0].options.length;j++){var oOption=document.createElement('OPTION');oOption.value=aObjects[0].options[j].value;oOption.text=aObjects[0].options[j].text;if(aObjects[0].options[j].value===defaultValue){oOption.setAttribute('selected','selected');}
oAux.options.add(oOption);}
oNewSelect.innerHTML='';for(var r=0;r<oAux.options.length;r++){var xOption=document.createElement('OPTION');xOption.value=oAux.options[r].value;xOption.text=oAux.options[r].text;if(_BROWSER.name=='msie'){if(oAux.options[r].getAttribute('selected')!=''){xOption.setAttribute('selected','selected');}}else{if(oAux.options[r].getAttribute('selected')=='selected'){xOption.setAttribute('selected','selected');}}
oNewSelect.options.add(xOption);}}else{var oAux=document.createElement(aObjects[0].tagName);for(var j=0;j<aObjects[0].options.length;j++){var oOption=document.createElement('OPTION');oOption.value=aObjects[0].options[j].value;oOption.text=aObjects[0].options[j].text;oNewSelect.options.add(oOption);}}}

View File

@@ -50,20 +50,18 @@ if (! is_file( XMLFORM_AJAX_PATH . $xmlFile )) {
}
}
}
$G_FORM = new form( $xmlFile, $sPath );
$G_FORM->id = urlDecode( $_POST['form'] );
$G_FORM->values = isset( $_SESSION[$G_FORM->id] ) ? $_SESSION[$G_FORM->id] : array ();
$newValues = (Bootstrap::json_decode( urlDecode( stripslashes( $_POST['fields'] ) ) ));
if (isset($_POST['aFieldCurrent'])) {
$currentValue = (Bootstrap::json_decode( urlDecode( stripslashes( $_POST['aFieldCurrent'] ) ) ));
} else {
$currentValue = (Bootstrap::json_decode( urlDecode( stripslashes( $_POST['fields'] ) ) ));
}
if (isset( $_POST['grid'] )) {
$_POST['row'] = (int) $_POST['row'];
$aAux = array ();
foreach ($currentValue as $sKey => $newValue) {
foreach ($newValues as $sKey => $newValue) {
$newValue = (array) $newValue;
$aKeys = array_keys( $newValue );
if (count($aKeys)>0) {
@@ -102,6 +100,7 @@ if (sizeof( $newValues ) > 1 && isset( $_POST['grid'] )) {
//Resolve dependencies
//Returns an array ($dependentFields) with the names of the fields
//that depends of fields passed through AJAX ($_GET/$_POST)
//Returns all dependencies of all fields, this in grids
$dependentFields = array ();
$aux = array ();
for ($r = 0; $r < sizeof( $newValues ); $r ++) {
@@ -125,16 +124,54 @@ for ($r = 0; $r < sizeof( $newValues ); $r ++) {
$dependentFields = array_unique( $dependentFields );
//Delete all dependencies of all fields, we're interested only in the fields sending from AJAX, this in grids
if (isset($_POST["grid"])) {
$arrayField = (array)(Bootstrap::json_decode(urlDecode(stripslashes($_POST["fields"]))));
$arrayDependentField = array();
$ereg = null;
foreach ($arrayField as $fieldData) {
$arrayAux = (array)($fieldData);
foreach ($arrayAux as $index => $value) {
$ereg = $ereg . (($ereg != null)? "|" : null) . $index; //Concatenate field
}
}
if ($ereg != null) {
foreach ($dependentFields as $value) {
if (preg_match("/^(?:$ereg)\|.*$/", $value)) {
$arrayAux = explode("|", $value);
$arrayDependentField[] = $arrayAux[1];
}
}
}
$dependentFields = array_unique($arrayDependentField);
}
//Completed all fields of the grid
if (isset($_POST["grid"]) && isset($_POST["gridField"])) {
$arrayGridField = (array)(Bootstrap::json_decode(urldecode(stripslashes($_POST["gridField"]))));
foreach ($arrayGridField as $index => $value) {
$G_FORM->values[$_POST["grid"]][$_POST["row"]][$index] = $value;
}
}
//Parse and update the new content
$template = PATH_CORE . 'templates/xmlform.html';
$newContent = $G_FORM->getFields( $template, (isset( $_POST['row'] ) ? $_POST['row'] : - 1) );
$newContent = $G_FORM->getFields(PATH_CORE . "templates" . PATH_SEP . "xmlform.html", (isset($_POST["row"])? $_POST["row"] : -1));
//Returns the dependentFields's content
$sendContent = array ();
$r = 0;
//Set data
foreach ($dependentFields as $d) {
$sendContent[$r]->name = $d;
$sendContent[$r]->content = NULL;
$sendContent[$r]->content = null;
if (! isset( $_POST['grid'] )) {
if (isset( $G_FORM->fields[$d] )) {
foreach ($G_FORM->fields[$d] as $attribute => $value) {
@@ -159,16 +196,18 @@ foreach ($dependentFields as $d) {
if ($sendContent[$r]->content->type != 'text') {
$sendContent[$r]->content->{$attribute} = toJSArray($value);
} else {
$sendContent[$r]->content->{$attribute} = toJSArray( (isset( $value[$_POST['row']] ) ? array ($value[$_POST['row']]) : array ()) );
$sendContent[$r]->content->{$attribute} = toJSArray((isset($value[$_POST["row"]])? array($value[$_POST["row"]]) : array()));
}
break;
}
}
$sendContent[$r]->value = isset( $G_FORM->values[$_POST['grid']][$_POST['row']][$d] ) ? $G_FORM->values[$_POST['grid']][$_POST['row']][$d] : '';
}
$r ++;
$r = $r + 1;
}
echo (Bootstrap::json_encode( $sendContent ));
echo Bootstrap::json_encode($sendContent);
function toJSArray ($array, $type = '')
{
@@ -215,20 +254,34 @@ function subDependencies ($k, &$G_FORM, &$aux, $grid = '')
return array ();
if (! isset( $G_FORM->fields[$grid]->fields[$k]->dependentFields ))
return array ();
$aux[] = $k;
if (strpos( $G_FORM->fields[$grid]->fields[$k]->dependentFields, ',' ) !== false) {
$myDependentFields = explode( ',', $G_FORM->fields[$grid]->fields[$k]->dependentFields );
} else {
$myDependentFields = explode( '|', $G_FORM->fields[$grid]->fields[$k]->dependentFields );
}
for ($r = 0; $r < sizeof( $myDependentFields ); $r ++) {
if ($myDependentFields[$r] == "")
unset( $myDependentFields[$r] );
}
$mD = $myDependentFields;
foreach( $mD as $ki) {
$myDependentFields = array_merge( $myDependentFields , subDependencies( $ki , $G_FORM , $aux, $grid) );
}
//Set field and the dependent field of the grid
foreach ($myDependentFields as $index => $value) {
if (!preg_match("/^.*\|.*$/", $value)) {
$myDependentFields[$index] = $k . "|" . $value;
}
}
}
return $myDependentFields;
}

View File

@@ -1,5 +1,4 @@
<?php
/**
* class.xmlform.php
*
@@ -1604,19 +1603,6 @@ class XmlForm_Field_Suggest extends XmlForm_Field_SimpleText //by neyek
$depValues = '+';
}
$aDepFields = array ();
$count = 0;
if ($this->dependentFields !== '') {
$dependentFields = explode( ",", $this->dependentFields );
foreach ($dependentFields as $valueDependent) {
$sqlDepField = $owner->fields[$valueDependent]->sql;
$count = preg_match_all( '/\@(?:([\@\%\#\=\!Qq])([a-zA-Z\_]\w*)|([a-zA-Z\_][\w\-\>\:]*)\(((?:[^\\\\\)]*?)*)\))/', $sqlDepField, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE );
for ($cnt = 0; $cnt < $count; $cnt ++) {
$aDepFields[$cnt] = $match[2][$cnt][0];
}
}
}
$sOptions = 'script: function (input) { ';
$sOptions .= ' var inputValue = base64_encode(getField(\'' . $rowIdField . '[' . $this->name . '_label\').value); ';
@@ -1635,60 +1621,50 @@ class XmlForm_Field_Suggest extends XmlForm_Field_SimpleText //by neyek
$sOptions .= 'callback: function (obj) { ';
$sOptions .= 'if (typeof obj != "undefined") { ';
$sOptions .= ' var jField = { };';
$sOptions .= ' var sField = "[]"; ';
$sOptions .= ' var aFieldCurrent = {};';
$sOptions .= ' aFieldCurrent[\'' . $this->name . '\'] = obj.id;';
$sOptions .= ' var sFieldCurrent = "["+ encodeURIComponent(aFieldCurrent.toJSONString()) + "]"; ';
if ($count > 0) {
for ($cnt = 0; $cnt < $count; $cnt ++) {
if ( $this->name == $aDepFields[$cnt] ) {
$sOptions .= ' jField[\'' . $aDepFields[$cnt] . '\'] = obj.id;';
} else {
$sOptions .= ' jField[\'' . $aDepFields[$cnt] . '\'] = getField(\'' . $rowIdField . '[' . $aDepFields[$cnt] . '\').value; ';
}
}
}
$sOptions .= ' var sField = "["+ encodeURIComponent(jField.toJSONString()) + "]"; ';
$sOptions .= $sCallBack . '; getField("' . $rowIdField . '[' . $this->name . '").value = obj.id;';
$sOwnerId = (isset($owner->owner->id))? $owner->owner->id : $owner->id;
$sOptions .= 'var indexField = "' . $rowIdField . '[' . $this->name . '";';
$sOptions .= 'indexField = indexField.match(/\[[0-9]+\]/g); ';
$sOptions .= 'indexFieldVal = indexField[0].replace(/\[|\]/g,""); ';
$sOptions .= 'var response = ajax_function("../gulliver/defaultAjaxDynaform", "reloadField", ';
$sOptions .= ' "form=' . $sOwnerId . '&fields=" + sField + "&grid=' . $ownerName . '&row=" + indexFieldVal + "&aFieldCurrent=" + sFieldCurrent, "POST" ); ';
$sOptions .= 'var gridField = gridGetAllFieldAndValue("' . $ownerName . '][" + indexFieldVal + "][' . $this->name . '", 0); '; //Not get current field
$sOptions .= 'var response = ajax_function("../gulliver/defaultAjaxDynaform", "reloadField", "form=' . $sOwnerId . '&fields=" + sFieldCurrent + "&grid=' . $ownerName . '" + ((gridField != "")? "&gridField=" + encodeURIComponent("{" + gridField + "}") : "") + "&row=" + indexFieldVal, "POST"); ';
$sOptions .= '';
$sOptions .= 'if (response.substr(0,1) === \'[\') { ';
$sOptions .= ' var newcont; ';
$sOptions .= ' eval(\'newcont=\' + response + \';\'); ';
$sOptions .= '';
$sOptions .= ' for(var i = 0; i<newcont.length; i++) { ';
// $sOptions .= ' var depField = getField(\'' . $rowIdField . '[\' + ' . 'newcont[i].name); ';
$sOptions .= ' var depField = \'' . $rowIdField . '[\' + ' . 'newcont[i].name; ';
$sOptions .= ' getField(depField).value = newcont[i].value; ';
$sOptions .= ' if (newcont[i].content.type == \'dropdown\') { ';
$sOptions .= '
switch (newcont[i].content.type) {
case "dropdown":
getField(depField).options.length = 0;
$sOptions .= ' fieldLength = getField(depField).options.length; ';
for (ni = 0; ni < newcont[i].content.options.length; ni++ ){
getField(depField).options[ni] = new Option(newcont[i].content.options[ni].value, newcont[i].content.options[ni].key);
}
$sOptions .= ' for (ni = 0; ni < fieldLength; ni++ ){ ';
$sOptions .= ' getField(depField).options.remove(ni); ';
$sOptions .= ' } ';
$sOptions .= ' getField(depField).length = 0; ';
$sOptions .= ' for (ni = 0; ni < newcont[i].content.options.length; ni++ ){ ';
$sOptions .= ' var opt = document.createElement("OPTION"); ';
$sOptions .= ' opt.value = newcont[i].content.options[ni].key; ';
$sOptions .= ' opt.text = newcont[i].content.options[ni].value; ';
$sOptions .= ' getField(depField).options.add(opt); ';
$sOptions .= ' } ';
$sOptions .= ' } ';
if (getField(depField).options.length == 0) {
getField(depField).options[0] = new Option("", "");
}
break;
case "text":
getField(depField).value = "";
if (newcont[i].content.options) {
if (newcont[i].content.options[0]) {
getField(depField).value = newcont[i].content.options[0].value;
}
}
break;
}
';
$sOptions .= ' } ';
$sOptions .= '} else { ';
$sOptions .= ' alert(\'Invalid response: \' + response); ';
@@ -3453,9 +3429,12 @@ class XmlForm_Field_Dropdown extends XmlForm_Field
$html .= $rowId == '' ? $this->NSFieldType() : $this->NSGridType() . ' ';
$html .= $this->NSDependentFields( true ) . ' ';
$html .= '>';
$findValue = '';
$firstValue = '';
$cont = 0;
$swOption = 0;
foreach ($this->option as $optValue => $optName) {
settype( $optValue, 'string' );
$html .= '<option value="' . $optValue . '" ' . (($optValue === $value) ? 'selected="selected"' : '') . '>' . $optName . '</option>';
@@ -3466,8 +3445,11 @@ class XmlForm_Field_Dropdown extends XmlForm_Field
if ($firstValue == '') {
$firstValue = $optValue;
}
$cont ++;
$cont = $cont + 1;
$swOption = 1;
}
foreach ($this->sqlOption as $optValue => $optName) {
settype( $optValue, 'string' );
$html .= '<option value="' . $optValue . '" ' . (($optValue === $value) ? 'selected="selected"' : '') . '>' . $optName . '</option>';
@@ -3478,7 +3460,14 @@ class XmlForm_Field_Dropdown extends XmlForm_Field
if ($firstValue == '') {
$firstValue = $optValue;
}
$swOption = 1;
}
if ($swOption == 0) {
$html = $html . "<option value=\"\"></option>";
}
$html .= '</select>';
if ($readOnlyField != '') {
$html .= '<input type="hidden" ';
@@ -4006,10 +3995,12 @@ class XmlForm_Field_Grid extends XmlForm_Field
$using_template = 'grid_view';
}
$tpl = new xmlformTemplate( $this, PATH_CORE . "templates/{$using_template}.html" );
$tpl = new xmlformTemplate($this, PATH_CORE . "templates" . PATH_SEP . "$using_template.html");
if (! isset( $values ) || ! is_array( $values ) || sizeof( $values ) == 0) {
$values = array_keys( $this->fields );
}
if ($therow != - 1) {
//Check if values arrary is complete to can flip.
$xValues = array ();
@@ -4033,12 +4024,18 @@ class XmlForm_Field_Grid extends XmlForm_Field
}
$values = $xValues;
}
$aValuekeys = array_keys( $values );
if (count( $aValuekeys ) > 0 && (int) $aValuekeys[0] == 1) {
$values = $this->flipValues( $values );
}
//if ($therow == 1)g::pr($values);
$this->rows = count( reset( $values ) );
//Fields Grid only required fields of the grid, no all fields of dynaform main
/*
if (isset( $owner->values )) {
foreach ($owner->values as $key => $value) {
if (! isset( $values[$key] )) {
@@ -4049,6 +4046,8 @@ class XmlForm_Field_Grid extends XmlForm_Field
}
}
}
*/
foreach ($this->fields as $k => $v) {
if (isset( $values['SYS_GRID_AGGREGATE_' . $this->name . '_' . $k] )) {
$this->fields[$k]->aggregate = $values['SYS_GRID_AGGREGATE_' . $this->name . '_' . $k];
@@ -5470,19 +5469,25 @@ class xmlformTemplate extends Smarty
public function getFields (&$form, $therow = -1)
{
$result = array ();
foreach ($form->fields as $k => $v) {
$field = $v;
if ($form->mode != '') {
#@ last modification: erik
$v->mode = $form->mode; #@
$field->mode = $form->mode; #@
} #@
//if (isset($form->fields[$k]->sql)) $form->fields[$k]->executeSQL( $form );
$value = (isset( $form->values[$k] )) ? $form->values[$k] : null;
$result[$k] = G::replaceDataField( $form->fields[$k]->label, $form->values );
if ($form->type == 'xmlform') {
if (in_array($v->type, array('text', 'currency', 'percentage', 'password', 'suggest', 'textarea', 'dropdown', 'yesno', 'listbox', 'checkbox', 'date', 'link', 'file'))) {
if (in_array($field->type, array("text", "currency", "percentage", "password", "suggest", "textarea", "dropdown", "yesno", "listbox", "checkbox", "date", "link", "file"))) {
$result[$k] = '<label for="form[' . $k . ']">' . $result[$k] . '</label>';
}
}
if (! is_array( $value )) {
if ($form->type == 'grid') {
$aAux = array ();
@@ -5496,7 +5501,7 @@ class xmlformTemplate extends Smarty
}
}
switch ($v->type) {
switch ($field->type) {
case "link":
$result["form"][$k] = $form->fields[$k]->renderGrid($aAux, array(), $form);
break;
@@ -5505,7 +5510,7 @@ class xmlformTemplate extends Smarty
break;
}
} else {
switch ($v->type) {
switch ($field->type) {
case "link":
$result["form"][$k] = $form->fields[$k]->render(
$value,
@@ -5530,10 +5535,10 @@ class xmlformTemplate extends Smarty
}
}*/
if ($v->type == "grid") {
if ($field->type == "grid") {
$result["form"][$k] = $form->fields[$k]->renderGrid( $value, $form, $therow );
} else {
switch ($v->type) {
switch ($field->type) {
case "dropdown":
$result["form"][$k] = $form->fields[$k]->renderGrid( $value, $form, false, $therow );
break;
@@ -5554,11 +5559,13 @@ class xmlformTemplate extends Smarty
}
}
}
foreach ($form as $name => $value) {
if ($name !== 'fields') {
$result['form_' . $name] = $value;
}
}
return $result;
}