From 282c491797ac8e747c24b07c7face34aa0117307 Mon Sep 17 00:00:00 2001 From: Erik Amaru Ortiz Date: Tue, 22 Feb 2011 23:22:50 +0000 Subject: [PATCH] users assignment (continue) --- workflow/engine/classes/model/TaskUser.php | 57 +++ .../engine/methods/processes/ajaxListener.php | 126 ++++++- workflow/engine/templates/bpmn/bpmnShapes.js | 7 +- workflow/engine/templates/bpmn/designer.js | 266 +++++++------- workflow/engine/templates/bpmn/processmap.js | 340 +++++++++++++++--- 5 files changed, 601 insertions(+), 195 deletions(-) diff --git a/workflow/engine/classes/model/TaskUser.php b/workflow/engine/classes/model/TaskUser.php index 78e8e5640..106b4e11c 100644 --- a/workflow/engine/classes/model/TaskUser.php +++ b/workflow/engine/classes/model/TaskUser.php @@ -147,4 +147,61 @@ class TaskUser extends BaseTaskUser { return $aRows; } + //erik: new functions + function getUsersTask($TAS_UID, $TU_TYPE=1){ + + require_once 'classes/model/Users.php'; + + $groupsTask = array(); + $usersTask = array(); + + //getting task's users + $criteria = new Criteria('workflow'); + $criteria->addSelectColumn(UsersPeer::USR_FIRSTNAME); + $criteria->addSelectColumn(UsersPeer::USR_LASTNAME); + $criteria->addSelectColumn(UsersPeer::USR_USERNAME); + $criteria->addSelectColumn(TaskUserPeer::TAS_UID); + $criteria->addSelectColumn(TaskUserPeer::USR_UID); + $criteria->addSelectColumn(TaskUserPeer::TU_TYPE); + $criteria->addSelectColumn(TaskUserPeer::TU_RELATION); + $criteria->addJoin(TaskUserPeer::USR_UID, UsersPeer::USR_UID, Criteria::LEFT_JOIN); + $criteria->add(TaskUserPeer::TAS_UID, $TAS_UID); + $criteria->add(TaskUserPeer::TU_TYPE, $TU_TYPE); + $criteria->add(TaskUserPeer::TU_RELATION, 1); + + $dataset = TaskUserPeer::doSelectRS($criteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + while ($dataset->next()) + $usersTask[] = $dataset->getRow(); + + //getting task's groups + $delimiter = DBAdapter::getStringDelimiter (); + $criteria = new Criteria('workflow'); + $criteria->addAsColumn('GRP_TITLE', 'CONTENT.CON_VALUE'); + $criteria->addSelectColumn(TaskUserPeer::TAS_UID); + $criteria->addSelectColumn(TaskUserPeer::USR_UID); + $criteria->addSelectColumn(TaskUserPeer::TU_TYPE); + $criteria->addSelectColumn(TaskUserPeer::TU_RELATION); + $aConditions[] = array(TaskUserPeer::USR_UID, 'CONTENT.CON_ID'); + $aConditions[] = array('CONTENT.CON_CATEGORY', $delimiter . 'GRP_TITLE' . $delimiter); + $aConditions[] = array('CONTENT.CON_LANG', $delimiter . SYS_LANG . $delimiter); + $criteria->addJoinMC($aConditions, Criteria::LEFT_JOIN); + $criteria->add(TaskUserPeer::TAS_UID, $TAS_UID); + $criteria->add(TaskUserPeer::TU_TYPE, $TU_TYPE); + $criteria->add(TaskUserPeer::TU_RELATION, 2); + $dataset = TaskUserPeer::doSelectRS($criteria); + + $dataset = TaskUserPeer::doSelectRS($criteria); + $dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + while( $dataset->next() ) + $usersTask[] = $dataset->getRow(); + + $result->data = $usersTask; + $result->totalCount = sizeof($usersTask); + + return $result; + } + } // TaskUser \ No newline at end of file diff --git a/workflow/engine/methods/processes/ajaxListener.php b/workflow/engine/methods/processes/ajaxListener.php index 4a639e166..43e6a3b16 100755 --- a/workflow/engine/methods/processes/ajaxListener.php +++ b/workflow/engine/methods/processes/ajaxListener.php @@ -150,12 +150,10 @@ class Ajax { require_once 'classes/model/Users.php'; G::LoadClass('configuration'); - - $search = isset($params['search']) ? $params['search']: null; - - $users = Users::getAll($params['start'], $params['limit'], $search); $conf = new Configurations; + $search = isset($params['search']) ? $params['search']: null; + $users = Users::getAll($params['start'], $params['limit'], $search); foreach($users->data as $i=>$user){ $users->data[$i]['USER'] = $conf->getEnvSetting( @@ -178,7 +176,125 @@ class Ajax print G::json_encode($groups); } - + + function assignUsersTask($param) + { + try{ + require_once 'classes/model/TaskUser.php'; + $oTaskUser = new TaskUser(); + $UIDS = explode(',', $param['UIDS']); + $TU_TYPE = 1; + + foreach( $UIDS as $UID ) { + if ($_POST['TU_RELATION'] == 1 ) + $oTaskUser->create(array('TAS_UID' => $param['TAS_UID'], 'USR_UID' => $UID, 'TU_TYPE' => $TU_TYPE, 'TU_RELATION' => 1)); + else + $oTaskUser->create(array('TAS_UID' => $param['TAS_UID'], 'USR_UID' => $UID, 'TU_TYPE' => $TU_TYPE, 'TU_RELATION' => 2)); + } + + $result->success = true; + $result->msg = ''; + } catch(Exception $e){ + $result->success = false; + $result->msg = $e->getMessage(); + } + + print G::json_encode($result); + } + + function removeUsersTask($param) + { + try{ + require_once 'classes/model/TaskUser.php'; + $oTaskUser = new TaskUser(); + $USR_UIDS = explode(',', $param['USR_UID']); + $TU_RELATIONS = explode(',', $param['TU_RELATION']); + $TU_TYPE = 1; + + foreach($USR_UIDS as $i=>$USR_UID) { + if ($TU_RELATIONS[$i] == 1 ){ + + $oTaskUser->remove($param['TAS_UID'], $USR_UID, $TU_TYPE, 1); + + } else { + $oTaskUser->remove($param['TAS_UID'], $USR_UID, $TU_TYPE, 2); + } + } + + $result->success = true; + $result->msg = ''; + } catch(Exception $e){ + $result->success = false; + $result->msg = "{$TU_RELATIONS[$i]} - {$param['TAS_UID']}, {$USR_UIDS[$i]}, $TU_TYPE, 1 --> " . $e->getMessage(); + } + + print G::json_encode($result); + } + + function getUsersTask($param) + { + require_once 'classes/model/TaskUser.php'; + G::LoadClass('configuration'); + $usersTaskList = Array(); + $task = new TaskUser; + $conf = new Configurations; + $TU_TYPE = 1; + + $usersTask = $task->getUsersTask($param['TAS_UID'], $TU_TYPE); + + foreach($usersTask->data as $userTask) { + $usersTaskListItem['TAS_UID'] = $userTask['TAS_UID']; + if( $userTask['TU_RELATION'] == 1 ) + $usersTaskListItem['NAME'] = $conf->getEnvSetting( + 'format', + Array( + 'userName'=>$userTask['USR_USERNAME'], + 'firstName'=>$userTask['USR_FIRSTNAME'], + 'lastName'=>$userTask['USR_LASTNAME'] + ) + ); + else + $usersTaskListItem['NAME'] = $userTask['GRP_TITLE']; + + $usersTaskListItem['TU_RELATION'] = $userTask['TU_RELATION']; + $usersTaskListItem['USR_UID'] = $userTask['USR_UID']; + + $usersTaskList[] = $usersTaskListItem; + } + + $result->data = $usersTaskList; + $result->totalCount = $usersTask->totalCount; + + print G::json_encode($result); + } + + function getProcessDetail($param){ + require_once 'classes/model/Process.php'; + + $PRO_UID = $param['PRO_UID']; + + G::loadClass('tasks'); + $tasks = new Tasks(); + $process = ProcessPeer::retrieveByPk($PRO_UID); + + $tasksList = $tasks->getAllTasks($PRO_UID); + + + $rootNode->id = $process->getProUid(); + $rootNode->text = $process->getProTitle(); + $rootNode->leaf = false; + $rootNode->expanded =true; + foreach($tasksList as $task) { + $node = new stdClass; + $node->id = $task['TAS_UID']; + $node->text = $task['TAS_TITLE']; + $node->leaf = true; + $rootNode->children[] = $node; + } + + $treeDetail[] = $rootNode; + print G::json_encode($treeDetail); + } } diff --git a/workflow/engine/templates/bpmn/bpmnShapes.js b/workflow/engine/templates/bpmn/bpmnShapes.js index db8e54cc6..7e97dfd00 100755 --- a/workflow/engine/templates/bpmn/bpmnShapes.js +++ b/workflow/engine/templates/bpmn/bpmnShapes.js @@ -225,6 +225,8 @@ Figure.prototype.onDragend=function() { case 'bpmnSubProcess': currObj.actiontype = 'saveTaskPosition'; currObj.workflow.savePosition(currObj); + + break; case 'bpmnAnnotation': currObj.actiontype = 'saveTextPosition'; @@ -969,8 +971,9 @@ bpmnTask.prototype.onDoubleClick = function () { * erik: Setting task target to Drop user & group assignment */ bpmnTask.prototype.onMouseEnter = function () { - if( this.type == 'bpmnTask' && typeof(Ext.getCmp('usersPanel')) != 'undefined' ) - Ext.getCmp('usersPanel')._targetTask = this.id; + if( this.type == 'bpmnTask' && typeof Ext.getCmp('usersPanel') != 'undefined' ) { + Ext.getCmp('usersPanel')._targetTask = {id: this.id, name: this.taskName}; + } }; bpmnTask.prototype.trim = function (str) { diff --git a/workflow/engine/templates/bpmn/designer.js b/workflow/engine/templates/bpmn/designer.js index a5a581c6c..b772b020c 100755 --- a/workflow/engine/templates/bpmn/designer.js +++ b/workflow/engine/templates/bpmn/designer.js @@ -10,6 +10,7 @@ new Ext.KeyMap(document, { var saveProcess; var usersPanel; +var _TAS_UID; Ext.onReady ( function() { workflow = new MyWorkflow("paintarea"); @@ -131,8 +132,8 @@ Ext.onReady ( function() { region : "center", layout : "border", autoScroll: true, - height : 1000, - width : PMExt.getBrowser().screen.width, + height : 1360, + width : 1280, //PMExt.getBrowser().screen.width, //items : [west, north, center] items : [north, center] }); @@ -196,7 +197,6 @@ Ext.onReady ( function() { border:true, shim: true, - plugin: new Ext.ux.WindowAlwaysOnTop, items: [toolbarPanel] /*html: '
\n\

\n\ @@ -268,7 +268,7 @@ Ext.onReady ( function() { //// usersPanelStart = 0; - usersPanelLimit = 11; + usersPanelLimit = 10; var usersStore = new Ext.data.Store( { autoLoad: true, @@ -289,30 +289,24 @@ Ext.onReady ( function() { }); var usersGrid = new Ext.grid.GridPanel({ - id: 'usersGrid', - title : 'Users', + id : 'usersGrid', + title : 'Users', + height : 180, stateful : true, - stateId : 'usersGrid', - enableColumnResize: true, - enableHdMenu: true, - //frame:false, - //columnLines: true, - ddGroup : 'task-assignment', - enableDragDrop: true, - viewConfig: { - forceFit:true + stateId : 'usersGrid', + ddGroup : 'task-assignment', + enableDragDrop : true, + viewConfig : { + forceFit : true }, - - cm: new Ext.grid.ColumnModel({ + cm : new Ext.grid.ColumnModel({ defaults: { - width: 200, - sortable: true + width: 200, + sortable: true }, - columns: [ + columns : [ {header: 'USR_UID', id:'USR_UID', dataIndex: 'USR_UID', hidden:true, hideable:false}, - {header: 'USER', dataIndex: 'USER', width: 300, renderer:function(v,p,r){ - return v; //String.format("{0}", v); - }} + {header: 'User', dataIndex: 'USER', width: 300} ] }), store: usersStore, @@ -322,23 +316,22 @@ Ext.onReady ( function() { } }, tbar:[ - //'->', new Ext.form.TextField ({ - id: 'usersSearchTxt', - ctCls:'pm_search_text_field', - allowBlank: true, - width: 230, - emptyText: _('ID_ENTER_SEARCH_TERM'),//'enter search term', - listeners: { + id : 'usersSearchTxt', + ctCls :'pm_search_text_field', + width : 220, + allowBlank : true, + emptyText : _('ID_ENTER_SEARCH_TERM'), + listeners : { specialkey: function(f,e){ if (e.getKey() == e.ENTER) usersSearch(); } } }),{ - text:'X', - ctCls:'pm_search_x_button', - handler: function(){ + text : 'X', + ctCls : 'pm_search_x_button', + handler : function(){ usersStore.setBaseParam( 'search', ''); usersStore.load({params:{start : 0 , limit : usersPanelLimit}}); Ext.getCmp('usersSearchTxt').setValue(''); @@ -349,15 +342,14 @@ Ext.onReady ( function() { } ], bbar: [new Ext.PagingToolbar({ - pageSize: usersPanelLimit, - store: usersStore, + pageSize : usersPanelLimit, + store : usersStore, displayInfo: true, - displayMsg: '{0} - {1} of {2}', - emptyMsg: "" + displayMsg : '{2} Users', + emptyMsg : '' })] }); - var groupsStore = new Ext.data.Store( { autoLoad: true, proxy : new Ext.data.HttpProxy({ @@ -374,104 +366,91 @@ Ext.onReady ( function() { }); var groupsGrid = new Ext.grid.GridPanel({ - id: 'groupsGrid', - title : 'Groups', + id : 'groupsGrid', + title : 'Groups', stateful : true, - stateId : 'groupsGrid', - //enableColumnResize: true, - //enableHdMenu: true, - frame:false, - //columnLines: true, - ddGroup : 'task-assignment', - height: 200, - enableDragDrop: true, - viewConfig: { - forceFit:true + stateId : 'groupsGrid', + ddGroup : 'task-assignment', + height : 180, + enableDragDrop : true, + viewConfig : { + forceFit :true }, - - cm: new Ext.grid.ColumnModel({ - defaults: { - width: 200, - sortable: true + cm : new Ext.grid.ColumnModel({ + defaults : { + width : 400, + sortable : true }, columns: [ - {header: '', id:'GRP_UID', dataIndex: 'GRP_UID', hidden:true, hideable:false}, - {header: 'Group', dataIndex: 'CON_VALUE', width: 300, renderer:function(v,p,r){ - return v; //String.format("{0}", v); - }} + {id:'GRP_UID', dataIndex: 'GRP_UID', hidden:true, hideable:false}, + {header: 'Group', dataIndex: 'CON_VALUE'} ] }), - store: groupsStore, - listeners: { - render: function(){ + store : groupsStore, + listeners : { + render : function(){ this.loadMask = new Ext.LoadMask(this.body, {msg:_('ID_LOADING')}); } }, - tbar:[ - //'->', + tbar : [ new Ext.form.TextField ({ - id: 'groupsSearchTxt', - ctCls:'pm_search_text_field', - allowBlank: true, - width: 230, - emptyText: _('ID_ENTER_SEARCH_TERM'),//'enter search term', - listeners: { + id : 'groupsSearchTxt', + ctCls :'pm_search_text_field', + allowBlank : true, + width : 220, + emptyText : _('ID_ENTER_SEARCH_TERM'), + listeners : { specialkey: function(f,e){ if (e.getKey() == e.ENTER) groupsSearch(); } } - }),{ - text:'X', - ctCls:'pm_search_x_button', - handler: function(){ + }), { + text :'X', + ctCls :'pm_search_x_button', + handler : function(){ groupsStore.setBaseParam( 'search', ''); groupsStore.load({params:{start : 0 , limit : usersPanelLimit}}); Ext.getCmp('groupsSearchTxt').setValue(''); } - },{ - text:TRANSLATIONS.ID_SEARCH, - handler: groupsSearch + }, { + text :TRANSLATIONS.ID_SEARCH, + handler : groupsSearch } ], bbar: [new Ext.PagingToolbar({ - pageSize: usersPanelLimit, - store: groupsStore, + pageSize : usersPanelLimit, + store : groupsStore, displayInfo: true, - displayMsg: '{0} - {1} of {2}', - emptyMsg: "" + displayMsg : '{2} Groups', + emptyMsg : 'No records found' })] }); usersPanel = new Ext.Window({ - id: 'usersPanel', - title: ' Actors', - headerAsText: true, - collapsed : true, - width: 302, - height:380, + id : 'usersPanel', + title : 'Actors', + width : 302, + height : 350, //x: (PMExt.getBrowser().screen.width - designerToolbarWidth) - 5, //y: designerToolbarHeight + 2, - x: 0, - y: 0, - minimizable: false, - maximizable: false, - closable: false, - resizable: false, - floating: true, - shadow:false, - border:false, - //html: 'userslist' + minimizable : false, + maximizable : false, + closable : false, + resizable : false, + floating : true, + shadow : false, + border : false, items:[ new Ext.TabPanel({ + id : 'usersPanelTabs', border: true, // already wrapped so don't add another border - activeTab: 0, // second tab initially active - tabPosition: 'top', - //region:'north', - split: true, - height:350, - items: [ + activeTab : 0, // second tab initially active + tabPosition : 'top', + split : true, + height : 318, + items : [ usersGrid, groupsGrid ] @@ -501,24 +480,57 @@ Ext.onReady ( function() { ] }); - usersPanel.on('minimize',function(w){ - if( Ext.getCmp('usersPanel').collapsed ) - Ext.getCmp('usersPanel').expand(); - else - Ext.getCmp('usersPanel').collapse(); - }); - // custom variables usersPanel._targetTask = null; + usersPanel._onDrop = function(ddSource, e, data) { - alert('tas_uid: ' + Ext.getCmp('usersPanel')._targetTask); - + _TAS_UID = Ext.getCmp('usersPanel')._targetTask.id; + if( typeof parent != 'undefined' ) { + parent._TAS_UID = _TAS_UID; + } + + var type = Ext.getCmp('usersPanelTabs').getActiveTab().id == 'usersGrid' ? 1 : 2; var records = ddSource.dragData.selections; + var uids = Array(); Ext.each(records, function(gridRow){ - alert('usr_uid ->'+gridRow.data.USR_UID); + if( type == 1 ) {//some users grid items were dropped + //alert('usr_uid ->'+gridRow.data.USR_UID); + uids.push(gridRow.data.USR_UID); + } else { //some groups grid items were dropped + //alert('grp_uid ->'+gridRow.data.GRP_UID); + uids.push(gridRow.data.GRP_UID); + } }); + uids = uids.join(','); + + if( typeof parent != 'undefined' ) { + parent.Ext.getCmp('eastPanelCenter').setTitle(Ext.getCmp('usersPanel')._targetTask.name); + } + Ext.Ajax.request({ + url: '../processes/ajaxListener', + success: function(response){ + var result = Ext.util.JSON.decode(response.responseText); + if( result.success ) { + PMExt.notify('', 'Users & Groups assigned successfully!'); + if( typeof parent != 'undefined' ) { + parent.Ext.getCmp('eastPanel').show(); + parent.Ext.getCmp('usersTaskGrid').store.reload({params: {action:'getUsersTask', TAS_UID: _TAS_UID}}); + } + } else { + PMExt.error(_('ID_ERROR'), result.msg) + } + }, + failure: function(){}, + params: { + action : 'assignUsersTask', + TAS_UID : _TAS_UID, + TU_RELATION : type, + UIDS : uids + } + }); } + usersPanel.on('beforeshow', function(e) { usersPanel._posRelToView = usersPanel.getPosition(true); @@ -623,7 +635,7 @@ Ext.onReady ( function() { new Ext.ToolTip({ target: 'x-shapes-annotation', title: 'Annotation', - anchor: 'left', + anchor: 'top', trackMouse: true, html: '' }); @@ -1265,28 +1277,24 @@ Ext.onReady ( function() { function usersSearch() { - var search = Ext.getCmp('usersSearchTxt').getValue(); - + var search = Ext.getCmp('usersSearchTxt').getValue().trim(); + if( search == '' ) { + PMExt.info(_('ID_INFO'), _('ID_ENTER_SEARCH_TERM')); + return; + } Ext.getCmp('usersGrid').store.setBaseParam('search', search); Ext.getCmp('usersGrid').store.load({params:{search: search, start : 0 , limit : usersPanelLimit }}); } function groupsSearch() { - var search = Ext.getCmp('groupsSearchTxt').getValue(); - + var search = Ext.getCmp('groupsSearchTxt').getValue().trim(); + if( search == '' ) { + PMExt.info(_('ID_INFO'), _('ID_ENTER_SEARCH_TERM')); + return; + } Ext.getCmp('groupsGrid').store.setBaseParam('search', search); Ext.getCmp('groupsGrid').store.load({params:{search: search, start : 0 , limit : usersPanelLimit }}); } -}); - -Ext.ux.WindowAlwaysOnTop = function(){ - this.init = function(win){ - win.on('deactivate', function(){ - var i=1; - this.manager.each(function(){i++}); - this.setZIndex(this.manager.zseed + (i*10)); - }) - } -} +}); \ No newline at end of file diff --git a/workflow/engine/templates/bpmn/processmap.js b/workflow/engine/templates/bpmn/processmap.js index ca9abd60e..0563f7aa3 100755 --- a/workflow/engine/templates/bpmn/processmap.js +++ b/workflow/engine/templates/bpmn/processmap.js @@ -1,28 +1,20 @@ new Ext.KeyMap(document, { key: Ext.EventObject.F5, fn: function(keycode, e) { - //here (in the toolbar) we are disabling the ctrl-f5 - e.stopEvent(); - //if (! e.ctrlKey) { - // if (Ext.isIE) - // e.browserEvent.keyCode = 8; - // e.stopEvent(); - //Ext.Msg.alert('Refresh', 'You clicked: F5'); - //document.location = document.location; - //} - //else - //Ext.Msg.alert('Refresh', 'You clicked: CTRL-F5'); + //e.stopEvent(); } }); +var _TAS_UID; + Ext.onReady ( function() { + workflow = new MyWorkflow("paintarea"); workflow.setEnableSmoothFigureHandling(false); workflow.scrollArea.width = 2000; //For Undo and Redo Options // workflow.getCommandStack().addCommandStackEventListener(new commandListener()); - //Getting process id from the URL using getUrlvars function - + if(typeof pro_uid !== 'undefined') { Ext.Ajax.request({ url: 'openProcess.php?PRO_UID=' + pro_uid, @@ -37,6 +29,7 @@ Ext.onReady ( function() { } + /********************************************************************************** * * Do the Ext (Yahoo UI) Stuff @@ -51,44 +44,270 @@ Ext.onReady ( function() { autoScroll : true, collapsible :true, split :true, - //collapseMode:'mini', - hideCollapseTool: false, - - items:{ - html:'
\n\ -

\n\ -

\n\ -

\n\ -

\n\ -

\n\ -

\n\ - \n\ -
' - } - }; - - var east= { - id : 'eastPanel', - title : '', - region : 'east', - width : 150, - border : false, - autoScroll : true, - collapsible :true, - split :true, collapseMode:'mini', hideCollapseTool: false, items:{ - html:'east panel' + html:'' } }; - var north= { + var usersTaskStore = new Ext.data.GroupingStore( { + autoLoad: false, + url: '../processes/ajaxListener', + reader : new Ext.data.JsonReader({ + totalProperty: 'totalCount', + root: 'data', + fields : [ + {name : 'USR_UID'}, + {name : 'NAME'}, + {name : 'TU_RELATION'} + ] + }), + baseParams: { + action: 'getUsersTask', + TAS_UID: '4619962094d5d499f746ca7075681567' + }, + groupField: 'TU_RELATION' + }); + + var usersTaskGrid = new Ext.grid.GridPanel({ + id : 'usersTaskGrid', + title : 'Users & Groups', + height : 180, + stateful : true, + stateId : 'usersTaskGrid', + sortable:false, + view: new Ext.grid.GroupingView({ + forceFit:true, + groupTextTpl: '{[values.rs.length]} {[values.rs[0].data["TU_RELATION"] == 1 ? "Users" : "Groups"]}' + //groupTextTpl: '{text}' + }), + cm : new Ext.grid.ColumnModel({ + defaults: { + width: 300, + sortable: true + }, + columns : [ + {id:'USR_UID', dataIndex: 'USR_UID', hidden:true, hideable:false}, + {header: 'Assigned', id:'TU_RELATION', dataIndex: 'TU_RELATION', hidden:true, hideable:false}, + {header: 'Assigned', dataIndex: 'NAME', hideable:false} + ] + }), + store: usersTaskStore, + listeners: { + render: function(){ + this.loadMask = new Ext.LoadMask(this.body, {msg:_('ID_LOADING')}); + } + }/*, + tbar:[ + '->', { + text: _('ID_REMOVE'), + iconCls: 'button_menu_ext ss_sprite ss_delete', + handler: removeUsersTask + } + ]*/, + bbar: [new Ext.PagingToolbar({ + pageSize : 10, + store : usersTaskStore, + displayInfo: true, + displayMsg : '{2} Users', + emptyMsg : '' + })] + }); + + //connecting context menu to grid + usersTaskGrid.addListener('rowcontextmenu', onDynaformsContextMenu,this); + + //by default the right click is not selecting the grid row over the mouse + //we need to set this four lines + usersTaskGrid.on('rowcontextmenu', function (grid, rowIndex, evt) { + var sm = grid.getSelectionModel(); + sm.selectRow(rowIndex, sm.isSelected(rowIndex)); + }, this); + + //prevent default + usersTaskGrid.on('contextmenu', function (evt) { + evt.preventDefault(); + }, this); + + function onDynaformsContextMenu(grid, rowIndex, e) { + e.stopEvent(); + var coords = e.getXY(); + usersTaskGridContextMenu.showAt([coords[0], coords[1]]); + } + + var usersTaskGridContextMenu = new Ext.menu.Menu({ + id: 'messageContextMenu', + items: [{ + text: _('ID_REMOVE'), + iconCls: 'button_menu_ext ss_sprite ss_delete', + handler: removeUsersTask + } + ] + }); + + function removeUsersTask(){ + + var usr_uid = Array(); + var tu_relation = Array(); + var rowsSelected = Ext.getCmp('usersTaskGrid').getSelectionModel().getSelections(); + + if( rowsSelected.length == 0 ) { + PMExt.error('', _('ID_NO_SELECTION_WARNING')); + return false; + } + + for(i=0; i