gplx/mediawiki/extensions/BlueSpicePermissionManager/resources/panel/column/PermissionMatrixColumn.js

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 );