From 6f57980ef9e6addc09201d4bae1b8a8f2bb0bb95 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Fri, 4 Mar 2016 10:40:40 +0000 Subject: [PATCH 01/19] HOR-281 Sanitizes output for storeInTmp method in genericAjax. --- gulliver/methods/genericAjax.php | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/gulliver/methods/genericAjax.php b/gulliver/methods/genericAjax.php index 4fef38877..3317d58b8 100755 --- a/gulliver/methods/genericAjax.php +++ b/gulliver/methods/genericAjax.php @@ -171,10 +171,22 @@ if( isset($request) ){ case 'storeInTmp': + if(!isset($_SESSION['USER_LOGGED'])) { + echo "{status: 0, message: \"Not Authorized\"}"; + break; + } try { $con = Propel::getConnection($_GET['cnn']); if($_GET['pkt'] == 'int'){ - $rs = $con->executeQuery("SELECT MAX({$_GET['pk']}) as lastId FROM {$_GET['table']};"); + // I know this isn't perfect + // but this is the sanitization + // that's used by Creole. + + $primaryKeyField = mysql_real_escape_string($_GET['pk']); + $tableName = mysql_real_escape_string($_GET['table']); + $primaryKeyField = str_replace("`", "", $primaryKeyField); + $tableName = str_replace("`", "", $tableName); + $rs = $con->executeQuery("SELECT MAX(`$primaryKeyField`) as lastId FROM `$tableName`"); $rs->next(); $row = $rs->getRow(); $gKey = (int)$row['lastId'] + 1; @@ -182,15 +194,24 @@ if( isset($request) ){ } else { $gKey = G::encryptOld(date('Y-m-d H:i:s').'@'.rand()); } + + // See above. Gross, but it works. + $field = mysql_real_escape_string($_GET['fld']); + $field = str_replace("`", "", $field); + + $query = "INSERT INTO {$_GET['table']} ({$_GET['pk']}, {$_GET['fld']}) VALUES (?, ?)"; // '$gKey', '{$_GET['value']}')"; - $rs = $con->executeQuery("INSERT INTO {$_GET['table']} ({$_GET['pk']}, {$_GET['fld']}) VALUES ('$gKey', '{$_GET['value']}');"); + $rs = $con->prepareStatement($query); + $rs->set(1, $gKey); + $rs->set(2, $_GET['value']); + $rs->executeQuery(); echo "{status: 1, message: \"success\"}"; } catch (Exception $e) { $err = $e->getMessage(); //$err = eregi_replace("[\n|\r|\n\r]", ' ', $err); $err = preg_replace("[\n|\r|\n\r]", " ", $err); //Made compatible to PHP 5.3 - + echo $con->lastQuery; echo "{status: 0, message: \"" . $err . "\"}"; } break; From 61fffbaf2d90aaf97d1876fa3c26d68a80ba3bed Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Fri, 4 Mar 2016 16:37:46 +0000 Subject: [PATCH 02/19] HOR-281 Removed debugging. --- gulliver/methods/genericAjax.php | 1 - 1 file changed, 1 deletion(-) diff --git a/gulliver/methods/genericAjax.php b/gulliver/methods/genericAjax.php index 3317d58b8..763682c69 100755 --- a/gulliver/methods/genericAjax.php +++ b/gulliver/methods/genericAjax.php @@ -211,7 +211,6 @@ if( isset($request) ){ $err = $e->getMessage(); //$err = eregi_replace("[\n|\r|\n\r]", ' ', $err); $err = preg_replace("[\n|\r|\n\r]", " ", $err); //Made compatible to PHP 5.3 - echo $con->lastQuery; echo "{status: 0, message: \"" . $err . "\"}"; } break; From cd886bb92c34c8372e9cfa48bc2f9e965bed84f6 Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Thu, 10 Mar 2016 16:08:00 +0000 Subject: [PATCH 03/19] HOR-281 Fixes references to table and field names. --- gulliver/methods/genericAjax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulliver/methods/genericAjax.php b/gulliver/methods/genericAjax.php index 763682c69..20f69a0a1 100755 --- a/gulliver/methods/genericAjax.php +++ b/gulliver/methods/genericAjax.php @@ -199,7 +199,7 @@ if( isset($request) ){ $field = mysql_real_escape_string($_GET['fld']); $field = str_replace("`", "", $field); - $query = "INSERT INTO {$_GET['table']} ({$_GET['pk']}, {$_GET['fld']}) VALUES (?, ?)"; // '$gKey', '{$_GET['value']}')"; + $query = "INSERT INTO $tableName ($primaryKeyField, $field) VALUES (?, ?)"; // '$gKey', '{$_GET['value']}')"; $rs = $con->prepareStatement($query); $rs->set(1, $gKey); From f9ca5867e467557e15100d5dd7a014e4e271187e Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Tue, 15 Mar 2016 13:49:48 +0000 Subject: [PATCH 04/19] HOR-281 storeInTmp does not emit error when trying to save entry from non logged in user. --- gulliver/methods/genericAjax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulliver/methods/genericAjax.php b/gulliver/methods/genericAjax.php index 20f69a0a1..cb4cd64b4 100755 --- a/gulliver/methods/genericAjax.php +++ b/gulliver/methods/genericAjax.php @@ -172,7 +172,7 @@ if( isset($request) ){ case 'storeInTmp': if(!isset($_SESSION['USER_LOGGED'])) { - echo "{status: 0, message: \"Not Authorized\"}"; + echo "{status: 1, message: \"success\"}"; break; } try { From 06963d81f2725cac0c7b29afacbd928aa9a3c2f7 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Thu, 17 Mar 2016 08:45:23 -0400 Subject: [PATCH 05/19] HOR-433 "(WSSO Plugin) Cuando se ingresa al proceso, se..." SOLVED Issue: (WSSO Plugin) Cuando se ingresa al proceso, se puede verificar que no se puede recuperar la data del mismo Cause: Se esta usando el mismo VirtualHost para clientes WEB y REST Solution: Se realizo la implementacion de la nueva directiva "server_hostname_requests_frontend" del "env.ini"; esto para el caso en que se requiera del "feature SSO", tomar nota de lo siguiente: - Habilitar el modulo "mod_headers" de apache (httpd.conf) - Tener configurado un VirtualHost normal para ProcessMaker (pmos.conf) - Para el "feature SSO" se debera crear un 2do VirtualHost con toda la configuracion necesaria para el mismo (pmos.conf), por lo que todos los usuarios que requieran este feature, deberan usar este para acceder por browser - Crear un 3er VirtualHost para las solicitudes del front-end (DESIGNER), en donde se agregara lo siguiente (pmos.conf): Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Headers "Content-Type,Depth,User-Agent,X-File-Size,X-Requested-With,If-Modified-Since,X-File-Name,Cache-Control,Authorization" Header set Access-Control-Allow-Methods "OPTIONS,GET,POST,PUT,DELETE" De tal forma que quedara asi: Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Headers "Content-Type,Depth,User-Agent,X-File-Size,X-Requested-With,If-Modified-Since,X-File-Name,Cache-Control,Authorization" Header set Access-Control-Allow-Methods "OPTIONS,GET,POST,PUT,DELETE" RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^.*/(.*)$ app.php [QSA,L,NC] - Agregar lo siguiente al archivo "/path/to/processmaker/shared/sites/your-workspace/env.ini" server_hostname_requests_frontend = "{your_server_hostname_requests_frontend}" Donde: - your_server_hostname_requests_frontend, es el nombre del servidor configurado para el front-end (3er VirtualHost), ejemplo: server_hostname_requests_frontend = "192.168.40.72:3017" - Tambien se puede hacer la configuracion en el archivo "/path/to/processmaker/workflow/engine/config/env.ini", considerar que esto afectara a todos lo workspaces creados Note: Todo el desarrollo se lo hizo en un server Windows-Server-2012-R2 con Apache-2.4 --- workflow/engine/classes/class.pmDynaform.php | 18 +++++++++---- workflow/engine/classes/class.system.php | 25 ++++++++++++++++++- workflow/engine/controllers/designer.php | 1 + .../engine/controllers/strategicDashboard.php | 8 +++--- workflow/engine/js/cases/core/pmDynaform.js | 4 +-- .../cases/casesConsolidatedListExtJs.php | 4 +-- workflow/engine/methods/cases/main_init.php | 2 +- workflow/engine/templates/designer/index.html | 2 ++ 8 files changed, 49 insertions(+), 15 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 201842128..88bb9f703 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -223,7 +223,7 @@ class pmDynaform $json->optionsSql[] = $option; } } catch (Exception $e) { - + } } break; @@ -602,7 +602,7 @@ class pmDynaform $data[$json->variable === "" ? $json->id : $json->variable] = $row[0]; } } catch (Exception $e) { - + } } } @@ -646,6 +646,7 @@ class pmDynaform $javascript = " "; @@ -955,6 +962,7 @@ class pmDynaform $javascrip = "" . " @@ -81,6 +82,7 @@ var SYS_SYS = "{$SYS_SYS}"; var SYS_LANG = "{$SYS_LANG}"; var SYS_SKIN = "{$SYS_SKIN}"; + var HTTP_SERVER_HOSTNAME = "{$HTTP_SERVER_HOSTNAME}"; From 49e299fbcc83f07015352f873c4b6e05d4bba0af Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Fri, 18 Mar 2016 16:49:33 -0400 Subject: [PATCH 06/19] HOR-474 "Asignacion de un rol a usuarios tarda demasiado " SOLVED Issue: Asignacion de un rol a usuarios tarda demasiado Cause: Los metodos Roles::getRoleUsers() y Roles::getAllUsers() no son optimos Solution: - Se a mejorado el metodo \ProcessMaker\BusinessModel\Role\User::getUsers() (Back-End) - Se agrego el pager a los grids en ADMIN>Users>Roles>Users (Front-End) HOR-474 "Asignacion de un rol a usuarios tarda demasiado " SOLVED Issue: Asignacion de un rol a usuarios tarda demasiado Cause: Los metodos Roles::getRoleUsers() y Roles::getAllUsers() no son optimos Solution: - Se a mejorado el metodo \ProcessMaker\BusinessModel\Role\User::getUsers() (Back-End) - Se agrego el pager a los grids en ADMIN>Users>Roles>Users (Front-End) HOR-474 "Asignacion de un rol a usuarios tarda demasiado " SOLVED Issue: Asignacion de un rol a usuarios tarda demasiado Cause: Los metodos Roles::getRoleUsers() y Roles::getAllUsers() no son optimos Solution: - Se a mejorado el metodo \ProcessMaker\BusinessModel\Role\User::getUsers() (Back-End) - Se agrego el pager a los grids en ADMIN>Users>Roles>Users (Front-End) --- gulliver/system/class.rbac.php | 4 +- rbac/engine/classes/model/Roles.php | 78 +------ .../engine/methods/roles/data_rolesUsers.php | 58 +++-- .../methods/roles/rolesUsersPermission.php | 7 + .../src/ProcessMaker/BusinessModel/Cases.php | 20 +- .../ProcessMaker/BusinessModel/Role/User.php | 153 +++++++------- .../ProcessMaker/Services/Api/Role/User.php | 8 +- .../templates/roles/rolesUsersPermission.js | 198 +++++++++++++++--- 8 files changed, 288 insertions(+), 238 deletions(-) diff --git a/gulliver/system/class.rbac.php b/gulliver/system/class.rbac.php index f3634a594..8ffcb6fde 100755 --- a/gulliver/system/class.rbac.php +++ b/gulliver/system/class.rbac.php @@ -788,7 +788,7 @@ class RBAC */ public function getRoleUsers ($ROL_UID, $filter = '') { - return $this->rolesObj->getRoleUsers( $ROL_UID, $filter ); + throw new Exception(__METHOD__ . ': The method is deprecated'); } /** @@ -859,7 +859,7 @@ class RBAC */ public function getAllUsers ($ROL_UID, $filter = '') { - return $this->rolesObj->getAllUsers( $ROL_UID, $filter ); + throw new Exception(__METHOD__ . ': The method is deprecated'); } /** diff --git a/rbac/engine/classes/model/Roles.php b/rbac/engine/classes/model/Roles.php index d789b82cd..282833d4f 100755 --- a/rbac/engine/classes/model/Roles.php +++ b/rbac/engine/classes/model/Roles.php @@ -398,85 +398,11 @@ class Roles extends BaseRoles { } function getRoleUsers($ROL_UID, $filter='') { - try { - $criteria = new Criteria(); - $criteria->addSelectColumn(RolesPeer::ROL_UID); - $criteria->addSelectColumn(RolesPeer::ROL_PARENT); - $criteria->addSelectColumn(RolesPeer::ROL_SYSTEM); - $criteria->addSelectColumn(RolesPeer::ROL_CODE); - $criteria->addSelectColumn(RolesPeer::ROL_CREATE_DATE); - $criteria->addSelectColumn(RolesPeer::ROL_UPDATE_DATE); - $criteria->addSelectColumn(RolesPeer::ROL_STATUS); - $criteria->addSelectColumn(RbacUsersPeer::USR_UID); - $criteria->addSelectColumn(RbacUsersPeer::USR_USERNAME); - $criteria->addSelectColumn(RbacUsersPeer::USR_FIRSTNAME); - $criteria->addSelectColumn(RbacUsersPeer::USR_LASTNAME); - $criteria->add(RolesPeer::ROL_UID, "", Criteria::NOT_EQUAL); - $criteria->add(RolesPeer::ROL_UID, $ROL_UID); - - $criteria->add(RbacUsersPeer::USR_STATUS, 0, Criteria::NOT_EQUAL); - - $criteria->addJoin(RolesPeer::ROL_UID, UsersRolesPeer::ROL_UID); - $criteria->addJoin(UsersRolesPeer::USR_UID, RbacUsersPeer::USR_UID); - - if ($filter != ''){ - $criteria->add( - $criteria->getNewCriterion(RbacUsersPeer::USR_USERNAME,'%'.$filter.'%',Criteria::LIKE)->addOr( - $criteria->getNewCriterion(RbacUsersPeer::USR_FIRSTNAME,'%'.$filter.'%',Criteria::LIKE)->addOr( - $criteria->getNewCriterion(RbacUsersPeer::USR_LASTNAME,'%'.$filter.'%',Criteria::LIKE))) - ); - } - - $oDataset = RolesPeer::doSelectRS($criteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - return $oDataset; - - } catch( exception $e ) { - throw $e; - } + throw new Exception(__METHOD__ . ': The method is deprecated'); } function getAllUsers($ROL_UID, $filter='') { - try { - $c = new Criteria(); - $c->addSelectColumn(RbacUsersPeer::USR_UID); - $c->add(RolesPeer::ROL_UID, $ROL_UID); - $c->addJoin(RolesPeer::ROL_UID, UsersRolesPeer::ROL_UID); - $c->addJoin(UsersRolesPeer::USR_UID, RbacUsersPeer::USR_UID); - - $result = RolesPeer::doSelectRS($c); - $result->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $result->next(); - - $a = Array(); - while( $row = $result->getRow() ) { - $a[] = $row['USR_UID']; - $result->next(); - } - - $criteria = new Criteria(); - - $criteria->addSelectColumn(RbacUsersPeer::USR_UID); - $criteria->addSelectColumn(RbacUsersPeer::USR_USERNAME); - $criteria->addSelectColumn(RbacUsersPeer::USR_FIRSTNAME); - $criteria->addSelectColumn(RbacUsersPeer::USR_LASTNAME); - $criteria->add(RbacUsersPeer::USR_STATUS, 1, Criteria::EQUAL); - $criteria->add(RbacUsersPeer::USR_UID, $a, Criteria::NOT_IN); - - if ($filter != ''){ - $criteria->add( - $criteria->getNewCriterion(RbacUsersPeer::USR_USERNAME,'%'.$filter.'%',Criteria::LIKE)->addOr( - $criteria->getNewCriterion(RbacUsersPeer::USR_FIRSTNAME,'%'.$filter.'%',Criteria::LIKE)->addOr( - $criteria->getNewCriterion(RbacUsersPeer::USR_LASTNAME,'%'.$filter.'%',Criteria::LIKE))) - ); - } - - $oDataset = RbacUsersPeer::doSelectRS($criteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - return $oDataset; - } catch( exception $e ) { - throw $e; - } + throw new Exception(__METHOD__ . ': The method is deprecated'); } function assignUserToRole($aData) { diff --git a/workflow/engine/methods/roles/data_rolesUsers.php b/workflow/engine/methods/roles/data_rolesUsers.php index a36458f46..d6b75d4e4 100755 --- a/workflow/engine/methods/roles/data_rolesUsers.php +++ b/workflow/engine/methods/roles/data_rolesUsers.php @@ -1,42 +1,32 @@ . - * - * For more information, contact Colosa Inc, 2566 Le Jeune Rd., - * Coral Gables, FL, 33134, USA, or email info@colosa.com. - */ +$response = []; -$ROL_UID = $_GET['rUID']; -$TYPE_DATA = $_GET["type"]; +try { + $option = $_POST['option']; + $roleUid = $_POST['roleUid']; -global $RBAC; + $pageSize = $_POST['pageSize']; + $filter = $_POST['filter']; -$filter = (isset( $_REQUEST['textFilter'] )) ? $_REQUEST['textFilter'] : ''; + $sortField = (isset($_POST['sort']))? $_POST['sort']: 'USR_FIRSTNAME'; + $sortDir = (isset($_POST['dir']))? $_POST['dir']: 'ASC'; + $start = (isset($_POST['start']))? $_POST['start']: 0; + $limit = (isset($_POST['limit']))? $_POST['limit']: $pageSize; -if ($TYPE_DATA == 'list') - $oDataset = $RBAC->getRoleUsers( $ROL_UID, $filter ); -if ($TYPE_DATA == 'show') - $oDataset = $RBAC->getAllUsers( $ROL_UID, $filter ); + $roleUser = new \ProcessMaker\BusinessModel\Role\User(); -$rows = Array (); -while ($oDataset->next()) { - $rows[] = $oDataset->getRow(); + $result = $roleUser->getUsers( + $roleUid, $option, ['filter' => $filter, 'filterOption' => ''], $sortField, $sortDir, $start, $limit + ); + + $response['status'] = 'OK'; + $response['success'] = true; + $response['resultTotal'] = $result['total']; + $response['resultRoot'] = $result['data']; +} catch (Exception $e) { + $response['status'] = 'ERROR'; + $response['message'] = $e->getMessage(); } -echo '{users: ' . G::json_encode( $rows ) . '}'; + +echo G::json_encode($response); diff --git a/workflow/engine/methods/roles/rolesUsersPermission.php b/workflow/engine/methods/roles/rolesUsersPermission.php index 5d07eecf9..5dba0985d 100755 --- a/workflow/engine/methods/roles/rolesUsersPermission.php +++ b/workflow/engine/methods/roles/rolesUsersPermission.php @@ -48,8 +48,15 @@ $G_ID_SUB_MENU_SELECTED = 'ROLES'; $G_PUBLISH = new Publisher(); +$configuration = new Configurations(); +$arrayConfigPage = $configuration->getConfiguration('roleUsersPermissionsList', 'pageSize', null, $_SESSION['USER_LOGGED']); + +$arrayConfig = []; +$arrayConfig['pageSize'] = (isset($arrayConfigPage['pageSize']))? $arrayConfigPage['pageSize'] : 20; + $oHeadPublisher = & headPublisher::getSingleton(); $oHeadPublisher->assign("PARTNER_FLAG", (defined('PARTNER_FLAG')) ? PARTNER_FLAG : false); +$oHeadPublisher->assign('CONFIG', $arrayConfig); $oHeadPublisher->addExtJsScript( 'roles/rolesUsersPermission', false ); //adding a javascript file .js $oHeadPublisher->addContent( 'roles/rolesUsersPermission' ); //adding a html file .html. diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php index cdfa9fd8b..9192cd850 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases.php @@ -2694,30 +2694,22 @@ class Cases } //Number records total - $criteriaCount = clone $criteria; - - $criteriaCount->clearSelectColumns(); - $criteriaCount->addSelectColumn('COUNT(' . \UsersPeer::USR_UID . ') AS NUM_REC'); - - $rsCriteriaCount = \UsersPeer::doSelectRS($criteriaCount); - $rsCriteriaCount->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - - $result = $rsCriteriaCount->next(); - $row = $rsCriteriaCount->getRow(); - - $numRecTotal = (int)($row['NUM_REC']); + $numRecTotal = \UsersPeer::doCount($criteria); //Query + $conf = new \Configurations(); + $sortFieldDefault = \UsersPeer::TABLE_NAME . '.' . $conf->userNameFormatGetFirstFieldByUsersTable(); + if (!is_null($sortField) && trim($sortField) != '') { $sortField = strtoupper($sortField); if (in_array(\UsersPeer::TABLE_NAME . '.' . $sortField, $criteria->getSelectColumns())) { $sortField = \UsersPeer::TABLE_NAME . '.' . $sortField; } else { - $sortField = \UsersPeer::USR_FIRSTNAME; + $sortField = $sortFieldDefault; } } else { - $sortField = \UsersPeer::USR_FIRSTNAME; + $sortField = $sortFieldDefault; } if (!is_null($sortDir) && trim($sortDir) != '' && strtoupper($sortDir) == 'DESC') { diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Role/User.php b/workflow/engine/src/ProcessMaker/BusinessModel/Role/User.php index 0cf9e2040..0825c16f5 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Role/User.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Role/User.php @@ -217,48 +217,6 @@ class User } } - /** - * Get criteria for User - * - * @param string $roleUid Unique id of Role - * @param array $arrayUserUidExclude Unique id of Users to exclude - * - * return object - */ - public function getUserCriteria($roleUid, array $arrayUserUidExclude = null) - { - try { - $criteria = new \Criteria("rbac"); - - $criteria->addSelectColumn(\RbacUsersPeer::USR_UID); - $criteria->addSelectColumn(\RbacUsersPeer::USR_USERNAME); - $criteria->addSelectColumn(\RbacUsersPeer::USR_FIRSTNAME); - $criteria->addSelectColumn(\RbacUsersPeer::USR_LASTNAME); - $criteria->addSelectColumn(\RbacUsersPeer::USR_STATUS); - - $criteria->addAlias("USR", \RbacUsersPeer::TABLE_NAME); - - $arrayCondition = array(); - $arrayCondition[] = array(\RbacUsersPeer::USR_UID, "USR.USR_UID", \Criteria::EQUAL); - $criteria->addJoinMC($arrayCondition, \Criteria::LEFT_JOIN); - - if ($roleUid != "") { - $criteria->addJoin(\UsersRolesPeer::USR_UID, \RbacUsersPeer::USR_UID, \Criteria::LEFT_JOIN); - $criteria->add(\UsersRolesPeer::ROL_UID, $roleUid, \Criteria::EQUAL); - } - - $criteria->add("USR.USR_USERNAME", "", \Criteria::NOT_EQUAL); - - if (!is_null($arrayUserUidExclude) && is_array($arrayUserUidExclude)) { - $criteria->add(\RbacUsersPeer::USR_UID, $arrayUserUidExclude, \Criteria::NOT_IN); - } - - return $criteria; - } catch (\Exception $e) { - throw $e; - } - } - /** * Get data of a User from a record * @@ -299,7 +257,11 @@ class User try { $arrayUser = array(); - //Verify data + $numRecTotal = 0; + + //Verify data and Set variables + $flagFilter = !is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData['filter']); + $process = new \ProcessMaker\BusinessModel\Process(); $role = new \ProcessMaker\BusinessModel\Role(); @@ -314,56 +276,89 @@ class User $process->throwExceptionIfDataNotMetPagerVarDefinition(array("start" => $start, "limit" => $limit), $this->arrayFieldNameForException); - //Get data - if (!is_null($limit) && $limit . "" == "0") { - return $arrayUser; + //Set variables + $filterName = 'filter'; + + if ($flagFilter) { + $arrayAux = [ + '' => 'filter', + 'LEFT' => 'lfilter', + 'RIGHT' => 'rfilter' + ]; + + $filterName = $arrayAux[ + (isset($arrayFilterData['filterOption']))? $arrayFilterData['filterOption'] : '' + ]; } - //SQL + //Get data + if (!is_null($limit) && (string)($limit) == '0') { + return [ + 'total' => $numRecTotal, + 'start' => (int)((!is_null($start))? $start : 0), + 'limit' => (int)((!is_null($limit))? $limit : 0), + $filterName => ($flagFilter)? $arrayFilterData['filter'] : '', + 'data' => $arrayUser + ]; + } + + //Query + $criteria = new \Criteria('rbac'); + + $criteria->addSelectColumn(\RbacUsersPeer::USR_UID); + $criteria->addSelectColumn(\RbacUsersPeer::USR_USERNAME); + $criteria->addSelectColumn(\RbacUsersPeer::USR_FIRSTNAME); + $criteria->addSelectColumn(\RbacUsersPeer::USR_LASTNAME); + $criteria->addSelectColumn(\RbacUsersPeer::USR_STATUS); + + $criteria->addJoin(\RbacUsersPeer::USR_UID, \UsersRolesPeer::USR_UID, \Criteria::LEFT_JOIN); + + $criteria->add(\RbacUsersPeer::USR_USERNAME, '', \Criteria::NOT_EQUAL); + switch ($option) { case "USERS": - //Criteria - $criteria = $this->getUserCriteria($roleUid); + $criteria->add(\UsersRolesPeer::ROL_UID, $roleUid, \Criteria::EQUAL); break; case "AVAILABLE-USERS": - //Get Uids - $arrayUid = array(); - - $criteria = $this->getUserCriteria($roleUid); - - $rsCriteria = \RbacUsersPeer::doSelectRS($criteria); - $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - - while ($rsCriteria->next()) { - $row = $rsCriteria->getRow(); - - $arrayUid[] = $row["USR_UID"]; - } - - //Criteria - $criteria = $this->getUserCriteria("", $arrayUid); + $criteria->add(\UsersRolesPeer::ROL_UID, $roleUid, \Criteria::NOT_EQUAL); break; } - if (!is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData["filter"]) && trim($arrayFilterData["filter"]) != "") { + if ($flagFilter && trim($arrayFilterData['filter']) != '') { + $arraySearch = [ + '' => '%' . $arrayFilterData['filter'] . '%', + 'LEFT' => $arrayFilterData['filter'] . '%', + 'RIGHT' => '%' . $arrayFilterData['filter'] + ]; + + $search = $arraySearch[ + (isset($arrayFilterData['filterOption']))? $arrayFilterData['filterOption'] : '' + ]; + $criteria->add( - $criteria->getNewCriterion(\RbacUsersPeer::USR_USERNAME, "%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE)->addOr( - $criteria->getNewCriterion(\RbacUsersPeer::USR_FIRSTNAME, "%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE)->addOr( - $criteria->getNewCriterion(\RbacUsersPeer::USR_LASTNAME, "%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE))) + $criteria->getNewCriterion(\RbacUsersPeer::USR_USERNAME, $search, \Criteria::LIKE)->addOr( + $criteria->getNewCriterion(\RbacUsersPeer::USR_FIRSTNAME, $search, \Criteria::LIKE)->addOr( + $criteria->getNewCriterion(\RbacUsersPeer::USR_LASTNAME, $search, \Criteria::LIKE))) ); } - //SQL - if (!is_null($sortField) && trim($sortField) != "") { + //Number records total + $numRecTotal = \RbacUsersPeer::doCount($criteria); + + //Query + $conf = new \Configurations(); + $sortFieldDefault = \RbacUsersPeer::TABLE_NAME . '.' . $conf->userNameFormatGetFirstFieldByUsersTable(); + + if (!is_null($sortField) && trim($sortField) != '') { $sortField = strtoupper($sortField); - if (in_array($sortField, array("USR_UID", "USR_USERNAME", "USR_FIRSTNAME", "USR_LASTNAME", "USR_STATUS"))) { - $sortField = \RbacUsersPeer::TABLE_NAME . "." . $sortField; + if (in_array(\RbacUsersPeer::TABLE_NAME . '.' . $sortField, $criteria->getSelectColumns())) { + $sortField = \RbacUsersPeer::TABLE_NAME . '.' . $sortField; } else { - $sortField = \RbacUsersPeer::USR_USERNAME; + $sortField = $sortFieldDefault; } } else { - $sortField = \RbacUsersPeer::USR_USERNAME; + $sortField = $sortFieldDefault; } if (!is_null($sortDir) && trim($sortDir) != "" && strtoupper($sortDir) == "DESC") { @@ -390,7 +385,13 @@ class User } //Return - return $arrayUser; + return [ + 'total' => $numRecTotal, + 'start' => (int)((!is_null($start))? $start : 0), + 'limit' => (int)((!is_null($limit))? $limit : 0), + $filterName => ($flagFilter)? $arrayFilterData['filter'] : '', + 'data' => $arrayUser + ]; } catch (\Exception $e) { throw $e; } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Role/User.php b/workflow/engine/src/ProcessMaker/Services/Api/Role/User.php index 6f6e4a357..6dd793819 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Role/User.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Role/User.php @@ -38,9 +38,13 @@ class User extends Api public function doGetUsers($rol_uid, $filter = null, $start = null, $limit = null) { try { - $response = $this->roleUser->getUsers($rol_uid, (preg_match("/^.*\/users$/", $this->restler->url))? "USERS" : "AVAILABLE-USERS", array("filter" => $filter), null, null, $start, $limit); + $option = (preg_match('/^.*\/users$/', $this->restler->url))? 'USERS' : 'AVAILABLE-USERS'; - return $response; + $response = $this->roleUser->getUsers( + $rol_uid, $option, ['filter' => $filter, 'filterOption' => ''], null, null, $start, $limit + ); + + return $response['data']; } catch (\Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } diff --git a/workflow/engine/templates/roles/rolesUsersPermission.js b/workflow/engine/templates/roles/rolesUsersPermission.js index 947b02b86..717cd3b9b 100755 --- a/workflow/engine/templates/roles/rolesUsersPermission.js +++ b/workflow/engine/templates/roles/rolesUsersPermission.js @@ -26,8 +26,6 @@ var storeA; var cmodelP; var smodelA; var smodelP; -var storeU; -var storeX; var cmodelU; var smodelU; var smodelX; @@ -54,6 +52,9 @@ var removeUAllButton; var backButton; var editForm; +var pagingUser; +var pagingAvailableUser; + var sw_func_permissions; var sw_func_users; @@ -83,12 +84,12 @@ GridByDefaultP = function(){ //Function DoSearch Available DoSearchU = function(){ - availableUGrid.store.load({params: {textFilter: searchTextU.getValue()}}); + pagingAvailableUser.moveFirst(); }; //Function DoSearch Assigned DoSearchX = function(){ - assignedUGrid.store.load({params: {textFilter: searchTextX.getValue()}}); + pagingUser.moveFirst(); }; //Load Grid By Default Available Members @@ -149,6 +150,11 @@ CancelEditPermissionsActionU = function(){ Ext.onReady(function(){ + var loadMaskUserPermission = new Ext.LoadMask(Ext.getBody(), {msg: _("ID_LOADING_GRID")}); + + //Variables + var pageSizeU = parseInt(CONFIG.pageSize); + var pageSizeA = parseInt(CONFIG.pageSize); sw_func_permissions = false; sw_func_users = false; @@ -404,34 +410,154 @@ Ext.onReady(function(){ }); - storeU = new Ext.data.GroupingStore({ - proxy : new Ext.data.HttpProxy({ - url: 'data_rolesUsers?rUID=' + ROLES.ROL_UID + '&type=list' - }), - reader : new Ext.data.JsonReader( { - root: 'users', - fields : [ - {name : 'USR_UID'}, - {name : 'USR_USERNAME'}, - {name : 'USR_FIRSTNAME'}, - {name : 'USR_LASTNAME'} - ] - }) + //Stores + var storePageSize = new Ext.data.SimpleStore({ + fields: ["size"], + data: [["20"], ["30"], ["40"], ["50"], ["100"]], + autoLoad: true }); - storeX = new Ext.data.GroupingStore({ - proxy : new Ext.data.HttpProxy({ - url: 'data_rolesUsers?rUID=' + ROLES.ROL_UID + '&type=show' - }), - reader : new Ext.data.JsonReader( { - root: 'users', - fields : [ - {name : 'USR_UID'}, - {name : 'USR_USERNAME'}, - {name : 'USR_FIRSTNAME'}, - {name : 'USR_LASTNAME'} - ] - }) + var storeUser = new Ext.data.Store({ + proxy: new Ext.data.HttpProxy({ + url: "data_rolesUsers", + method: "POST" + }), + + reader: new Ext.data.JsonReader({ + root: "resultRoot", + totalProperty: "resultTotal", + fields: [ + {name: 'USR_UID'}, + {name: 'USR_USERNAME'}, + {name: 'USR_FIRSTNAME'}, + {name: 'USR_LASTNAME'} + ] + }), + + remoteSort: true, + + listeners: { + beforeload: function (store) + { + loadMaskUserPermission.show(); + + this.baseParams = { + "option": "USERS", + "roleUid": ROLES.ROL_UID, + "pageSize": pageSizeU, + "filter": searchTextX.getValue() + }; + }, + load: function (store, record, opt) + { + loadMaskUserPermission.hide(); + } + } + }); + + var storeAvailableUser = new Ext.data.Store({ + proxy: new Ext.data.HttpProxy({ + url: "data_rolesUsers", + method: "POST" + }), + + reader: new Ext.data.JsonReader({ + root: "resultRoot", + totalProperty: "resultTotal", + fields: [ + {name: 'USR_UID'}, + {name: 'USR_USERNAME'}, + {name: 'USR_FIRSTNAME'}, + {name: 'USR_LASTNAME'} + ] + }), + + remoteSort: true, + + listeners: { + beforeload: function (store) + { + loadMaskUserPermission.show(); + + this.baseParams = { + "option": "AVAILABLE-USERS", + "roleUid": ROLES.ROL_UID, + "pageSize": pageSizeA, + "filter": searchTextU.getValue() + }; + }, + load: function (store, record, opt) + { + loadMaskUserPermission.hide(); + } + } + }); + + //Components + var cboPageSizeUser = new Ext.form.ComboBox({ + id: "cboPageSizeUser", + + mode: "local", + triggerAction: "all", + store: storePageSize, + valueField: "size", + displayField: "size", + width: 50, + editable: false, + + listeners: { + select: function (combo, record, index) + { + pageSizeU = parseInt(record.data["size"]); + + pagingUser.pageSize = pageSizeU; + pagingUser.moveFirst(); + } + } + }); + + pagingUser = new Ext.PagingToolbar({ + id: "pagingUser", + + pageSize: pageSizeU, + store: storeUser, + displayInfo: true, + displayMsg: _("ID_GRID_PAGE_DISPLAYING_ITEMS"), + emptyMsg: _("ID_NO_RECORDS_FOUND"), + items: ["-", _("ID_PAGE_SIZE") + " ", cboPageSizeUser] + }); + + var cboPageSizeAvailableUser = new Ext.form.ComboBox({ + id: "cboPageSizeAvailableUser", + + mode: "local", + triggerAction: "all", + store: storePageSize, + valueField: "size", + displayField: "size", + width: 50, + editable: false, + + listeners: { + select: function (combo, record, index) + { + pageSizeA = parseInt(record.data["size"]); + + pagingAvailableUser.pageSize = pageSizeA; + pagingAvailableUser.moveFirst(); + } + } + }); + + pagingAvailableUser = new Ext.PagingToolbar({ + id: "pagingAvailableUser", + + pageSize: pageSizeA, + store: storeAvailableUser, + displayInfo: true, + displayMsg: _("ID_GRID_PAGE_DISPLAYING_ITEMS"), + emptyMsg: _("ID_NO_RECORDS_FOUND"), + items: ["-", _("ID_PAGE_SIZE") + " ", cboPageSizeAvailableUser] }); cmodelU = new Ext.grid.ColumnModel({ @@ -510,7 +636,7 @@ Ext.onReady(function(){ title : _('ID_AVAILABLE_USERS'), region : 'center', ddGroup : 'assignedUGridDDGroup', - store : storeX, + store: storeAvailableUser, cm : cmodelU, sm : smodelX, enableDragDrop : true, @@ -528,7 +654,7 @@ Ext.onReady(function(){ columnLines : false, viewConfig : {forceFit:true}, tbar: [cancelEditPermissionsUButton,{xtype: 'tbfill'},'-',searchTextU, clearTextButtonU], - //bbar: [{xtype: 'tbfill'}, assignUAllButton], + bbar: pagingAvailableUser, listeners: {rowdblclick: AssignUserAction}, hidden : true }); @@ -537,7 +663,7 @@ Ext.onReady(function(){ layout : 'fit', title : _('ID_ASSIGNED_USERS'), ddGroup : 'availableUGridDDGroup', - store : storeU, + store: storeUser, cm : cmodelU, sm : smodelU, enableDragDrop : false, @@ -554,7 +680,8 @@ Ext.onReady(function(){ frame : false, columnLines : false, viewConfig : {forceFit:true}, - tbar : [editPermissionsUButton,{xtype: 'tbfill'},'-',searchTextX, clearTextButtonX] + tbar: [editPermissionsUButton, {xtype: "tbfill"}, "-", searchTextX, clearTextButtonX], + bbar: pagingUser }); buttonsUPanel = new Ext.Panel({ @@ -613,6 +740,9 @@ Ext.onReady(function(){ } }); + cboPageSizeUser.setValue(pageSizeU); + cboPageSizeAvailableUser.setValue(pageSizeA); + //LOAD ALL PANELS viewport = new Ext.Viewport({ layout: 'border', From 58b80f54a174368d07b747710323042ccc87b90c Mon Sep 17 00:00:00 2001 From: Chloe Deguzman Date: Mon, 21 Mar 2016 22:25:04 +0000 Subject: [PATCH 07/19] HOR-281 No longer assumes mysql for escaping. --- gulliver/methods/genericAjax.php | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/gulliver/methods/genericAjax.php b/gulliver/methods/genericAjax.php index cb4cd64b4..af051ac58 100755 --- a/gulliver/methods/genericAjax.php +++ b/gulliver/methods/genericAjax.php @@ -178,15 +178,10 @@ if( isset($request) ){ try { $con = Propel::getConnection($_GET['cnn']); if($_GET['pkt'] == 'int'){ - // I know this isn't perfect - // but this is the sanitization - // that's used by Creole. - - $primaryKeyField = mysql_real_escape_string($_GET['pk']); - $tableName = mysql_real_escape_string($_GET['table']); - $primaryKeyField = str_replace("`", "", $primaryKeyField); - $tableName = str_replace("`", "", $tableName); - $rs = $con->executeQuery("SELECT MAX(`$primaryKeyField`) as lastId FROM `$tableName`"); + + $primaryKeyField = Propel::getDB($_GET['cnn'])->quoteIdentifier($_GET['pk']); + $tableName = Propel::getDB($_GET['cnn'])->quoteIdentifier($_GET['table']); + $rs = $con->executeQuery("SELECT MAX($primaryKeyField) as lastId FROM $tableName"); $rs->next(); $row = $rs->getRow(); $gKey = (int)$row['lastId'] + 1; From 8a49a366ac0c39e26e266c74f7714b44b68d32e3 Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Tue, 22 Mar 2016 11:55:24 -0400 Subject: [PATCH 08/19] fix in risk date --- workflow/engine/src/ProcessMaker/Services/Api/Light.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Light.php b/workflow/engine/src/ProcessMaker/Services/Api/Light.php index cfbbc4651..aa7d92646 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Light.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Light.php @@ -25,7 +25,8 @@ class Light extends Api //return lists 'date', 'delegateDate', - 'dueDate' + 'dueDate', + 'delRiskDate' ]; /** * Get list counters From 412d121c7b9a8d0a912db3a05bb98d895996b53e Mon Sep 17 00:00:00 2001 From: richardnoel Date: Tue, 22 Mar 2016 13:45:15 -0400 Subject: [PATCH 09/19] OM-[PMDynaform] Crear un componente flashMessage --- workflow/engine/js/cases/core/pmDynaform.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/js/cases/core/pmDynaform.js b/workflow/engine/js/cases/core/pmDynaform.js index 19794e330..616efbe15 100644 --- a/workflow/engine/js/cases/core/pmDynaform.js +++ b/workflow/engine/js/cases/core/pmDynaform.js @@ -55,7 +55,7 @@ $(window).load(function () { }; } var data = jsondata; - window.project = new PMDynaform.core.Project({ + window.dynaform = new PMDynaform.core.Project({ data: data, onBeforePrintHandler : function () { var nodeClone = $(".pmdynaform-container").clone(); From 6470adda9bd04d096a0ebea7e7cf884dc8bd5dd4 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Tue, 22 Mar 2016 16:10:18 -0400 Subject: [PATCH 10/19] HOR-509 "Departaments> Al dar click en todos para asignar..." SOLVED Issue: Departaments> Al dar click en todos para asignar usuarios en Departamentos tarda demasiado y sale un error Cause: El codigo en la seccion "assignedUsers" y "availableUsers" en departments_Ajax.php no son optimos Solution: - Se implemento el metodo \ProcessMaker\BusinessModel\Department::getUsers() (Back-End) - Se agrego el pager a los grids en ADMIN>Users>Departments>Users (Front-End) --- .../methods/departments/departmentUsers.php | 6 + .../methods/departments/departments_Ajax.php | 88 ++--- .../ProcessMaker/BusinessModel/Department.php | 300 ++++++++++++------ .../ProcessMaker/Services/Api/Department.php | 18 +- .../templates/departments/departmentUsers.js | 222 ++++++++++--- 5 files changed, 442 insertions(+), 192 deletions(-) diff --git a/workflow/engine/methods/departments/departmentUsers.php b/workflow/engine/methods/departments/departmentUsers.php index 0c2d80c09..e435b596b 100755 --- a/workflow/engine/methods/departments/departmentUsers.php +++ b/workflow/engine/methods/departments/departmentUsers.php @@ -63,6 +63,11 @@ $oHeadPublisher->addContent( 'departments/departmentUsers' ); //adding a html fi G::LoadClass( 'configuration' ); $c = new Configurations(); +$arrayConfigPage = $c->getConfiguration('departmentUsersList', 'pageSize', null, $_SESSION['USER_LOGGED']); + +$arrayConfig = []; +$arrayConfig['pageSize'] = (isset($arrayConfigPage['pageSize']))? $arrayConfigPage['pageSize'] : 20; + $dep = new Department(); $dep->Load( $_GET['dUID'] ); @@ -73,6 +78,7 @@ $depart['DEP_MANAGER'] = $dep->getDepManager(); $oHeadPublisher->assign( 'DEPARTMENT', $depart ); $oHeadPublisher->assign( 'FORMATS', $c->getFormats() ); +$oHeadPublisher->assign('CONFIG', $arrayConfig); G::RenderPage( 'publish', 'extJs' ); diff --git a/workflow/engine/methods/departments/departments_Ajax.php b/workflow/engine/methods/departments/departments_Ajax.php index e1fa0f4be..0be601615 100755 --- a/workflow/engine/methods/departments/departments_Ajax.php +++ b/workflow/engine/methods/departments/departments_Ajax.php @@ -22,12 +22,6 @@ * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. */ - -G::LoadSystem('inputfilter'); -$filter = new InputFilter(); -$_POST = $filter->xssFilterHard($_POST); -$_REQUEST = $filter->xssFilterHard($_REQUEST); - function LookForChildren ($parent, $level, $aDepUsers) { G::LoadClass( 'configuration' ); @@ -251,7 +245,7 @@ switch ($_POST['action']) { while ($oDataset->next()) { $aRow = $oDataset->getRow(); - $managerName = $aRow['USR_USERNAME'] ? " - Department Manager: ".$aRow['USR_USERNAME'] : 'No Manager'; + $managerName = $aRow['USR_USERNAME'] ? " - Department Manager: ".$aRow['USR_USERNAME'] : 'No Manager'; } } @@ -282,55 +276,43 @@ switch ($_POST['action']) { echo '{success: true}'; break; case 'assignedUsers': - $filter = isset( $_POST['textFilter'] ) ? $_POST['textFilter'] : ''; - $dep_uid = $_REQUEST['dUID']; - $oDept = new Department(); - $oDept->Load( $dep_uid ); - $manager = $oDept->getDepManager(); - $oCriteria = new Criteria( 'workflow' ); - $oCriteria->addSelectColumn( UsersPeer::USR_UID ); - $oCriteria->addSelectColumn( UsersPeer::USR_USERNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_FIRSTNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_LASTNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_STATUS ); - $oCriteria->add( UsersPeer::DEP_UID, '' ); - $oCriteria->add( UsersPeer::USR_STATUS, 'CLOSED', Criteria::NOT_EQUAL ); - if ($filter != '') { - $oCriteria->add( $oCriteria->getNewCriterion( UsersPeer::USR_USERNAME, '%' . $filter . '%', Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_FIRSTNAME, '%' . $filter . '%', Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_LASTNAME, '%' . $filter . '%', Criteria::LIKE ) ) ) ); - } - $oCriteria->add( UsersPeer::DEP_UID, $dep_uid ); - $oDataset = UsersPeer::doSelectRS( $oCriteria ); - $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); - $aUsers = array (); - while ($oDataset->next()) { - $aUsers[] = $oDataset->getRow(); - $index = sizeof( $aUsers ) - 1; - $aUsers[$index]['USR_SUPERVISOR'] = ($manager == $aUsers[$index]['USR_UID']) ? true : false; - } - echo '{users:' . G::json_encode( $aUsers ) . '}'; - break; case 'availableUsers': - $filter = isset( $_POST['textFilter'] ) ? $_POST['textFilter'] : ''; - $dep_uid = $_REQUEST['dUID']; - $oCriteria = new Criteria( 'workflow' ); - $oCriteria->addSelectColumn( UsersPeer::USR_UID ); - $oCriteria->addSelectColumn( UsersPeer::USR_USERNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_FIRSTNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_LASTNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_STATUS ); - $oCriteria->add( UsersPeer::DEP_UID, '' ); - $oCriteria->add( UsersPeer::USR_STATUS, 'CLOSED', Criteria::NOT_EQUAL ); + $response = []; - if ($filter != '') { - $oCriteria->add( $oCriteria->getNewCriterion( UsersPeer::USR_USERNAME, '%' . $filter . '%', Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_FIRSTNAME, '%' . $filter . '%', Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_LASTNAME, '%' . $filter . '%', Criteria::LIKE ) ) ) ); + try { + $option = $_POST['option']; + $departmentUid = $_POST['departmentUid']; + + $pageSize = $_POST['pageSize']; + $filter = $_POST['filter']; + + $sortField = (isset($_POST['sort']) && $_POST['sort'] != 'USR_USERNAME')? $_POST['sort']: ''; + $sortDir = (isset($_POST['dir']))? $_POST['dir']: 'ASC'; + $start = (isset($_POST['start']))? $_POST['start']: 0; + $limit = (isset($_POST['limit']))? $_POST['limit']: $pageSize; + + $department = new \ProcessMaker\BusinessModel\Department(); + + $result = $department->getUsers( + $departmentUid, + $option, + ['filter' => $filter, 'filterOption' => ''], + $sortField, + $sortDir, + $start, + $limit + ); + + $response['status'] = 'OK'; + $response['success'] = true; + $response['resultTotal'] = $result['total']; + $response['resultRoot'] = $result['data']; + } catch (Exception $e) { + $response['status'] = 'ERROR'; + $response['message'] = $e->getMessage(); } - $oDataset = UsersPeer::doSelectRS( $oCriteria ); - $oDataset->setFetchmode( ResultSet::FETCHMODE_ASSOC ); - $aUsers = array (); - while ($oDataset->next()) { - $aUsers[] = $oDataset->getRow(); - } - echo '{users:' . G::json_encode( $aUsers ) . '}'; + + echo G::json_encode($response); break; case 'assignDepartmentToUserMultiple': $DEP_UID = $_REQUEST['DEP_UID']; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Department.php b/workflow/engine/src/ProcessMaker/BusinessModel/Department.php index 0d1149873..99052dc26 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Department.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Department.php @@ -146,95 +146,6 @@ class Department return $aDepts; } - /** - * Get list for Assigned User - * - * @access public - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia - * - * @return array - */ - public function getAssignedUser($dep_uid) - { - $dep_uid = Validator::depUid($dep_uid); - $oDept = new \Department(); - $oDept->Load( $dep_uid ); - $manager = $oDept->getDepManager(); - $oCriteria = new \Criteria( 'workflow' ); - $oCriteria->addSelectColumn( UsersPeer::USR_UID ); - $oCriteria->addSelectColumn( UsersPeer::USR_USERNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_FIRSTNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_LASTNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_STATUS ); - $oCriteria->add( UsersPeer::DEP_UID, '' ); - $oCriteria->add( UsersPeer::USR_STATUS, 'CLOSED', \Criteria::NOT_EQUAL ); - $oCriteria->add( UsersPeer::DEP_UID, $dep_uid ); - $oDataset = UsersPeer::doSelectRS( $oCriteria ); - $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); - $aUsers = array (); - while ($oDataset->next()) { - $dataTemp = $oDataset->getRow(); - $aUsers[] = array_change_key_case($dataTemp, CASE_LOWER); - $index = sizeof( $aUsers ) - 1; - $aUsers[$index]['usr_supervisor'] = ($manager == $aUsers[$index]['usr_uid']) ? true : false; - } - return $aUsers; - } - - /** - * Get list for Available User - * - * @access public - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia - * - * @return array - */ - public function getAvailableUser($dep_uid, $start = 0, $limit = 0, $search = '') - { - $dep_uid = Validator::depUid($dep_uid); - - $start = (int)$start; - $start = abs($start); - if ($start != 0) { - $start+1; - } - - $limit = (int)$limit; - $limit = abs($limit); - if ($limit == 0) { - $limit = 25; - } else { - $limit = (int)$limit; - } - - $oCriteria = new \Criteria( 'workflow' ); - $oCriteria->addSelectColumn( UsersPeer::USR_UID ); - $oCriteria->addSelectColumn( UsersPeer::USR_USERNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_FIRSTNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_LASTNAME ); - $oCriteria->addSelectColumn( UsersPeer::USR_STATUS ); - $oCriteria->add( UsersPeer::DEP_UID, '' ); - $oCriteria->add( UsersPeer::USR_STATUS, 'CLOSED', \Criteria::NOT_EQUAL ); - - $oCriteria->setLimit( $limit ); - $oCriteria->setOffset( $start ); - - if ($search != '') { - $oCriteria->add( $oCriteria->getNewCriterion( UsersPeer::USR_USERNAME, '%' . $search . '%', \Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_FIRSTNAME, '%' . $search . '%', \Criteria::LIKE )->addOr( $oCriteria->getNewCriterion( UsersPeer::USR_LASTNAME, '%' . $search . '%', \Criteria::LIKE ) ) ) ); - } - - $oDataset = UsersPeer::doSelectRS( $oCriteria ); - $oDataset->setFetchmode( \ResultSet::FETCHMODE_ASSOC ); - $aUsers = array (); - while ($oDataset->next()) { - $dataTemp = $oDataset->getRow(); - $aUsers[] = array_change_key_case($dataTemp, CASE_LOWER); - } - return $aUsers; - } - /** * Assign User to Department * @@ -323,6 +234,217 @@ class Department } } + /** + * Get custom record + * + * @param array $record Record + * + * @return array Return an array with custom record + */ + private function __getUserCustomRecordFromRecord(array $record) + { + try { + $recordc = [ + 'usr_uid' => $record['USR_UID'], + 'usr_username' => $record['USR_USERNAME'], + 'usr_firstname' => $record['USR_FIRSTNAME'], + 'usr_lastname' => $record['USR_LASTNAME'], + 'usr_status' => $record['USR_STATUS'] + ]; + + if (isset($record['USR_SUPERVISOR'])) { + $recordc['usr_supervisor'] = $record['USR_SUPERVISOR']; + } + + return $recordc; + } catch (\Exception $e) { + throw $e; + } + } + + /** + * Get all Users of a Department (Assigned/Available) + * + * @param string $departmentUid Unique id of Department + * @param string $option Option (ASSIGNED, AVAILABLE) + * @param array $arrayFilterData Data of the filters + * @param string $sortField Field name to sort + * @param string $sortDir Direction of sorting (ASC, DESC) + * @param int $start Start + * @param int $limit Limit + * @param bool $flagRecord Flag that set the "getting" of record + * @param bool $throwException Flag to throw the exception (This only if the parameters are invalid) + * (TRUE: throw the exception; FALSE: returns FALSE) + * + * @return array Return an array with all Users of a Department, ThrowTheException/FALSE otherwise + */ + public function getUsers( + $departmentUid, + $option, + array $arrayFilterData = null, + $sortField = null, + $sortDir = null, + $start = null, + $limit = null, + $flagRecord = true, + $throwException = true + ) { + try { + $arrayUser = array(); + + $numRecTotal = 0; + + //Verify data and Set variables + $flagFilter = !is_null($arrayFilterData) && is_array($arrayFilterData) && isset($arrayFilterData['filter']); + + $result = \ProcessMaker\BusinessModel\Validator::validatePagerDataByPagerDefinition( + ['$start' => $start, '$limit' => $limit], + ['$start' => '$start', '$limit' => '$limit'] + ); + + if ($result !== true) { + if ($throwException) { + throw new \Exception($result); + } else { + return false; + } + } + + $arrayDepartmentData = $this->getDepartmentRecordByPk( + $departmentUid, ['$departmentUid' => '$departmentUid'], $throwException + ); + + if ($arrayDepartmentData === false) { + return false; + } + + //Set variables + $filterName = 'filter'; + + if ($flagFilter) { + $arrayAux = [ + '' => 'filter', + 'LEFT' => 'lfilter', + 'RIGHT' => 'rfilter' + ]; + + $filterName = $arrayAux[ + (isset($arrayFilterData['filterOption']))? $arrayFilterData['filterOption'] : '' + ]; + } + + //Get data + if (!is_null($limit) && (string)($limit) == '0') { + return [ + 'total' => $numRecTotal, + 'start' => (int)((!is_null($start))? $start : 0), + 'limit' => (int)((!is_null($limit))? $limit : 0), + $filterName => ($flagFilter)? $arrayFilterData['filter'] : '', + 'data' => $arrayUser + ]; + } + + //Query + $criteria = new \Criteria('workflow'); + + $criteria->addSelectColumn(\UsersPeer::USR_UID); + $criteria->addSelectColumn(\UsersPeer::USR_USERNAME); + $criteria->addSelectColumn(\UsersPeer::USR_FIRSTNAME); + $criteria->addSelectColumn(\UsersPeer::USR_LASTNAME); + $criteria->addSelectColumn(\UsersPeer::USR_STATUS); + + $criteria->add(\UsersPeer::USR_STATUS, 'CLOSED', \Criteria::NOT_EQUAL); + + switch ($option) { + case 'ASSIGNED': + $criteria->add(\UsersPeer::DEP_UID, $departmentUid, \Criteria::EQUAL); + break; + case 'AVAILABLE': + $criteria->add(\UsersPeer::DEP_UID, '', \Criteria::EQUAL); + break; + } + + if ($flagFilter && trim($arrayFilterData['filter']) != '') { + $arraySearch = [ + '' => '%' . $arrayFilterData['filter'] . '%', + 'LEFT' => $arrayFilterData['filter'] . '%', + 'RIGHT' => '%' . $arrayFilterData['filter'] + ]; + + $search = $arraySearch[ + (isset($arrayFilterData['filterOption']))? $arrayFilterData['filterOption'] : '' + ]; + + $criteria->add( + $criteria->getNewCriterion(\UsersPeer::USR_USERNAME, $search, \Criteria::LIKE)->addOr( + $criteria->getNewCriterion(\UsersPeer::USR_FIRSTNAME, $search, \Criteria::LIKE)->addOr( + $criteria->getNewCriterion(\UsersPeer::USR_LASTNAME, $search, \Criteria::LIKE))) + ); + } + + //Number records total + $numRecTotal = \UsersPeer::doCount($criteria); + + //Query + $conf = new \Configurations(); + $sortFieldDefault = \UsersPeer::TABLE_NAME . '.' . $conf->userNameFormatGetFirstFieldByUsersTable(); + + if (!is_null($sortField) && trim($sortField) != '') { + $sortField = strtoupper($sortField); + + if (in_array(\UsersPeer::TABLE_NAME . '.' . $sortField, $criteria->getSelectColumns())) { + $sortField = \UsersPeer::TABLE_NAME . '.' . $sortField; + } else { + $sortField = $sortFieldDefault; + } + } else { + $sortField = $sortFieldDefault; + } + + if (!is_null($sortDir) && trim($sortDir) != '' && strtoupper($sortDir) == 'DESC') { + $criteria->addDescendingOrderByColumn($sortField); + } else { + $criteria->addAscendingOrderByColumn($sortField); + } + + if (!is_null($start)) { + $criteria->setOffset((int)($start)); + } + + if (!is_null($limit)) { + $criteria->setLimit((int)($limit)); + } + + $rsCriteria = \UsersPeer::doSelectRS($criteria); + $rsCriteria->setFetchmode(\ResultSet::FETCHMODE_ASSOC); + + while ($rsCriteria->next()) { + $record = $rsCriteria->getRow(); + + switch ($option) { + case 'ASSIGNED': + $record['USR_SUPERVISOR'] = $record['USR_UID'] == $arrayDepartmentData['DEP_MANAGER']; + break; + case 'AVAILABLE': + break; + } + + $arrayUser[] = ($flagRecord)? $record : $this->__getUserCustomRecordFromRecord($record); + } + + //Return + return [ + 'total' => $numRecTotal, + 'start' => (int)((!is_null($start))? $start : 0), + 'limit' => (int)((!is_null($limit))? $limit : 0), + $filterName => ($flagFilter)? $arrayFilterData['filter'] : '', + 'data' => $arrayUser + ]; + } catch (\Exception $e) { + throw $e; + } + } + /** * Put Set Manager User * diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Department.php b/workflow/engine/src/ProcessMaker/Services/Api/Department.php index 6c78f01df..967d91484 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Department.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Department.php @@ -64,8 +64,12 @@ class Department extends Api { try { $oDepartment = new \ProcessMaker\BusinessModel\Department(); - $response = $oDepartment->getAssignedUser($dep_uid); - return $response; + + $response = $oDepartment->getUsers( + $dep_uid, 'ASSIGNED', null, null, null, null, null, false + ); + + return $response['data']; } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } @@ -82,12 +86,16 @@ class Department extends Api * @return array * */ - public function doGetAvailableUser($dep_uid, $start = 0, $limit = 0, $search = '') + public function doGetAvailableUser($dep_uid, $start = null, $limit = null, $search = null) { try { $oDepartment = new \ProcessMaker\BusinessModel\Department(); - $response = $oDepartment->getAvailableUser($dep_uid, $start, $limit, $search); - return $response; + + $response = $oDepartment->getUsers( + $dep_uid, 'AVAILABLE', ['filter' => $search, 'filterOption' => ''], null, null, $start, $limit, false + ); + + return $response['data']; } catch (\Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } diff --git a/workflow/engine/templates/departments/departmentUsers.js b/workflow/engine/templates/departments/departmentUsers.js index 684003265..697c749de 100755 --- a/workflow/engine/templates/departments/departmentUsers.js +++ b/workflow/engine/templates/departments/departmentUsers.js @@ -20,8 +20,6 @@ new Ext.KeyMap(document, { } }); -var storeP; -var storeA; var cmodelP; var smodelA; var smodelP; @@ -45,7 +43,16 @@ var sw_func_auth; var sw_form_changed; var sw_user_summary; +var pagingUser; +var pagingAvailableUser; + Ext.onReady(function(){ + var loadMaskGridLoading = new Ext.LoadMask(Ext.getBody(), {msg: _("ID_LOADING_GRID")}); + + //Variables + var pageSizeU = parseInt(CONFIG.pageSize); + var pageSizeA = parseInt(CONFIG.pageSize); + sw_func_groups = false; //sw_func_reassign = false; sw_func_auth = false; @@ -63,7 +70,7 @@ Ext.onReady(function(){ handler: CancelEditMembersAction //hidden: true }); - + supervisorButton = new Ext.Action({ text: _('ID_SET_MANAGER'), iconCls: 'button_menu_ext ss_sprite ss_user_edit', @@ -83,42 +90,164 @@ Ext.onReady(function(){ iconCls: 'button_menu_ext ss_sprite ss_arrow_redo', handler: BackToUsers }); - + contextMenu = new Ext.menu.Menu({ items: [supervisorButton] }); - storeP = new Ext.data.GroupingStore( { - proxy : new Ext.data.HttpProxy({ - url: 'departments_Ajax?action=assignedUsers&dUID=' + DEPARTMENT.DEP_UID - }), - reader : new Ext.data.JsonReader( { - root: 'users', - fields : [ - {name : 'USR_UID'}, - {name : 'USR_USERNAME'}, - {name : 'USR_FIRSTNAME'}, - {name : 'USR_LASTNAME'}, - {name : 'USR_SUPERVISOR'}, - {name : 'USR_STATUS'} - ] - }) + //Stores + var storePageSize = new Ext.data.SimpleStore({ + fields: ["size"], + data: [["20"], ["30"], ["40"], ["50"], ["100"]], + autoLoad: true }); - storeA = new Ext.data.GroupingStore( { - proxy : new Ext.data.HttpProxy({ - url: 'departments_Ajax?action=availableUsers&dUID=' + DEPARTMENT.DEP_UID - }), - reader : new Ext.data.JsonReader( { - root: 'users', - fields : [ - {name : 'USR_UID'}, - {name : 'USR_USERNAME'}, - {name : 'USR_FIRSTNAME'}, - {name : 'USR_LASTNAME'}, - {name : 'USR_STATUS'} - ] - }) + var storeUser = new Ext.data.Store({ + proxy: new Ext.data.HttpProxy({ + url: "departments_Ajax", + method: "POST" + }), + + reader: new Ext.data.JsonReader({ + root: "resultRoot", + totalProperty: "resultTotal", + fields: [ + {name: "USR_UID"}, + {name: "USR_USERNAME"}, + {name: "USR_FIRSTNAME"}, + {name: "USR_LASTNAME"}, + {name: "USR_SUPERVISOR"}, + {name: "USR_STATUS"} + ] + }), + + remoteSort: true, + + listeners: { + beforeload: function (store) + { + loadMaskGridLoading.show(); + + this.baseParams = { + "option": "ASSIGNED", + "departmentUid": DEPARTMENT.DEP_UID, + "pageSize": pageSizeU, + "filter": searchTextP.getValue(), + "action": "assignedUsers" + }; + }, + load: function (store, record, opt) + { + loadMaskGridLoading.hide(); + } + } + }); + + var storeAvailableUser = new Ext.data.Store({ + proxy: new Ext.data.HttpProxy({ + url: "departments_Ajax", + method: "POST" + }), + + reader: new Ext.data.JsonReader({ + root: "resultRoot", + totalProperty: "resultTotal", + fields: [ + {name: "USR_UID"}, + {name: "USR_USERNAME"}, + {name: "USR_FIRSTNAME"}, + {name: "USR_LASTNAME"}, + {name: "USR_STATUS"} + ] + }), + + remoteSort: true, + + listeners: { + beforeload: function (store) + { + loadMaskGridLoading.show(); + + this.baseParams = { + "option": "AVAILABLE", + "departmentUid": DEPARTMENT.DEP_UID, + "pageSize": pageSizeA, + "filter": searchTextA.getValue(), + "action": "availableUsers" + }; + }, + load: function (store, record, opt) + { + loadMaskGridLoading.hide(); + } + } + }); + + //Components + var cboPageSizeUser = new Ext.form.ComboBox({ + id: "cboPageSizeUser", + + mode: "local", + triggerAction: "all", + store: storePageSize, + valueField: "size", + displayField: "size", + width: 50, + editable: false, + + listeners: { + select: function (combo, record, index) + { + pageSizeU = parseInt(record.data["size"]); + + pagingUser.pageSize = pageSizeU; + pagingUser.moveFirst(); + } + } + }); + + pagingUser = new Ext.PagingToolbar({ + id: "pagingUser", + + pageSize: pageSizeU, + store: storeUser, + displayInfo: true, + displayMsg: _("ID_GRID_PAGE_DISPLAYING_ITEMS"), + emptyMsg: _("ID_NO_RECORDS_FOUND"), + items: ["-", _("ID_PAGE_SIZE") + " ", cboPageSizeUser] + }); + + var cboPageSizeAvailableUser = new Ext.form.ComboBox({ + id: "cboPageSizeAvailableUser", + + mode: "local", + triggerAction: "all", + store: storePageSize, + valueField: "size", + displayField: "size", + width: 50, + editable: false, + + listeners: { + select: function (combo, record, index) + { + pageSizeA = parseInt(record.data["size"]); + + pagingAvailableUser.pageSize = pageSizeA; + pagingAvailableUser.moveFirst(); + } + } + }); + + pagingAvailableUser = new Ext.PagingToolbar({ + id: "pagingAvailableUser", + + pageSize: pageSizeA, + store: storeAvailableUser, + displayInfo: true, + displayMsg: _("ID_GRID_PAGE_DISPLAYING_ITEMS"), + emptyMsg: _("ID_NO_RECORDS_FOUND"), + items: ["-", _("ID_PAGE_SIZE") + " ", cboPageSizeAvailableUser] }); cmodelP = new Ext.grid.ColumnModel({ @@ -214,7 +343,7 @@ Ext.onReady(function(){ title : _('ID_AVAILABLE_USERS'), region : 'center', ddGroup : 'assignedGridDDGroup', - store : storeA, + store: storeAvailableUser, cm : cmodelP, sm : smodelA, enableDragDrop : true, @@ -232,7 +361,7 @@ Ext.onReady(function(){ columnLines : false, viewConfig : {forceFit:true}, tbar: [cancelEditMembersButton,{xtype: 'tbfill'},'-',searchTextA,clearTextButtonA], - //bbar: [{xtype: 'tbfill'}, cancelEditMembersButton], + bbar: pagingAvailableUser, listeners: {rowdblclick: AssignGroupsAction}, hidden: true }); @@ -241,7 +370,7 @@ Ext.onReady(function(){ layout : 'fit', title : _('ID_ASSIGNED_USERS'), ddGroup : 'availableGridDDGroup', - store : storeP, + store: storeUser, cm : cmodelP, sm : smodelP, enableDragDrop : true, @@ -259,21 +388,21 @@ Ext.onReady(function(){ columnLines : false, viewConfig : {forceFit:true}, tbar: [editMembersButton,'-',supervisorButton, NoSupervisorButton,{xtype: 'tbfill'},'-',searchTextP,clearTextButtonP], - //bbar: [{xtype: 'tbfill'},editMembersButton], + bbar: pagingUser, listeners: {rowdblclick: function(){ (availableGrid.hidden)? DoNothing() : RemoveGroupsAction(); } } }); - - assignedGrid.on('rowcontextmenu', + + assignedGrid.on('rowcontextmenu', function (grid, rowIndex, evt) { var sm = grid.getSelectionModel(); sm.selectRow(rowIndex, sm.isSelected(rowIndex)); }, this ); - + assignedGrid.on('contextmenu', function(evt){evt.preventDefault();}, this); assignedGrid.addListener('rowcontextmenu',onMessageContextMenu, this); @@ -315,12 +444,15 @@ Ext.onReady(function(){ tbar: [''+_('ID_DEPARTMENT') + ' : ' + DEPARTMENT.DEP_TITLE + '',{xtype: 'tbfill'},backButton] }); + cboPageSizeUser.setValue(pageSizeU); + cboPageSizeAvailableUser.setValue(pageSizeA); + //LOAD ALL PANELS viewport = new Ext.Viewport({ layout: 'border', items: [northPanel, UsersPanel] }); - + RefreshUsers(); DDLoadUsers(); @@ -477,12 +609,12 @@ RemoveAllGroupsAction = function(){ //Function DoSearch Available DoSearchA = function(){ - availableGrid.store.load({params: {textFilter: searchTextA.getValue()}}); + pagingAvailableUser.moveFirst(); }; //Function DoSearch Assigned DoSearchP = function(){ - assignedGrid.store.load({params: {textFilter: searchTextP.getValue()}}); + pagingUser.moveFirst(); }; //Load Grid By Default Available Members @@ -516,11 +648,11 @@ CancelEditMembersAction = function(){ if (rowsSelected.length == 1){ supervisorButton.enable(); NoSupervisorButton.enable(); - } + } else{ supervisorButton.disable(); NoSupervisorButton.disable(); - } + } UsersPanel.doLayout(); }; From 22691a06b01624d1d64018ae03fb31b4bf8170b9 Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Tue, 15 Mar 2016 11:54:22 -0400 Subject: [PATCH 11/19] HOR-435 It's necesary to close the session, if we close processmaker and open again HOME and DESIGNER are blocked fix in frames implementation of the template html and css fix in file css remove file add link fix in status code fix in remove confirm fix in edege --- workflow/engine/js/src/Register.js | 2 +- workflow/engine/js/src/Sessions.js | 59 ++++++---- workflow/engine/methods/dashboard/main.php | 3 + .../engine/methods/login/authentication.php | 2 +- workflow/engine/methods/login/login.php | 2 +- workflow/engine/methods/setup/main.php | 3 + .../methods/strategicDashboard/main.php | 3 + workflow/engine/methods/users/myInfo.php | 3 + .../engine/skinEngine/neoclassic/block.php | 105 ++++++++++++++++++ .../skinEngine/neoclassic/css2/block.css | 92 +++++++++++++++ .../neoclassic/images/fa-hand-pointer-o.png | Bin 0 -> 1824 bytes .../neoclassic/images/processmaker.logow.png | Bin 0 -> 6383 bytes 12 files changed, 249 insertions(+), 25 deletions(-) create mode 100644 workflow/engine/skinEngine/neoclassic/block.php create mode 100644 workflow/engine/skinEngine/neoclassic/css2/block.css create mode 100644 workflow/engine/skinEngine/neoclassic/images/fa-hand-pointer-o.png create mode 100644 workflow/engine/skinEngine/neoclassic/images/processmaker.logow.png diff --git a/workflow/engine/js/src/Register.js b/workflow/engine/js/src/Register.js index 15336890f..4610bd73d 100644 --- a/workflow/engine/js/src/Register.js +++ b/workflow/engine/js/src/Register.js @@ -1,3 +1,3 @@ PM.Sessions.register(); -localStorage.setItem('ID_BLOCKER_MSG', PM.Sessions.getCookie('PM-Warning')); \ No newline at end of file +PM.Sessions.setLabel('ID_BLOCKER_MSG', PM.Sessions.getCookie('PM-Warning')); \ No newline at end of file diff --git a/workflow/engine/js/src/Sessions.js b/workflow/engine/js/src/Sessions.js index c0599e4a2..e4ae2f89d 100644 --- a/workflow/engine/js/src/Sessions.js +++ b/workflow/engine/js/src/Sessions.js @@ -2,40 +2,41 @@ PM.Sessions = (function () { var Sessions = function () { if (window.location.pathname.indexOf("login") === -1 && window.location.pathname.indexOf("sysLogin") === -1 && - this.getCookie('PM-TabPrimary') != 101010010) { + this.getCookie('PM-TabPrimary') !== '101010010') { + this.isClose = (this.getLabel('mainWindowClose') === "true"); + if (this.isClose && parent.parent.parent.window.name === "") { + this.register(); + } this.checkTab(); } }; Sessions.prototype.register = function () { + this.setLabel('mainWindowClose', false); window.name = this.getCookie('PM-TabPrimary'); }; Sessions.prototype.checkTab = function () { var ieVersion, - msg; - if (parent.parent.parent.window.name !== this.getCookie('PM-TabPrimary') && parent.parent.parent.window.name.indexOf(this.getCookie('PM-TabPrimary')) === -1 ) { + msg, + win; + if (window.name === this.getCookie('PM-TabPrimary')) { + this.setLabel('mainWindowClose', false); + } + if (parent.parent.parent.window.name !== this.getCookie('PM-TabPrimary') && + parent.parent.parent.window.name.indexOf(this.getCookie('PM-TabPrimary')) === -1 ) { ieVersion = this.detectBrowser(); msg = this.getLabel('ID_BLOCKER_MSG'); - + win = window.open('', '_self', ''); if (ieVersion && ieVersion <= 11) { - window.open('', '_self', ''); - window.document.execCommand('Stop'); - if (confirm(msg)) { - window.close(); - } - } else if (ieVersion && ieVersion <= 12) { - window.open('', '_self', ''); - window.document.execCommand('Stop'); - if (confirm(msg)) { - window.close(); - } + win.document.execCommand('Stop'); + win.open("/errors/block.php","_self"); + } else if (ieVersion && ieVersion <= 13) { + win.document.execCommand('Stop'); + win.open("/errors/block.php","_self"); } else { - window.open('', '_self', ''); - window.stop(); - if (confirm(msg)) { - window.close(); - } + win.stop(); + win.open("/errors/block.php","_self"); } } }; @@ -105,14 +106,28 @@ PM.Sessions = (function () { this.createCookie(name,"",-1); }; - Sessions.prototype.setLabel = function(nameLabel) { - localStorage.setItem(nameLabel, _(nameLabel)); + Sessions.prototype.setLabel = function(nameLabel, labelValue) { + localStorage.setItem(nameLabel, labelValue); }; Sessions.prototype.getLabel = function(nameLabel) { return localStorage.getItem(nameLabel); }; + Sessions.prototype.addEventHandler = function (elem, eventType, handler) { + if (elem.addEventListener) + elem.addEventListener(eventType, handler, false); + else if (elem.attachEvent) + elem.attachEvent('on' + eventType, handler); + }; + + Sessions.prototype.isClose = false; + return new Sessions(); })(); +PM.Sessions.addEventHandler(window, "unload",function () { + if (window.name === PM.Sessions.getCookie('PM-TabPrimary')){ + PM.Sessions.setLabel('mainWindowClose', true); + } +}); \ No newline at end of file diff --git a/workflow/engine/methods/dashboard/main.php b/workflow/engine/methods/dashboard/main.php index e787bb328..4f15ac770 100644 --- a/workflow/engine/methods/dashboard/main.php +++ b/workflow/engine/methods/dashboard/main.php @@ -29,5 +29,8 @@ $G_ID_MENU_SELECTED = 'DASHBOARD'; $G_PUBLISH = new Publisher(); $G_PUBLISH->AddContent( 'view', 'dashboard/load' ); +$oHeadPublisher = & headPublisher::getSingleton(); +$oHeadPublisher->addScriptFile('/jscore/src/PM.js'); +$oHeadPublisher->addScriptFile('/jscore/src/Sessions.js'); G::RenderPage( 'publish' ); diff --git a/workflow/engine/methods/login/authentication.php b/workflow/engine/methods/login/authentication.php index 2fee26017..a08c11c9a 100755 --- a/workflow/engine/methods/login/authentication.php +++ b/workflow/engine/methods/login/authentication.php @@ -413,7 +413,7 @@ try { } $configS = System::getSystemConfiguration('', '', SYS_SYS); - $activeSession = array_key_exists('session_block', $configS) ? !(int)$configS['session_block']:true; + $activeSession = isset($configS['session_block']) ? !(int)$configS['session_block']:true; if ($activeSession){ setcookie("PM-TabPrimary", 101010010, time() + (24 * 60 * 60), '/'); } diff --git a/workflow/engine/methods/login/login.php b/workflow/engine/methods/login/login.php index b9edcfc8a..e234c041e 100755 --- a/workflow/engine/methods/login/login.php +++ b/workflow/engine/methods/login/login.php @@ -338,7 +338,7 @@ $flagForgotPassword = isset($oConf->aConfig['login_enableForgotPassword']) ? $oConf->aConfig['login_enableForgotPassword'] : 'off'; -setcookie('PM-Warning', trim(G::LoadTranslation('ID_BLOCKER_MSG'),'*'), time() + (24 * 60 * 60), SYS_CURRENT_URI); +setcookie('PM-Warning', trim(G::LoadTranslation('ID_BLOCKER_MSG'), '*'), time() + (24 * 60 * 60), SYS_URI); setcookie("PM-TabPrimary", uniqid(), time() + (24 * 60 * 60), '/'); $oHeadPublisher->addScriptCode("var flagForgotPassword = '$flagForgotPassword';"); diff --git a/workflow/engine/methods/setup/main.php b/workflow/engine/methods/setup/main.php index 4e08f06d7..13a8807af 100755 --- a/workflow/engine/methods/setup/main.php +++ b/workflow/engine/methods/setup/main.php @@ -42,5 +42,8 @@ else { } $G_PUBLISH->AddContent( 'view', 'setup/main_Load' ); +$oHeadPublisher = & headPublisher::getSingleton(); +$oHeadPublisher->addScriptFile('/jscore/src/PM.js'); +$oHeadPublisher->addScriptFile('/jscore/src/Sessions.js'); G::RenderPage( 'publish' ); diff --git a/workflow/engine/methods/strategicDashboard/main.php b/workflow/engine/methods/strategicDashboard/main.php index 20277d740..e239d2420 100644 --- a/workflow/engine/methods/strategicDashboard/main.php +++ b/workflow/engine/methods/strategicDashboard/main.php @@ -34,6 +34,9 @@ $G_ID_MENU_SELECTED = 'DASHBOARD+'; $G_PUBLISH = new Publisher(); $G_PUBLISH->AddContent( 'view', 'strategicDashboard/load' ); +$oHeadPublisher = & headPublisher::getSingleton(); +$oHeadPublisher->addScriptFile('/jscore/src/PM.js'); +$oHeadPublisher->addScriptFile('/jscore/src/Sessions.js'); G::RenderPage( 'publish' ); diff --git a/workflow/engine/methods/users/myInfo.php b/workflow/engine/methods/users/myInfo.php index e9b23a245..62cf69fef 100755 --- a/workflow/engine/methods/users/myInfo.php +++ b/workflow/engine/methods/users/myInfo.php @@ -25,6 +25,9 @@ $G_MAIN_MENU = 'processmaker'; $G_ID_MENU_SELECTED = 'MY_ACCOUNT'; $G_PUBLISH = new Publisher(); +$oHeadPublisher = & headPublisher::getSingleton(); +$oHeadPublisher->addScriptFile('/jscore/src/PM.js'); +$oHeadPublisher->addScriptFile('/jscore/src/Sessions.js'); if (isset( $_GET['type'] )) { $G_PUBLISH->AddContent( 'view', 'users/usersReload' ); diff --git a/workflow/engine/skinEngine/neoclassic/block.php b/workflow/engine/skinEngine/neoclassic/block.php new file mode 100644 index 000000000..838647f2c --- /dev/null +++ b/workflow/engine/skinEngine/neoclassic/block.php @@ -0,0 +1,105 @@ + + + + + + + + + + + + + +
+ +
+ + +
+
+
+

+
+
+

Hi there, please check your tabs!

+

A browser instance of ProcessMaker is actually open. You can start only one at the time. + For more information: +

+ +
+
+
+
+
+ + + + + + + diff --git a/workflow/engine/skinEngine/neoclassic/css2/block.css b/workflow/engine/skinEngine/neoclassic/css2/block.css new file mode 100644 index 000000000..5dd5a2261 --- /dev/null +++ b/workflow/engine/skinEngine/neoclassic/css2/block.css @@ -0,0 +1,92 @@ +*, *:before, *:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +body { + font-family: "Helvetica Neue", Roboto, Arial, "Droid Sans", sans-serif; + font-size: 13px; + font-weight: 400; + line-height: 1.471; +} + +.special-page { + color: #fff; + background: #3397e2; +} + +.container { + width: 100%; + padding: 0; +} + +.col-md-55, .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + float: left; + padding-right: 10px; + padding-left: 10px; +} + +.col-middle { + margin-top: 5%; +} + +.text-center { + text-align: center; +} + +p { + margin: 0 0 10px; +} + +img { + vertical-align: middle; + border: 0; +} + +.text-error { + background: rgba(255,255,255,0.9); + color: #000; + padding: 25px 0; + margin: 120px 0; +} + +h1 { + margin-top: 10px; + margin-bottom: 10px; + font-family: 'Montserrat', sans-serif; + font-size: 36px; + font-weight: 500; + line-height: 1.1; + color: inherit; + margin: 0.67em 0; +} +b, strong { + font-weight: bold; +} +.mid_center { + width: 370px; + margin: 0 auto; + text-align: center; + padding: 10px 20px; +} +.btn-success { + border: none; + box-shadow: none; + border-radius: 2px; + font-size: 1.4rem; + cursor: pointer; + background: #1fbc99; + border: 1px solid #1ba385; +} + +.buttons, button, .btn { + margin-right: 5px; +} +#push, #footer { + height: 60px; + text-align: center; + color: #fff; +} \ No newline at end of file diff --git a/workflow/engine/skinEngine/neoclassic/images/fa-hand-pointer-o.png b/workflow/engine/skinEngine/neoclassic/images/fa-hand-pointer-o.png new file mode 100644 index 0000000000000000000000000000000000000000..feac7ccc2dcce8117df123dcb8e74fd9e89b6894 GIT binary patch literal 1824 zcmeHH`!^E|0Nt9+yk~hdjG6b$BX3!;2SY3q=9TxnBFbdx;Z5bWG)f*JuVTbOD5B6% zOnjdu^d-U+a|d(XMoTqtA-Q3X)|03hLDPjcP&kbemU?JF5a z4+Q{#GcHbUw)^q-|M)L9AUVM9++Vkh;Yv9P03HAdfg!?B5m7O52}voKH2k29tepHI zgo2_HQW=F-)6mq?#^_@83=EA-&CD$-7XpA5M#T^L8ww751ORlUL zgk6tQa={i1%Dx8Hn{jVabKGw=Z_fpt*)y1JT7n9aP2OF5sD~ruT}V+>6El{PuU%V) z+$RQWVDtk;cgkbaa2ct<_Gb7_Q78Tip&!>io;x)9N(`Qohj=*uUGGE#j(~bPQsU)I2QxlzP`U4yJYZ zaj=;k<6Ze;A(^lh>1ZJsP^kLlVUyj~o$%g2KqzPyM%o*#fj(5(K=7q3)t^Q`P|rfS zOS}b&sEw;(FXUQR16D8+x4MW2>J2|sPgQo}=UvT!W7IKL1b^#B;f%JwJ=^1btkMKt z{b{$xwnltH()ma(To&$g!vwbBTnIiReViB*$%RID2JK~Xh=0<_@(f>|>=zHdD#h($ zAyOh-^l=*-v<8!o92?1d6~3$d>7%`_F)6hmaBve$rL1T!0Cd%*Fk3q1a~4vwjWza? zc3et5zw%rqFRg{`z(H_zw3$9j8(5ShOMX#*s-brG2!Ilo`VHR&e|7;>_v(s147iR^ zPmH)SG6-5o3(8gi|G-r-Hj|aIyvN(&8Wz}P3!8GA`;am_z{w7;EUYHS^#eB4qfK-; zg+LuC&{{wyNhiM(aVm&Y#2lTwSA#wzK&HRp66Y%SbQ;KoP+Z~bqx~>prhiv zo_q8LwT&blk`s@2bSchsidnYirQO$_6DkJo3L7qmN99^z>1!2nLj?>EN%?h{i|L}0p5F8gcbS`h=311V z-j;Omx~gAo52Ez!yRc-20;f^=MWAH}&3+*>e~@NgOyADQP?wft^oiTq-eeiCc8Fp| z^A>)Sn9hd>{8!CmuOo}{<(htqs|-U2t$FU2L;B&ua!~^-rzE_R5B*Zf2rDR_2*zD4 z545x6zhujJ7asy?*7Y<`nxGShcYO#CL@0_{SjKdxC(W(Df@<(f80%a*YZK9HxqpTL M2U`lMi4c(b5B4!E=Kufz literal 0 HcmV?d00001 diff --git a/workflow/engine/skinEngine/neoclassic/images/processmaker.logow.png b/workflow/engine/skinEngine/neoclassic/images/processmaker.logow.png new file mode 100644 index 0000000000000000000000000000000000000000..f8981bd46676063bc18c20230422ddb81c75ffea GIT binary patch literal 6383 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 literal 0 HcmV?d00001 From 8fca5818f86fdcb5cf22402452e3ce0b01bf1eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Cesar=20Laura=20Avenda=C3=B1o?= Date: Tue, 22 Mar 2016 19:32:20 -0400 Subject: [PATCH 12/19] Update label ID_MSG_AJAX_FAILURE --- .../engine/content/translations/english/processmaker.en.po | 4 ++-- workflow/engine/data/mssql/insert.sql | 2 +- workflow/engine/data/mysql/insert.sql | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 1433b0429..60639f14a 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -6580,8 +6580,8 @@ msgstr "Do you want to assign all available users to this role?" # TRANSLATION # LABEL/ID_MSG_AJAX_FAILURE #: LABEL/ID_MSG_AJAX_FAILURE -msgid "Some error has occurred. Try again later." -msgstr "Some error has occurred. Try again later." +msgid "An error has occurred. Please contact your system administrator." +msgstr "An error has occurred. Please contact your system administrator." # TRANSLATION # LABEL/ID_FINISH diff --git a/workflow/engine/data/mssql/insert.sql b/workflow/engine/data/mssql/insert.sql index 4359f5680..b53bff8f4 100755 --- a/workflow/engine/data/mssql/insert.sql +++ b/workflow/engine/data/mssql/insert.sql @@ -3622,7 +3622,7 @@ SELECT 'LABEL','ID_ASSIGNED_USERS','en','ASSIGNED USERS','2014-01-15' UNION ALL SELECT 'LABEL','ID_MSG_CONFIRM_ASSIGN_ALL_USERS','en','Do you want to assign all available users to this role?','2014-01-15' UNION ALL -SELECT 'LABEL','ID_MSG_AJAX_FAILURE','en','Some error has occurred. Try again later.','2014-10-21' +SELECT 'LABEL','ID_MSG_AJAX_FAILURE','en','An error has occurred. Please contact your system administrator.','2014-10-21' UNION ALL SELECT 'LABEL','ID_FINISH','en','Finish','2014-01-15' UNION ALL diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 46bfd7d5a..63bb344cc 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -2528,7 +2528,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_AVAILABLE_USERS','en','AVAILABLE USERS','2014-01-15') , ( 'LABEL','ID_ASSIGNED_USERS','en','ASSIGNED USERS','2014-01-15') , ( 'LABEL','ID_MSG_CONFIRM_ASSIGN_ALL_USERS','en','Do you want to assign all available users to this role?','2014-01-15') , -( 'LABEL','ID_MSG_AJAX_FAILURE','en','Some error has occurred. Try again later.','2014-10-21') , +( 'LABEL','ID_MSG_AJAX_FAILURE','en','An error has occurred. Please contact your system administrator.','2014-10-21') , ( 'LABEL','ID_FINISH','en','Finish','2014-01-15') , ( 'LABEL','ID_USERS_SUCCESS_DELETE','en','User has been deleted correctly.','2014-01-15') , ( 'LABEL','ID_ASSIGN_ALL_GROUPS','en','Assign All Groups','2014-01-15') , From 1195c3091899fdae4138ea1b5680f00e960b04af Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Wed, 23 Mar 2016 10:59:49 -0400 Subject: [PATCH 13/19] HOR-537 (MultiTimeZone) El flag de multi time zone no cambia en base a la licencia ingresada fix in name workspace sys_sys --- .../engine/src/ProcessMaker/BusinessModel/Light.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php index 00429a5b3..48a0e2687 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php @@ -1257,11 +1257,18 @@ class Light */ public function getConfiguration() { - $sysConf = \System::getSystemConfiguration('', '', SYS_SYS); + $sysConf = \Bootstrap::getSystemConfiguration('','',SYS_SYS); + $multiTimeZone = false; + //Set Time Zone + /*----------------------------------********---------------------------------*/ + if (\PMLicensedFeatures::getSingleton()->verifyfeature + ('oq3S29xemxEZXJpZEIzN01qenJUaStSekY4cTdJVm5vbWtVM0d4S2lJSS9qUT0=')) { + $multiTimeZone = (int)($sysConf['system_utc_time_zone']) == 1; + } + /*----------------------------------********---------------------------------*/ $offset = timezone_offset_get( new \DateTimeZone( $sysConf['time_zone'] ), new \DateTime() ); $response['timeZone'] = sprintf( "GMT%s%02d:%02d", ( $offset >= 0 ) ? '+' : '-', abs( $offset / 3600 ), abs( ($offset % 3600) / 60 ) ); - $response['multiTimeZone'] = (isset($sysConf['system_utc_time_zone']) && $sysConf['system_utc_time_zone']) - ?true:false; + $response['multiTimeZone'] = $multiTimeZone; $fields = \System::getSysInfo(); $response['version'] = $fields['PM_VERSION']; From 98e55c6e1b7abeb9000e3bce532ce2b269d881b8 Mon Sep 17 00:00:00 2001 From: alex_santos Date: Wed, 23 Mar 2016 13:09:03 -0400 Subject: [PATCH 14/19] OM-357 --- workflow/engine/js/cases/core/pmDynaform.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/workflow/engine/js/cases/core/pmDynaform.js b/workflow/engine/js/cases/core/pmDynaform.js index ea1f22077..3aa5ba709 100644 --- a/workflow/engine/js/cases/core/pmDynaform.js +++ b/workflow/engine/js/cases/core/pmDynaform.js @@ -108,7 +108,14 @@ $(window).load(function () { form.appendChild(arrayRequired); dyn_forward = document.getElementById("dyn_forward"); dyn_forward.onclick = function () { - if (window.project.getForms()[0].isValid()) { + if (window.dynaform.getForms()[0].isValid()) { + //Destroy modal previous + if($('#modalProgressBar').length > 0){ + $('#modalProgressBar').remove(); + } + //Show Modal for nex step + var viewModalSubmit = new PMDynaform.view.ModalProgressBar(); + viewModalSubmit.render(); form.submit(); } return false; From 45e5cddf191f592cba5c6934f9820e411f804821 Mon Sep 17 00:00:00 2001 From: Ronald Q Date: Wed, 23 Mar 2016 13:53:56 -0400 Subject: [PATCH 15/19] =?UTF-8?q?HOR-541=20(Notifications)=20El=20nombre?= =?UTF-8?q?=20del=20.pem=20debe=20ser=20din=C3=A1mico=20en=20los=20archivo?= =?UTF-8?q?s=20que=20ejecutan=20las=20notificaciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix in mobile.ini fix un comment --- workflow/engine/config/mobile.ini | 1 - .../BusinessModel/Light/PushMessageIOS.php | 63 ++++++++++++------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/workflow/engine/config/mobile.ini b/workflow/engine/config/mobile.ini index 1a1de6f57..b76af1aa3 100644 --- a/workflow/engine/config/mobile.ini +++ b/workflow/engine/config/mobile.ini @@ -1,4 +1,3 @@ - ;Setting Android android[url] = "https://android.googleapis.com/gcm/send" android[serverApiKey] = "AIzaSyALwyLUYtZDcJQr54V5rxhZjoWnOLWCSvc" diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Light/PushMessageIOS.php b/workflow/engine/src/ProcessMaker/BusinessModel/Light/PushMessageIOS.php index 4cff8843d..33a9873c9 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Light/PushMessageIOS.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Light/PushMessageIOS.php @@ -14,34 +14,47 @@ namespace ProcessMaker\BusinessModel\Light; class PushMessageIOS { - var $url = 'ssl://gateway.sandbox.push.apple.com:2195'; - var $passphrase = "sample"; - var $pemFile; - var $devices = array(); - var $response = array(); + private $url = 'ssl://gateway.sandbox.push.apple.com:2195'; + private $passphrase = "sample"; + private $pemFile = 'mobileios.pem'; + private $devices = array(); + private $response = array(); /** + * Sete server notification Ios * @param $url string the url server */ - function setUrl($url){ + public function setUrl($url) + { $this->url = $url; } /** - * Constructor - * @param $passphrase update your private key's + * Set key passphrase + * @param string $passphrase update your private key's */ - function setKey($passphrase){ + public function setKey($passphrase) + { $this->passphrase = $passphrase; } /** - * Set the devices token to send to - * @param $deviceIds array of device tokens to send to + * Set name file .pem + * @param string $file name file .pem */ - function setDevices($devicesToken) + public function setPemFile($file) { - if(is_array($devicesToken)){ + $file = file_exists(PATH_CONFIG . $file)?$file:'mobileios.pem'; + $this->pemFile = $file; + } + + /** + * Set the devices token to send to + * @param array $devicesToken of device tokens to send to + */ + public function setDevices($devicesToken) + { + if (is_array($devicesToken)) { $this->devices = $devicesToken; } else { $this->devices = array($devicesToken); @@ -53,27 +66,30 @@ class PushMessageIOS */ public function setSettingNotification() { - $conf = \System::getSystemConfiguration( PATH_CONFIG . 'mobile.ini' ); + $conf = \System::getSystemConfiguration(PATH_CONFIG . 'mobile.ini'); $this->setUrl($conf['apple']['url']); $this->setKey($conf['apple']['passphrase']); + $this->setPemFile($conf['apple']['pemFile']); } /** * Send the message to the device - * @param $message the message to send - * @return mixed + * @param $message string the message to send + * @param $data object for payload body + * @return array + * @throws \Exception */ - function send($message, $data) + public function send($message, $data) { - if(!is_array($this->devices) || count($this->devices) == 0){ + if (!is_array($this->devices) || count($this->devices) == 0) { $this->error("No devices set"); } - if(strlen($this->passphrase) < 8){ + if (strlen($this->passphrase) < 8) { $this->error("Server API Key not set"); } $ctx = stream_context_create(); - stream_context_set_option($ctx, 'ssl', 'local_cert', PATH_CONFIG . 'mobileios.pem'); + stream_context_set_option($ctx, 'ssl', 'local_cert', PATH_CONFIG . $this->pemFile); stream_context_set_option($ctx, 'ssl', 'passphrase', $this->passphrase); // Open a connection to the APNS server @@ -88,7 +104,7 @@ class PushMessageIOS $body['aps'] = array( 'alert' => $message, 'sound' => 'default', - 'data' => $data + 'data' => $data ); } else { $body['aps'] = array( @@ -112,7 +128,7 @@ class PushMessageIOS $fp = stream_socket_client($this->url, $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) { - throw (new \Exception( \G::LoadTranslation( 'ID_FAILED' ).': ' ."$err $errstr")); + throw (new \Exception(\G::LoadTranslation('ID_FAILED') . ': ' . "$err $errstr")); } else { //echo 'Apple service is online. ' . '
'; } @@ -138,7 +154,8 @@ class PushMessageIOS return $this->response; } - function error($msg){ + public function error($msg) + { echo "Android send notification failed with error:"; echo "\t" . $msg; } From 7ffb786e55e8f091e253c73affc3be9d92b59f01 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Wed, 23 Mar 2016 16:42:11 -0400 Subject: [PATCH 16/19] HOR-539 "Contadores de casos pausados incorrectos" SOLVED Issue: Contadores de casos pausados incorrectos Cause: El comando upgrade utiliza los metodos del anterior listado Solution: - Se agrega validacion para los contadores del listado paused - Se debera ejecutar el comando "./processmaker migrate-new-cases-lists your-workflow" para reconstruir los datos --- workflow/engine/classes/class.wsTools.php | 2 +- .../engine/classes/model/AppCacheView.php | 31 ++++++++++++------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/workflow/engine/classes/class.wsTools.php b/workflow/engine/classes/class.wsTools.php index c714d880e..5937b3721 100755 --- a/workflow/engine/classes/class.wsTools.php +++ b/workflow/engine/classes/class.wsTools.php @@ -2157,7 +2157,7 @@ class workspaceTools while($dataset->next()) { $aRow = $dataset->getRow(); $oAppCache = new AppCacheView(); - $aCount = $oAppCache->getAllCounters( $aTypes, $aRow['USR_UID'] ); + $aCount = $oAppCache->getAllCounters($aTypes, $aRow['USR_UID'], false); $newData = array( 'USR_UID' => $aRow['USR_UID'], 'USR_TOTAL_INBOX' => $aCount['to_do'], diff --git a/workflow/engine/classes/model/AppCacheView.php b/workflow/engine/classes/model/AppCacheView.php index 7bbe195b0..da2bceb0f 100755 --- a/workflow/engine/classes/model/AppCacheView.php +++ b/workflow/engine/classes/model/AppCacheView.php @@ -34,18 +34,18 @@ class AppCacheView extends BaseAppCacheView public $confCasesList; public $pathToAppCacheFiles; - public function getAllCounters($aTypes, $userUid, $processSummary = false) + public function getAllCounters($aTypes, $userUid, $flagPausedSupervisor = true) { $aResult = array(); foreach ($aTypes as $type) { - $aResult[$type] = $this->getListCounters($type, $userUid, $processSummary); + $aResult[$type] = $this->getListCounters($type, $userUid, $flagPausedSupervisor); } return $aResult; } - public function getListCounters($type, $userUid, $processSummary) + public function getListCounters($type, $userUid, $flagPausedSupervisor = true) { $distinct = true; @@ -65,7 +65,7 @@ class AppCacheView extends BaseAppCacheView $distinct = false; break; case 'paused': - $criteria = $this->getPausedCountCriteria($userUid); + $criteria = $this->getPausedCountCriteria($userUid, $flagPausedSupervisor); break; case 'completed': $criteria = $this->getCompletedCountCriteria($userUid); @@ -520,9 +520,10 @@ class AppCacheView extends BaseAppCacheView * gets the PAUSED cases list criteria * param $userUid the current userUid * param $doCount if true this will return the criteria for count cases only + * @param bool $flagSupervisor Flag to include the records of the supervisor * @return Criteria object $Criteria */ - public function getPaused($userUid, $doCount) + public function getPaused($userUid, $doCount, $flagSupervisor = true) { //adding configuration fields from the configuration options //and forming the criteria object @@ -538,12 +539,17 @@ class AppCacheView extends BaseAppCacheView //$criteria->add(AppCacheViewPeer::USR_UID, $userUid); if (!empty($userUid)) { - $criteria->add( - $criteria->getNewCriterion(AppCacheViewPeer::USR_UID, $userUid)->addOr( - $criteria->getNewCriterion(AppCacheViewPeer::PRO_UID, $aProcesses, Criteria::IN)) - ); + $criterionAux = $criteria->getNewCriterion(AppCacheViewPeer::USR_UID, $userUid, Criteria::EQUAL); + + if ($flagSupervisor && !empty($aProcesses)) { + $criterionAux = $criterionAux->addOr( + $criteria->getNewCriterion(AppCacheViewPeer::PRO_UID, $aProcesses, Criteria::IN) + ); + } + + $criteria->add($criterionAux); } else { - if (count($aProcesses) > 0) { + if ($flagSupervisor && !empty($aProcesses)) { $criteria->add(AppCacheViewPeer::PRO_UID, $aProcesses, Criteria::IN); } } @@ -568,11 +574,12 @@ class AppCacheView extends BaseAppCacheView /** * gets the PAUSED cases list criteria for count * param $userUid the current userUid + * @param bool $flagSupervisor Flag to include the records of the supervisor * @return Criteria object $Criteria */ - public function getPausedCountCriteria($userUid) + public function getPausedCountCriteria($userUid, $flagSupervisor = true) { - return $this->getPaused($userUid, true); + return $this->getPaused($userUid, true, $flagSupervisor); } /** From bbb6a8ede04f3457661711cc02bd16321035195c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Cesar=20Laura=20Avenda=C3=B1o?= Date: Wed, 23 Mar 2016 17:00:14 -0400 Subject: [PATCH 17/19] HOR-545 --- workflow/engine/controllers/home.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/workflow/engine/controllers/home.php b/workflow/engine/controllers/home.php index 749193c59..1c8e240e4 100755 --- a/workflow/engine/controllers/home.php +++ b/workflow/engine/controllers/home.php @@ -105,6 +105,9 @@ class Home extends Controller foreach ($processList as $key => $valueProcess) { foreach ($proData as $keyPro => $valuePro) { + if (!isset($valueProcess['pro_uid'])) { + $valueProcess['pro_uid'] = ''; + } if ($valueProcess['pro_uid'] == $valuePro['PRO_UID']) { $processesList[] = $valueProcess; } From a795a78757ea8b0e4c4f7f89f18890007e1e4d08 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Wed, 23 Mar 2016 17:37:23 -0400 Subject: [PATCH 18/19] HOR-546 "Peticiones ajax en pmDynaform no funcionan" SOLVED Issue: Peticiones ajax en pmDynaform no funcionan Cause: Uso del flag para excluir el string del protocolo "http://" Solution: Se elimina el flag para excluir el string del protocolo "http://" --- workflow/engine/classes/class.pmDynaform.php | 16 ++++++++-------- workflow/engine/classes/class.system.php | 6 ++---- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 759c18731..3b10e45ed 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -649,7 +649,7 @@ class pmDynaform $javascript = " "; @@ -965,7 +965,7 @@ class pmDynaform $javascrip = "" . "