bs.util.registerNamespace( 'bs.permissionManager.panel' );
bs.permissionManager.panel.GroupManager = function ( cfg ) {
cfg = cfg || {};
cfg = Object.assign( { expanded: false, padded: false }, cfg );
bs.permissionManager.panel.GroupManager.parent.call( this, cfg );
this.editable = cfg.editable || false;
this.groupTypes = cfg.types || [ 'explicit', 'implicit' ];
this.blacklist = cfg.blacklist || [];
this.$element.addClass( 'bs-permission-manager-group-manager' );
this.groupWidgets = [];
};
OO.inheritClass( bs.permissionManager.panel.GroupManager, OO.ui.PanelLayout );
bs.permissionManager.panel.GroupManager.prototype.init = async function () {
this.renderHeader();
await this.getGroups();
this.groupPanel = new OO.ui.ButtonSelectWidget( {
items: [],
classes: [ 'group-panel' ]
} );
this.groupPanel.connect( this, { select: 'groupSelected' } );
this.$element.append( this.groupPanel.$element );
this.renderGroups();
};
bs.permissionManager.panel.GroupManager.prototype.getGroups = async function () {
try {
this.groups = await this.doGetGroups();
} catch ( e ) {
this.showError( e );
}
};
bs.permissionManager.panel.GroupManager.prototype.doGetGroups = async function () {
return new Promise( ( resolve, reject ) => {
const data = {};
if ( typeof this.groupTypes === 'object' && this.groupTypes.length ) {
data.type = this.groupTypes.join( '|' );
}
if ( typeof this.blacklist === 'object' && this.blacklist.length ) {
data.blacklist = this.blacklist.join( '|' );
}
$.ajax( {
url: mw.util.wikiScript( 'rest' ) + '/bs-permission-manager/v1/groups',
type: 'GET',
data: data,
success: function ( data ) { // eslint-disable-line no-shadow
resolve( data );
},
error: function ( xhr, status, error ) {
reject( error );
}
} );
} );
};
bs.permissionManager.panel.GroupManager.prototype.renderHeader = function () {
this.$header = $( '
' ).addClass( 'group-manager-header' );
const label = new OO.ui.LabelWidget( {
label: mw.msg( 'bs-permissionmanager-group-manager-heading' )
} );
this.$header.append( label.$element );
if ( this.editable ) {
this.addButton = new OO.ui.ButtonWidget( {
icon: 'add',
title: mw.msg( 'bs-permissionmanager-group-create' ),
flags: [ 'progressive' ],
framed: false
} );
this.addButton.connect( this, { click: 'addGroup' } );
this.$header.append(
$( '
' ).addClass( 'group-manager-header-actions' ).append( this.addButton.$element )
);
}
this.$element.append( this.$header );
};
bs.permissionManager.panel.GroupManager.prototype.selectFirst = function () {
this.groupPanel.selectItem( this.groupPanel.findFirstSelectableItem() );
};
bs.permissionManager.panel.GroupManager.prototype.renderGroups = function () {
this.groupPanel.clearItems();
this.groupWidgets = {};
const groups = this.getSortedGroups( this.groups );
let currentGroup = null;
const menuItems = [];
for ( let i = 0; i < groups.length; i++ ) {
if ( currentGroup === null ) {
menuItems.push( new bs.permissionManager.widget.GroupManagerSectionHeader( {
label: mw.msg( 'bs-permissionmanager-group-header-implicit' )
} ) );
currentGroup = 'implicit';
}
const group = groups[ i ];
if ( group.group_type !== 'implicit' && currentGroup === 'implicit' ) {
menuItems.push( new bs.permissionManager.widget.GroupManagerSectionHeader( {
label: mw.msg( 'bs-permissionmanager-group-header-groups' )
} ) );
currentGroup = group.group_type;
}
const groupItem = new bs.permissionManager.widget.GroupManagerItem( $.extend( // eslint-disable-line no-jquery/no-extend
group, { editable: this.editable }
) );
groupItem.connect( this, { remove: 'removeGroup', edit: 'editGroup' } );
this.groupWidgets[ group.group_name ] = groupItem;
menuItems.push( groupItem );
}
this.groupPanel.addItems( menuItems );
};
bs.permissionManager.panel.GroupManager.prototype.getGroupLabel = function ( group ) {
for ( let i = 0; i < this.groups.length; i++ ) {
if ( this.groups[ i ].group_name === group ) {
return this.groups[ i ].displayname;
}
}
return null;
};
bs.permissionManager.panel.GroupManager.prototype.groupSelected = function ( item ) {
if ( !item ) {
return;
}
this.emit( 'groupSelected', item.getData(), item );
};
bs.permissionManager.panel.GroupManager.prototype.showError = function ( error ) {
const msg = error || mw.msg( 'bs-permissionmanager-error' );
this.$element.html( new OO.ui.MessageWidget( {
type: 'error',
label: msg
} ).$element );
};
bs.permissionManager.panel.GroupManager.prototype.getSortedGroups = function ( groups ) {
// Order: implicit first, custom, then the rest. Alphabetically sorted within each group
return groups.sort( ( a, b ) => {
const order = [ 'implicit', 'extension-minimal', 'core-minimal', 'custom' ];
const aIndex = order.indexOf( a.group_type );
const bIndex = order.indexOf( b.group_type );
if ( aIndex !== -1 && bIndex !== -1 ) {
if ( aIndex !== bIndex ) {
return aIndex - bIndex;
}
// If group_type is the same, sort by group_name
return a.group_name.localeCompare( b.group_name );
}
if ( aIndex !== -1 ) {
return -1;
}
if ( bIndex !== -1 ) {
return 1;
}
// If group_type is not in the order array, sort by group_name
return a.group_name.localeCompare( b.group_name );
} );
};
bs.permissionManager.panel.GroupManager.prototype.removeGroup = function ( groupName ) {
OO.ui.confirm( mw.msg( 'bs-permissionmanager-group-remove-confirm', groupName ), { size: 'medium' } )
.done( async ( confirmed ) => {
if ( !confirmed ) {
return;
}
await this.doRemoveGroup( groupName );
await this.getGroups();
this.renderGroups();
} );
};
bs.permissionManager.panel.GroupManager.prototype.doRemoveGroup = async function ( groupName ) {
return new Promise( ( resolve, reject ) => {
$.ajax( {
url: mw.util.wikiScript( 'rest' ) + '/bs-permission-manager/v1/groups/delete/' + groupName,
type: 'POST',
success: function () {
resolve();
},
error: function ( xhr, status, error ) {
reject( error );
}
} );
} );
};
bs.permissionManager.panel.GroupManager.prototype.addGroup = function () {
const dialog = new bs.permissionManager.dialog.AddGroup( {} );
this.openGroupNameDialog( dialog );
};
bs.permissionManager.panel.GroupManager.prototype.editGroup = function ( groupName ) {
const dialog = new bs.permissionManager.dialog.EditGroup( { group: groupName } );
this.openGroupNameDialog( dialog );
};
bs.permissionManager.panel.GroupManager.prototype.openGroupNameDialog = function ( dialog ) {
const windowManager = new OO.ui.WindowManager();
$( 'body' ).append( windowManager.$element );
windowManager.addWindows( [ dialog ] );
windowManager.openWindow( dialog ).closed.then( async ( data ) => {
if ( data && data.action === 'save' ) {
await this.getGroups();
this.renderGroups();
this.groupPanel.selectItemByData( data.newGroup );
windowManager.destroy();
}
} );
};
bs.permissionManager.panel.GroupManager.prototype.setDirty = function ( group, dirty ) {
if ( !this.groupPanel ) {
return;
}
const items = this.groupPanel.items.filter( ( item ) => item.getData() === group );
if ( items.length ) {
items[ 0 ].setDirty( dirty );
}
};
bs.permissionManager.panel.GroupManager.prototype.resetDirty = function () {
if ( !this.groupPanel ) {
return;
}
const items = this.groupPanel.items;
for ( let i = 0; i < items.length; i++ ) {
items[ i ].setDirty( false );
}
};