From bd638dde23137afc9493efb5d4f7979eb0e6e3b2 Mon Sep 17 00:00:00 2001 From: "marcelo.cuiza" Date: Thu, 16 Apr 2015 14:54:27 -0400 Subject: [PATCH 01/19] PM-2314,PM-2331 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PM-2314,En ADMIN > Plugins > Enterprise features el status del actionByEmail y el pmConsolidatedCL es "Install now" y este deberíestar como Installed y estas opciones ya deberí estar instaladas PM-2331,Admin/Plugins/Enterprise Features -> Eliminar columna de status en listado de features Dentro el tab "Enterprise features" se quito la columna status (PM-2331), Se agregaran los new features al ejecutar en consola ./processmaker databa-upgrade(PM-2314), --- .../engine/classes/class.licensedFeatures.php | 179 ++++++++++++++++++ workflow/engine/classes/class.wsTools.php | 4 + .../templates/enterprise/addonsStore.js | 48 ----- 3 files changed, 183 insertions(+), 48 deletions(-) diff --git a/workflow/engine/classes/class.licensedFeatures.php b/workflow/engine/classes/class.licensedFeatures.php index f2aef8649..16982bb7a 100644 --- a/workflow/engine/classes/class.licensedFeatures.php +++ b/workflow/engine/classes/class.licensedFeatures.php @@ -27,6 +27,59 @@ class PMLicensedFeatures { private $featuresDetails = array (); private $features = array (); + private $newFeatures = array( + 0 => array( + "description" => "Enables de Actions By Email feature", + "enabled" => false, + "id" => "actionsByEmail", + "latest_version" => "", + "log" => null, + "name" => "actionsByEmail", + "nick" => "actionsByEmail", + "progress" => 0, + "publisher" => "Colosa", + "release_type" => "localRegistry", + "status" => "ready", + "store" => "00000000000000000000000000010004", + "type" => "features", + "url" => "", + "version" => "" + ), + 1 => array( + "description" => "Enables de Batch Routing feature", + "enabled" => false, + "id" => "pmConsolidatedCL", + "latest_version" => "", + "log" => null, + "name" => "pmConsolidatedCL", + "nick" => "pmConsolidatedCL", + "progress" => 0, + "publisher" => "Colosa", + "release_type" => "localRegistry", + "status" => "ready", + "store" => "00000000000000000000000000010005", + "type" => "features", + "url" => "", + "version" => "" + ), + 2 => array( + "description" => "Dashboard with improved charting graphics and optimized to show strategic information like Process Efficiency and User Efficiency indicators.", + "enabled" => false, + "id" => "strategicDashboards", + "latest_version" => "", + "log" => null, + "name" => "strategicDashboards", + "nick" => "Strategic Dashboards", + "progress" => 0, + "publisher" => "Colosa", + "release_type" => "localRegistry", + "status" => "ready", + "store" => "00000000000000000000000000010006", + "type" => "features", + "url" => "", + "version" => "" + ) + ); private static $instancefeature = null; @@ -87,6 +140,132 @@ class PMLicensedFeatures $this->featuresDetails[$value[0]]->enabled = $enable; return $enable; } + + public function addNewFeatures ($data) + { + $newFeaturesList = $this->newFeatures; + $newData = array(); + $newFeaturesIds = array(); + foreach($newFeaturesList as $val) { + $newFeaturesIds[] = $val['id']; + } + $criteria = new Criteria(); + $criteria->addSelectColumn(AddonsManagerPeer::ADDON_ID); + $criteria->add(AddonsManagerPeer::ADDON_ID, $newFeaturesIds, Criteria::IN); + $criteria->add(AddonsManagerPeer::ADDON_TYPE, 'features'); + $rs = AddonsManagerPeer::doSelectRS($criteria); + $rs->next(); + $row = $rs->getRow(); + if(sizeof($row)) { + while (is_array($row)) { + $ids[] = $row[0]; + $rs->next(); + $row = $rs->getRow(); + } + $toUpdate = array_diff($newFeaturesIds,$ids); + + if(sizeof($toUpdate)){ + $newFeaturesListAux = array(); + foreach($toUpdate as $index => $v) { + $newFeaturesListAux[] = $newFeaturesList[$index]; + } + unset($newFeaturesList); + $newFeaturesList = array_values($newFeaturesListAux); + } else { + return $data; + } + } + + foreach($newFeaturesList as $k => $newFeature){ + $newData[] = array ( + 'db' => 'wf', + 'table' => 'ADDONS_MANAGER', + 'keys' => + array ( + 0 => 'ADDON_ID', + ), + 'data' => + array ( + 0 => + array ( + 'field' => 'ADDON_DESCRIPTION', + 'type' => 'text', + 'value' => $newFeature['description'], + ), + 1 => + array ( + 'field' => 'ADDON_ID', + 'type' => 'text', + 'value' => $newFeature['id'], + ), + 2 => + array ( + 'field' => 'ADDON_NAME', + 'type' => 'text', + 'value' => $newFeature['name'], + ), + 3 => + array ( + 'field' => 'ADDON_NICK', + 'type' => 'text', + 'value' => $newFeature['nick'], + ), + 4 => + array ( + 'field' => 'ADDON_PUBLISHER', + 'type' => 'text', + 'value' => $newFeature['publisher'], + ), + 5 => + array ( + 'field' => 'ADDON_RELEASE_TYPE', + 'type' => 'text', + 'value' => $newFeature['release_type'], + ), + 6 => + array ( + 'field' => 'ADDON_STATUS', + 'type' => 'text', + 'value' => $newFeature['status'], + ), + 7 => + array ( + 'field' => 'STORE_ID', + 'type' => 'text', + 'value' => $newFeature['store'], + ), + 8 => + array ( + 'field' => 'ADDON_TYPE', + 'type' => 'text', + 'value' => $newFeature['type'], + ), + 9 => + array ( + 'field' => 'ADDON_DOWNLOAD_URL', + 'type' => 'text', + 'value' => $newFeature['url'], + ), + 10 => + array ( + 'field' => 'ADDON_VERSION', + 'type' => 'text', + 'value' => $newFeature['version'], + ), + 11 => + array ( + 'field' => 'ADDON_DOWNLOAD_PROGRESS', + 'type' => 'text', + 'value' => $newFeature['progress'], + ) + ), + 'action' => 1, + ); + + $i++; + } + return array_merge($data, $newData); + } /*----------------------------------********---------------------------------*/ } diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index 828c01560..e801bb228 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -912,6 +912,10 @@ class workspaceTools if (file_exists(PATH_CORE . 'data' . PATH_SEP . 'check.data')) { $checkData = unserialize(file_get_contents(PATH_CORE . 'data' . PATH_SEP . 'check.data')); if (is_array($checkData)) { + /*----------------------------------********---------------------------------*/ + $licensedFeatures = & PMLicensedFeatures::getSingleton(); + $checkData = $licensedFeatures->addNewFeatures($checkData); + /*----------------------------------********---------------------------------*/ foreach ($checkData as $checkThis) { $this->updateThisRegistry($checkThis); } diff --git a/workflow/engine/templates/enterprise/addonsStore.js b/workflow/engine/templates/enterprise/addonsStore.js index 5a265e9df..898899bb1 100644 --- a/workflow/engine/templates/enterprise/addonsStore.js +++ b/workflow/engine/templates/enterprise/addonsStore.js @@ -1443,54 +1443,6 @@ Ext.onReady(function() { } return ''; } - }, - { - id : "status-feature", - header : _('ID_STATUS'), - width : 60, - sortable : false, - hideable : false, - dataIndex: "status", - renderer: function (val) { - var str = ""; - var text = ""; - - switch (val) { - case "available": text = _('ID_BUY_NOW'); break; - case "installed": text = _('ID_INSTALLED'); break; - case "ready": text = _('ID_INSTALL_NOW'); break; - case "upgrade": text = _('ID_UPGRADE_NOW'); break; - case "download": text = _('ID_CANCEL'); break; - case "install": text = _('ID_INSTALLING'); break; - case "cancel": text = _('ID_CANCELLING'); break; - case "disabled": text = _('ID_DISABLED'); break; - case "download-start": text = ""; break; - default: text = val; break; - } - - switch (val) { - case "available": - case "ready": - case "upgrade": - case "download": - case "install": - case "cancel": - case "download-start": - str = "
" + text + "
"; - break; - - case "installed": - case "disabled": - str = "
" + text + "
"; - break; - - default: - str = "
" + text + "
"; - break; - } - - return (str); - } } ] }); From ff86ff1743c20e15a5633c51df702adf39a670be Mon Sep 17 00:00:00 2001 From: "marcelo.cuiza" Date: Thu, 16 Apr 2015 16:33:15 -0400 Subject: [PATCH 02/19] PM-2314,PM-2331 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PM-2314,En ADMIN > Plugins > Enterprise features el status del actionByEmail y el pmConsolidatedCL es "Install now" y este deberíestar como Installed y estas opciones ya deberí estar instaladas PM-2331,Admin/Plugins/Enterprise Features -> Eliminar columna de status en listado de features Dentro el tab "Enterprise features" se quito la columna status (PM-2331), Se agregaran los new features al ejecutar en consola ./processmaker databa-upgrade(PM-2314), --- .../engine/classes/class.licensedFeatures.php | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/workflow/engine/classes/class.licensedFeatures.php b/workflow/engine/classes/class.licensedFeatures.php index 16982bb7a..813d49d7e 100644 --- a/workflow/engine/classes/class.licensedFeatures.php +++ b/workflow/engine/classes/class.licensedFeatures.php @@ -78,6 +78,74 @@ class PMLicensedFeatures "type" => "features", "url" => "", "version" => "" + ), + 3 => array( + "description" => "Enables the configuration of a second database connection in order to divide the database requests in read and write operations. This features is used with database clusters to improve the application performance.", + "enabled" => false, + "id" => "secondDatabaseConnection", + "latest_version" => "", + "log" => null, + "name" => "secondDatabaseConnection", + "nick" => "secondDatabaseConnection", + "progress" => 0, + "publisher" => "Colosa", + "release_type" => "localRegistry", + "status" => "ready", + "store" => "00000000000000000000000000010000", + "type" => "features", + "url" => "", + "version" => "" + ), + 4 => array( + "description" => "Registers every admin action in a log. The actions in administration settings options are registered in the log.", + "enabled" => false, + "id" => "auditLog", + "latest_version" => "", + "log" => null, + "name" => "auditLog", + "nick" => "auditLog", + "progress" => 0, + "publisher" => "Colosa", + "release_type" => "localRegistry", + "status" => "ready", + "store" => "00000000000000000000000000010001", + "type" => "features", + "url" => "", + "version" => "" + ), + 5 => array( + "description" => "A more secure option to store user passwords in ProcessMaker. The modern algorithm SHA-2 is used to store the passwords.", + "enabled" => false, + "id" => "secureUserPasswordHash", + "latest_version" => "", + "log" => null, + "name" => "secureUserPasswordHash", + "nick" => "secureUserPasswordHash", + "progress" => 0, + "publisher" => "Colosa", + "release_type" => "localRegistry", + "status" => "ready", + "store" => "00000000000000000000000000010002", + "type" => "features", + "url" => "", + "version" => "" + ), + 6 => array( + "description" => "This functionality enables the flexibility to send mails from different email servers or configurations.", + "enabled" => false, + "id" => "sendEmailFromDifferentEmailServers", + "latest_version" => "", + "log" => null, + "name" => "sendEmailFromDifferentEmailServers", + "nick" => "sendEmailFromDifferentEmailServers", + "progress" => 0, + "publisher" => "Colosa", + "release_type" => "localRegistry", + "status" => "ready", + "store" => "00000000000000000000000000010003", + "type" => "features", + "url" => "", + "version" => "" ) ); From 8c0cfe3ed91c0285cfa2a5086a39a5633c824d04 Mon Sep 17 00:00:00 2001 From: jonathan Date: Fri, 17 Apr 2015 12:37:34 -0400 Subject: [PATCH 03/19] update change login --- .../skinEngine/neoclassic/css/loginStyle.css | 58 ++++++++++++++---- .../engine/skinEngine/neoclassic/layout.html | 15 +++-- workflow/engine/skinEngine/skinEngine.php | 14 ++--- .../xmlform/login/forgotPasswordpm3.xml | 4 +- workflow/engine/xmlform/login/loginpm3.xml | 3 +- .../engine/xmlform/login/sysLoginNoWSpm3.xml | 3 +- workflow/public_html/fonts/Chivo-Regular.ttf | Bin 0 -> 50844 bytes 7 files changed, 70 insertions(+), 27 deletions(-) create mode 100644 workflow/public_html/fonts/Chivo-Regular.ttf diff --git a/workflow/engine/skinEngine/neoclassic/css/loginStyle.css b/workflow/engine/skinEngine/neoclassic/css/loginStyle.css index bcf5c1cb2..a2f350014 100644 --- a/workflow/engine/skinEngine/neoclassic/css/loginStyle.css +++ b/workflow/engine/skinEngine/neoclassic/css/loginStyle.css @@ -1,9 +1,18 @@ /* * LOGIN PM3 STYLES */ + +@font-face { + font-family: "Chivo"; + font-style: normal; + font-weight: normal; + src: local("?"), url("/fonts/Chivo-Regular.ttf") format("truetype"); + } body.login { background: url("/images/backgroundpm3.jpg") repeat scroll 0 0 / cover rgba(0, 0, 0, 0); - //background-position-y: -30px; + //background-position-y: -30px; + font-family: "Chivo",sans-serif; + height: 100%; } .vertical-offset-100 { @@ -48,7 +57,8 @@ img.img-responsive { .module_app_input___gray { - background-color: #fff; + font-family: "Chivo",sans-serif; + background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; @@ -71,9 +81,11 @@ img.img-responsive { color: #555; display: block; font-size: 14px; - height: 45px; + //height: 45px; + box-sizing: border-box; + //padding-top: 12px; line-height: 1.42857; - padding: 9px 12px; + //padding: 9px 12px; transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; width: 100%; } @@ -82,6 +94,7 @@ img.img-responsive { box-sizing: border-box; color: #444; font-family: "Open Sans",Arial,Helvetica,sans-serif; + //font-family: "Chivo",sans-serif; font-size: 16px; height: 45px; padding: 10px; @@ -159,7 +172,7 @@ p { font-weight: 700; //transition: all 0.3s ease-in-out 0s; max-width: 400px; - filter:none; + filter:none; } .button-login-success:hover{ @@ -211,13 +224,10 @@ p { font-size: 11px; } -.footer-login .content{ +.footer-login span{ color: white; font-weight: 900; -} - -.footer-login{ - text-align: center; + font-size: 12px; } .login_result span{ @@ -227,6 +237,7 @@ p { .login .module_app_inputFailed___gray{ + font-family: "Chivo",sans-serif; background-color: #fff; background-image: none; border: 1px solid #ccc; @@ -241,4 +252,29 @@ p { transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; width: 100%; border:1px solid #e14333; -} \ No newline at end of file +} + +.page-wrap{ + height: auto; + margin: 0 auto -60px; + min-height: 95%; + padding: 0 0 60px; +} + +.page-wrap:after{ + width: 100%; + display:block; + clear:both; +} + +.footer-login{ + text-align: center; + height: auto; + margin: -0px auto 0; +} + +#form[FORGOT_PASWORD_LINK]{ + font-family: Chivo; + font-size: 14px; + padding-top: 10px; +} diff --git a/workflow/engine/skinEngine/neoclassic/layout.html b/workflow/engine/skinEngine/neoclassic/layout.html index af628788d..a2996d5ba 100644 --- a/workflow/engine/skinEngine/neoclassic/layout.html +++ b/workflow/engine/skinEngine/neoclassic/layout.html @@ -78,10 +78,8 @@ {else} - - + +
@@ -102,8 +100,13 @@
- + {/if} diff --git a/workflow/engine/skinEngine/skinEngine.php b/workflow/engine/skinEngine/skinEngine.php index fd3d6a9da..03a185256 100755 --- a/workflow/engine/skinEngine/skinEngine.php +++ b/workflow/engine/skinEngine/skinEngine.php @@ -377,8 +377,8 @@ class SkinEngine if (strpos($_SERVER['REQUEST_URI'], '/login/login') !== false) { $freeOfChargeText = ""; if (! defined('SKIP_FREE_OF_CHARGE_TEXT')) - $freeOfChargeText = "Supplied free of charge with no support, certification, warranty,
maintenance nor indemnity by Colosa and its Certified Partners."; - if(class_exists('pmLicenseManager')) $freeOfChargeText=""; + $freeOfChargeText = "Supplied free of charge with no support, certification, warranty,
maintenance nor indemnity by Processmaker and its Certified Partners."; + if(file_exists(PATH_CLASSES."/class.pmLicenseManager.php")) $freeOfChargeText=""; $fileFooter = PATH_SKINS . SYS_SKIN . PATH_SEP . 'footer.html'; if (file_exists($fileFooter)) { @@ -392,7 +392,7 @@ class SkinEngine if (file_exists($fileFooter)) { $footer .= file_get_contents($fileFooter); } else { - $footer .= "
Copyright © 2000-" . date('Y') . " ProcessMaker Inc. All rights reserved.
$freeOfChargeText " . "

"; + $footer .= "$freeOfChargeText
Copyright © 2000-" . date('Y') . " ProcessMaker Inc. All rights reserved.
" . "

"; } } } @@ -505,7 +505,7 @@ class SkinEngine if (file_exists($fileFooter)) { $footer .= file_get_contents($fileFooter); } else { - $footer .= "
Copyright © 2000-" . date('Y') . " ProcessMaker Inc. All rights reserved.
$freeOfChargeText " . "

"; + $footer .= "$freeOfChargeText
Copyright © 2000-" . date('Y') . " ProcessMaker Inc. All rights reserved.
" . "

"; } } } @@ -698,8 +698,8 @@ class SkinEngine if (strpos($_SERVER['REQUEST_URI'], '/login/login') !== false) { $freeOfChargeText = ""; if (! defined('SKIP_FREE_OF_CHARGE_TEXT')) - $freeOfChargeText = "Supplied free of charge with no support, certification, warranty, maintenance nor indemnity by Colosa and its Certified Partners."; - if(class_exists('pmLicenseManager')) $freeOfChargeText=""; + $freeOfChargeText = "Supplied free of charge with no support, certification, warranty, maintenance nor indemnity by ProcessMaker and its Certified Partners."; + if(file_exists(PATH_CLASSES."/class.pmLicenseManager.php")) $freeOfChargeText=""; $fileFooter = PATH_SKINS . SYS_SKIN . PATH_SEP . 'footer.html'; if (file_exists($fileFooter)) { @@ -713,7 +713,7 @@ class SkinEngine if (file_exists($fileFooter)) { $footer .= file_get_contents($fileFooter); } else { - $footer .= " $freeOfChargeText
Copyright © 2000-" . date('Y') . " ProcessMaker Inc. All rights reserved.
" . "

"; + $footer .= "$freeOfChargeText
Copyright © 2000-" . date('Y') . " ProcessMaker Inc. All rights reserved.
" . "

"; } } } diff --git a/workflow/engine/xmlform/login/forgotPasswordpm3.xml b/workflow/engine/xmlform/login/forgotPasswordpm3.xml index 1c148713a..2e45b7f31 100755 --- a/workflow/engine/xmlform/login/forgotPasswordpm3.xml +++ b/workflow/engine/xmlform/login/forgotPasswordpm3.xml @@ -25,7 +25,9 @@ window.onload= function(){ document.getElementById('form[BSUBMIT]').classList.remove('module_app_button___gray'); document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); document.getElementById('form[BCANCEL]').classList.remove('module_app_button___gray'); - document.getElementById('form[BCANCEL]').classList.add('button-login-cancel'); + document.getElementById('form[BCANCEL]').classList.add('button-login-cancel'); + document.getElementById('form[BSUBMIT]').setAttribute("tabindex",-1); + document.getElementById('form[BCANCEL]').setAttribute("tabindex",-1); }; var panel; diff --git a/workflow/engine/xmlform/login/loginpm3.xml b/workflow/engine/xmlform/login/loginpm3.xml index f1811cbcb..fe6b34711 100755 --- a/workflow/engine/xmlform/login/loginpm3.xml +++ b/workflow/engine/xmlform/login/loginpm3.xml @@ -29,7 +29,8 @@ window.onload= function(){ document.getElementById('form[USR_USERNAME]').placeholder = _('ID_USER'); document.getElementById('form[USR_PASSWORD_MASK]').placeholder = _('ID_PASSWORD'); document.getElementById('form[BSUBMIT]').classList.remove('module_app_button___gray'); - document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); + document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); + document.getElementById('form[BSUBMIT]').setAttribute("tabindex",-1); }; // enable/disable forgot password link diff --git a/workflow/engine/xmlform/login/sysLoginNoWSpm3.xml b/workflow/engine/xmlform/login/sysLoginNoWSpm3.xml index a0c0202a3..65413d5d9 100755 --- a/workflow/engine/xmlform/login/sysLoginNoWSpm3.xml +++ b/workflow/engine/xmlform/login/sysLoginNoWSpm3.xml @@ -29,7 +29,8 @@ window.onload= function(){ document.getElementById('form[USR_PASSWORD_MASK]').placeholder = _('ID_PASSWORD'); document.getElementById('form[USER_ENV]').placeholder = _('ID_WORKSPACE'); document.getElementById('form[BSUBMIT]').classList.remove('module_app_button___gray'); - document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); + document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); + document.getElementById('form[BSUBMIT]').setAttribute("tabindex",-1); }; setFocus (getField ('USR_USERNAME')); diff --git a/workflow/public_html/fonts/Chivo-Regular.ttf b/workflow/public_html/fonts/Chivo-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..30f8143c83d3757121ed25bc82981c5afba10b27 GIT binary patch literal 50844 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 literal 0 HcmV?d00001 From f76826fefba73e3d8c46a0b24a844c8221d3b14c Mon Sep 17 00:00:00 2001 From: "marcelo.cuiza" Date: Fri, 17 Apr 2015 12:38:37 -0400 Subject: [PATCH 04/19] PM-2314,PM-2331 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PM-2314,En ADMIN > Plugins > Enterprise features el status del actionByEmail y el pmConsolidatedCL es "Install now" y este deberíestar como Installed y estas opciones ya deberí estar instaladas PM-2331,Admin/Plugins/Enterprise Features -> Eliminar columna de status en listado de features Dentro el tab "Enterprise features" se quito la columna status (PM-2331), Se agregaran los new features al ejecutar en consola ./processmaker databa-upgrade(PM-2314) --- workflow/engine/classes/class.licensedFeatures.php | 4 ++-- workflow/engine/data/mysql/insert.sql | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.licensedFeatures.php b/workflow/engine/classes/class.licensedFeatures.php index 813d49d7e..dcf2161bb 100644 --- a/workflow/engine/classes/class.licensedFeatures.php +++ b/workflow/engine/classes/class.licensedFeatures.php @@ -29,7 +29,7 @@ class PMLicensedFeatures private $features = array (); private $newFeatures = array( 0 => array( - "description" => "Enables de Actions By Email feature", + "description" => "Enables de Actions By Email feature.", "enabled" => false, "id" => "actionsByEmail", "latest_version" => "", @@ -46,7 +46,7 @@ class PMLicensedFeatures "version" => "" ), 1 => array( - "description" => "Enables de Batch Routing feature", + "description" => "Enables de Batch Routing feature.", "enabled" => false, "id" => "pmConsolidatedCL", "latest_version" => "", diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 4a9996c20..9d8b25c9e 100755 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -59981,3 +59981,12 @@ INSERT INTO CATALOG (CAT_UID, CAT_LABEL_ID, CAT_TYPE, CAT_FLAG, CAT_OBSERVATION, ('1060','ID_NEW_CASES','INDICATOR','','','2015-03-04','2015-03-04'), ('1070','ID_COMPLETED_CASES','INDICATOR','','','2015-03-04','2015-03-04'), ('1080','ID_WORKING_CASES','INDICATOR','','','2015-03-04','2015-03-04'); + +INSERT INTO ADDONS_MANAGER (ADDON_DESCRIPTION,ADDON_ID,ADDON_NAME,ADDON_NICK,ADDON_PUBLISHER,ADDON_RELEASE_TYPE,ADDON_STATUS,STORE_ID,ADDON_TYPE,ADDON_DOWNLOAD_URL,ADDON_VERSION,ADDON_DOWNLOAD_PROGRESS) VALUES +('Enables de Actions By Email feature.','actionsByEmail','actionsByEmail','actionsByEmail','Colosa','localRegistry','ready','00000000000000000000000000010004','features','','','0'); +('Enables de Batch Routing feature.','pmConsolidatedCL','pmConsolidatedCL','pmConsolidatedCL','Colosa','localRegistry','ready','00000000000000000000000000010005','features','','','0'); +('Dashboard with improved charting graphics and optimized to show strategic information like Process Efficiency and User Efficiency indicators.','strategicDashboards','strategicDashboards','Strategic Dashboards','Colosa','localRegistry','ready','00000000000000000000000000010006','features','','','0'); +('Enables the configuration of a second database connection in order to divide the database requests in read and write operations. This features is used with database clusters to improve the application performance.','secondDatabaseConnection','secondDatabaseConnection','secondDatabaseConnection','Colosa','localRegistry','ready','00000000000000000000000000010000','features','','','0'); +('A more secure option to store user passwords in ProcessMaker. The modern algorithm SHA-2 is used to store the passwords.','secureUserPasswordHash','secureUserPasswordHash','secureUserPasswordHash','Colosa','localRegistry','ready','00000000000000000000000000010002','features','','','0'); +('This functionality enables the flexibility to send mails from different email servers or configurations.','sendEmailFromDifferentEmailServers','sendEmailFromDifferentEmailServers','sendEmailFromDifferentEmailServers','Colosa','localRegistry','ready','00000000000000000000000000010003','features','','','0'); +('Registers every admin action in a log. The actions in administration settings options are registered in the log.','auditLog','auditLog','auditLog','Colosa','localRegistry','ready','00000000000000000000000000010001','features','','','0'); From 633f4fe9c4cb92275152d6ffa5e2f43870df160c Mon Sep 17 00:00:00 2001 From: "marcelo.cuiza" Date: Fri, 17 Apr 2015 13:04:20 -0400 Subject: [PATCH 05/19] PM-2314,PM-2331 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PM-2314,En ADMIN > Plugins > Enterprise features el status del actionByEmail y el pmConsolidatedCL es "Install now" y este deberíestar como Installed y estas opciones ya deberí estar instaladas PM-2331,Admin/Plugins/Enterprise Features -> Eliminar columna de status en listado de features Dentro el tab "Enterprise features" se quito la columna status (PM-2331), Se agregaran los new features al ejecutar en consola ./processmaker databa-upgrade(PM-2314) --- workflow/engine/data/mysql/insert.sql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 9d8b25c9e..fbb333b5e 100755 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -59983,10 +59983,10 @@ INSERT INTO CATALOG (CAT_UID, CAT_LABEL_ID, CAT_TYPE, CAT_FLAG, CAT_OBSERVATION, ('1080','ID_WORKING_CASES','INDICATOR','','','2015-03-04','2015-03-04'); INSERT INTO ADDONS_MANAGER (ADDON_DESCRIPTION,ADDON_ID,ADDON_NAME,ADDON_NICK,ADDON_PUBLISHER,ADDON_RELEASE_TYPE,ADDON_STATUS,STORE_ID,ADDON_TYPE,ADDON_DOWNLOAD_URL,ADDON_VERSION,ADDON_DOWNLOAD_PROGRESS) VALUES -('Enables de Actions By Email feature.','actionsByEmail','actionsByEmail','actionsByEmail','Colosa','localRegistry','ready','00000000000000000000000000010004','features','','','0'); -('Enables de Batch Routing feature.','pmConsolidatedCL','pmConsolidatedCL','pmConsolidatedCL','Colosa','localRegistry','ready','00000000000000000000000000010005','features','','','0'); -('Dashboard with improved charting graphics and optimized to show strategic information like Process Efficiency and User Efficiency indicators.','strategicDashboards','strategicDashboards','Strategic Dashboards','Colosa','localRegistry','ready','00000000000000000000000000010006','features','','','0'); -('Enables the configuration of a second database connection in order to divide the database requests in read and write operations. This features is used with database clusters to improve the application performance.','secondDatabaseConnection','secondDatabaseConnection','secondDatabaseConnection','Colosa','localRegistry','ready','00000000000000000000000000010000','features','','','0'); -('A more secure option to store user passwords in ProcessMaker. The modern algorithm SHA-2 is used to store the passwords.','secureUserPasswordHash','secureUserPasswordHash','secureUserPasswordHash','Colosa','localRegistry','ready','00000000000000000000000000010002','features','','','0'); -('This functionality enables the flexibility to send mails from different email servers or configurations.','sendEmailFromDifferentEmailServers','sendEmailFromDifferentEmailServers','sendEmailFromDifferentEmailServers','Colosa','localRegistry','ready','00000000000000000000000000010003','features','','','0'); +('Enables de Actions By Email feature.','actionsByEmail','actionsByEmail','actionsByEmail','Colosa','localRegistry','ready','00000000000000000000000000010004','features','','','0'), +('Enables de Batch Routing feature.','pmConsolidatedCL','pmConsolidatedCL','pmConsolidatedCL','Colosa','localRegistry','ready','00000000000000000000000000010005','features','','','0'), +('Dashboard with improved charting graphics and optimized to show strategic information like Process Efficiency and User Efficiency indicators.','strategicDashboards','strategicDashboards','Strategic Dashboards','Colosa','localRegistry','ready','00000000000000000000000000010006','features','','','0'), +('Enables the configuration of a second database connection in order to divide the database requests in read and write operations. This features is used with database clusters to improve the application performance.','secondDatabaseConnection','secondDatabaseConnection','secondDatabaseConnection','Colosa','localRegistry','ready','00000000000000000000000000010000','features','','','0'), +('A more secure option to store user passwords in ProcessMaker. The modern algorithm SHA-2 is used to store the passwords.','secureUserPasswordHash','secureUserPasswordHash','secureUserPasswordHash','Colosa','localRegistry','ready','00000000000000000000000000010002','features','','','0'), +('This functionality enables the flexibility to send mails from different email servers or configurations.','sendEmailFromDifferentEmailServers','sendEmailFromDifferentEmailServers','sendEmailFromDifferentEmailServers','Colosa','localRegistry','ready','00000000000000000000000000010003','features','','','0'), ('Registers every admin action in a log. The actions in administration settings options are registered in the log.','auditLog','auditLog','auditLog','Colosa','localRegistry','ready','00000000000000000000000000010001','features','','','0'); From 4a499e7f4c4b1c1b44c4a0d625d064ceff46d151 Mon Sep 17 00:00:00 2001 From: jonathan Date: Fri, 17 Apr 2015 13:40:33 -0400 Subject: [PATCH 06/19] update login --- workflow/engine/skinEngine/neoclassic/css/loginStyle.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/workflow/engine/skinEngine/neoclassic/css/loginStyle.css b/workflow/engine/skinEngine/neoclassic/css/loginStyle.css index a2f350014..f6e2b7fe2 100644 --- a/workflow/engine/skinEngine/neoclassic/css/loginStyle.css +++ b/workflow/engine/skinEngine/neoclassic/css/loginStyle.css @@ -102,6 +102,12 @@ img.img-responsive { margin-bottom: 6px; } + +.form-signin .module_app_input___gray:-ms-input-placeholder { + font-family: "Open Sans",Arial,Helvetica,sans-serif; + color:#999; + } + .module_app_input___gray::-moz-placeholder { color: #999; opacity: 1; From cba4ec2f47a61e59f1cb625b41e30c20a1f585c9 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Fri, 17 Apr 2015 13:51:47 -0400 Subject: [PATCH 07/19] PM-2003 --- workflow/engine/classes/class.pmDynaform.php | 34 +++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 52d6fa84c..e8107eb2e 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -80,19 +80,37 @@ class pmDynaform public function jsonr(&$json) { - foreach ($json as $key => $value) { + foreach ($json as $key => &$value) { $sw1 = is_array($value); $sw2 = is_object($value); if ($sw1 || $sw2) { $this->jsonr($value); } if (!$sw1 && !$sw2) { - //property + //set properties from trigger $prefixs = array("@@", "@#", "@%", "@?", "@$", "@="); if (is_string($value) && in_array(substr($value, 0, 2), $prefixs)) { $triggerValue = substr($value, 2); if (isset($this->fields["APP_DATA"][$triggerValue])) { - $json->$key = $this->fields["APP_DATA"][$triggerValue]; + $json->{$key} = $this->fields["APP_DATA"][$triggerValue]; + } + } + //set properties from 'formInstance' variable + if (isset($this->fields["APP_DATA"]["formInstance"])) { + $formInstance = $this->fields["APP_DATA"]["formInstance"]; + if (!is_array($formInstance)) { + $formInstance = array($formInstance); + } + $nfi = count($formInstance); + for ($ifi = 0; $ifi < $nfi; $ifi++) { + $fi = $formInstance[$ifi]; + if (is_object($fi) && isset($fi->id) && $key === "id" && $json->{$key} === $fi->id) { + foreach ($fi as $keyfi => $valuefi) { + if (isset($json->{$keyfi})) { + $json->{$keyfi} = $valuefi; + } + } + } } } //query & options @@ -208,11 +226,15 @@ class pmDynaform $this->lang = $json->language; } if ($this->langs !== null) { - if (($key === "label" || $key === "hint" || $key === "placeholder" || $key === "validateMessage" || $key === "alternateText" || $key === "comment" || $key === "alt") && isset($json->{$key}) && isset($this->langs->{$this->lang})) { + if (($key === "label" || $key === "title" || $key === "hint" || $key === "placeholder" || $key === "validateMessage" || $key === "alternateText" || $key === "comment" || $key === "alt") && isset($this->langs->{$this->lang})) { $langs = $this->langs->{$this->lang}->Labels; foreach ($langs as $langsValue) { - if ($json->{$key} === $langsValue->msgid) + if (is_object($json) && $json->{$key} === $langsValue->msgid) { $json->{$key} = $langsValue->msgstr; + } + if (is_array($json) && $json[$key] === $langsValue->msgid) { + $json[$key] = $langsValue->msgstr; + } } } } @@ -409,6 +431,8 @@ class pmDynaform $json->name = $newVariable["VAR_NAME"]; if (isset($json->dbConnection) && $json->dbConnection === $oldVariable["VAR_DBCONNECTION"]) $json->dbConnection = $newVariable["VAR_DBCONNECTION"]; + if (isset($json->dbConnectionLabel) && $json->dbConnectionLabel === $oldVariable["VAR_DBCONNECTION_LABEL"]) + $json->dbConnectionLabel = $newVariable["VAR_DBCONNECTION_LABEL"]; if (isset($json->sql) && $json->sql === $oldVariable["VAR_SQL"]) $json->sql = $newVariable["VAR_SQL"]; if (isset($json->options) && G::json_encode($json->options) === $oldVariable["VAR_ACCEPTED_VALUES"]) { From 15654c189eb2bfcf8935b3c8fa5b3223f7f716a1 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Fri, 17 Apr 2015 14:03:05 -0400 Subject: [PATCH 08/19] PM-2301 --- workflow/engine/methods/cases/pmDynaform.php | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow/engine/methods/cases/pmDynaform.php b/workflow/engine/methods/cases/pmDynaform.php index 97041fb70..7cbab53dd 100644 --- a/workflow/engine/methods/cases/pmDynaform.php +++ b/workflow/engine/methods/cases/pmDynaform.php @@ -1,6 +1,7 @@ $DYN_UID)); $a->printPmDynaform(); From b9069e8c6f57b80f46efe3a511d1391a06fbedb4 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Fri, 17 Apr 2015 14:08:13 -0400 Subject: [PATCH 09/19] PM-2301-IMPROVEMENT --- .../ProcessMaker/BusinessModel/Variable.php | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index fc4d5b237..8e0e25ffd 100755 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -129,10 +129,13 @@ class Variable $cnn = \Propel::getConnection("workflow"); try { $variable = \ProcessVariablesPeer::retrieveByPK($variableUid); + $dbConnection = \DbSourcePeer::retrieveByPK($variable->getVarDbconnection(), $variable->getPrjUid()); + $oldVariable = array( "VAR_NAME" => $variable->getVarName(), "VAR_FIELD_TYPE" => $variable->getVarFieldType(), "VAR_DBCONNECTION" => $variable->getVarDbconnection(), + "VAR_DBCONNECTION_LABEL" => $dbConnection !== null ? '[' . $dbConnection->getDbsServer() . ':' . $dbConnection->getDbsPort() . '] ' . $dbConnection->getDbsType() . ': ' . $dbConnection->getDbsDatabaseName() : 'PM Database', "VAR_SQL" => $variable->getVarSql(), "VAR_ACCEPTED_VALUES" => $variable->getVarAcceptedValues() ); @@ -170,10 +173,12 @@ class Variable $variable->save(); $cnn->commit(); //update dynaforms + $dbConnection = \DbSourcePeer::retrieveByPK($variable->getVarDbconnection(), $variable->getPrjUid()); $newVariable = array( "VAR_NAME" => $variable->getVarName(), "VAR_FIELD_TYPE" => $variable->getVarFieldType(), "VAR_DBCONNECTION" => $variable->getVarDbconnection(), + "VAR_DBCONNECTION_LABEL" => $dbConnection !== null ? '[' . $dbConnection->getDbsServer() . ':' . $dbConnection->getDbsPort() . '] ' . $dbConnection->getDbsType() . ': ' . $dbConnection->getDbsDatabaseName() : 'PM Database', "VAR_SQL" => $variable->getVarSql(), "VAR_ACCEPTED_VALUES" => $variable->getVarAcceptedValues() ); @@ -265,9 +270,14 @@ class Variable $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_NULL); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_DEFAULT); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_ACCEPTED_VALUES); + $criteria->addSelectColumn(\DbSourcePeer::DBS_SERVER); + $criteria->addSelectColumn(\DbSourcePeer::DBS_PORT); + $criteria->addSelectColumn(\DbSourcePeer::DBS_DATABASE_NAME); + $criteria->addSelectColumn(\DbSourcePeer::DBS_TYPE); $criteria->add(\ProcessVariablesPeer::PRJ_UID, $processUid, \Criteria::EQUAL); $criteria->add(\ProcessVariablesPeer::VAR_UID, $variableUid, \Criteria::EQUAL); + $criteria->addJoin(\ProcessVariablesPeer::VAR_DBCONNECTION, \DbSourcePeer::DBS_UID, \Criteria::LEFT_JOIN); $rsCriteria = \ProcessVariablesPeer::doSelectRS($criteria); @@ -283,7 +293,8 @@ class Variable 'var_field_type' => $aRow['VAR_FIELD_TYPE'], 'var_field_size' => (int)$aRow['VAR_FIELD_SIZE'], 'var_label' => $aRow['VAR_LABEL'], - 'var_dbconnection' => $aRow['VAR_DBCONNECTION'], + 'var_dbconnection' => $aRow['VAR_DBCONNECTION'] === 'none' ? 'workflow' : $aRow['VAR_DBCONNECTION'], + 'var_dbconnection_label' => $aRow['DBS_SERVER'] !== null ? '[' . $aRow['DBS_SERVER'] . ':' . $aRow['DBS_PORT'] . '] ' . $aRow['DBS_TYPE'] . ': ' . $aRow['DBS_DATABASE_NAME'] : 'PM Database', 'var_sql' => $aRow['VAR_SQL'], 'var_null' => (int)$aRow['VAR_NULL'], 'var_default' => $aRow['VAR_DEFAULT'], @@ -326,8 +337,13 @@ class Variable $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_NULL); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_DEFAULT); $criteria->addSelectColumn(\ProcessVariablesPeer::VAR_ACCEPTED_VALUES); + $criteria->addSelectColumn(\DbSourcePeer::DBS_SERVER); + $criteria->addSelectColumn(\DbSourcePeer::DBS_PORT); + $criteria->addSelectColumn(\DbSourcePeer::DBS_DATABASE_NAME); + $criteria->addSelectColumn(\DbSourcePeer::DBS_TYPE); $criteria->add(\ProcessVariablesPeer::PRJ_UID, $processUid, \Criteria::EQUAL); + $criteria->addJoin(\ProcessVariablesPeer::VAR_DBCONNECTION, \DbSourcePeer::DBS_UID, \Criteria::LEFT_JOIN); $rsCriteria = \ProcessVariablesPeer::doSelectRS($criteria); @@ -343,7 +359,8 @@ class Variable 'var_field_type' => $aRow['VAR_FIELD_TYPE'], 'var_field_size' => (int)$aRow['VAR_FIELD_SIZE'], 'var_label' => $aRow['VAR_LABEL'], - 'var_dbconnection' => $aRow['VAR_DBCONNECTION'], + 'var_dbconnection' => $aRow['VAR_DBCONNECTION'] === 'none' ? 'workflow' : $aRow['VAR_DBCONNECTION'], + 'var_dbconnection_label' => $aRow['DBS_SERVER'] !== null ? '[' . $aRow['DBS_SERVER'] . ':' . $aRow['DBS_PORT'] . '] ' . $aRow['DBS_TYPE'] . ': ' . $aRow['DBS_DATABASE_NAME'] : 'PM Database', 'var_sql' => $aRow['VAR_SQL'], 'var_null' => (int)$aRow['VAR_NULL'], 'var_default' => $aRow['VAR_DEFAULT'], @@ -690,4 +707,3 @@ class Variable } } } - From b728b7609f3fd7bf46cd117ed4fa45059e866f3d Mon Sep 17 00:00:00 2001 From: jonathan Date: Fri, 17 Apr 2015 14:19:03 -0400 Subject: [PATCH 10/19] update login v2 --- workflow/engine/skinEngine/skinEngine.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/skinEngine/skinEngine.php b/workflow/engine/skinEngine/skinEngine.php index 03a185256..e6a7290a7 100755 --- a/workflow/engine/skinEngine/skinEngine.php +++ b/workflow/engine/skinEngine/skinEngine.php @@ -378,7 +378,7 @@ class SkinEngine $freeOfChargeText = ""; if (! defined('SKIP_FREE_OF_CHARGE_TEXT')) $freeOfChargeText = "Supplied free of charge with no support, certification, warranty,
maintenance nor indemnity by Processmaker and its Certified Partners."; - if(file_exists(PATH_CLASSES."/class.pmLicenseManager.php")) $freeOfChargeText=""; + if(file_exists(PATH_CLASSES."class.pmLicenseManager.php")) $freeOfChargeText=""; $fileFooter = PATH_SKINS . SYS_SKIN . PATH_SEP . 'footer.html'; if (file_exists($fileFooter)) { @@ -699,7 +699,7 @@ class SkinEngine $freeOfChargeText = ""; if (! defined('SKIP_FREE_OF_CHARGE_TEXT')) $freeOfChargeText = "Supplied free of charge with no support, certification, warranty, maintenance nor indemnity by ProcessMaker and its Certified Partners."; - if(file_exists(PATH_CLASSES."/class.pmLicenseManager.php")) $freeOfChargeText=""; + if(file_exists(PATH_CLASSES."class.pmLicenseManager.php")) $freeOfChargeText=""; $fileFooter = PATH_SKINS . SYS_SKIN . PATH_SEP . 'footer.html'; if (file_exists($fileFooter)) { From eef845727efe39e272ab1f537e02445fdd34b858 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Fri, 17 Apr 2015 14:57:53 -0400 Subject: [PATCH 11/19] I solved the issue PM-2336 [Error con el Consolidated tab] --- workflow/engine/classes/class.processMap.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.processMap.php b/workflow/engine/classes/class.processMap.php index 3d65399c7..7dd4742f1 100755 --- a/workflow/engine/classes/class.processMap.php +++ b/workflow/engine/classes/class.processMap.php @@ -1588,8 +1588,9 @@ class processMap $numRows = DynaformPeer::doCount($oCriteria); if ($numRows == 0) { - echo "
".G::LoadTranslation('ID_ALERT')."
".G::LoadTranslation('ID_CONSOLIDATED_DYNAFORM_REQUIRED')."
"; - die; + $aFields['TITLE_ALERT'] = G::LoadTranslation('ID_ALERT'); + $aFields['SUBTITLE_MESSAGE'] = G::LoadTranslation('ID_CONSOLIDATED_DYNAFORM_REQUIRED'); + $sFilename = 'tasks/tasks_Consolidated_Error.xml'; } } From 197a1d571098ebfe78ad98dcdb6e7f296ca54a1a Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Fri, 17 Apr 2015 15:03:52 -0400 Subject: [PATCH 12/19] I added new form by show Consolitated Error --- .../tasks/tasks_Consolidated_Error.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 workflow/engine/xmlform/tasks/tasks_Consolidated_Error.xml diff --git a/workflow/engine/xmlform/tasks/tasks_Consolidated_Error.xml b/workflow/engine/xmlform/tasks/tasks_Consolidated_Error.xml new file mode 100644 index 000000000..7c449fe4d --- /dev/null +++ b/workflow/engine/xmlform/tasks/tasks_Consolidated_Error.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 67bd800e58ed220534236bb62ab8d7c9d469a44d Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Fri, 17 Apr 2015 15:21:09 -0400 Subject: [PATCH 13/19] PM-2291 "DesignerBPMN>CaseTracker: No se visualizan los..." SOLVED > Code Isuue: DesignerBPMN>CaseTracker: No se visualizan los formularios asignados al caseTracker. > Solution: Cuando se tiene dynaforms creados en BPMN al ingresar al case tracker y ver los dynaforms se mostrara con la nueva interfaz en otro caso se mostrara con la antigua interfaz tal como se mostraba anteriormente. Al mostrar el dynaform con la nueva interfaz se tiene un link "Back" que permite volver a la pagina anterior. --- gulliver/system/class.publisher.php | 5 +- workflow/engine/classes/class.pmDynaform.php | 70 ++++++++++++++++++- .../engine/methods/tracker/tracker_Show.php | 24 +++++-- 3 files changed, 90 insertions(+), 9 deletions(-) diff --git a/gulliver/system/class.publisher.php b/gulliver/system/class.publisher.php index 40b7fc20e..e398cba52 100755 --- a/gulliver/system/class.publisher.php +++ b/gulliver/system/class.publisher.php @@ -294,10 +294,10 @@ class Publisher //This dynaform has show/hide field conditions if (isset($_SESSION['CURRENT_DYN_UID']) && $_SESSION['CURRENT_DYN_UID'] != '') { - $ConditionalShowHideRoutines = $oFieldCondition->getConditionScript($_SESSION["CURRENT_DYN_UID"]); //lsl + $ConditionalShowHideRoutines = $oFieldCondition->getConditionScript($_SESSION["CURRENT_DYN_UID"]); } else { if (isset($_SESSION['CONDITION_DYN_UID']) && $_SESSION['CONDITION_DYN_UID'] != '') { - $ConditionalShowHideRoutines = $oFieldCondition->getConditionScript($_SESSION["CONDITION_DYN_UID"]); //lsl + $ConditionalShowHideRoutines = $oFieldCondition->getConditionScript($_SESSION["CONDITION_DYN_UID"]); } } } @@ -649,4 +649,3 @@ class Publisher $G_TABLE = null; } } - diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 52d6fa84c..3c89f6d04 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -3,7 +3,7 @@ /** * class.pmDynaform.php * Implementing pmDynaform library in the running case. - * + * * @author Roly Rudy Gutierrez Pinto * @package engine.classes */ @@ -136,7 +136,7 @@ class pmDynaform array_push($json->options, $option); } } catch (Exception $e) { - + } } if (isset($json->options[0])) { @@ -225,6 +225,72 @@ class pmDynaform return $this->record != null && $this->record["DYN_VERSION"] == 2 ? true : false; } + public function printViewWitoutSubmit() + { + ob_clean(); + + $json = G::json_decode($this->record["DYN_CONTENT"]); + + foreach ($json->items[0]->items as $key => $value) { + switch ($json->items[0]->items[$key][0]->type) { + case "submit": + unset($json->items[0]->items[$key]); + break; + } + } + + $this->jsonr($json); + + $javascript = " + + + + "; + + $file = file_get_contents(PATH_HOME . "public_html" . PATH_SEP . "lib" . PATH_SEP . "pmdynaform" . PATH_SEP . "build" . PATH_SEP . "pmdynaform.html"); + $file = str_replace("{javascript}", $javascript, $file); + + echo $file; + exit(0); + } + public function printView() { ob_clean(); diff --git a/workflow/engine/methods/tracker/tracker_Show.php b/workflow/engine/methods/tracker/tracker_Show.php index 652b24949..a8d4dcb20 100755 --- a/workflow/engine/methods/tracker/tracker_Show.php +++ b/workflow/engine/methods/tracker/tracker_Show.php @@ -54,11 +54,27 @@ switch ($_GET['CTO_TYPE_OBJ']) { $Fields['APP_DATA']['__DYNAFORM_OPTIONS']['PRINT_PREVIEW'] = '#'; $Fields['APP_DATA']['__DYNAFORM_OPTIONS']['PRINT_PREVIEW_ACTION'] = 'tracker_PrintView?CTO_UID_OBJ=' . $_GET['CTO_UID_OBJ'] . '&CTO_TYPE_OBJ=PRINT_PREVIEW'; $_SESSION['CTO_UID_OBJ'] = $_GET['CTO_UID_OBJ']; - $G_PUBLISH = new Publisher(); - $G_PUBLISH->AddContent( 'dynaform', 'xmlform', $_SESSION['PROCESS'] . '/' . $_GET['CTO_UID_OBJ'], '', $Fields['APP_DATA'], '', '', 'view' ); - G::RenderPage( 'publish' ); - break; + $dynaForm = new Dynaform(); + $arrayDynaFormData = $dynaForm->Load($_GET["CTO_UID_OBJ"]); + + if (isset($arrayDynaFormData["DYN_VERSION"]) && $arrayDynaFormData["DYN_VERSION"] == 2) { + G::LoadClass("pmDynaform"); + + $Fields["PRO_UID"] = $_SESSION["PROCESS"]; + $Fields["CURRENT_DYNAFORM"] = $_GET["CTO_UID_OBJ"]; + + $pmDynaForm = new pmDynaform($Fields); + + if ($pmDynaForm->isResponsive()) { + $pmDynaForm->printViewWitoutSubmit(); + } + } else { + $G_PUBLISH = new Publisher(); + $G_PUBLISH->AddContent("dynaform", "xmlform", $_SESSION["PROCESS"] . "/" . $_GET["CTO_UID_OBJ"], "", $Fields["APP_DATA"], "", "", "view"); + G::RenderPage("publish"); + } + break; case 'INPUT_DOCUMENT': G::LoadClass( 'case' ); $oCase = new Cases(); From 8e9253d9cc0bda869fa3bf90b72677a4c46c71cb Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Fri, 17 Apr 2015 15:34:51 -0400 Subject: [PATCH 14/19] I solved the issue with Timing control --- workflow/engine/methods/cases/cases_Step.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/methods/cases/cases_Step.php b/workflow/engine/methods/cases/cases_Step.php index df4224e1e..f3af8eb91 100755 --- a/workflow/engine/methods/cases/cases_Step.php +++ b/workflow/engine/methods/cases/cases_Step.php @@ -908,7 +908,7 @@ try { $daysSelected = "selected = 'selected'"; } - $sAux = ''; @@ -921,7 +921,7 @@ try { $calendarSelected = "selected = 'selected'"; } - $sAux = ''; From 377be8c191aa73767b249f3959a68ea4f729a562 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Fri, 17 Apr 2015 16:02:27 -0400 Subject: [PATCH 15/19] PM-2206 --- workflow/engine/xmlform/login/forgotPasswordpm3.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/xmlform/login/forgotPasswordpm3.xml b/workflow/engine/xmlform/login/forgotPasswordpm3.xml index 204c4d134..98122fc1f 100755 --- a/workflow/engine/xmlform/login/forgotPasswordpm3.xml +++ b/workflow/engine/xmlform/login/forgotPasswordpm3.xml @@ -6,7 +6,7 @@ - + From 8a2818b3621261c2830105151fcc90e4649771b3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Fri, 17 Apr 2015 16:22:34 -0400 Subject: [PATCH 16/19] PM-2291 "DesignerBPMN>CaseTracker: No se visualizan los..." SOLVED --- workflow/engine/classes/class.pmDynaform.php | 2 +- workflow/engine/methods/tracker/tracker_Show.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 3c89f6d04..cc28f890a 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -225,7 +225,7 @@ class pmDynaform return $this->record != null && $this->record["DYN_VERSION"] == 2 ? true : false; } - public function printViewWitoutSubmit() + public function printViewWithoutSubmit() { ob_clean(); diff --git a/workflow/engine/methods/tracker/tracker_Show.php b/workflow/engine/methods/tracker/tracker_Show.php index a8d4dcb20..5259a7447 100755 --- a/workflow/engine/methods/tracker/tracker_Show.php +++ b/workflow/engine/methods/tracker/tracker_Show.php @@ -67,7 +67,7 @@ switch ($_GET['CTO_TYPE_OBJ']) { $pmDynaForm = new pmDynaform($Fields); if ($pmDynaForm->isResponsive()) { - $pmDynaForm->printViewWitoutSubmit(); + $pmDynaForm->printViewWithoutSubmit(); } } else { $G_PUBLISH = new Publisher(); From 24396618bbadbcdfae6cb677cafcc2220ab55a8d Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Fri, 17 Apr 2015 16:52:19 -0400 Subject: [PATCH 17/19] PM-2003 --- workflow/engine/classes/class.pmDynaform.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index e8107eb2e..b12f1974b 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -159,6 +159,12 @@ class pmDynaform } if (isset($json->options[0])) { $json->data = $json->options[0]; + $no = count($json->options); + for ($io = 0; $io < $no; $io++) { + if ($json->options[$io]["value"] === $json->defaultValue) { + $json->data = $json->options[$io]; + } + } } } //data From 8d706c934752cdb1949f4ee39b0c593585475ad9 Mon Sep 17 00:00:00 2001 From: jonathan Date: Fri, 17 Apr 2015 18:00:52 -0400 Subject: [PATCH 18/19] update login v2 --- workflow/engine/xmlform/login/forgotPasswordpm3.xml | 4 +--- workflow/engine/xmlform/login/loginpm3.xml | 3 +-- workflow/engine/xmlform/login/sysLoginNoWSpm3.xml | 3 +-- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/workflow/engine/xmlform/login/forgotPasswordpm3.xml b/workflow/engine/xmlform/login/forgotPasswordpm3.xml index 2e45b7f31..1c148713a 100755 --- a/workflow/engine/xmlform/login/forgotPasswordpm3.xml +++ b/workflow/engine/xmlform/login/forgotPasswordpm3.xml @@ -25,9 +25,7 @@ window.onload= function(){ document.getElementById('form[BSUBMIT]').classList.remove('module_app_button___gray'); document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); document.getElementById('form[BCANCEL]').classList.remove('module_app_button___gray'); - document.getElementById('form[BCANCEL]').classList.add('button-login-cancel'); - document.getElementById('form[BSUBMIT]').setAttribute("tabindex",-1); - document.getElementById('form[BCANCEL]').setAttribute("tabindex",-1); + document.getElementById('form[BCANCEL]').classList.add('button-login-cancel'); }; var panel; diff --git a/workflow/engine/xmlform/login/loginpm3.xml b/workflow/engine/xmlform/login/loginpm3.xml index fe6b34711..f1811cbcb 100755 --- a/workflow/engine/xmlform/login/loginpm3.xml +++ b/workflow/engine/xmlform/login/loginpm3.xml @@ -29,8 +29,7 @@ window.onload= function(){ document.getElementById('form[USR_USERNAME]').placeholder = _('ID_USER'); document.getElementById('form[USR_PASSWORD_MASK]').placeholder = _('ID_PASSWORD'); document.getElementById('form[BSUBMIT]').classList.remove('module_app_button___gray'); - document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); - document.getElementById('form[BSUBMIT]').setAttribute("tabindex",-1); + document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); }; // enable/disable forgot password link diff --git a/workflow/engine/xmlform/login/sysLoginNoWSpm3.xml b/workflow/engine/xmlform/login/sysLoginNoWSpm3.xml index 65413d5d9..5dd893ede 100755 --- a/workflow/engine/xmlform/login/sysLoginNoWSpm3.xml +++ b/workflow/engine/xmlform/login/sysLoginNoWSpm3.xml @@ -29,8 +29,7 @@ window.onload= function(){ document.getElementById('form[USR_PASSWORD_MASK]').placeholder = _('ID_PASSWORD'); document.getElementById('form[USER_ENV]').placeholder = _('ID_WORKSPACE'); document.getElementById('form[BSUBMIT]').classList.remove('module_app_button___gray'); - document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); - document.getElementById('form[BSUBMIT]').setAttribute("tabindex",-1); + document.getElementById('form[BSUBMIT]').classList.add('button-login-success'); }; setFocus (getField ('USR_USERNAME')); From 8960fd80b1f24e99c1cb764e019f8c8b1171ab54 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Fri, 17 Apr 2015 19:32:39 -0400 Subject: [PATCH 19/19] IMPROVEMENT --- workflow/engine/classes/class.pmDynaform.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index b12f1974b..3d9231563 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -211,7 +211,7 @@ class pmDynaform if ($column->type === "text" || $column->type === "textarea" || $column->type === "dropdown" || $column->type === "datetime" || $column->type === "checkbox" || $column->type === "file" || $column->type === "link") { array_push($cells, array( "value" => isset($row[$column->name]) ? $row[$column->name] : "", - "label" => isset($row[$column->name . "_label"]) ? $row[$column->name . "_label"] : "" + "label" => isset($row[$column->name . "_label"]) ? $row[$column->name . "_label"] : (isset($row[$column->name]) ? $row[$column->name] : "") )); } if ($column->type === "suggest") {