278 lines
9.4 KiB
JavaScript
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 ] );
|
|
}
|
|
};
|