Robert Vogel has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/172539

Change subject: UserManager: Added multi select features
......................................................................

UserManager: Added multi select features

* Added checkbox column
* Added multi group assginment
* Added rowexpander for group lists (experimental)

Change-Id: Ib8b840e8108ad0ba0be28e17342622a721515cd9
---
M UserManager/UserManager.setup.php
R UserManager/resources/BS.UserManager/dialog/User.js
A UserManager/resources/BS.UserManager/dialog/UserGroups.js
R UserManager/resources/BS.UserManager/panel/Manager.js
M UserManager/resources/bluespice.userManager.js
5 files changed, 199 insertions(+), 31 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/BlueSpiceExtensions 
refs/changes/39/172539/1

diff --git a/UserManager/UserManager.setup.php 
b/UserManager/UserManager.setup.php
index 4758fd0..2d560d0 100644
--- a/UserManager/UserManager.setup.php
+++ b/UserManager/UserManager.setup.php
@@ -31,4 +31,5 @@
 $wgAjaxExportList[] = 'UserManager::getUsers';
 $wgAjaxExportList[] = 'UserManager::addUser';
 $wgAjaxExportList[] = 'UserManager::editUser';
-$wgAjaxExportList[] = 'UserManager::deleteUser';
\ No newline at end of file
+$wgAjaxExportList[] = 'UserManager::deleteUser';
+$wgAjaxExportList[] = 'UserManager::setUserGroups';
\ No newline at end of file
diff --git a/UserManager/resources/BS.UserManager/UserDialog.js 
b/UserManager/resources/BS.UserManager/dialog/User.js
similarity index 97%
rename from UserManager/resources/BS.UserManager/UserDialog.js
rename to UserManager/resources/BS.UserManager/dialog/User.js
index e6b58b7..5b545b1 100644
--- a/UserManager/resources/BS.UserManager/UserDialog.js
+++ b/UserManager/resources/BS.UserManager/dialog/User.js
@@ -12,7 +12,7 @@
  * @filesource
  */
 
-Ext.define( 'BS.UserManager.UserDialog', {
+Ext.define( 'BS.UserManager.dialog.User', {
        extend: 'BS.Window',
        currentData: {},
        selectedData: {},
@@ -56,7 +56,7 @@
                        labelAlign: 'right',
                        name: 'realname'
                });
-               
+
                this.cbGroups = Ext.create( 'Ext.ux.form.MultiSelect', {
                        fieldLabel: 
mw.message('bs-usermanager-headergroups').plain(),
                        labelWidth: 130,
@@ -106,7 +106,7 @@
 
                return this.selectedData;
        },
-                       
+
        getGroupsValue: function( data ) {
                var groups = [];
                for( var i = 0; i < data.length; i++ ) {
diff --git a/UserManager/resources/BS.UserManager/dialog/UserGroups.js 
b/UserManager/resources/BS.UserManager/dialog/UserGroups.js
new file mode 100644
index 0000000..c82260d
--- /dev/null
+++ b/UserManager/resources/BS.UserManager/dialog/UserGroups.js
@@ -0,0 +1,63 @@
+/**
+ * UserManager UserGroups Dialog
+ *
+ * Part of BlueSpice for MediaWiki
+ *
+ * @author     Robert Vogel <[email protected]>
+ * @package    Bluespice_Extensions
+ * @subpackage UserManager
+ * @copyright  Copyright (C) 2014 Hallo Welt! - Medienwerkstatt GmbH, All 
rights reserved.
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU Public License v2 or 
later
+ * @filesource
+ */
+
+Ext.define( 'BS.UserManager.dialog.UserGroups', {
+       extend: 'BS.Window',
+       currentData: {},
+       selectedData: {},
+       maxHeight: 620,
+       title: mw.message('bs-usermanager-headergroups').plain(),
+       afterInitComponent: function() {
+               if( this.currentData.groups ) {
+                       this.cbGroups.setValue( 
this.getGroupsValue(this.currentData.groups) );
+               }
+
+               this.cbGroups = Ext.create( 'Ext.ux.form.MultiSelect', {
+                       fieldLabel: 
mw.message('bs-usermanager-headergroups').plain(),
+                       labelWidth: 130,
+                       labelAlign: 'right',
+                       store: this.strGroups,
+                       valueField: 'group',
+                       displayField: 'displayname',
+                       maxHeight: 350
+               } );
+
+               this.items = [
+                       this.cbGroups
+               ];
+
+               this.callParent(arguments);
+       },
+       resetData: function() {
+               this.cbGroups.reset();
+
+               this.callParent(arguments);
+       },
+       setData: function( obj ) {
+               this.currentData = obj;
+               this.cbGroups.setValue( 
this.getGroupsValue(this.currentData.groups) );
+       },
+       getData: function() {
+               this.selectedData.groups = this.cbGroups.getValue();
+
+               return this.selectedData;
+       },
+
+       getGroupsValue: function( data ) {
+               var groups = [];
+               for( var i = 0; i < data.length; i++ ) {
+                       groups.push( data[i].group );
+               }
+               return groups;
+       }
+} );
\ No newline at end of file
diff --git a/UserManager/resources/BS.UserManager/Panel.js 
b/UserManager/resources/BS.UserManager/panel/Manager.js
similarity index 65%
rename from UserManager/resources/BS.UserManager/Panel.js
rename to UserManager/resources/BS.UserManager/panel/Manager.js
index de77aca..c80c8b5 100644
--- a/UserManager/resources/BS.UserManager/Panel.js
+++ b/UserManager/resources/BS.UserManager/panel/Manager.js
@@ -12,14 +12,12 @@
  * @filesource
  */
 
-Ext.define( 'BS.UserManager.Panel', {
+Ext.define( 'BS.UserManager.panel.Manager', {
        extend: 'BS.CRUDGridPanel',
+       requires: [ 'BS.UserManager.dialog.User', 
'BS.UserManager.dialog.UserGroups' ],
        id: 'bs-usermanager-extgrid',
        features: [],
        initComponent: function() {
-               this.smMain = this.smMain || Ext.create( 
'Ext.selection.RowModel', {
-                       mode: "MULTI"
-               });
                this.strMain = Ext.create( 'Ext.data.JsonStore', {
                        proxy: {
                                type: 'ajax',
@@ -33,12 +31,13 @@
                        },
                        autoLoad: true,
                        remoteSort: true,
-                       fields: [ 'user_id', 'user_name', 'user_page', 
'user_real_name', 'user_email', 'groups' ],
+                       fields: [ 'user_id', 'user_name', 'user_page_link', 
'user_real_name', 'user_email', 'groups' ],
                        sortInfo: {
                                field: 'id',
                                direction: 'ASC'
                        }
                });
+
                this.strGroups = Ext.create( 'Ext.data.JsonStore', {
                        fields: [ 'group', 'displayname' ],
                        proxy: {
@@ -66,21 +65,24 @@
                        header: 
mw.message('bs-usermanager-headerusername').plain(),
                        sortable: true,
                        dataIndex: 'user_name',
-                       tpl: '<a href="{user_page}">{user_name}</a>'
+                       tpl: '{user_page_link}',
+                       flex: 1
                } );
                this.colRealName = Ext.create( 'Ext.grid.column.Template', {
                        id: 'userrealname',
                        header: 
mw.message('bs-usermanager-headerrealname').plain(),
                        sortable: true,
                        dataIndex: 'user_real_name',
-                       tpl: '{user_real_name}'
+                       tpl: '{user_real_name}',
+                       flex: 1
                } );
                this.colEmail = Ext.create( 'Ext.grid.column.Column', {
                        id: this.getId()+'-useremail',
                        header: 
mw.message('bs-usermanager-headeremail').plain(),
                        sortable: true,
                        dataIndex: 'user_email',
-                       renderer: this.renderEmail
+                       renderer: this.renderEmail,
+                       flex: 1
                } );
                this.colGroups = Ext.create( 'Ext.grid.column.Column', {
                        header: 
mw.message('bs-usermanager-headergroups').plain(),
@@ -111,6 +113,15 @@
                });
 
                this.gpMainConf.features = [this.filters];
+               this.gpMainConf.plugins = [{
+                               ptype: 'rowexpander',
+                               rowBodyTpl : new Ext.XTemplate(
+                                       '<ul>',
+                                       '<tpl for="groups">',
+                                               '<li>{displayname}</li>',
+                                       '</tpl></ul>'
+                               )
+                       }];
 
                this.colMainConf.columns = [
                        this.colUserName,
@@ -120,14 +131,35 @@
                ];
                this.callParent( arguments );
        },
+
+       makeSelModel: function(){
+               this.smModel = Ext.create( 'Ext.selection.CheckboxModel', {
+                       mode: "MULTI",
+                       selType: 'checkboxmodel'
+               });
+               return this.smModel;
+       },
+
+       makeGridColumns: function() {
+               var columns = this.callParent(arguments);
+               return {
+                       items: columns.items
+               };
+       },
+
        renderGroups: function( value ) {
+               return value.length;
+/*
                if ( value.length === 0 ) return '';
 
-               var html = '<ul class="bs-extjs-list">';
+               var html = '<div class="bs-extjs-list">';
+               var items = [];
                for ( var i = 0; i < value.length; i++ ) {
-                       html += '<li>' + value[i].displayname + '</li>';
+                       items.push( '<li>' + value[i].displayname + '</li>' );
                }
-               html += '</ul>';
+               html += items.join( '' );
+               html += '</div>';
+*/
                return html;
        },
        renderEmail: function( value ) {
@@ -135,9 +167,19 @@
 
                return '<a href="mailto:' + value + '">' + value + '</a>';
        },
+       onGrdMainRowClick: function( oSender, iRowIndex, oEvent ) {
+               this.callParent(arguments);
+               /*
+                * We override base class functionality which disables edit 
button on
+                * multi selection
+                */
+               this.btnEdit.enable();
+       },
        onBtnAddClick: function( oButton, oEvent ) {
                if ( !this.dlgUserAdd ) {
-                       this.dlgUserAdd = Ext.create( 
'BS.UserManager.UserDialog', {strGroups:this.strGroups} );
+                       this.dlgUserAdd = new BS.UserManager.dialog.User({
+                               strGroups:this.strGroups
+                       });
                        this.dlgUserAdd.on( 'ok', this.onDlgUserAddOk, this );
                }
 
@@ -148,24 +190,44 @@
                this.callParent( arguments );
        },
        onBtnEditClick: function( oButton, oEvent ) {
-               var selectedRow = 
this.grdMain.getSelectionModel().getSelection();
-               if ( !this.dlgUserEdit ) {
-                       this.dlgUserEdit = Ext.create( 
'BS.UserManager.UserDialog', {strGroups:this.strGroups} );
-                       this.dlgUserEdit.on( 'ok', this.onDlgUserEditOk, this );
+               var selectedRows = 
this.grdMain.getSelectionModel().getSelection();
+               if( selectedRows.length > 1 ) { //Multiselect
+                       if ( !this.dlgUserGroups ) {
+                               this.dlgUserGroups = new 
BS.UserManager.dialog.UserGroups({
+                                       strGroups:this.strGroups
+                               });
+                               this.dlgUserGroups.on( 'ok', 
this.onDlgUserGroupsOk, this );
+                       }
+
+                       this.active = 'edit-multi-groups';
+                       this.dlgUserGroups.setData( { groups: [] } );
+                       this.dlgUserGroups.show();
+               }
+               else { //Single select
+                       if ( !this.dlgUserEdit ) {
+                               this.dlgUserEdit = new 
BS.UserManager.dialog.User({
+                                       strGroups:this.strGroups
+                               });
+                               this.dlgUserEdit.on( 'ok', 
this.onDlgUserEditOk, this );
+                       }
+
+                       this.active = 'edit';
+                       this.dlgUserEdit.setTitle( mw.message( 
'bs-usermanager-titleeditdetails' ).plain() );
+                       this.dlgUserEdit.tfUserName.disable();
+                       this.dlgUserEdit.setData( selectedRows[0].getData() );
+                       this.dlgUserEdit.show();
                }
 
-               this.active = 'edit';
-               this.dlgUserEdit.setTitle( mw.message( 
'bs-usermanager-titleeditdetails' ).plain() );
-               this.dlgUserEdit.tfUserName.disable();
-               this.dlgUserEdit.setData( selectedRow[0].getData() );
-               this.dlgUserEdit.show();
                this.callParent( arguments );
        },
        onBtnRemoveClick: function( oButton, oEvent ) {
                bs.util.confirm(
                        'UMremove',
                        {
-                               text: mw.message( 
'bs-usermanager-confirmdeleteuser', 
this.grdMain.getSelectionModel().getSelection().length ).text(),
+                               text: mw.message(
+                                       'bs-usermanager-confirmdeleteuser',
+                                       
this.grdMain.getSelectionModel().getSelection().length
+                               ).text(),
                                title: mw.message( 
'bs-usermanager-titledeleteuser' ).plain()
                        },
                        {
@@ -177,7 +239,7 @@
        },
        onRemoveUserOk: function() {
                var selectedRow = 
this.grdMain.getSelectionModel().getSelection();
-               for (var i = 0; i<selectedRow.length; i++){
+               for (var i = 0; i < selectedRow.length; i++){
                        var userId = selectedRow[i].get( 'user_id' );
 
                        Ext.Ajax.request( {
@@ -248,14 +310,35 @@
                        failure: function( response, opts ) {}
                });
        },
+       onDlgUserGroupsOk: function( sender, data ) {
+               var selectedRow = 
this.grdMain.getSelectionModel().getSelection();
+               var userIds = [];
+               for (var i = 0; i < selectedRow.length; i++){
+                       userIds.push( selectedRow[i].get( 'user_id' ) );
+               }
+               Ext.Ajax.request( {
+                       url: bs.util.getAjaxDispatcherUrl(
+                               'UserManager::setUserGroups',
+                               [ userIds, data.groups ]
+                       ),
+                       scope: this,
+                       method: 'post',
+                       success: function( response, opts ) {
+                               var responseObj = Ext.decode( 
response.responseText );
+                               this.renderMsgSuccess( responseObj );
+                       }
+               });
+       },
        reloadStore: function() {
                this.strMain.reload();
        },
        showDlgAgain: function() {
                if ( this.active === 'add' ) {
                        this.dlgUserAdd.show();
-               } else {
+               } else if ( this.active === 'edit' ) {
                        this.dlgUserEdit.show();
+               } else if ( this.active === 'edit-multi-groups' ) {
+                       this.dlgUserGroupsEdit.show();
                }
        },
        renderMsgSuccess: function( responseObj ) {
@@ -266,7 +349,17 @@
 
                                message = message + responseObj.message[i] + 
'<br />';
                        }
-                       bs.util.alert( 'UMsuc', { text: message, titleMsg: 
'bs-extjs-title-success' }, { ok: this.reloadStore, cancel: function() {}, 
scope: this } );
+                       bs.util.alert(
+                               'UMsuc',
+                               {
+                                       text: message,
+                                       titleMsg: 'bs-extjs-title-success' },
+                               {
+                                       ok: this.reloadStore,
+                                       cancel: function() {},
+                                       scope: this
+                               }
+                       );
                }
        },
        renderMsgFailure: function( responseObj ) {
@@ -276,7 +369,18 @@
                                if ( typeof( responseObj.errors[i].message ) 
!== 'string') continue;
                                message = message + 
responseObj.errors[i].message + '<br />';
                        }
-                       bs.util.alert( 'UMfail', { text: message, titleMsg: 
'bs-extjs-title-warning' }, { ok: this.showDlgAgain, cancel: function() {}, 
scope: this } );
+                       bs.util.alert(
+                               'UMfail',
+                               {
+                                       text: message,
+                                       titleMsg: 'bs-extjs-title-warning'
+                               },
+                               {
+                                       ok: this.showDlgAgain,
+                                       cancel: function() {},
+                                       scope: this
+                               }
+                       );
                }
        }
 } );
\ No newline at end of file
diff --git a/UserManager/resources/bluespice.userManager.js 
b/UserManager/resources/bluespice.userManager.js
index 92400ee..e74caac 100644
--- a/UserManager/resources/bluespice.userManager.js
+++ b/UserManager/resources/bluespice.userManager.js
@@ -10,6 +10,6 @@
  * @filesource
  */
 
-Ext.create( 'BS.UserManager.Panel', {
+Ext.create( 'BS.UserManager.panel.Manager', {
        renderTo: 'bs-usermanager-grid'
 } );
\ No newline at end of file

-- 
To view, visit https://gerrit.wikimedia.org/r/172539
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib8b840e8108ad0ba0be28e17342622a721515cd9
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/BlueSpiceExtensions
Gerrit-Branch: master
Gerrit-Owner: Robert Vogel <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to