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