diff --git a/workflow/engine/methods/groups/groups.php b/workflow/engine/methods/groups/groups.php index f2b2dd3a3..61ff0554d 100644 --- a/workflow/engine/methods/groups/groups.php +++ b/workflow/engine/methods/groups/groups.php @@ -51,138 +51,41 @@ 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 = 'GROUPS'; - - $dbc = new DBConnection(); - $ses = new DBSession($dbc); - - $Fields['WHERE'] = ''; - - $G_PUBLISH = new Publisher; - $oHeadPublisher =& headPublisher::getSingleton(); - $oHeadPublisher->addScriptFile('/jscore/groups/groups.js'); - $G_PUBLISH->AddContent('view', 'groups/groups_Tree' ); - $G_PUBLISH->AddContent('smarty', 'groups/groups_usersList', '', '', array()); + +$G_PUBLISH = new Publisher; - G::RenderPage( "publish-treeview",'blank' ); +$oHeadPublisher =& headPublisher::getSingleton(); - $groups_Edit = G::encryptlink('groups_Edit'); - $groups_Delete = G::encryptlink('groups_Delete'); - $groups_List = G::encryptlink('groups_List'); - $groups_AddUser = G::encryptlink('groups_AddUser'); +//$oHeadPublisher->usingExtJs('ux/Ext.ux.fileUploadField'); +$oHeadPublisher->addExtJsScript('groups/groupsList', false); //adding a javascript file .js +$oHeadPublisher->addContent('groups/groupsList'); //adding a html file .html. + +$labels = G::getTranslations(Array('ID_GROUPS','ID_EDIT','ID_DELETE','ID_NEW','ID_SEARCH','ID_ENTER_SEARCH_TERM','ID_GROUP_NAME','ID_SAVE','ID_CLOSE', + 'ID_STATUS','ID_SELECT_STATUS','ID_MEMBERS','ID_MSG_GROUP_NAME_EXISTS','ID_GROUPS_SUCCESS_NEW','ID_GROUPS_SUCCESS_UPDATE', + 'ID_MSG_CONFIRM_DELETE_GROUP','ID_GROUPS_SUCCESS_DELETE','ID_CREATE_GROUP_TITLE','ID_EDIT_GROUP_TITLE')); + +$oHeadPublisher->assign('TRANSLATIONS', $labels); +G::RenderPage('publish', 'extJs'); + +// +// +// $dbc = new DBConnection(); +// $ses = new DBSession($dbc); +// +// $Fields['WHERE'] = ''; +// +// $G_PUBLISH = new Publisher; +// $oHeadPublisher =& headPublisher::getSingleton(); +// $oHeadPublisher->addScriptFile('/jscore/groups/groups.js'); +// +// $G_PUBLISH->AddContent('view', 'groups/groups_Tree' ); +// $G_PUBLISH->AddContent('smarty', 'groups/groups_usersList', '', '', array()); +// +// G::RenderPage( "publish-treeview",'blank' ); +// +// $groups_Edit = G::encryptlink('groups_Edit'); +// $groups_Delete = G::encryptlink('groups_Delete'); +// $groups_List = G::encryptlink('groups_List'); +// $groups_AddUser = G::encryptlink('groups_AddUser'); ?> - diff --git a/workflow/engine/methods/groups/groupsMembers.php b/workflow/engine/methods/groups/groupsMembers.php new file mode 100644 index 000000000..98a09b98f --- /dev/null +++ b/workflow/engine/methods/groups/groupsMembers.php @@ -0,0 +1,77 @@ +. + * + * For more information, contact Colosa Inc, 2566 Le Jeune Rd., + * Coral Gables, FL, 33134, USA, or email info@colosa.com. + * + */ + +$access = $RBAC->userCanAccess('PM_USERS'); +if( $access != 1 ){ + switch ($access) + { + case -1: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); + die; + break; + case -2: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_SYSTEM', 'error', 'labels'); + G::header('location: ../login/login'); + die; + break; + default: + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + G::header('location: ../login/login'); + die; + break; + } +} + +if (($RBAC_Response=$RBAC->userCanAccess("PM_USERS"))!=1) return $RBAC_Response; + + $G_MAIN_MENU = 'processmaker'; + $G_SUB_MENU = 'users'; + $G_ID_MENU_SELECTED = 'USERS'; + $G_ID_SUB_MENU_SELECTED = 'GROUPS'; + + +$G_PUBLISH = new Publisher; + +$oHeadPublisher =& headPublisher::getSingleton(); + +//$oHeadPublisher->usingExtJs('ux/Ext.ux.fileUploadField'); +$oHeadPublisher->addExtJsScript('groups/groupsMembers', false); //adding a javascript file .js +$oHeadPublisher->addContent('groups/groupsMembers'); //adding a html file .html. + +$labels = G::getTranslations(Array('ID_GROUPS','ID_GROUP_NAME','ID_BACK','ID_ASSIGN_ALL_MEMBERS','ID_REMOVE_ALL_MEMBERS', + 'ID_MSG_AJAX_FAILURE', 'ID_PROCESSING','ID_ENTER_SEARCH_TERM','ID_FIRST_NAME','ID_LAST_NAME','ID_USER_NAME','ID_AVAILABLE_MEMBERS','ID_ASSIGNED_MEMBERS')); + +G::LoadClass('groups'); +$oGroup = new Groupwf(); +$oGroup->load($_REQUEST['GRP_UID']); + +$groups['GRP_UID'] = $_REQUEST['GRP_UID']; +$groups['GRP_TITLE'] = $oGroup->getGrpTitle(); + +$oHeadPublisher->assign('TRANSLATIONS', $labels); +$oHeadPublisher->assign('GROUPS', $groups); +G::RenderPage('publish', 'extJs'); +?> \ No newline at end of file diff --git a/workflow/engine/methods/groups/groups_Ajax.php b/workflow/engine/methods/groups/groups_Ajax.php index 5862b8553..6a8123572 100644 --- a/workflow/engine/methods/groups/groups_Ajax.php +++ b/workflow/engine/methods/groups/groups_Ajax.php @@ -94,4 +94,176 @@ switch ($_POST['action']) } } break; + case 'groupsList': + require_once 'classes/model/Groupwf.php'; + $oCriteria = new Criteria('workflow'); + $oCriteria->addSelectColumn(GroupwfPeer::GRP_UID); + $oCriteria->addSelectColumn(GroupwfPeer::GRP_STATUS); + $oCriteria->addSelectColumn(ContentPeer::CON_VALUE); + $oCriteria->addJoin(GroupwfPeer::GRP_UID, ContentPeer::CON_ID, Criteria::LEFT_JOIN); + $oCriteria->add(ContentPeer::CON_CATEGORY,'GRP_TITLE'); + $oCriteria->add(ContentPeer::CON_LANG,SYS_LANG); + + $filter = (isset($_POST['textFilter']))? $_POST['textFilter'] : ''; + if ($filter != ''){ + $oCriteria->add(ContentPeer::CON_VALUE, '%'.$filter.'%', Criteria::LIKE); + } + + $oDataset = GroupwfPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $arrData = Array(); + while ($oDataset->next()){ + $arrData[] = $oDataset->getRow(); + } + + echo '{success: true, groups: '.G::json_encode($arrData).'}'; + break; + case 'exitsGroupName': + require_once 'classes/model/Groupwf.php'; + G::LoadClass('Groupswf'); + $oGroup = new Groupwf(); + $oCriteria=$oGroup->loadByGroupname($_POST['GRP_NAME']); + $oDataset = GroupwfPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $oDataset->next(); + $aRow = $oDataset->getRow(); + $response = ($aRow) ? 'true' : 'false'; + echo $response; + break; + case 'saveNewGroup': + G::LoadClass('groups'); + $newGroup['GRP_UID'] = ''; + $newGroup['GRP_STATUS'] = G::toUpper($_POST['status']); + $newGroup['GRP_TITLE'] = $_POST['name']; + unset($newGroup['GRP_UID']); + $group = new Groupwf(); + $group->create($newGroup); + echo '{success: true}'; + break; + case 'saveEditGroup': + G::LoadClass('groups'); + $editGroup['GRP_UID'] = $_POST['grp_uid']; + $editGroup['GRP_STATUS'] = G::toUpper($_POST['status']); + $editGroup['GRP_TITLE'] = $_POST['name']; + $group = new Groupwf(); + $group->update($editGroup); + echo '{success: true}'; + break; + case 'deleteGroup': + G::LoadClass('groups'); + $group = new Groupwf(); + if (!isset($_POST['GRP_UID'])) return; + $group->remove(urldecode($_POST['GRP_UID'])); + require_once 'classes/model/TaskUser.php'; + $oProcess = new TaskUser(); + $oCriteria = new Criteria('workflow'); + $oCriteria->add(TaskUserPeer::USR_UID, $_POST['GRP_UID']); + TaskUserPeer::doDelete($oCriteria); + echo '{success: true}'; + break; + case 'assignedMembers': + require_once 'classes/model/Users.php'; + require_once 'classes/model/GroupUser.php'; + $sGroupUID = $_REQUEST['gUID']; + $oCriteria = new Criteria('workflow'); + $oCriteria->addSelectColumn(GroupUserPeer::GRP_UID); + $oCriteria->addSelectColumn(UsersPeer::USR_UID); + $oCriteria->addSelectColumn(UsersPeer::USR_USERNAME); + $oCriteria->addSelectColumn(UsersPeer::USR_FIRSTNAME); + $oCriteria->addSelectColumn(UsersPeer::USR_LASTNAME); + $oCriteria->addSelectColumn(UsersPeer::USR_EMAIL); + $oCriteria->addJoin(GroupUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN); + $oCriteria->add(GroupUserPeer::GRP_UID, $sGroupUID); + $oCriteria->add(UsersPeer::USR_STATUS, 'ACTIVE'); + + $filter = (isset($_POST['textFilter']))? $_POST['textFilter'] : ''; + 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); + + $arrData = Array(); + while ($oDataset->next()){ + $arrData[] = $oDataset->getRow(); + } + echo '{success: true, members: '.G::json_encode($arrData).'}'; + break; + case 'availableMembers': + require_once 'classes/model/Users.php'; + require_once 'classes/model/GroupUser.php'; + $sGroupUID = $_REQUEST['gUID']; + $oCriteria = new Criteria('workflow'); + $oCriteria->addSelectColumn(GroupUserPeer::GRP_UID); + $oCriteria->addSelectColumn(UsersPeer::USR_UID); + $oCriteria->addJoin(GroupUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN); + $oCriteria->add(GroupUserPeer::GRP_UID, $sGroupUID); + $oCriteria->add(UsersPeer::USR_STATUS, 'ACTIVE'); + + $oDataset = UsersPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $oDataset->next(); + $uUIDs = array(); + while ($aRow = $oDataset->getRow()) { + $uUIDs[] = $aRow['USR_UID']; + $oDataset->next(); + } + + $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_EMAIL); + $oCriteria->add(UsersPeer::USR_STATUS, 'ACTIVE'); + $oCriteria->add(UsersPeer::USR_UID, $uUIDs, Criteria::NOT_IN); + + $filter = (isset($_POST['textFilter']))? $_POST['textFilter'] : ''; + 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); + + $arrData = Array(); + while ($oDataset->next()){ + $arrData[] = $oDataset->getRow(); + } + echo '{success: true, members: '.G::json_encode($arrData).'}'; + break; + case 'assignUsersToGroupsMultiple': + $GRP_UID = $_POST['GRP_UID']; + $uUIDs = explode(',',$_POST['USR_UID']); + G::LoadClass('groups'); + $oGroup = new Groups(); + foreach ($uUIDs as $USR_UID){ + $oGroup->addUserToGroup($GRP_UID, $USR_UID); + } + break; + case 'deleteUsersToGroupsMultiple': + $GRP_UID = $_POST['GRP_UID']; + $uUIDs = explode(',',$_POST['USR_UID']); + G::LoadClass('groups'); + $oGroup = new Groups(); + foreach ($uUIDs as $USR_UID){ + $oGroup->removeUserOfGroup($GRP_UID, $USR_UID); + } + break; + + + + + } diff --git a/workflow/engine/templates/groups/groupsList.html b/workflow/engine/templates/groups/groupsList.html new file mode 100755 index 000000000..432f567b5 --- /dev/null +++ b/workflow/engine/templates/groups/groupsList.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/workflow/engine/templates/groups/groupsList.js b/workflow/engine/templates/groups/groupsList.js new file mode 100755 index 000000000..3b06e7f25 --- /dev/null +++ b/workflow/engine/templates/groups/groupsList.js @@ -0,0 +1,443 @@ +/* + * @author: Qennix + * Jan 27th, 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){ + iGrid = Ext.getCmp('infoGrid'); + rowSelected = iGrid.getSelectionModel().getSelected(); + if (rowSelected){ + DeleteButtonAction(); + } + } +}, +{ + key: Ext.EventObject.F2, + fn: function(k,e){ + iGrid = Ext.getCmp('infoGrid'); + rowSelected = iGrid.getSelectionModel().getSelected(); + if (rowSelected){ + EditGroupWindow(); + } + } +} +]); + +var store; +var cmodel; +var infoGrid; +var viewport; +var smodel; + +var newButton; +var editButton; +var deleteButton; +var searchButton; + +var searchText; +var contextMenu; + +Ext.onReady(function(){ + Ext.QuickTips.init(); + + newButton = new Ext.Action({ + text: TRANSLATIONS.ID_NEW, + iconCls: 'button_menu_ext ss_sprite ss_add', + handler: NewGroupWindow + }); + + editButton = new Ext.Action({ + text: TRANSLATIONS.ID_EDIT, + iconCls: 'button_menu_ext ss_sprite ss_pencil', + handler: EditGroupWindow, + disabled: true + }); + + deleteButton = new Ext.Action({ + text: TRANSLATIONS.ID_DELETE, + iconCls: 'button_menu_ext ss_sprite ss_delete', + handler: DeleteButtonAction, + disabled: true + }); + + membersButton = new Ext.Action({ + text: TRANSLATIONS.ID_MEMBERS, + iconCls: 'button_menu_ext ss_sprite ss_user_add', + handler: MembersAction, + disabled: true + }); + + searchButton = new Ext.Action({ + text: TRANSLATIONS.ID_SEARCH, + handler: DoSearch + }); + + contextMenu = new Ext.menu.Menu({ + items: [editButton, deleteButton,'-',membersButton] + }); + + searchText = new Ext.form.TextField ({ + id: 'searchTxt', + ctCls:'pm_search_text_field', + allowBlank: true, + width: 150, + emptyText: TRANSLATIONS.ID_ENTER_SEARCH_TERM, + listeners: { + specialkey: function(f,e){ + if (e.getKey() == e.ENTER) { + DoSearch(); + } + }, + focus: function(f,e) { + var row = infoGrid.getSelectionModel().getSelected(); + infoGrid.getSelectionModel().deselectRow(infoGrid.getStore().indexOf(row)); + } + } + }); + + clearTextButton = new Ext.Action({ + text: 'X', + ctCls:'pm_search_x_button', + handler: GridByDefault + }); + + + smodel = new Ext.grid.RowSelectionModel({ + singleSelect: true, + listeners:{ + rowselect: function(sm){ + editButton.enable(); + deleteButton.enable(); + membersButton.enable(); + }, + rowdeselect: function(sm){ + editButton.disable(); + deleteButton.disable(); + membersButton.disable(); + } + } + }); + + comboStatusStore = new Ext.data.SimpleStore({ + fields: ['id','value'], + data: [['1','ACTIVE'],['0','INACTIVE']] + }); + + newForm = new Ext.FormPanel({ + url: 'groups_Ajax?action=saveNewGroup', + frame: true, + items:[ + {xtype: 'textfield', fieldLabel: TRANSLATIONS.ID_GROUP_NAME, name: 'name', width: 200, allowBlank: false}, + { + xtype: 'combo', + fieldLabel: TRANSLATIONS.ID_STATUS, + hiddenName: 'status', + typeAhead: true, + mode: 'local', + store: comboStatusStore, + displayField: 'value', + valueField:'value', + allowBlank: false, + triggerAction: 'all', + emptyText: TRANSLATIONS.ID_SELECT_STATUS, + selectOnFocus:true + } + ], + buttons: [ + {text: TRANSLATIONS.ID_CLOSE, handler: CloseWindow}, + {text: TRANSLATIONS.ID_SAVE, handler: SaveNewGroupAction} + ] + }); + + editForm = new Ext.FormPanel({ + url: 'groups_Ajax?action=saveEditGroup', + frame: true, + items:[ + {xtype: 'textfield', name: 'grp_uid', hidden: true}, + {xtype: 'textfield', fieldLabel: TRANSLATIONS.ID_GROUP_NAME, name: 'name', width: 200, allowBlank: false}, + { + xtype: 'combo', + fieldLabel: TRANSLATIONS.ID_STATUS, + hiddenName: 'status', + typeAhead: true, + mode: 'local', + store: comboStatusStore, + displayField: 'value', + valueField:'value', + allowBlank: false, + triggerAction: 'all', + emptyText: TRANSLATIONS.ID_SELECT_STATUS, + selectOnFocus:true + } + ], + buttons: [ + {text: TRANSLATIONS.ID_CLOSE, handler: CloseWindow}, + {text: TRANSLATIONS.ID_SAVE, handler: SaveEditGroupAction} + ] + }); + + store = new Ext.data.GroupingStore( { + proxy : new Ext.data.HttpProxy({ + url: 'groups_Ajax?action=groupsList' + }), + reader : new Ext.data.JsonReader( { + root: 'groups', + fields : [ + {name : 'GRP_UID'}, + {name : 'GRP_STATUS'}, + {name : 'CON_VALUE'} + ] + }) + }); + + cmodel = new Ext.grid.ColumnModel({ + defaults: { + width: 50, + sortable: true + }, + columns: [ + {id:'GRP_UID', dataIndex: 'USR_UID', hidden:true, hideable:false}, + {header: 'Group Name', dataIndex: 'CON_VALUE', width: 60, align:'left'}, + {header: 'Status', dataIndex: 'GRP_STATUS', width: 30, align:'center'} + ] + }); + + + infoGrid = new Ext.grid.GridPanel({ + region: 'center', + layout: 'fit', + id: 'infoGrid', + height:100, + autoWidth : true, + stateful : true, + stateId : 'grid', + enableColumnResize: true, + enableHdMenu: true, + frame:false, + iconCls:'icon-grid', + columnLines: false, + viewConfig: { + forceFit:true + }, + title : TRANSLATIONS.ID_GROUPS, + store: store, + cm: cmodel, + sm: smodel, + tbar: [newButton, '-', editButton, deleteButton,'-',membersButton, {xtype: 'tbfill'}, searchText,clearTextButton,searchButton], + listeners: { + rowdblclick: EditGroupWindow + }, + view: new Ext.grid.GroupingView({ + forceFit:true, + groupTextTpl: '{text}' + }) + }); + + infoGrid.on('rowcontextmenu', + function (grid, rowIndex, evt) { + var sm = grid.getSelectionModel(); + sm.selectRow(rowIndex, sm.isSelected(rowIndex)); + }, + this + ); + + infoGrid.on('contextmenu', function(evt){evt.preventDefault();}, this); + infoGrid.addListener('rowcontextmenu',onMessageContextMenu, this); + infoGrid.store.load(); + + viewport = new Ext.Viewport({ + layout: 'fit', + autoScroll: false, + items: [ + infoGrid + ] + }); +}); + +//Funtion Handles Context Menu Opening +onMessageContextMenu = function (grid, rowIndex, e) { + e.stopEvent(); + var coords = e.getXY(); + contextMenu.showAt([coords[0], coords[1]]); +} + +//Do Nothing Function +DoNothing = function(){} + +//Open New Group Form +NewGroupWindow = function(){ + w = new Ext.Window({ + height: 130, + width: 400, + title: TRANSLATIONS.ID_CREATE_GROUP_TITLE, + closable: false, + modal: true, + items: [newForm] + }); + w.show(); +} + +//Load Grid By Default +GridByDefault = function(){ + searchText.reset(); + infoGrid.store.load(); +} + +//Do Search Function +DoSearch = function(){ + infoGrid.store.load({params: {textFilter: searchText.getValue()}}); +} + +//Close Popup Window +CloseWindow = function(){ + w.hide(); +} + +//Check Group Name Availability +CheckGroupName = function(grp_name, function_success, function_failure){ + Ext.Ajax.request({ + url: 'groups_Ajax', + params: {action: 'exitsGroupName', GRP_NAME: grp_name}, + success: function(resp, opt){ + var checked = eval(resp.responseText); + (!checked) ? function_success() : function_failure(); + }, + failure: function(r,o) { + function_failure(); + } + }); +} + +//Save Group Button +SaveNewGroupAction = function(){ + var group = newForm.getForm().findField('name').getValue(); + if (group != '') CheckGroupName(group, SaveNewGroup, DuplicateGroupName); +} + +//Show Duplicate Group Name Message +DuplicateGroupName = function(){ + Ext.Msg.alert(TRANSLATIONS.ID_GROUPS, TRANSLATIONS.ID_MSG_GROUP_NAME_EXISTS); +} + +//Save New Group +SaveNewGroup = function(){ + newForm.getForm().submit({ + success: function(f,a){ + w.hide(); //Hide popup widow + newForm.getForm().reset(); //Set empty form to next use + searchText.reset(); + infoGrid.store.load(); //Reload store grid + Ext.Msg.alert(TRANSLATIONS.ID_GROUPS,TRANSLATIONS.ID_GROUPS_SUCCESS_NEW); + }, + failure: function(f,a){ + switch(a.failureType){ + case Ext.form.Action.CLIENT_INVALID: + //Ext.Msg.alert('New Role Form','Invalid Data'); + break; + } + + } + }); +} + +//Open Edit Group Form +EditGroupWindow = function(){ + rowSelected = infoGrid.getSelectionModel().getSelected(); + editForm.getForm().findField('grp_uid').setValue(rowSelected.data.GRP_UID); + editForm.getForm().findField('name').setValue(rowSelected.data.CON_VALUE); + editForm.getForm().findField('status').setValue(rowSelected.data.GRP_STATUS); + w = new Ext.Window({ + height: 130, + width: 440, + title: TRANSLATIONS.ID_EDIT_GROUP_TITLE, + closable: false, + modal: true, + items: [editForm] + }); + w.show(); +} + +//Save Edit Group Button +SaveEditGroupAction = function(){ + var group = editForm.getForm().findField('name').getValue(); + rowSelected = infoGrid.getSelectionModel().getSelected(); + if (group != ''){ + if (rowSelected.data.CON_VALUE.toUpperCase() == group.toUpperCase()){ + SaveEditGroup(); + }else{ + CheckGroupName(group, SaveEditGroup, DuplicateGroupName); + } + } +} + +//Save Edit Group +SaveEditGroup = function(){ + editForm.getForm().submit({ + success: function(f,a){ + w.hide(); //Hide popup widow + DoSearch(); //Reload store grid + editButton.disable(); //Disable Edit Button + deleteButton.disable(); //Disable Delete Button + membersButton.disable(); //Disable Members Button + Ext.Msg.alert(TRANSLATIONS.ID_ROLES,TRANSLATIONS.ID_GROUPS_SUCCESS_UPDATE); + }, + failure: function(f,a){ + switch(a.failureType){ + case Ext.form.Action.CLIENT_INVALID: + //Ext.Msg.alert('New Role Form','Invalid Data'); + break; + } + + } + }); +} + +//Delete Button Action +DeleteButtonAction = function(){ + Ext.Msg.confirm(TRANSLATIONS.ID_CONFIRM, TRANSLATIONS.ID_MSG_CONFIRM_DELETE_GROUP, + function(btn, text){ + if (btn=="yes"){ + rowSelected = infoGrid.getSelectionModel().getSelected(); + Ext.Ajax.request({ + url: 'groups_Ajax', + params: {action: 'deleteGroup', GRP_UID: rowSelected.data.GRP_UID}, + success: function(r,o){ + DoSearch(); + editButton.disable(); //Disable Edit Button + deleteButton.disable(); //Disable Delete Button + membersButton.disable(); //Disable Members Button + Ext.Msg.alert(TRANSLATIONS.ID_GROUPS, TRANSLATIONS.ID_GROUPS_SUCCESS_DELETE); + } + }); + + } + } + ); +} + +//Members Button Action +MembersAction = function(){ + rowSelected = infoGrid.getSelectionModel().getSelected(); + location.href = 'groupsMembers?GRP_UID=' + rowSelected.data.GRP_UID; +} \ No newline at end of file diff --git a/workflow/engine/templates/groups/groupsMembers.html b/workflow/engine/templates/groups/groupsMembers.html new file mode 100755 index 000000000..7f6b02bfb --- /dev/null +++ b/workflow/engine/templates/groups/groupsMembers.html @@ -0,0 +1,4 @@ +
+
+
+ diff --git a/workflow/engine/templates/groups/groupsMembers.js b/workflow/engine/templates/groups/groupsMembers.js new file mode 100644 index 000000000..3936340b5 --- /dev/null +++ b/workflow/engine/templates/groups/groupsMembers.js @@ -0,0 +1,419 @@ +/* + * @author: Qennix + * Jan 27th, 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 MembersPanel; +var viewport; + +var assignButton; +var assignAllButton; +var removeButton; +var removeAllButton; +var backButton; + + +Ext.onReady(function(){ + + assignAllButton = new Ext.Action({ + text: TRANSLATIONS.ID_ASSIGN_ALL_MEMBERS, + iconCls: 'button_menu_ext ss_sprite ss_add', + handler: AssignAllUsersAction + }); + + removeAllButton = new Ext.Action({ + text: TRANSLATIONS.ID_REMOVE_ALL_MEMBERS, + iconCls: 'button_menu_ext ss_sprite ss_delete', + handler: RemoveAllUsersAction + }); + + backButton = new Ext.Action({ + text: TRANSLATIONS.ID_BACK, + iconCls: 'button_menu_ext ss_sprite ss_arrow_redo', + handler: BackToGroups + }); + + storeP = new Ext.data.GroupingStore( { + proxy : new Ext.data.HttpProxy({ + url: 'groups_Ajax?action=assignedMembers&gUID=' + GROUPS.GRP_UID + }), + reader : new Ext.data.JsonReader( { + root: 'members', + fields : [ + {name : 'USR_UID'}, + {name : 'USR_USERNAME'}, + {name : 'USR_FIRSTNAME'}, + {name : 'USR_LASTNAME'}, + {name : 'USR_EMAIL'} + ] + }) + }); + + searchTextA = new Ext.form.TextField ({ + id: 'searchTextA', + ctCls:'pm_search_text_field', + allowBlank: true, + width: 110, + emptyText: TRANSLATIONS.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: TRANSLATIONS.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 + }); + + storeA = new Ext.data.GroupingStore( { + proxy : new Ext.data.HttpProxy({ + url: 'groups_Ajax?action=availableMembers&gUID=' + GROUPS.GRP_UID + }), + reader : new Ext.data.JsonReader( { + root: 'members', + fields : [ + {name : 'USR_UID'}, + {name : 'USR_USERNAME'}, + {name : 'USR_FIRSTNAME'}, + {name : 'USR_LASTNAME'}, + {name : 'USR_EMAIL'} + ] + }) + }); + + cmodelP = new Ext.grid.ColumnModel({ + defaults: { + width: 50, + sortable: true + }, + columns: [ + {id:'USR_UID', dataIndex: 'USR_UID', hidden:true, hideable:false}, + {header: TRANSLATIONS.ID_LAST_NAME, dataIndex: 'USR_LASTNAME', width: 60, align:'left'}, + {header: TRANSLATIONS.ID_FIRST_NAME, dataIndex: 'USR_FIRSTNAME', width: 60, align:'left'}, + {header: TRANSLATIONS.ID_USER_NAME, dataIndex: 'USR_USERNAME', width: 60, align:'left'} + ] + }); + + 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; + } + } + } + }); + + availableGrid = new Ext.grid.GridPanel({ + layout : 'fit', + region : 'center', + ddGroup : 'assignedGridDDGroup', + store : storeA, + cm : cmodelP, + sm : smodelA, + enableDragDrop : true, + stripeRows : true, + autoExpandColumn: 'USR_USERNAME', + 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: [TRANSLATIONS.ID_AVAILABLE_MEMBERS,{xtype: 'tbfill'},'-',searchTextA,clearTextButtonA], + bbar: [{xtype: 'tbfill'}, assignAllButton], + listeners: {rowdblclick: AssignUsersAction} + }); + + assignedGrid = new Ext.grid.GridPanel({ + layout : 'fit', + ddGroup : 'availableGridDDGroup', + store : storeP, + cm : cmodelP, + sm : smodelP, + enableDragDrop : true, + stripeRows : true, + autoExpandColumn: 'USR_USERNAME', + 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: [TRANSLATIONS.ID_ASSIGNED_MEMBERS,{xtype: 'tbfill'},'-',searchTextP,clearTextButtonP], + bbar: [{xtype: 'tbfill'},removeAllButton], + listeners: {rowdblclick: RemoveUsersAction} + }); + + 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: AssignUsersAction, id: 'assignButton', disabled: true}, + {xtype:'button',text: '<<', handler: RemoveUsersAction, id: 'removeButton', disabled: true} + ] + }); + + RefreshMembers(); + + //MEMBERS DRAG AND DROP PANEL + MembersPanel = new Ext.Panel({ + region : 'center', + autoWidth : true, + layout : 'hbox', + defaults : { flex : 1 }, //auto stretch + layoutConfig : { align : 'stretch' }, + items : [availableGrid,buttonsPanel,assignedGrid], + viewConfig : {forceFit:true}, + tbar: [TRANSLATIONS.ID_GROUPS + ' : ' + GROUPS.GRP_TITLE ,{xtype: 'tbfill'},backButton] + + }); + + //LOAD ALL PANELS + viewport = new Ext.Viewport({ + layout: 'fit', + items: [MembersPanel] + }); + + DDLoadUsers(); //Load DND functionality + +}); + +//Do Nothing Function +DoNothing = function(){} + +//Return to Groups Main Page +BackToGroups = function(){ + location.href = 'groups'; +} + +//Loads Drag N Drop Functionality for Users +DDLoadUsers = function(){ + //MEMBERS 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']; + } + DeleteGroupsUser(arrAux,RefreshMembers,FailureProcess); + return true; + } + }); + + //MEMBERS 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']; + } + SaveGroupsUser(arrAux,RefreshMembers,FailureProcess); + return true; + } + }); +} + +//REFRESH GROUPS GRIDS +RefreshMembers = function(){ + DoSearchA(); + DoSearchP(); +} + +//FAILURE AJAX FUNCTION +FailureProcess = function(){ + Ext.Msg.alert(TRANSLATIONS.ID_GROUPS, TRANSLATIONS.ID_MSG_AJAX_FAILURE); +} + +//ASSIGN GROUPS TO A USER +SaveGroupsUser = function(arr_usr, function_success, function_failure){ + var sw_response; + viewport.getEl().mask(TRANSLATIONS.ID_PROCESSING); + Ext.Ajax.request({ + url: 'groups_Ajax', + params: {action: 'assignUsersToGroupsMultiple', GRP_UID: GROUPS.GRP_UID, USR_UID: arr_usr.join(',')}, + success: function(){ + function_success(); + viewport.getEl().unmask(); + }, + failure: function(){ + function_failure(); + viewport.getEl().unmask(); + } + }); +} + +//REMOVE USERS FROM A GROUP +DeleteGroupsUser = function(arr_usr, function_success, function_failure){ + var sw_response; + viewport.getEl().mask(TRANSLATIONS.ID_PROCESSING); + Ext.Ajax.request({ + url: 'groups_Ajax', + params: {action: 'deleteUsersToGroupsMultiple', GRP_UID: GROUPS.GRP_UID, USR_UID: arr_usr.join(',')}, + success: function(){ + function_success(); + viewport.getEl().unmask(); + }, + failure: function(){ + function_failure(); + viewport.getEl().unmask(); + } + }); +} + +//AssignButton Functionality +AssignUsersAction = function(){ + rowsSelected = availableGrid.getSelectionModel().getSelections(); + var arrAux = new Array(); + for(var a=0; a < rowsSelected.length; a++){ + arrAux[a] = rowsSelected[a].get('USR_UID'); + } + SaveGroupsUser(arrAux,RefreshMembers,FailureProcess); +} + +//RemoveButton Functionality +RemoveUsersAction = function(){ + rowsSelected = assignedGrid.getSelectionModel().getSelections(); + var arrAux = new Array(); + for(var a=0; a < rowsSelected.length; a++){ + arrAux[a] = rowsSelected[a].get('USR_UID'); + } + DeleteGroupsUser(arrAux,RefreshMembers,FailureProcess); +} + +//AssignALLButton Functionality +AssignAllUsersAction = 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']; + } + SaveGroupsUser(arrAux,RefreshMembers,FailureProcess); + } +} + +//RevomeALLButton Functionality +RemoveAllUsersAction = 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']; + } + DeleteGroupsUser(arrAux,RefreshMembers,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(); +} \ No newline at end of file