From f871d9fded148c9553fbd67a2c2788abe263ac7c Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Fri, 18 Jan 2013 19:12:32 -0400 Subject: [PATCH] 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 --- gulliver/js/form/core/form.js | 67 +++++++++++++-- gulliver/js/grid/core/grid.js | 43 ++++++---- gulliver/js/maborak/core/maborak.js | 17 ++-- gulliver/methods/defaultAjax.php | 79 +++++++++++++++--- gulliver/system/class.xmlform.php | 121 +++++++++++++++------------- 5 files changed, 226 insertions(+), 101 deletions(-) diff --git a/gulliver/js/form/core/form.js b/gulliver/js/form/core/form.js index a755f15ae..7271c3a25 100755 --- a/gulliver/js/form/core/form.js +++ b/gulliver/js/form/core/form.js @@ -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:'') + 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; + //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 1) { @@ -1192,17 +1201,17 @@ var G_Grid = function(oForm, sGridName){ else maskToPut=0; } - + // clean the field and load mask execute event keypress document.getElementById(aAux[0]+']['+ aAux[1] + '][' + oField.sFieldName + ']').value = ''; this.executeEvent(document.getElementById(aAux[0]+']['+ aAux[1] + '][' + oField.sFieldName + ']'), 'keypress'); // execute formula and set decimal eval("document.getElementById('" + aAux[0] + '][' + aAux[1] + '][' + oField.sFieldName + "]').value = (" + sAux + ').toFixed('+maskToPut+');'); - + // trim value document.getElementById(aAux[0] + '][' + aAux[1] + '][' + oField.sFieldName + ']').value = document.getElementById(aAux[0] + '][' + aAux[1] + '][' + oField.sFieldName + ']').value.replace(/^\s*|\s*$/g,""); - + // set '' to field if response is NaN if (document.getElementById(aAux[0] + '][' + aAux[1] + '][' + oField.sFieldName + ']').value =='NaN') document.getElementById(aAux[0] + '][' + aAux[1] + '][' + oField.sFieldName + ']').value = ''; diff --git a/gulliver/js/maborak/core/maborak.js b/gulliver/js/maborak/core/maborak.js index 9bb5c45f8..d1bf8f64b 100644 --- a/gulliver/js/maborak/core/maborak.js +++ b/gulliver/js/maborak/core/maborak.js @@ -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=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-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-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;i0)?"&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;i1)dd.remove(0);}else{for(var key in dd.options){dd.options[key]=null;}} -for(var o=0;oid = 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) { @@ -157,18 +194,20 @@ foreach ($dependentFields as $d) { break; case 'options': if ($sendContent[$r]->content->type != 'text') { - $sendContent[$r]->content->{$attribute} = toJSArray( $value ); + $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; } + diff --git a/gulliver/system/class.xmlform.php b/gulliver/system/class.xmlform.php index 1fb950f39..9e56705df 100755 --- a/gulliver/system/class.xmlform.php +++ b/gulliver/system/class.xmlform.php @@ -1,5 +1,4 @@ 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; iNSFieldType() : $this->NSGridType() . ' '; $html .= $this->NSDependentFields( true ) . ' '; $html .= '>'; + $findValue = ''; $firstValue = ''; $cont = 0; + $swOption = 0; + foreach ($this->option as $optValue => $optName) { settype( $optValue, 'string' ); $html .= ''; @@ -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 .= ''; @@ -3478,7 +3460,14 @@ class XmlForm_Field_Dropdown extends XmlForm_Field if ($firstValue == '') { $firstValue = $optValue; } + + $swOption = 1; } + + if ($swOption == 0) { + $html = $html . ""; + } + $html .= ''; if ($readOnlyField != '') { $html .= '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] = ''; } } + 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; }