diff --git a/workflow/engine/methods/cases/proxyPMTablesFieldList.php b/workflow/engine/methods/cases/proxyPMTablesFieldList.php index 75f6a25fc..a275ed7cf 100644 --- a/workflow/engine/methods/cases/proxyPMTablesFieldList.php +++ b/workflow/engine/methods/cases/proxyPMTablesFieldList.php @@ -462,30 +462,56 @@ function setCasesListFields($arrayCasesListField, $arrayField) return $arrayFieldResult; } +/** + * Get the Custom Case List configuration data. + * + * @global string $action + * @global array $confCasesList + * @global string $tabUid + */ function fieldSet() { - global $conf; - global $confCasesList; global $action; + global $confCasesList; + global $tabUid; - if (is_array($confCasesList)) { - $validConfig = isset($confCasesList["first"]) && isset($confCasesList["second"]); + $confCasesList = (array) $confCasesList; + + $result = []; + $sw1 = !empty($confCasesList); + $sw2 = $tabUid === "" || (!empty($tabUid) && !empty($confCasesList['PMTable']) && $confCasesList['PMTable'] === $tabUid); + + if ($sw1 && $sw2) { + $result = $confCasesList; + //remove used elements + $data = $result['second']['data']; + $fields = getFieldsByTabUid($result['PMTable']); + foreach ($data as $value1) { + foreach ($fields as $key => $value2) { + $swName = $value1['name'] === $value2['name']; + $swFieldType = $value1['fieldType'] === $value2['fieldType']; + if ($swName && $swFieldType) { + unset($fields[$key]); + break; + } + } + } + $result['first']['data'] = array_values($fields); } else { - $validConfig = false; - } - - if (!$validConfig) { - $arrayField = getDefaultFields($action, 0); + $fields = getFieldsByTabUid($tabUid); + $arrayField = getDefaultFields($action, 0); $arrayConfig = getDefaultConfig($action, 0); - - $result = genericJsonResponse("", array(), $arrayField, $arrayConfig["rowsperpage"], $arrayConfig["dateformat"]); - - $conf->saveObject($result, "casesList", $action, "", "", ""); - - echo G::json_encode($result); - } else { - echo G::json_encode($confCasesList); + $generic = genericJsonResponse($tabUid, [], $arrayField, $arrayConfig["rowsperpage"], $arrayConfig["dateformat"]); + $result = $generic; + $result['first']['data'] = $fields; } + + if (is_array($result) && isset($result['second']['data'])) { + foreach ($result['second']['data'] as $key => $value) { + $result['second']['data'][$key]['align_label'] = $result['second']['data'][$key]['align']; + } + } + echo G::json_encode($result); } function fieldReset($translation) @@ -690,11 +716,6 @@ try { switch ($xaction) { case "FIELD_SET": - if (is_array($confCasesList) && isset($confCasesList['second']['data'])) { - foreach ($confCasesList['second']['data'] as $key => $value) { - $confCasesList['second']['data'][$key]['align_label'] = $confCasesList['second']['data'][$key]['align']; - } - } fieldSet(); break; case "FIELD_RESET": @@ -744,44 +765,53 @@ function genericJsonResponse($pmtable, $first, $second, $rowsperpage, $dateForma return $result; } +/** + * Get row from PM Table. + * + * @param string $tabUid + */ function xgetFieldsFromPMTable($tabUid) { - $rows = array(); - $result = array(); - // $rows[] = array ( 'name' => 'val 1', 'gridIndex' => '21', 'fieldType' => 'PM Table' ); - // $rows[] = array ( 'name' => 'val 2', 'gridIndex' => '22', 'fieldType' => 'PM Table' ); - // $rows[] = array ( 'name' => 'val 3', 'gridIndex' => '23', 'fieldType' => 'PM Table' ); - //$result['success'] = true; - //$result['totalCount'] = count($rows); - $oCriteria = new Criteria('workflow'); - $oCriteria->clearSelectColumns ( ); - $oCriteria->setDistinct(); - $oCriteria->addSelectColumn ( FieldsPeer::FLD_NAME ); - $oCriteria->addSelectColumn ( FieldsPeer::FLD_UID ); - $oCriteria->addSelectColumn ( FieldsPeer::FLD_INDEX ); - $oCriteria->add (FieldsPeer::ADD_TAB_UID, $tabUid , CRITERIA::EQUAL ); - $oCriteria->add (FieldsPeer::FLD_NAME, 'APP_UID' , CRITERIA::NOT_EQUAL ); - $oCriteria->addAnd (FieldsPeer::FLD_NAME, 'APP_NUMBER' , CRITERIA::NOT_EQUAL ); - $oCriteria->addDescendingOrderByColumn('FLD_INDEX'); - $oDataset = FieldsPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - $index = count($rows); - - while ($aRow = $oDataset->getRow()) { - $aRow['index'] = ++$index; - $aTempRow['name'] = $aRow['FLD_NAME']; - $aTempRow['gridIndex'] = $aRow['index']; - $aTempRow['fieldType'] = 'PM Table'; - $rows[] = $aTempRow; - $oDataset->next(); - } - - $result['data'] = $rows; - print G::json_encode( $result ) ; + $result = []; + $result['data'] = getFieldsByTabUid($tabUid); + print G::json_encode($result); } - /** +/** + * Get rows from Fields table. + * + * @param string $tabUid + * @return array + */ +function getFieldsByTabUid($tabUid) +{ + $rows = []; + $criteria = new Criteria('workflow'); + $criteria->clearSelectColumns(); + $criteria->setDistinct(); + $criteria->addSelectColumn(FieldsPeer::FLD_NAME); + $criteria->addSelectColumn(FieldsPeer::FLD_UID); + $criteria->addSelectColumn(FieldsPeer::FLD_INDEX); + $criteria->add(FieldsPeer::ADD_TAB_UID, $tabUid, CRITERIA::EQUAL); + $criteria->add(FieldsPeer::FLD_NAME, 'APP_UID', CRITERIA::NOT_EQUAL); + $criteria->addAnd(FieldsPeer::FLD_NAME, 'APP_NUMBER', CRITERIA::NOT_EQUAL); + $criteria->addDescendingOrderByColumn('FLD_INDEX'); + $dataSet = FieldsPeer::doSelectRS($criteria); + $dataSet->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $dataSet->next(); + $index = 0; + while ($row = $dataSet->getRow()) { + $row['index'] = ++$index; + $tempRow['name'] = $row['FLD_NAME']; + $tempRow['gridIndex'] = $row['index']; + $tempRow['fieldType'] = 'PM Table'; + $rows[] = $tempRow; + $dataSet->next(); + } + return $rows; +} + +/** * * @param Array $fields * @return Array diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php b/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php index 387257903..a6fb1b7e3 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php @@ -4,6 +4,7 @@ namespace ProcessMaker\BusinessModel; use AdditionalTables; use AdditionalTablesPeer; +use Configurations; use G; use Exception; @@ -578,11 +579,60 @@ class ReportTable $result->trace = $e->getTraceAsString(); } - + $this->updateCaseListFieldsConfiguration($columns); //Return return $result; } + /** + * Update the Custom Case List fields configuration. + * + * @param array $columns + */ + public function updateCaseListFieldsConfiguration($columns) + { + $actions = [ + "todo", "draft", "sent", "unassigned", "paused", "completed", "cancelled" + ]; + $conf = new Configurations(); + foreach ($actions as $action) { + $confCasesList = $conf->loadObject("casesList", $action, "", "", ""); + if (is_array($confCasesList) && !empty($confCasesList)) { + $this->removeNonExistentElementsCustomCaseList($confCasesList['first']['data'], $columns); + $this->removeNonExistentElementsCustomCaseList($confCasesList['second']['data'], $columns); + $conf->saveObject($confCasesList, "casesList", $action); + } + } + } + + /** + * Remove non existent elements in Custom Case List. + * + * @param array $data + * @param array $columns + */ + public function removeNonExistentElementsCustomCaseList(&$data, $columns) + { + $n = count($data); + for ($key = 0; $key < $n; $key++) { + if ($data[$key]['fieldType'] === 'PM Table') { + $remove = true; + foreach ($columns as $column) { + if ($data[$key]['name'] === $column->field_name) { + $remove = false; + break; + } + } + if ($remove === true) { + unset($data[$key]); + $data = array_values($data); + $key = 0; + $n = count($data); + } + } + } + } + /** * Create the structure of tables * diff --git a/workflow/engine/templates/cases/casesListSetup.js b/workflow/engine/templates/cases/casesListSetup.js index e90854240..b53092588 100644 --- a/workflow/engine/templates/cases/casesListSetup.js +++ b/workflow/engine/templates/cases/casesListSetup.js @@ -64,7 +64,7 @@ Ext.onReady(function () { success: function (response, opts) { - var dataResponse = eval("(" + response.responseText + ")"); //json + var dataResponse = Ext.util.JSON.decode(response.responseText); switch (option) { case "FIELD_SET": @@ -85,8 +85,11 @@ Ext.onReady(function () { break; case "FIELD_SAVE": configDefaultResponseText = response.responseText; - Ext.Msg.alert(_("ID_INFO"), _("ID_SAVED")); - location.reload(true); + var windowAlert = Ext.Msg.alert(_("ID_INFO"), _("ID_SAVED")); + fieldSet(dataResponse); + setTimeout(function () { + windowAlert.getDialog().close(); + }, 500); break; } }, @@ -166,59 +169,34 @@ Ext.onReady(function () { }} }); - // create the Data Store to list PMTables in the dropdown - var pmTablesDropdown = new Ext.form.ComboBox ({ - width : '180', - xtype : 'combo', - emptyText: _("ID_EMPTY_PMTABLE"), - displayField : 'ADD_TAB_NAME', - valueField : 'ADD_TAB_UID', - triggerAction: 'all', - store : PmTableStore, - listeners: { - 'select': function() { - var tableUid = this.value; - Ext.Ajax.request({ - url: 'proxyPMTablesFieldList', - success: function(response) { - var dataResponse = Ext.util.JSON.decode(response.responseText); - var rec = Ext.data.Record.create(pmFields); - //alert(firstGrid.store); - var index; - var record; - var count = firstGrid.store.getTotalCount(); - - // removing all the PM Table fields from the first grid - do { - index = firstGrid.store.find('fieldType','PM Table'); - record = firstGrid.store.getAt(index); - if (index>=0) { - firstGrid.store.remove(record); - } - } while (index>=0); - - // removing all the PM Table fields from the second grid - do { - index = secondGrid.store.find('fieldType','PM Table'); - record = secondGrid.store.getAt(index); - if (index>=0) { - secondGrid.store.remove(record); - } - } while (index>=0); - - for (var i = 0; i <= dataResponse.data.length-1; i++) { - var d = new rec( dataResponse.data[i] ); - firstGrid.store.add(d); + // create the Data Store to list PMTables in the dropdown + var pmTablesDropdown = new Ext.form.ComboBox({ + width: '180', + xtype: 'combo', + emptyText: _("ID_EMPTY_PMTABLE"), + displayField: 'ADD_TAB_NAME', + valueField: 'ADD_TAB_UID', + triggerAction: 'all', + store: PmTableStore, + listeners: { + 'select': function () { + var tableUid = this.value; + Ext.Ajax.request({ + url: 'proxyPMTablesFieldList', + params: { + xaction: 'FIELD_SET', + action: currentAction, + table: tableUid + }, + success: function (response) { + var dataResponse = Ext.util.JSON.decode(response.responseText); + fieldSet(dataResponse); + }, + failure: function () {} + }); } - firstGrid.store.commitChanges(); - }, - failure: function(){}, - params: {xaction: 'getFieldsFromPMTable', table: tableUid } - }); - - } - } - }); + } + }); // COMPONENT DEPRECATED remove it in the next revision of the enterprise plugin // create the Dropdown for rows per page @@ -573,7 +551,7 @@ Ext.onReady(function () { text: _("ID_RESET"), handler: function () { - var dataResponse = eval("(" + configDefaultResponseText + ")"); //json + var dataResponse = Ext.util.JSON.decode(configDefaultResponseText); fieldSet(dataResponse); }