gplx/mediawiki/extensions/BlueSpicePermissionManager/resources/panel/SimpleMatrix.js

278 lines
9.4 KiB
JavaScript

bs.util.registerNamespace( 'bs.permissionManager.panel' );
bs.permissionManager.panel.SimpleMatrix = function ( cfg ) {
cfg = cfg || {};
cfg = Object.assign( { expanded: false, padded: true, classes: [ 'bs-permission-manager-simple-matrix' ] }, cfg );
bs.permissionManager.panel.SimpleMatrix.parent.call( this, cfg );
this.manager = cfg.manager;
this.activeGroup = null;
this.activeView = null;
this.views = {};
this.originalValues = {};
this.items = {};
this.setUsableRoles();
this.setUsableNamespaces();
};
OO.inheritClass( bs.permissionManager.panel.SimpleMatrix, OO.ui.PanelLayout );
bs.permissionManager.panel.SimpleMatrix.prototype.setUsableRoles = function () {
const blacklist = [ 'accountselfcreate', 'commenter', 'author', 'structuremanager', 'accountmanager', 'bot', 'maintenanceadmin' ],
nsRoleBlacklist = blacklist.concat( [ 'admin' ] );
// Define roles user can set - blacklist instead of whitelist to allow for custom roles
this.usableRoles = this.manager.permissionRawData.roles.filter( ( role ) => blacklist.indexOf( role.role ) === -1 );
this.usableNsRoles = this.manager.permissionRawData.roles.filter( ( role ) => nsRoleBlacklist.indexOf( role.role ) === -1 );
};
bs.permissionManager.panel.SimpleMatrix.prototype.setUsableNamespaces = function () {
this.usableNamespaces = this.manager.permissionRawData.namespaces.filter( ( ns ) => ns.content && ns.talk === false );
};
bs.permissionManager.panel.SimpleMatrix.prototype.render = function ( data ) {
if ( this.activeGroup === null ) {
return;
}
if ( this.activeView ) {
this.activeView.$element.hide();
}
if ( this.views.hasOwnProperty( this.activeGroup ) ) {
this.activeView = this.views[ this.activeGroup ];
this.updateMetaForCurrentView();
this.activeView.$element.show();
return;
}
this.views[ this.activeGroup ] = this.makeView( this.activeGroup, data );
this.activeView = this.views[ this.activeGroup ];
this.$element.append( this.activeView.$element );
};
bs.permissionManager.panel.SimpleMatrix.prototype.setActiveGroup = function ( group ) {
this.activeGroup = group;
};
bs.permissionManager.panel.SimpleMatrix.prototype.reset = function ( data ) {
for ( const key in this.views ) {
this.views[ key ].$element.remove();
}
this.items = {};
this.views = {};
this.originalValues = {};
this.activeView = null;
this.render( data );
};
bs.permissionManager.panel.SimpleMatrix.prototype.toggle = function ( active ) {
this.$element.toggle( active );
};
bs.permissionManager.panel.SimpleMatrix.prototype.makeView = function ( group, data ) {
const view = new OO.ui.PanelLayout( {
expanded: false,
padded: false
} );
view.$element.addClass( 'bs-permission-manager-simple-matrix-view' );
view.$element.append( this.getGroupHeader( group ).$element );
view.$element.append( this.makeGlobal( data ).$element );
view.$element.append( this.makeNamespaces( data ).$element );
return view;
};
bs.permissionManager.panel.SimpleMatrix.prototype.getGroupHeader = function ( group ) {
const groupLabel = this.manager.groupSelector.getGroupLabel( group );
return new OO.ui.LabelWidget( {
label: mw.message( 'bs-permission-manager-simple-matrix-group', groupLabel ).text(),
classes: [ 'bs-permission-manager-simple-matrix-group-header' ]
} );
};
bs.permissionManager.panel.SimpleMatrix.prototype.makeGlobal = function ( data ) {
const global = new OO.ui.PanelLayout( {
expanded: false,
padded: false,
classes: [ 'bs-permission-manager-simple-matrix-global' ]
} );
const heading = new OO.ui.LabelWidget( {
label: mw.message( 'bs-permission-manager-simple-matrix-global' ).text(),
classes: [ 'bs-permission-manager-simple-matrix-heading' ]
} );
const subtitle = new OO.ui.LabelWidget( {
label: mw.message( 'bs-permission-manager-simple-matrix-global-sub' ).text(),
classes: [ 'bs-permission-manager-simple-matrix-subtitle' ]
} );
global.$element.append( heading.$element, subtitle.$element );
for ( let i = 0; i < this.usableRoles.length; i++ ) {
const role = this.usableRoles[ i ],
roleData = this.findRoleData( role.role, data );
if ( !roleData ) {
continue;
}
global.$element.append( this.makeRoleItem(
role,
roleData.global,
roleData.global_meta
).$element );
}
return global;
};
bs.permissionManager.panel.SimpleMatrix.prototype.makeNamespaces = function ( data ) {
const namespaces = new OO.ui.PanelLayout( {
expanded: false,
padded: false,
classes: [ 'bs-permission-manager-simple-matrix-ns' ]
} );
const heading = new OO.ui.LabelWidget( {
label: mw.message( 'bs-permission-manager-simple-matrix-namespace' ).text(),
classes: [ 'bs-permission-manager-simple-matrix-heading' ]
} );
const subtitle = new OO.ui.LabelWidget( {
label: mw.message( 'bs-permission-manager-simple-matrix-namespace-sub' ).text(),
classes: [ 'bs-permission-manager-simple-matrix-subtitle' ]
} );
const hint = new OO.ui.LabelWidget( {
label: mw.message( 'bs-permissionmanager-simple-setonwiki-sub' ).text(),
classes: [ 'bs-permission-manager-simple-matrix-subtitle', 'hint' ]
} );
namespaces.$element.append( heading.$element, subtitle.$element, hint.$element );
if ( this.usableNamespaces.length > 5 ) {
const search = this.makeNamespaceSearch();
namespaces.$element.append( search.$element );
search.connect( this, {
change: 'filterNamespaces'
} );
}
for ( let i = 0; i < this.usableNamespaces.length; i++ ) {
const nsPanel = new OO.ui.PanelLayout( {
expanded: false,
padded: false,
classes: [ 'bs-permission-manager-simple-matrix-ns-panel' ]
} );
const label = new OO.ui.LabelWidget( {
label: this.usableNamespaces[ i ].name,
classes: [ 'bs-permission-manager-simple-matrix-ns-label' ]
} );
nsPanel.$element.append( label.$element );
for ( let j = 0; j < this.usableNsRoles.length; j++ ) {
const roleData = this.findRoleData( this.usableNsRoles[ j ].role, data );
if ( !roleData ) {
continue;
}
nsPanel.$element.append( this.makeRoleItem(
this.usableNsRoles[ j ],
roleData[ 'ns_' + this.usableNamespaces[ i ].id ] || false,
roleData[ 'ns_' + this.usableNamespaces[ i ].id + '_meta' ] || {},
{ nsId: this.usableNamespaces[ i ].id, nsName: this.usableNamespaces[ i ].name }
).$element );
}
namespaces.$element.append( nsPanel.$element );
}
return namespaces;
};
bs.permissionManager.panel.SimpleMatrix.prototype.makeNamespaceSearch = function () {
return new OO.ui.SearchInputWidget( {
placeholder: mw.msg( 'bs-permissionmanager-search-namespaces' ),
classes: [ 'bs-permission-manager-simple-matrix-ns-search' ]
} );
};
bs.permissionManager.panel.SimpleMatrix.prototype.filterNamespaces = function ( val ) {
if ( !this.activeView ) {
return;
}
const nsPanel = this.activeView.$element.find( '.bs-permission-manager-simple-matrix-ns' );
if ( nsPanel.length === 0 ) {
return;
}
nsPanel.find( '.bs-permission-manager-simple-matrix-ns-panel' ).each( function () {
const $nsItem = $( this );
const $label = $nsItem.find( '.bs-permission-manager-simple-matrix-ns-label' );
if ( $label.length === 0 || val === '' || $label.text().toLowerCase().indexOf( val.toLowerCase() ) !== -1 ) {
$nsItem.show();
} else {
$nsItem.hide();
}
} );
};
bs.permissionManager.panel.SimpleMatrix.prototype.findRoleData = function ( role, data ) {
for ( let i = 0; i < data.length; i++ ) {
if ( data[ i ].role === role ) {
return data[ i ];
}
}
return null;
};
bs.permissionManager.panel.SimpleMatrix.prototype.makeRoleItem = function ( role, value, meta, additionalData ) {
const item = new bs.permissionManager.widget.SimpleMatrixRoleItem( {
role: role,
value: value,
meta: meta,
additionalData: additionalData,
matrix: this
} );
if ( !this.items.hasOwnProperty( this.activeGroup ) ) {
this.items[ this.activeGroup ] = [];
}
this.items[ this.activeGroup ].push( item );
return item;
};
bs.permissionManager.panel.SimpleMatrix.prototype.valueChange = function ( role, id, value, dirty ) {
this.manager.setDirty( id, role, dirty );
if ( id === 'global' ) {
this.manager.setGlobal( role, value );
} else {
this.manager.setNamespace( id, role, value );
}
this.manager.emit( 'change' );
this.setDataForActiveRole( role, this.manager.getMatrixDataForRoleAndGroup( role, this.activeGroup ) );
this.updateMetaForCurrentView();
};
bs.permissionManager.panel.SimpleMatrix.prototype.updateMetaForCurrentView = function () {
for ( let i = 0; i < this.items[ this.activeGroup ].length; i++ ) {
if ( this.items[ this.activeGroup ][ i ].type === 'global' ) {
this.items[ this.activeGroup ][ i ].setMeta(
this.manager.getGlobalMeta( this.activeGroup, this.items[ this.activeGroup ][ i ].role.role )
);
} else {
this.items[ this.activeGroup ][ i ].setMeta(
this.manager.getNamespaceMeta(
this.activeGroup,
this.items[ this.activeGroup ][ i ].role.role,
this.items[ this.activeGroup ][ i ].additionalData.nsId,
this.items[ this.activeGroup ][ i ].additionalData.nsName
)
);
}
}
};
bs.permissionManager.panel.SimpleMatrix.prototype.setDataForActiveRole = function ( role, data ) {
if ( !this.activeGroup ) {
return;
}
for ( let i = 0; i < this.items[ this.activeGroup ].length; i++ ) {
if ( this.items[ this.activeGroup ][ i ].role.role !== role ) {
continue;
}
let type = this.items[ this.activeGroup ][ i ].type;
if ( type !== 'global' ) {
type = 'ns_' + type;
}
if ( !data.hasOwnProperty( type ) ) {
continue;
}
this.items[ this.activeGroup ][ i ].setValue( data[ type ] );
}
};