117 lines
4.3 KiB
JavaScript
117 lines
4.3 KiB
JavaScript
bs.util.registerNamespace( 'bs.permissionManager.panel.column' );
|
|
|
|
bs.permissionManager.panel.column.PermissionMatrixColumn = function ( cfg ) {
|
|
bs.permissionManager.panel.column.PermissionMatrixColumn.parent.call( this, cfg );
|
|
this.originalValues = {};
|
|
this.dirtyValues = {};
|
|
this.cells = {};
|
|
this.inputs = {};
|
|
this.metas = {};
|
|
|
|
this.eventsDisabled = false;
|
|
};
|
|
|
|
OO.inheritClass( bs.permissionManager.panel.column.PermissionMatrixColumn, OOJSPlus.ui.data.column.Column );
|
|
|
|
bs.permissionManager.panel.column.PermissionMatrixColumn.prototype.renderCell = function ( value, row ) {
|
|
const $cell = bs.permissionManager.panel.column.PermissionMatrixColumn.parent.prototype.renderCell.call( this, value, row );
|
|
$cell.addClass( 'bs-permission-manager-matrix-cell' );
|
|
if ( row.hasOwnProperty( this.id + '_meta' ) ) {
|
|
this.metas[ row.role ] = row[ this.id + '_meta' ];
|
|
}
|
|
this.cells[ row.role ] = $cell;
|
|
this.decorateCell( row.role );
|
|
return $cell;
|
|
};
|
|
|
|
bs.permissionManager.panel.column.PermissionMatrixColumn.prototype.getViewControls = function ( value, row ) {
|
|
const input = new OO.ui.CheckboxInputWidget( {
|
|
selected: value,
|
|
data: { role: row.role }
|
|
} );
|
|
this.originalValues[ row.role ] = value;
|
|
const column = this;
|
|
input.connect( input, {
|
|
change: function ( value ) { // eslint-disable-line no-shadow
|
|
if ( this.eventsDisabled ) {
|
|
return;
|
|
}
|
|
const role = this.getData().role;
|
|
column.dirtyValues[ role ] = value;
|
|
let dirty = false;
|
|
if ( column.dirtyValues[ role ] !== column.originalValues[ row.role ] ) {
|
|
dirty = true;
|
|
}
|
|
column.cells[ role ].toggleClass( 'bs-permission-manager-matrix-dirty', dirty );
|
|
|
|
column.emit( 'valueChange', role, value, dirty, column );
|
|
}
|
|
} );
|
|
this.inputs[ row.role ] = input;
|
|
return input;
|
|
};
|
|
|
|
bs.permissionManager.panel.column.PermissionMatrixColumn.prototype.setMeta = function ( role, value ) {
|
|
this.metas[ role ] = value;
|
|
};
|
|
|
|
bs.permissionManager.panel.column.PermissionMatrixColumn.prototype.getRoles = function () {
|
|
return Object.keys( this.cells );
|
|
};
|
|
|
|
bs.permissionManager.panel.column.PermissionMatrixColumn.prototype.setValue = function ( role, value ) {
|
|
if ( !this.inputs.hasOwnProperty( role ) ) {
|
|
return;
|
|
}
|
|
this.eventsDisabled = true;
|
|
this.inputs[ role ].setSelected( value );
|
|
this.eventsDisabled = false;
|
|
};
|
|
|
|
bs.permissionManager.panel.column.PermissionMatrixColumn.prototype.decorateCell = function ( role ) {
|
|
if ( !this.cells.hasOwnProperty( role ) || !this.metas.hasOwnProperty( role ) ) {
|
|
return;
|
|
}
|
|
const $cell = this.cells[ role ],
|
|
meta = this.metas[ role ];
|
|
const blocked = meta.isBlocked || false;
|
|
$cell.removeClass( 'bs-permission-manager-assigned' );
|
|
$cell.removeClass( 'bs-permission-manager-blocked' );
|
|
$cell.removeClass( 'bs-permission-manager-blocked' );
|
|
$cell.attr( 'title', '' );
|
|
if ( meta.assignment === 'inherit' ) {
|
|
$cell.attr( 'title', mw.msg( 'bs-permissionmanager-affected-by-inherited', meta.inheritFrom ) );
|
|
}
|
|
if ( meta.assignment === 'explicit' ) {
|
|
$cell.attr( 'title', mw.msg( 'bs-permissionmanager-affected-by-explicitlyset' ) );
|
|
}
|
|
if ( meta.assignment === false ) {
|
|
$cell.attr( 'title', mw.msg( 'bs-permissionmanager-affected-by-notset' ) );
|
|
}
|
|
if ( meta.assignment === 'global' && meta.hasOwnProperty( 'nsId' ) ) {
|
|
$cell.attr( 'title', mw.msg( 'bs-permissionmanager-affected-by-setonwiki' ) );
|
|
}
|
|
if ( meta.assignment === 'explicit' || ( meta.assignment !== false && !blocked ) ) {
|
|
$cell.addClass( 'bs-permission-manager-assigned' );
|
|
} else if ( blocked ) {
|
|
if ( meta.assignment !== 'explicit' && meta.blocking.length ) {
|
|
$cell.attr( 'title', mw.msg( 'bs-permissionmanager-affected-by-explicit', meta.blocking.join( ', ' ) ) );
|
|
$cell.addClass( 'bs-permission-manager-blocked' );
|
|
} else if ( meta.dependencies ) {
|
|
const dependencyLines = [];
|
|
for ( const key in meta.dependencies ) {
|
|
dependencyLines.push( mw.msg( 'bs-permissionmanager-affected-by-dependency-single', key, meta.dependencies[ key ].join( ', ' ) ) );
|
|
}
|
|
// Set title without encoding
|
|
$cell[ 0 ].title = mw.msg(
|
|
'bs-permissionmanager-affected-by-dependency',
|
|
dependencyLines.join( '\n' ),
|
|
Object.keys( meta.dependencies ).length
|
|
);
|
|
$cell.addClass( 'bs-permission-manager-blocked' );
|
|
}
|
|
}
|
|
};
|
|
|
|
OOJSPlus.ui.data.registry.columnRegistry.register( 'bs-permissionmanager-matrix', bs.permissionManager.panel.column.PermissionMatrixColumn );
|