Smuggli has submitted this change and it was merged.

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


UserManager: Added multi select features

* Added checkbox column
* Added multi group assginment
* Added custom expand mechanism for groups list

Change-Id: Ib8b840e8108ad0ba0be28e17342622a721515cd9
---
M UserManager/UserManager.class.php
M UserManager/UserManager.setup.php
M UserManager/i18n/de.json
M UserManager/i18n/en.json
M UserManager/i18n/qqq.json
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
9 files changed, 296 insertions(+), 58 deletions(-)

Approvals:
  Smuggli: Verified; Looks good to me, approved
  Raimond Spekking: Looks good to me, but someone else must approve



diff --git a/UserManager/UserManager.class.php 
b/UserManager/UserManager.class.php
index 3aef28d..96bfdbe 100644
--- a/UserManager/UserManager.class.php
+++ b/UserManager/UserManager.class.php
@@ -84,7 +84,7 @@
                $sDirection = $oStoreParams->getDirection();
                $aFilters = $oStoreParams->getFilter();
 
-               $aSortingParams = json_decode( $sSort );
+               $aSortingParams = FormatJson::decode( $sSort );
                if ( is_array( $aSortingParams ) ) {
                        $sSort = $aSortingParams[0]->property;
                        $sDirection = $aSortingParams[0]->direction;
@@ -155,7 +155,7 @@
                        $tmp = array();
                        $tmp['user_id']        = $row->user_id;
                        $tmp['user_name']      = $row->user_name;
-                       $tmp['user_page']      = $oUserTitle->getLocalURL();
+                       $tmp['user_page_link'] = Linker::link( $oUserTitle, 
$row->user_name.' ' ); //The whitespace is to aviod automatic rewrite to 
user_real_name by BSF
                        $tmp['user_real_name'] = $row->user_real_name;
                        $tmp['user_email']     = $row->user_email == null ? '' 
: $row->user_email; //PW: Oracle returns null when field is emtpy
                        $tmp['groups']         = array();
@@ -179,7 +179,7 @@
                $oUserManager = BsExtensionManager::getExtension( 'UserManager' 
);
                wfRunHooks( 'BSWikiAdminUserManagerBeforeUserListSend', array( 
$oUserManager, &$data ) );
 
-               return json_encode( $data );
+               return FormatJson::encode( $data );
        }
 
        /**
@@ -190,7 +190,7 @@
        public static function addUser( $sUsername, $sPassword, $sRePassword, 
$sEmail, $sRealname, $aGroups = array() ) {
                if ( wfReadOnly() ) {
                        global $wgReadOnly;
-                       return json_encode( array(
+                       return FormatJson::encode( array(
                                'success' => false,
                                'message' => array( wfMessage( 'bs-readonly', 
$wgReadOnly )->plain() )
                                ) );
@@ -278,7 +278,7 @@
                }
 
                if ( !empty( $aResponse['errors'] ) ) { //In case that any 
error occurred
-                       return json_encode( $aResponse );
+                       return FormatJson::encode( $aResponse );
                }
 
                $oNewUser->addToDatabase();
@@ -338,7 +338,7 @@
                        )
                );
 
-               return json_encode( $aResponse );
+               return FormatJson::encode( $aResponse );
        }
 
        /**
@@ -354,7 +354,7 @@
        public static function editUser( $sUsername, $sPassword, $sRePassword, 
$sEmail, $sRealname, $aGroups = array() ) {
                if ( wfReadOnly() ) {
                        global $wgReadOnly;
-                       return json_encode( array(
+                       return FormatJson::encode( array(
                                'success' => false,
                                'message' => array( wfMessage( 'bs-readonly', 
$wgReadOnly )->plain() )
                                ) );
@@ -457,7 +457,7 @@
                        $aAnswer['message'][] = wfMessage( 
'bs-usermanager-save-successful' )->plain();
                }
 
-               return json_encode( $aAnswer );
+               return FormatJson::encode( $aAnswer );
        }
 
        /**
@@ -467,21 +467,21 @@
         * @return string json encoded response
         */
        public static function deleteUser( $iUserId ) {
-               if ( wfReadOnly() ) {
-                       global $wgReadOnly;
-                       return json_encode( array(
-                               'success' => false,
-                               'message' => array( wfMessage( 'bs-readonly', 
$wgReadOnly )->plain() ),
-                               'errors' => array(),
-                       ));
-               }
-               if ( BsCore::checkAccessAdmission( 'wikiadmin' ) === false ) 
return true;
-
                $aAnswer = array(
                        'success' => true,
                        'errors' => array(),
-                       'message' => array(),
+                       'message' => array()
                );
+
+               if ( wfReadOnly() ) {
+                       global $wgReadOnly;
+                       $aAnswer['success'] = false;
+                       $aAnswer['message'][] =  wfMessage( 'bs-readonly', 
$wgReadOnly )->plain();
+               }
+               if ( BsCore::checkAccessAdmission( 'wikiadmin' ) === false ) {
+                       $aAnswer['success'] = false;
+                       $aAnswer['message'][] =  wfMessage( 
'bs-wikiadmin-notallowed' )->plain();
+               }
 
                $oUser = User::newFromId( $iUserId );
 
@@ -502,7 +502,7 @@
                }
 
                if( !$aAnswer['success'] ) {
-                       return json_encode( $aAnswer );
+                       return FormatJson::encode( $aAnswer );
                }
 
                $dbw = wfGetDB( DB_MASTER );
@@ -529,17 +529,74 @@
                if ( ( $res === false ) || ( $res1 === false ) || ( $res2 === 
false ) || ( $res3 === false ) ) {
                        $aAnswer['success'] = false;
                        $aAnswer['message'][] = wfMessage( 
'bs-usermanager-db-error' )->plain();
-                       return json_encode( $aAnswer );
+                       return FormatJson::encode( $aAnswer );
                }
 
                $aAnswer['message'][] = wfMessage( 
'bs-usermanager-user-deleted' )->plain();
 
-               return json_encode( $aAnswer );
+               return FormatJson::encode( $aAnswer );
+       }
+
+       public static function setUserGroups( $aUserIds, $aGroups ) {
+               $aAnswer = array(
+                       'success' => true,
+                       'errors' => array(),
+                       'message' => array()
+               );
+
+               if ( wfReadOnly() ) {
+                       global $wgReadOnly;
+                       $aAnswer['success'] = false;
+                       $aAnswer['message'][] =  wfMessage( 'bs-readonly', 
$wgReadOnly )->plain();
+               }
+
+               if ( BsCore::checkAccessAdmission( 'wikiadmin' ) === false ) {
+                       $aAnswer['success'] = false;
+                       $aAnswer['message'][] =  wfMessage( 
'bs-wikiadmin-notallowed' )->plain();
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $resDelGroups = $dbw->delete( 'user_groups',
+                       array(
+                               'ug_user' => $aUserIds
+                       )
+               );
+
+               $resInsGroups = true;
+               if( is_array( $aGroups ) ) {
+                       foreach ( $aGroups as $sGroup ) {
+                               if ( in_array( $sGroup, self::$excludegroups ) 
) {
+                                       continue;
+                               }
+                               foreach( $aUserIds as $iUserId ) {
+                                       $resInsGroups = $dbw->insert(
+                                                       'user_groups',
+                                                       array(
+                                                               'ug_user' => 
(int)$iUserId,
+                                                               'ug_group' => 
addslashes( $sGroup )
+                                                       )
+                                       );
+                                       if( $resInsGroups === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               if ( $resDelGroups === false || $resInsGroups === false ) {
+                       $aAnswer['success'] = false;
+                       $aAnswer['message'][] = wfMessage( 
'bs-usermanager-db-error' )->plain();
+               }
+
+               if ( $aAnswer['success'] ) {
+                       $aAnswer['message'][] = wfMessage( 
'bs-usermanager-save-successful' )->plain();
+               }
+
+               return FormatJson::encode( $aAnswer );
        }
 
        public function getForm( $firsttime = false ) {
                $this->getOutput()->addModules( 'ext.bluespice.userManager' );
                return '<div id="bs-usermanager-grid"></div>';
        }
-
 }
\ No newline at end of file
diff --git a/UserManager/UserManager.setup.php 
b/UserManager/UserManager.setup.php
index 4758fd0..b86b037 100644
--- a/UserManager/UserManager.setup.php
+++ b/UserManager/UserManager.setup.php
@@ -22,7 +22,8 @@
                'bs-usermanager-labelpasswordcheck',
                'bs-usermanager-headergroups',
                'bs-usermanager-titledeleteuser',
-               'bs-usermanager-confirmdeleteuser'
+               'bs-usermanager-confirmdeleteuser',
+               'bs-usermanager-groups-more'
        ),
        'localBasePath' => __DIR__ . '/resources',
        'remoteExtPath' => 'BlueSpiceExtensions/UserManager/resources'
@@ -31,4 +32,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/i18n/de.json b/UserManager/i18n/de.json
index e4cb57b..879f108 100644
--- a/UserManager/i18n/de.json
+++ b/UserManager/i18n/de.json
@@ -29,5 +29,6 @@
        "bs-usermanager-labelnewpassword": "Passwort",
        "bs-usermanager-labelpasswordcheck": "Passwort bestätigen",
        "bs-usermanager-titledeleteuser": "Benutzer löschen",
-       "bs-usermanager-confirmdeleteuser": "Bist du sicher, dass du 
{{PLURAL:$1|diesen|diese $1}} Benutzer löschen willst?"
+       "bs-usermanager-confirmdeleteuser": "Bist du sicher, dass du 
{{PLURAL:$1|diesen|diese $1}} Benutzer löschen willst?",
+       "bs-usermanager-groups-more": "... mehr"
 }
diff --git a/UserManager/i18n/en.json b/UserManager/i18n/en.json
index 99dff1f..972a1aa 100644
--- a/UserManager/i18n/en.json
+++ b/UserManager/i18n/en.json
@@ -28,5 +28,6 @@
        "bs-usermanager-labelnewpassword": "Password",
        "bs-usermanager-labelpasswordcheck": "Confirm password",
        "bs-usermanager-titledeleteuser": "Delete user",
-       "bs-usermanager-confirmdeleteuser": "Are you sure, you want to delete 
{{PLURAL:$1|this user|these $1 users}}?"
+       "bs-usermanager-confirmdeleteuser": "Are you sure, you want to delete 
{{PLURAL:$1|this user|these $1 users}}?",
+       "bs-usermanager-groups-more": "... more"
 }
diff --git a/UserManager/i18n/qqq.json b/UserManager/i18n/qqq.json
index 70f1ae0..aa63c6d 100644
--- a/UserManager/i18n/qqq.json
+++ b/UserManager/i18n/qqq.json
@@ -29,5 +29,6 @@
        "bs-usermanager-labelnewpassword": "Label for 
password\\n{{Identical|Password}}",
        "bs-usermanager-labelpasswordcheck": "Label for confirm 
password\\n{{Identical|Confirm password}}",
        "bs-usermanager-titledeleteuser": "Window title for delete 
user\\n{{Identical|Delete user}}",
-       "bs-usermanager-confirmdeleteuser": "Text for are you sure, you want to 
delete {{PLURAL:$1|this user|these $1 users}}?\\n $1 is the number of users 
which will be deleted - use for PLURAL distinction."
+       "bs-usermanager-confirmdeleteuser": "Text for are you sure, you want to 
delete {{PLURAL:$1|this user|these $1 users}}?\\n $1 is the number of users 
which will be deleted - use for PLURAL distinction.",
+       "bs-usermanager-groups-more": "Text of a link that expands the list of 
groups"
 }
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..6629638 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,27 +65,31 @@
                        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(),
                        dataIndex: 'groups',
                        renderer: this.renderGroups,
-                       sortable: false
+                       sortable: false,
+                       flex: 1
                } );
                this.filters = Ext.create('Ext.ux.grid.FiltersFeature', {
                        encode: true,
@@ -120,14 +123,44 @@
                ];
                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 ) {
                if ( value.length === 0 ) return '';
 
                var html = '<ul class="bs-extjs-list">';
                for ( var i = 0; i < value.length; i++ ) {
+                       if( i === 2  ) {
+                               html += '<li>' + mw.html.element(
+                                       'a',
+                                       {
+                                               href: '#',
+                                               class: 'bs-um-more-groups'
+                                       },
+                                       
mw.message('bs-usermanager-groups-more').plain()
+                               ) + '</li>';
+                               html += '</ul>';
+                               html += '<ul class="bs-extjs-list 
bs-um-hidden-groups" style="display:none">';
+                       }
+
                        html += '<li>' + value[i].displayname + '</li>';
                }
                html += '</ul>';
+
                return html;
        },
        renderEmail: function( value ) {
@@ -135,9 +168,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 +191,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 +240,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 +311,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 +350,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 +370,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..2eba8c7 100644
--- a/UserManager/resources/bluespice.userManager.js
+++ b/UserManager/resources/bluespice.userManager.js
@@ -10,6 +10,14 @@
  * @filesource
  */
 
-Ext.create( 'BS.UserManager.Panel', {
-       renderTo: 'bs-usermanager-grid'
-} );
\ No newline at end of file
+(function( mw, $, bs, d, undefined){
+       Ext.create( 'BS.UserManager.panel.Manager', {
+               renderTo: 'bs-usermanager-grid'
+       } );
+
+       $(d).on( 'click', '.bs-um-more-groups', function() {
+               $(this).parent('li').hide();
+               $(this).parents('ul').next('.bs-um-hidden-groups').show();
+               return false;
+       });
+})(mediaWiki, jQuery, blueSpice, document );
\ 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: merged
Gerrit-Change-Id: Ib8b840e8108ad0ba0be28e17342622a721515cd9
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/BlueSpiceExtensions
Gerrit-Branch: master
Gerrit-Owner: Robert Vogel <[email protected]>
Gerrit-Reviewer: Mglaser <[email protected]>
Gerrit-Reviewer: Pigpen <[email protected]>
Gerrit-Reviewer: Raimond Spekking <[email protected]>
Gerrit-Reviewer: Siebrand <[email protected]>
Gerrit-Reviewer: Smuggli <[email protected]>
Gerrit-Reviewer: Tweichart <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to