gplx/mediawiki/extensions/BlueSpicePermissionManager/resources/widget/PresetSelect.js

205 lines
5.5 KiB
JavaScript

bs.util.registerNamespace( 'bs.permissionManager.widget' );
bs.permissionManager.widget.PresetSelect = function ( cfg ) {
cfg = cfg || {};
bs.permissionManager.widget.PresetSelect.parent.call( this, cfg );
this.$customPresetPanel = cfg.$customPanel;
this.$customPresetPanel.hide();
this.presets = cfg.data || {};
this.presetItems = {};
this.active = false;
this.customPanelLoaded = false;
this.errorWidget = null;
this.dirty = false;
this.makeToolbar();
this.initialActive = false;
for ( const presetId in this.presets ) {
if ( !this.presets.hasOwnProperty( presetId ) ) {
continue;
}
this.presetItems[ presetId ] = new bs.permissionManager.widget.PresetWidget(
this.presets[ presetId ]
);
this.presetItems[ presetId ].on( 'click', this.presetChange.bind( this ), [ presetId ] );
this.$element.append( this.presetItems[ presetId ].$element );
if ( this.presets[ presetId ].active ) {
this.initialActive = presetId;
}
}
this.$element.append( this.$customPresetPanel );
this.presetChange( this.initialActive, true );
};
OO.inheritClass( bs.permissionManager.widget.PresetSelect, OO.ui.Widget );
bs.permissionManager.widget.PresetSelect.static.tagName = 'div';
bs.permissionManager.widget.PresetSelect.prototype.presetChange = function ( presetId, init ) {
if ( !this.presetItems.hasOwnProperty( presetId ) ) {
return;
}
if ( this.active && this.active === presetId ) {
// Select already active item
return;
}
if ( this.active === 'custom' ) {
this.onReset();
}
if ( !init ) {
this.dirty = presetId !== this.initialActive;
}
this.setButtonState();
this.setActive( presetId );
};
bs.permissionManager.widget.PresetSelect.prototype.makeToolbar = function () {
this.toolbar = new OOJSPlus.ui.toolbar.ManagerToolbar( {
saveable: true,
cancelable: true
} );
this.toolbar.connect( this, {
save: 'onSave',
cancel: 'onReset',
initialize: function () {
this.toolbar.setAbilities( { cancel: false, save: false } );
}
} );
this.$element.append( this.toolbar.$element );
this.toolbar.setup();
this.toolbar.initialize();
};
bs.permissionManager.widget.PresetSelect.prototype.setButtonState = function ( dirty ) {
dirty = dirty || false;
this.toolbar.setAbilities( { save: dirty || this.dirty } );
if ( this.active === 'custom' ) {
this.toolbar.setAbilities( { cancel: dirty } );
}
};
bs.permissionManager.widget.PresetSelect.prototype.onSave = function () {
const promises = [];
if ( this.active === 'custom' && this.customPresetManager ) {
promises.push( this.customPresetManager.save() );
}
promises.push( this.save() );
const mainPromise = Promise.all( promises );
mainPromise.then(
() => {
window.location.reload();
},
() => {
this.reportError();
}
);
};
bs.permissionManager.widget.PresetSelect.prototype.onReset = function () {
if ( this.active === 'custom' && this.customPresetManager ) {
this.customPresetManager.reset();
this.setButtonState( false );
}
};
bs.permissionManager.widget.PresetSelect.prototype.setActive = function ( presetId ) {
if ( this.active ) {
this.presetItems[ this.active ].setActive( false );
}
this.active = presetId;
this.presetItems[ presetId ].setActive( true );
if ( presetId === 'custom' ) {
this.showCustom();
} else {
this.hideCustom();
}
};
bs.permissionManager.widget.PresetSelect.prototype.save = function () {
const data = {
PermissionManagerActivePreset: this.active
},
dfd = $.Deferred();
bs.api.tasks.execSilent( 'configmanager', 'save', data )
.done( ( response ) => {
if ( !response.hasOwnProperty( 'success' ) || !response.success ) {
dfd.reject();
return;
}
dfd.resolve();
} ).fail( () => {
dfd.reject();
} );
return dfd.promise();
};
bs.permissionManager.widget.PresetSelect.prototype.showMessage = function ( type, message ) {
if ( this.messageWidget ) {
this.messageWidget.$element.remove();
}
this.messageWidget = new OO.ui.MessageWidget( {
type: type,
label: message,
classes: [ 'permission-manager-info-message' ]
} );
this.$element.prepend( this.messageWidget.$element );
};
bs.permissionManager.widget.PresetSelect.prototype.reportError = function () {
this.showMessage( 'error', mw.message( 'bs-permissionmanager-preset-save-error' ).text() );
};
bs.permissionManager.widget.PresetSelect.prototype.showSuccess = function () {
this.showMessage( 'success', mw.message( 'bs-permissionmanager-preset-save-success' ).text() );
};
bs.permissionManager.widget.PresetSelect.prototype.showCustom = function () {
if ( !this.customPanelLoaded ) {
this.$customPresetPanel.show();
this.presetsSetDisabled( true );
mw.loader.using( 'ext.bluespice.permissionManager.customPresetManager' ).done( () => {
this.customPresetManager = new bs.permissionManager.panel.PermissionManager();
this.customPresetManager.connect( this, {
change: function () {
this.setButtonState( this.customPresetManager.isDirty() );
}
} );
this.customPresetManager.init().then( () => {
this.$customPresetPanel.html( this.customPresetManager.$element );
this.presetsSetDisabled( false );
this.customPanelLoaded = true;
this.$customPresetPanel.removeClass( 'loading' );
} );
} );
}
this.$customPresetPanel.show();
};
bs.permissionManager.widget.PresetSelect.prototype.hideCustom = function () {
this.$customPresetPanel.hide();
};
bs.permissionManager.widget.PresetSelect.prototype.presetsSetDisabled = function ( disabled ) {
for ( const presetId in this.presetItems ) {
if ( !this.presetItems.hasOwnProperty( presetId ) ) {
continue;
}
this.presetItems[ presetId ].setDisabled( disabled );
}
};