diff --git a/gulliver/system/class.rbac.php b/gulliver/system/class.rbac.php index 84742a456..6027ebbb0 100644 --- a/gulliver/system/class.rbac.php +++ b/gulliver/system/class.rbac.php @@ -670,6 +670,19 @@ class RBAC return $this->rolesObj->getAllUsersByRole(); } +/** + * this function gets the number of users by department + * + * + * @access public + * @author: Enrique Ponce de Leon + * + * @return $this->rolesObj->getAllUsersByRole + */ + function getAllUsersByDepartment(){ + return $this->rolesObj->getAllUsersByDepartment(); + } + /** * this function gets roles code * diff --git a/rbac/engine/classes/model/Roles.php b/rbac/engine/classes/model/Roles.php index 504f10ea6..b9feb92a5 100644 --- a/rbac/engine/classes/model/Roles.php +++ b/rbac/engine/classes/model/Roles.php @@ -359,6 +359,23 @@ class Roles extends BaseRoles { return $aRoles; } + //Added by Enrique at Feb 10th, 2011 + //Gets number of users by department + function getAllUsersByDepartment(){ + $oCriteria = new Criteria('rbac'); + $oCriteria->addSelectColumn(UsersPeer::DEP_UID); + $oCriteria->addSelectColumn('COUNT(*) AS CNT'); + $oCriteria->addGroupByColumn(UsersPeer::DEP_UID); + $oDataset = UsersPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $aDepts = array(); + while ($oDataset->next()){ + $row = $oDataset->getRow(); + $aDepts[$row['DEP_UID']] = $row['CNT']; + } + return $aDepts; + } + function getRoleUsers($ROL_UID, $filter='') { try { $criteria = new Criteria(); diff --git a/workflow/engine/methods/departments/departments.php b/workflow/engine/methods/departments/departments.php index 52c594c95..b6afccc1a 100644 --- a/workflow/engine/methods/departments/departments.php +++ b/workflow/engine/methods/departments/departments.php @@ -22,6 +22,8 @@ * Coral Gables, FL, 33134, USA, or email info@colosa.com. * */ +G::LoadClass('configuration'); +$c = new Configurations(); $access = $RBAC->userCanAccess('PM_USERS'); if( $access != 1 ){ @@ -50,313 +52,19 @@ if (($RBAC_Response=$RBAC->userCanAccess("PM_USERS"))!=1) return $RBAC_Response; $G_SUB_MENU = 'users'; $G_ID_MENU_SELECTED = 'USERS'; $G_ID_SUB_MENU_SELECTED = 'DEPARTMENTS'; - + $G_PUBLISH = new Publisher; - $oHeadPublisher =& headPublisher::getSingleton(); - //$oHeadPublisher->addScriptFile('/jscore/departments/departments.js'); - - $G_PUBLISH->AddContent('view', 'departments/departments_Tree' ); - $G_PUBLISH->AddContent('smarty', 'departments/departments_userList', '', '', array()); - - G::RenderPage( "publish-treeview",'blank' ); - $departments_New = G::encryptlink('departments_New'); - $departments_Edit = G::encryptlink('departments_Edit'); - $departments_Delete = G::encryptlink('departments_Delete'); - $departments_List = G::encryptlink('departments_List'); - $departments_AddUser = G::encryptlink('departments_AddUser'); - $departments_AddManager = G::encryptlink('departments_AddManager'); - $subdep_Edit = G::encryptlink('subdep_Edit'); - $subdep_Delete = G::encryptlink('subdep_Delete'); -?> - +//$labels = G::getTranslations(Array('ID_DEPARTMENTS','ID_DELETE','ID_EDIT','ID_USERS','ID_ACTIVE','ID_INACTIVE','ID_SELECT_STATUS', +// 'ID_CLOSE','ID_SAVE','ID_DEPARTMENT_NAME','ID_STATUS')); +// +//$oHeadPublisher->assign('TRANSLATIONS', $labels); +$oHeadPublisher->assign('FORMATS',$c->getFormats()); +G::RenderPage('publish', 'extJs'); +?> \ No newline at end of file diff --git a/workflow/engine/methods/departments/departments_Ajax.php b/workflow/engine/methods/departments/departments_Ajax.php index ed491860c..86587e266 100644 --- a/workflow/engine/methods/departments/departments_Ajax.php +++ b/workflow/engine/methods/departments/departments_Ajax.php @@ -22,6 +22,47 @@ * Coral Gables, FL, 33134, USA, or email info@colosa.com. * */ + + +function LookForChildren($parent, $level,$aDepUsers){ + G::LoadClass('configuration'); + $conf = new Configurations(); + $oDept = new Department(); + $allDepartments = $oDept->getDepartments ( $parent ); + $level++; + $rows = Array(); + foreach($allDepartments as $department){ + unset($depto); + $depto['DEP_TITLE'] = $department['DEP_TITLE']; + $depto['DEP_STATUS'] = $department['DEP_STATUS']; + if ($department['DEP_MANAGER_USERNAME']!=''){ + $depto['DEP_MANAGER_NAME'] = $conf->usersNameFormat($department['DEP_MANAGER_USERNAME'], $department['DEP_MANAGER_FIRSTNAME'], $department['DEP_MANAGER_LASTNAME']); + }else{ + $depto['DEP_MANAGER_NAME'] = ''; + } + $depto['DEP_TOTAL_USERS'] = isset($aDepUsers[$department['DEP_UID']])? $aDepUsers[$department['DEP_UID']] : 0; + $depto['DEP_UID'] = $department['DEP_UID']; + $depto['DEP_MANAGER'] = $department['DEP_MANAGER']; + $depto['DEP_PARENT'] = $department['DEP_PARENT']; + if ($department['HAS_CHILDREN'] > 0){ + $depto['children'] = LookForChildren($department['DEP_UID'], $level, $aDepUsers); + $depto['iconCls'] = 'ss_sprite ss_chart_organisation'; + $depto['expanded'] = true; + }else{ + $depto['leaf'] = true; + if ($level==1){ + $depto['iconCls'] = 'ss_sprite ss_chart_organisation'; + }else{ + $depto['iconCls'] = 'ss_sprite ss_plugin'; + } + } + + $rows[] = $depto; + } + return $rows; +} + + if (($RBAC_Response=$RBAC->userCanAccess("PM_USERS"))!=1) return $RBAC_Response; G::LoadInclude('ajax'); $_POST['action'] = get_ajax_value('action'); @@ -110,5 +151,210 @@ switch ($_POST['action']) G::RenderPage('publish', 'raw'); break; - + case 'departmentList': + global $RBAC; + $aDEPTS = $RBAC->getAllUsersByDepartment(); + $tree_depart = LookForChildren('', 0,$aDEPTS); + echo G::json_encode($tree_depart); + break; + case 'checkDepartmentName': + $parent = $_REQUEST['parent']; + $dep_name = $_REQUEST['name']; + + $oCriteria = new Criteria('workflow'); + + $oCriteria->clearSelectColumns(); + $oCriteria->addSelectColumn( ContentPeer::CON_CATEGORY ); + $oCriteria->addSelectColumn( ContentPeer::CON_VALUE ); + $oCriteria->addSelectColumn(DepartmentPeer::DEP_PARENT); + $oCriteria->add(ContentPeer::CON_CATEGORY, 'DEPO_TITLE'); + $oCriteria->addJoin(ContentPeer::CON_ID, DepartmentPeer::DEP_UID, Criteria::LEFT_JOIN); + $oCriteria->add(ContentPeer::CON_VALUE, $dep_name); + $oCriteria->add(ContentPeer::CON_LANG, SYS_LANG ); + $oCriteria->add(DepartmentPeer::DEP_PARENT,$parent); + + $oDataset = DepartmentPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + $aRow = $oDataset->getRow(); + + echo (!$aRow) ? 'true' : 'false'; + break; + case 'checkEditDepartmentName': + $parent = $_REQUEST['parent']; + $dep_name = $_REQUEST['name']; + $dep_uid = $_REQUEST['uid']; + + $oCriteria = new Criteria('workflow'); + $oCriteria->clearSelectColumns(); + $oCriteria->addSelectColumn( ContentPeer::CON_CATEGORY ); + $oCriteria->addSelectColumn( ContentPeer::CON_VALUE ); + $oCriteria->addSelectColumn(DepartmentPeer::DEP_PARENT); + $oCriteria->add(ContentPeer::CON_CATEGORY, 'DEPO_TITLE'); + $oCriteria->addJoin(ContentPeer::CON_ID, DepartmentPeer::DEP_UID, Criteria::LEFT_JOIN); + $oCriteria->add(ContentPeer::CON_VALUE, $dep_name); + $oCriteria->add(DepartmentPeer::DEP_UID,$dep_uid,Criteria::NOT_EQUAL); + $oCriteria->add(ContentPeer::CON_LANG, SYS_LANG ); + $oCriteria->add(DepartmentPeer::DEP_PARENT,$parent); + + $oDataset = DepartmentPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + $aRow = $oDataset->getRow(); + + echo (!$aRow) ? 'true' : 'false'; + break; + + case 'saveDepartment': + $parent = $_REQUEST['parent']; + $dep_name = $_REQUEST['name']; + $newDepartment['DEP_PARENT'] = $parent; + $newDepartment['DEP_TITLE'] = $dep_name; + $oDept = new Department(); + $oDept->create($newDepartment); + echo '{success: true}'; + break; + case 'usersByDepartment': + G::LoadClass ( 'configuration' ); + $sDepUid = $_REQUEST['DEP_UID']; + $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_REPORTS_TO); + $oCriteria->add(UsersPeer::USR_STATUS, 'CLOSED', Criteria::NOT_EQUAL); + $oCriteria->add(UsersPeer::DEP_UID, $sDepUid); + + $oDataset = DepartmentPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $rows = Array(); + + $conf = new Configurations(); + + while ($oDataset->next()){ + $aRow = $oDataset->getRow(); + $user['USR_UID'] = $aRow['USR_UID']; + $user['USR_VALUE'] = $conf->usersNameFormat($aRow['USR_USERNAME'], $aRow['USR_FIRSTNAME'], $aRow['USR_LASTNAME']); + $rows[] = $user; + } + + echo '{users: '.G::json_encode($rows).'}'; + break; + case 'updateDepartment': + try{ + $dep_name = $_REQUEST['name']; + echo $dep_name; + $dep_uid = $_REQUEST['uid']; + $dep_manager = $_REQUEST['manager']; + $dep_status = $_REQUEST['status']; + $editDepartment['DEP_UID'] = $dep_uid; + $editDepartment['DEPO_TITLE'] = $dep_name; + $editDepartment['DEP_STATUS'] = $dep_status; + $editDepartment['DEP_MANAGER'] = $dep_manager; + $oDept = new Department(); + $oDept->update($editDepartment); + $oDept->updateDepartmentManager($dep_uid); + echo '{success: true}'; + }catch(exception $e){ + echo '{success: false}'; + } + break; + case 'canDeleteDepartment': + global $RBAC; + $aDEPTS = $RBAC->getAllUsersByDepartment(); + if (isset($aDEPTS[$_POST['dep_uid']])){ + echo '{success: false, users: '.$aDEPTS[$_POST['dep_uid']].'}'; + }else{ + echo '{success: true}'; + } + break; + case 'deleteDepartment': + $DEP_UID = $_POST['DEP_UID']; + $oDept = new Department(); + $oDept->remove($DEP_UID); + echo '{success: true}'; + break; + case 'assignedUsers': + $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); + 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(); + } + 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->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))) + ); + } + $oDataset = UsersPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $aUsers = array(); + while ($oDataset->next()){ + $aUsers[] = $oDataset->getRow(); + } + echo '{users:'.G::json_encode($aUsers).'}'; + break; + case 'assignDepartmentToUserMultiple': + $DEP_UID = $_REQUEST['DEP_UID']; + $uSERS = $_REQUEST['USR_UID']; + $aUsers = explode(',',$uSERS); + $dep = new Department(); + $dep->Load($DEP_UID); + $dep_manager = $dep->getDepManager(); + $manager = ($dep_manager=='')? true : false; + foreach ($aUsers as $USR_UID){ + $dep->addUserToDepartment($DEP_UID, $USR_UID, $manager, false); + $manager = false; + } + $dep->updateDepartmentManager($DEP_UID); + break; + case 'deleteDepartmentToUserMultiple': + $DEP_UID = $_REQUEST['DEP_UID']; + $uSERS = $_REQUEST['USR_UID']; + $aUsers = explode(',',$uSERS); + $dep = new Department(); + $dep->Load($DEP_UID); + $manager = $dep->getDepManager(); + foreach ($aUsers as $USR_UID){ + $dep->removeUserFromDepartment($DEP_UID, $USR_UID); + if ($USR_UID==$manager){ + $editDepto['DEP_UID'] = $DEP_UID; + $editDepto['DEP_MANAGER'] = ''; + $dep->update($editDepto); + $dep->updateDepartmentManager($DEP_UID); + } + } + break; } diff --git a/workflow/engine/templates/departments/departmentList.html b/workflow/engine/templates/departments/departmentList.html new file mode 100755 index 000000000..432f567b5 --- /dev/null +++ b/workflow/engine/templates/departments/departmentList.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/workflow/engine/templates/departments/departmentList.js b/workflow/engine/templates/departments/departmentList.js new file mode 100755 index 000000000..6e789a3d2 --- /dev/null +++ b/workflow/engine/templates/departments/departmentList.js @@ -0,0 +1,435 @@ +/* + * @author: Qennix + * Jan 31th, 2011 + */ + +//Keyboard Events +new Ext.KeyMap(document, { + key: Ext.EventObject.F5, + fn: function(keycode, e) { + if (! e.ctrlKey) { + if (Ext.isIE) { + // IE6 doesn't allow cancellation of the F5 key, so trick it into + // thinking some other key was pressed (backspace in this case) + e.browserEvent.keyCode = 8; + } + e.stopEvent(); + document.location = document.location; + }else{ + Ext.Msg.alert('Refresh', 'You clicked: CTRL-F5'); + } + } +} +//, +//{ +// key: Ext.EventObject.DELETE, +// fn: function(k,e){ +// var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode(); +// //if (typeof dep_node != 'undefined') +// //if(dep_node.attributes.leaf){ +// DeleteDepartmentAction(); +// //} +// } +//} +); + +var treePanel; +var rootNode; + +Ext.onReady(function() { + Ext.QuickTips.init(); + + newButton = new Ext.Action({ + text: _('ID_NEW_DEPARTMENT'), + iconCls: ' button_menu_ext ss_sprite ss_add', + handler: NewRootDepartment + }); + + newSubButton = new Ext.Action({ + text: _('ID_NEW_SUB_DEPARTMENT'), + iconCls: ' button_menu_ext ss_sprite ss_add', + handler: NewSubDepartment, + disabled: true + }); + + editButton = new Ext.Action({ + text: _('ID_EDIT'), + iconCls: 'button_menu_ext ss_sprite ss_pencil', + handler: EditDepartmentAction, + disabled: true + }); + + deleteButton = new Ext.Action({ + text: _('ID_DELETE'), + iconCls: 'button_menu_ext ss_sprite ss_delete', + handler: DeleteDepartmentAction, + disabled: true + }); + + usersButton = new Ext.Action({ + text: _('ID_USERS'), + iconCls: 'button_menu_ext ss_sprite ss_user_add', + handler: UsersButtonAction, + disabled: true + }); + + contextMenu = new Ext.menu.Menu({ + items: [newSubButton,'-',editButton, deleteButton,'-',usersButton] + }); + + smodel = new Ext.tree.DefaultSelectionModel({ + listeners:{ + selectionchange: function(sm, node){ + editButton.enable(); + newSubButton.enable(); + usersButton.enable(); + if (!node){ + deleteButton.disable(); + }else{ + if (node.attributes.leaf){ + deleteButton.enable(); + }else{ + deleteButton.disable(); + } + } + //var tree = Ext.getCmp('treePanel'); + //alert(treePanel.getRootNode()); + } + } + }); + + comboStatusStore = new Ext.data.SimpleStore({ + fields: ['id','value'], + data: [['ACTIVE',_('ID_ACTIVE')],['INACTIVE',_('ID_INACTIVE')]] + }); + + comboDepManager = new Ext.data.GroupingStore( { + proxy : new Ext.data.HttpProxy({ + url: 'departments_Ajax?action=usersByDepartment' + }), + reader : new Ext.data.JsonReader( { + root: 'users', + fields : [ + {name : 'USR_UID'}, + {name : 'USR_VALUE'} + ] + }) + }); + + newForm = new Ext.FormPanel({ + url: 'departments_Ajax?request=saveNewDepartment', + frame: true, + items:[ + {xtype: 'textfield', name: 'parent', hidden: true}, + {xtype: 'textfield', fieldLabel: _('ID_DEPARTMENT_NAME'), name: 'dep_name', width: 230, allowBlank: false} + ], + buttons: [ + {text: _('ID_SAVE'), handler: SaveNewDepartment}, + {text: _('ID_CANCEL'), handler: CloseWindow} + + ], + labelWidth: 120 + }); + + editForm = new Ext.FormPanel({ + url: 'departments_Ajax?request=saveEditDepartment', + frame: true, + items:[ + {xtype: 'textfield', name: 'dep_uid', hidden: true}, + {xtype: 'textfield', name: 'dep_parent', hidden: true}, + {xtype: 'textfield', fieldLabel: _('ID_DEPARTMENT_NAME'), name: 'dep_name', width: 230, allowBlank: false}, + { + xtype: 'combo', + fieldLabel: _('ID_STATUS'), + hiddenName: 'status', + typeAhead: true, + mode: 'local', + store: comboStatusStore, + displayField: 'value', + valueField:'id', + allowBlank: false, + triggerAction: 'all', + emptyText: _('ID_SELECT_STATUS'), + selectOnFocus:true + } + , + { + xtype: 'combo', + fieldLabel: 'Manager', + hiddenName: 'manager', + typeAhead: true, + mode: 'local', + store: comboDepManager, + displayField: 'USR_VALUE', + valueField:'USR_UID', + allowBlank: true, + triggerAction: 'all', + emptyText: '', + selectOnFocus:true + } + ], + buttons: [ + {text: _('ID_SAVE'), handler: SaveEditDepartment}, + {text: _('ID_CANCEL'), handler: CloseWindow} + ], + labelWidth: 120 + }); + + rootNode = new Ext.tree.AsyncTreeNode({ + text:'Departments' + }); + + + treePanel = new Ext.ux.tree.TreeGrid({ + title: _('ID_DEPARTMENTS'), + autoScroll: true, + width: 720, + height: 300, + id: 'treePanel', + columns:[{ + header: _('ID_DEPARTMENT_NAME'), + dataIndex: 'DEP_TITLE', + width: 320 + },{ + header: _('ID_STATUS'), + width: 100, + dataIndex: 'DEP_STATUS', + align: 'center', + tpl: new Ext.XTemplate('{DEP_STATUS:this.formatStatus}', { + formatStatus: function(v) { + switch(v){ + case 'ACTIVE': return '' + _('ID_ACTIVE') + ''; break; + case 'INACTIVE': return '' + _('ID_INACTIVE') + ''; break; + } + } + }) + },{ + header: _('ID_MANAGER'), + width: 220, + dataIndex: 'DEP_MANAGER_NAME' + },{ + header: _('ID_USERS'), + width: 80, + dataIndex: 'DEP_TOTAL_USERS', + align: 'center', + sortType: 'asFloat' + } + ], + selModel: smodel, + tbar: [newButton,'-',newSubButton,'-',editButton, deleteButton,'-',usersButton], + dataUrl:'departments_Ajax?action=departmentList', + root: rootNode + }); + + treePanel.on('contextmenu', treeContextHandler); + + viewport = new Ext.Viewport({ + layout: 'fit', + autoScroll: false, + items: [treePanel] + }); + +}); + +//Funtion Handles Context Menu Opening +treeContextHandler = function(node, evt){ + node.select(); + var coords = evt.getXY(); + contextMenu.showAt([coords[0], coords[1]]); +}; + +//Do Nothing Function +DoNothing = function(){}; + +//Call New Department at Root +NewRootDepartment = function(){ + newForm.getForm().findField('parent').setValue(''); + w = new Ext.Window({ + title: _('ID_NEW_DEPARTMENT'), + autoHeight: true, + modal: true, + closable: false, + width: 420, + items: [newForm] + }); + w.show(); +}; + +//Call New Sub Department at Parent +NewSubDepartment = function(){ + var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode(); + newForm.getForm().findField('parent').setValue(dep_node.attributes.DEP_UID); + w = new Ext.Window({ + title: _('ID_NEW_SUB_DEPARTMENT'), + autoHeight: true, + modal: true, + closable: false, + width: 420, + items: [newForm] + }); + w.show(); +}; + +//Close PopUp Window +CloseWindow = function(){ + w.hide(); +}; + +SaveNewDepartment = function(){ + var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode(); + if (dep_node) dep_node.unselect(); + var dep_name = newForm.getForm().findField('dep_name').getValue(); + var dep_parent = newForm.getForm().findField('parent').getValue(); + Ext.Ajax.request({ + url: 'departments_Ajax', + params: {action: 'checkDepartmentName', name: dep_name, parent: dep_parent}, + success: function(resp, opt){ + var res_ok = eval(resp.responseText); + if (res_ok){ + Ext.Ajax.request({ + url: 'departments_Ajax', + params: {action: 'saveDepartment', name: dep_name, parent: dep_parent}, + success: function(r,o){ + var xtree = Ext.getCmp('treePanel'); + treePanel.getLoader().load(rootNode); + newSubButton.disable(); + editButton.disable(); + deleteButton.disable(); + usersButton.disable(); + newForm.getForm().findField('dep_name').reset(); + w.hide(); + PMExt.notify(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_SUCCESS_NEW')); + }, + failure: function(r,o){ + DoNothing(); + } + }); + }else{ + PMExt.error(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_EXISTS')); + } + }, + failure: function(resp, opt){ + DoNothing(); + } + }); +}; + +SaveEditDepartment = function(){ + var dep_name = editForm.getForm().findField('dep_name').getValue(); + var dep_parent = editForm.getForm().findField('dep_parent').getValue(); + var dep_uid = editForm.getForm().findField('dep_uid').getValue(); + var dep_status = editForm.getForm().findField('status').getValue(); + var dep_manager = editForm.getForm().findField('manager').getValue(); + var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode(); + if (dep_node) dep_node.unselect(); + Ext.Ajax.request({ + url: 'departments_Ajax', + params: {action: 'checkEditDepartmentName', name: dep_name, parent: dep_parent, uid: dep_uid}, + success: function(resp, opt){ + var res_ok = eval(resp.responseText); + if (res_ok){ + Ext.Ajax.request({ + url: 'departments_Ajax', + params: {action: 'updateDepartment', uid: dep_uid, name: dep_name, status: dep_status, manager: dep_manager}, + success: function(r,o){ + var xtree = Ext.getCmp('treePanel'); + xtree.getLoader().load(xtree.root); + newSubButton.disable(); + editButton.disable(); + deleteButton.disable(); + usersButton.disable(); + newForm.getForm().findField('dep_name').reset(); + w.hide(); + PMExt.notify(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_SUCCESS_UPDATE')); + }, + failure: function(r,o){ + DoNothing(); + } + }); + }else{ + PMExt.error(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_EXISTS')); + } + }, + failure: function(resp, opt){ + DoNothing(); + } + }); +}; + + +//Edit Department Action +EditDepartmentAction = function(){ + var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode(); + editForm.getForm().findField('dep_uid').setValue(dep_node.attributes.DEP_UID); + editForm.getForm().findField('dep_parent').setValue(dep_node.attributes.DEP_PARENT); + editForm.getForm().findField('dep_name').setValue(dep_node.attributes.DEP_TITLE); + editForm.getForm().findField('status').setValue(dep_node.attributes.DEP_STATUS); + editForm.getForm().findField('manager').getStore().addListener('load',function(s,r,o){ + editForm.getForm().findField('manager').setValue(dep_node.attributes.DEP_MANAGER); + }); + editForm.getForm().findField('manager').store.load({params: {DEP_UID: dep_node.attributes.DEP_UID }}); + w = new Ext.Window({ + title: _('ID_EDIT_DEPARTMENT'), + autoHeight: true, + modal: true, + closable: false, + width: 420, + items: [editForm] + }); + w.show(); +}; + +//Delete Department Action +DeleteDepartmentAction = function(){ + var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode(); + var DEP_UID = dep_node.attributes.DEP_UID; + if (dep_node) dep_node.unselect(); + viewport.getEl().mask(_('ID_PROCESSING')); + Ext.Ajax.request({ + url: 'departments_Ajax', + params: {action: 'canDeleteDepartment', dep_uid: DEP_UID }, + success: function(r,o){ + viewport.getEl().unmask(); + var response = Ext.util.JSON.decode(r.responseText); + if (response.success){ + + Ext.Msg.confirm(_('ID_DEPARTMENTS'), _('ID_CONFIRM_DELETE_DEPARTMENT'), + function(btn, text){ + if (btn=='yes'){ + viewport.getEl().mask(_('ID_PROCESSING')); + Ext.Ajax.request({ + url: 'departments_Ajax', + params: {action: 'deleteDepartment', DEP_UID: DEP_UID}, + success: function(r,o){ + viewport.getEl().unmask(); + treePanel.getRootNode().reload(); + newSubButton.disable(); + editButton.disable(); + deleteButton.disable(); + usersButton.disable(); + PMExt.notify(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_SUCCESS_DELETE')); + }, + failure: function(r,o){ + viewport.getEl().unmask(); + } + }); + } + }); + + }else{ + PMExt.error(_('ID_DEPARTMENTS'),_('ID_MSG_CANNOT_DELETE_DEPARTMENT')); + } + }, + failure: function(r,o){ + viewport.getEl().unmask(); + + } + }); +}; + +//User Assined Action +UsersButtonAction = function(){ + var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode(); + var DEP_UID = dep_node.attributes.DEP_UID; + location.href= 'departmentUsers?dUID=' + DEP_UID; +}; \ No newline at end of file diff --git a/workflow/engine/templates/departments/departmentUsers.html b/workflow/engine/templates/departments/departmentUsers.html new file mode 100755 index 000000000..7f6b02bfb --- /dev/null +++ b/workflow/engine/templates/departments/departmentUsers.html @@ -0,0 +1,4 @@ +
+
+
+ diff --git a/workflow/engine/templates/departments/departmentUsers.js b/workflow/engine/templates/departments/departmentUsers.js new file mode 100755 index 000000000..2f09c797b --- /dev/null +++ b/workflow/engine/templates/departments/departmentUsers.js @@ -0,0 +1,478 @@ +/* +* @author: Qennix +* Feb 10th, 2011 +*/ + +//Keyboard Events +new Ext.KeyMap(document, { + key: Ext.EventObject.F5, + fn: function(keycode, e) { + if (! e.ctrlKey) { + if (Ext.isIE) { + // IE6 doesn't allow cancellation of the F5 key, so trick it into + // thinking some other key was pressed (backspace in this case) + e.browserEvent.keyCode = 8; + } + e.stopEvent(); + document.location = document.location; + }else{ + Ext.Msg.alert('Refresh', 'You clicked: CTRL-F5'); + } + } +}); + +var storeP; +var storeA; +var cmodelP; +var smodelA; +var smodelP; +var availableGrid; +var assignedGrid; +var GroupsPanel; +var AuthenticationPanel; +var northPanel; +var tabsPanel; +var viewport; +var assignButton; +var assignAllButton; +var removeButton; +var removeAllButton; +var backButton; +var discardChangesButton; +var saveChangesButton; +var sw_func_groups; +//var sw_func_reassign; +var sw_func_auth; +var sw_form_changed; +var sw_user_summary; + +Ext.onReady(function(){ + sw_func_groups = false; + //sw_func_reassign = false; + sw_func_auth = false; + sw_user_summary = false; + + editMembersButton = new Ext.Action({ + text: _('ID_EDIT_USERS'), + iconCls: 'button_menu_ext ss_sprite ss_user_add', + handler: EditMembersAction + }); + + cancelEditMembersButton = new Ext.Action({ + text: _('ID_FINISH_EDITION'), + iconCls: 'button_menu_ext ss_sprite ss_cancel', + handler: CancelEditMembersAction, + hidden: true + }); + + backButton = new Ext.Action({ + text : _('ID_BACK'), + iconCls: 'button_menu_ext ss_sprite ss_arrow_redo', + handler: BackToUsers + }); + +// saveChangesButton = new Ext.Action({ +// text: _('ID_SAVE_CHANGES'), +// //iconCls: 'button_menu_ext ss_sprite ss_arrow_redo', +// handler: SaveChangesAuthForm, +// disabled: true +// }); + +// discardChangesButton = new Ext.Action({ +// text: _('ID_DISCARD_CHANGES'), +// //iconCls: 'button_menu_ext ss_sprite ss_arrow_redo', +// handler: LoadAuthForm, +// disabled: true +// }); + + 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'} + ] + }) + }); + + 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'} + ] + }) + }); + + cmodelP = new Ext.grid.ColumnModel({ + defaults: { + width: 50, + sortable: true + }, + columns: [ + {id:'USR_UID', dataIndex: 'USR_UID', hidden:true, hideable:false}, + {header: _('ID_FULL_NAME'), dataIndex: 'USR_USERNAME', width: 60, align:'left', renderer: show_user} + ] + }); + + smodelA = new Ext.grid.RowSelectionModel({ + selectSingle: false, + listeners:{ + selectionchange: function(sm){ + switch(sm.getCount()){ + case 0: Ext.getCmp('assignButton').disable(); break; + default: Ext.getCmp('assignButton').enable(); break; + } + } + } + }); + + smodelP = new Ext.grid.RowSelectionModel({ + selectSingle: false, + listeners:{ + selectionchange: function(sm){ + switch(sm.getCount()){ + case 0: Ext.getCmp('removeButton').disable(); break; + default: Ext.getCmp('removeButton').enable(); break; + } + } + } + }); + + searchTextA = new Ext.form.TextField ({ + id: 'searchTextA', + ctCls:'pm_search_text_field', + allowBlank: true, + width: 110, + emptyText: _('ID_ENTER_SEARCH_TERM'), + listeners: { + specialkey: function(f,e){ + if (e.getKey() == e.ENTER) { + DoSearchA(); + } + } + } + }); + + clearTextButtonA = new Ext.Action({ + text: 'X', + ctCls:'pm_search_x_button', + handler: GridByDefaultA + }); + + searchTextP = new Ext.form.TextField ({ + id: 'searchTextP', + ctCls:'pm_search_text_field', + allowBlank: true, + width: 110, + emptyText: _('ID_ENTER_SEARCH_TERM'), + listeners: { + specialkey: function(f,e){ + if (e.getKey() == e.ENTER) { + DoSearchP(); + } + } + } + }); + + clearTextButtonP = new Ext.Action({ + text: 'X', + ctCls:'pm_search_x_button', + handler: GridByDefaultP + }); + + availableGrid = new Ext.grid.GridPanel({ + layout : 'fit', + region : 'center', + ddGroup : 'assignedGridDDGroup', + store : storeA, + cm : cmodelP, + sm : smodelA, + enableDragDrop : true, + stripeRows : true, + autoExpandColumn: 'CON_VALUE', + iconCls : 'icon-grid', + id : 'availableGrid', + height : 100, + autoWidth : true, + stateful : true, + stateId : 'grid', + enableColumnResize : true, + enableHdMenu : true, + frame : false, + columnLines : false, + viewConfig : {forceFit:true}, + tbar: [_('ID_AVAILABLE_USERS'),{xtype: 'tbfill'},'-',searchTextA,clearTextButtonA], + //bbar: [{xtype: 'tbfill'}, cancelEditMembersButton], + listeners: {rowdblclick: AssignGroupsAction}, + hidden: true + }); + + assignedGrid = new Ext.grid.GridPanel({ + layout : 'fit', + ddGroup : 'availableGridDDGroup', + store : storeP, + cm : cmodelP, + sm : smodelP, + enableDragDrop : true, + stripeRows : true, + autoExpandColumn: 'CON_VALUE', + iconCls : 'icon-grid', + id : 'assignedGrid', + height : 100, + autoWidth : true, + stateful : true, + stateId : 'grid', + enableColumnResize : true, + enableHdMenu : true, + frame : false, + columnLines : false, + viewConfig : {forceFit:true}, + tbar: [_('ID_ASSIGNED_USERS'),{xtype: 'tbfill'},'-',searchTextP,clearTextButtonP], + //bbar: [{xtype: 'tbfill'},editMembersButton], + listeners: {rowdblclick: function(){ + (availableGrid.hidden)? DoNothing() : RemoveGroupsAction(); + }} + }); + + buttonsPanel = new Ext.Panel({ + width : 40, + layout : { + type:'vbox', + padding:'0', + pack:'center', + align:'center' + }, + defaults:{margins:'0 0 35 0'}, + items:[ + {xtype:'button',text: '>', handler: AssignGroupsAction, id: 'assignButton', disabled: true}, + {xtype:'button',text: '<', handler: RemoveGroupsAction, id: 'removeButton', disabled: true}, + {xtype:'button',text: '>>', handler: AssignAllGroupsAction, id: 'assignButtonAll', disabled: false}, + {xtype:'button',text: '<<', handler: RemoveAllGroupsAction, id: 'removeButtonAll', disabled: false} + ], + hidden: true + }); + + //GROUPS DRAG AND DROP PANEL + UsersPanel = new Ext.Panel({ + region: 'center', + //title : _('ID_USERS'), + autoWidth : true, + layout : 'hbox', + defaults : { flex : 1 }, //auto stretch + layoutConfig : { align : 'stretch' }, + items : [availableGrid,buttonsPanel,assignedGrid], + viewConfig : {forceFit:true}, + bbar: [{xtype: 'tbfill'},editMembersButton, cancelEditMembersButton] + }); + + //NORTH PANEL WITH TITLE AND ROLE DETAILS + northPanel = new Ext.Panel({ + region: 'north', + xtype: 'panel', + tbar: [''+_('ID_DEPARTMENT') + ' : ' + DEPARTMENT.DEP_TITLE + '',{xtype: 'tbfill'},backButton] + }); + + + + //LOAD ALL PANELS + viewport = new Ext.Viewport({ + layout: 'border', + items: [northPanel, UsersPanel] + }); + + RefreshUsers(); + DDLoadUsers(); + +}); + +//Do Nothing Function +DoNothing = function(){}; + +//Return to Roles Main Page +BackToUsers = function(){ + location.href = 'departments'; +}; + +//Loads Drag N Drop Functionality for Permissions +DDLoadUsers = function(){ + //GROUPS DRAG N DROP AVAILABLE + var availableGridDropTargetEl = availableGrid.getView().scroller.dom; + var availableGridDropTarget = new Ext.dd.DropTarget(availableGridDropTargetEl, { + ddGroup : 'availableGridDDGroup', + notifyDrop : function(ddSource, e, data){ + var records = ddSource.dragData.selections; + var arrAux = new Array(); + for (var r=0; r < records.length; r++){ + arrAux[r] = records[r].data['USR_UID']; + } + DeleteDepartmentUser(arrAux,RefreshUsers,FailureProcess); + return true; + } +}); + + //GROUPS DRAG N DROP ASSIGNED + var assignedGridDropTargetEl = assignedGrid.getView().scroller.dom; + var assignedGridDropTarget = new Ext.dd.DropTarget(assignedGridDropTargetEl, { + ddGroup : 'assignedGridDDGroup', + notifyDrop : function(ddSource, e, data){ + var records = ddSource.dragData.selections; + var arrAux = new Array(); + for (var r=0; r < records.length; r++){ + arrAux[r] = records[r].data['USR_UID']; + } + SaveDepartmentUser(arrAux,RefreshUsers,FailureProcess); + return true; + } + }); + sw_func_groups = true; +}; + +//REFRESH GROUPS GRIDS +RefreshUsers = function(){ + DoSearchA(); + DoSearchP(); +}; + +//FAILURE AJAX FUNCTION +FailureProcess = function(){ + Ext.Msg.alert(_('ID_DEPARTMENTS'), _('ID_MSG_AJAX_FAILURE')); +}; + +//ASSIGN USERS TO A DEPARTMENT +SaveDepartmentUser = function(arr_usr, function_success, function_failure){ + var sw_response; + viewport.getEl().mask(_('ID_PROCESSING')); + Ext.Ajax.request({ + url: 'departments_Ajax', + params: {action: 'assignDepartmentToUserMultiple', DEP_UID: DEPARTMENT.DEP_UID, USR_UID: arr_usr.join(',')}, + success: function(){ + function_success(); + viewport.getEl().unmask(); + }, + failure: function(){ + function_failure(); + viewport.getEl().unmask(); + } + }); +}; + +//REMOVE USERS FROM A DEPARTMENT +DeleteDepartmentUser = function(arr_usr, function_success, function_failure){ + var sw_response; + viewport.getEl().mask(_('ID_PROCESSING')); + Ext.Ajax.request({ + url: 'departments_Ajax', + params: {action: 'deleteDepartmentToUserMultiple', DEP_UID: DEPARTMENT.DEP_UID, USR_UID: arr_usr.join(',')}, + success: function(){ + function_success(); + viewport.getEl().unmask(); + }, + failure: function(){ + function_failure(); + viewport.getEl().unmask(); + } + }); +}; + +//AssignButton Functionality +AssignGroupsAction = function(){ + rowsSelected = availableGrid.getSelectionModel().getSelections(); + var arrAux = new Array(); + for(var a=0; a < rowsSelected.length; a++){ + arrAux[a] = rowsSelected[a].get('USR_UID'); + } + SaveDepartmentUser(arrAux,RefreshUsers,FailureProcess); +}; + +//RemoveButton Functionality +RemoveGroupsAction = function(){ + rowsSelected = assignedGrid.getSelectionModel().getSelections(); + var arrAux = new Array(); + for(var a=0; a < rowsSelected.length; a++){ + arrAux[a] = rowsSelected[a].get('USR_UID'); + } + DeleteDepartmentUser(arrAux,RefreshUsers,FailureProcess); +}; + +//AssignALLButton Functionality +AssignAllGroupsAction = function(){ + var allRows = availableGrid.getStore(); + var arrAux = new Array(); + if (allRows.getCount()>0){ + for (var r=0; r < allRows.getCount(); r++){ + row = allRows.getAt(r); + arrAux[r] = row.data['USR_UID']; + } + SaveDepartmentUser(arrAux,RefreshUsers,FailureProcess); + } +}; + +//RevomeALLButton Functionality +RemoveAllGroupsAction = function(){ + var allRows = assignedGrid.getStore(); + var arrAux = new Array(); + if (allRows.getCount()>0){ + for (var r=0; r < allRows.getCount(); r++){ + row = allRows.getAt(r); + arrAux[r] = row.data['USR_UID']; + } + DeleteDepartmentUser(arrAux,RefreshUsers,FailureProcess); + } +}; + +//Function DoSearch Available +DoSearchA = function(){ + availableGrid.store.load({params: {textFilter: searchTextA.getValue()}}); +}; + +//Function DoSearch Assigned +DoSearchP = function(){ + assignedGrid.store.load({params: {textFilter: searchTextP.getValue()}}); +}; + +//Load Grid By Default Available Members +GridByDefaultA = function(){ + searchTextA.reset(); + availableGrid.store.load(); +}; + +//Load Grid By Default Assigned Members +GridByDefaultP = function(){ + searchTextP.reset(); + assignedGrid.store.load(); +}; + +//edit members action +EditMembersAction = function(){ + availableGrid.show(); + buttonsPanel.show(); + editMembersButton.hide(); + cancelEditMembersButton.show(); + UsersPanel.doLayout(); +}; + +//CancelEditMenbers Function +CancelEditMembersAction = function(){ + availableGrid.hide(); + buttonsPanel.hide(); + editMembersButton.show(); + cancelEditMembersButton.hide(); + UsersPanel.doLayout(); +}; + +//Render Full User Name +show_user = function(v,i,s){ + return _FNF(v,s.data.USR_FIRSTNAME, s.data.USR_LASTNAME); +}; \ No newline at end of file diff --git a/workflow/engine/templates/departments/departments_Tree.php b/workflow/engine/templates/departments/departments_Tree.php index 5254a9f00..1928ff91d 100644 --- a/workflow/engine/templates/departments/departments_Tree.php +++ b/workflow/engine/templates/departments/departments_Tree.php @@ -48,6 +48,9 @@ $template->assign( 'ADD_UNASSIGNEDUSER', G::loadTranslation("ID_UNASSIGNED_USERS") ); $htmlDpto = lookforchildren( '' , 0); + + print_r($htmlDpto); + die; $content = $template->getOutputContent(); print $content;