diff options
author | Timo Tijhof <krinklemail@gmail.com> | 2018-05-20 15:39:47 +0200 |
---|---|---|
committer | Timo Tijhof <krinklemail@gmail.com> | 2018-05-20 16:51:48 +0200 |
commit | ecc812f06e7dff587b3f31dc18189adbf4616351 (patch) | |
tree | b8cd389a41291d085fa2b925b4f7d48020039674 /resources/src/mediawiki.api/options.js | |
parent | a6ad278b0e4aa20d9f4d8415ffe9c22762d441a0 (diff) | |
download | mediawikicore-ecc812f06e7dff587b3f31dc18189adbf4616351.tar.gz mediawikicore-ecc812f06e7dff587b3f31dc18189adbf4616351.zip |
mediawiki.api: Merge modules into one
These are all quite tiny and not worth providing separately
to the system as deliverable file bundles.
Mark the other mediawiki.api.* modules as alias to 'mediawiki.api'
for back-compat, with deprecation warning.
Highlights:
* Change mediawiki.api.edit.js to not use mw.user, because that
causes a circular dependency, given mw.user also depends on
mediawiki.api.
Bug: T192623
Change-Id: I0afdc8ab50bc1354bb5099bf39923c07eab0b665
Diffstat (limited to 'resources/src/mediawiki.api/options.js')
-rw-r--r-- | resources/src/mediawiki.api/options.js | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/resources/src/mediawiki.api/options.js b/resources/src/mediawiki.api/options.js new file mode 100644 index 000000000000..4930c4fccc52 --- /dev/null +++ b/resources/src/mediawiki.api/options.js @@ -0,0 +1,102 @@ +/** + * @class mw.Api.plugin.options + */ +( function ( mw, $ ) { + + $.extend( mw.Api.prototype, { + + /** + * Asynchronously save the value of a single user option using the API. See #saveOptions. + * + * @param {string} name + * @param {string|null} value + * @return {jQuery.Promise} + */ + saveOption: function ( name, value ) { + var param = {}; + param[ name ] = value; + return this.saveOptions( param ); + }, + + /** + * Asynchronously save the values of user options using the API. + * + * If a value of `null` is provided, the given option will be reset to the default value. + * + * Any warnings returned by the API, including warnings about invalid option names or values, + * are ignored. However, do not rely on this behavior. + * + * If necessary, the options will be saved using several sequential API requests. Only one promise + * is always returned that will be resolved when all requests complete. + * + * @param {Object} options Options as a `{ name: value, … }` object + * @return {jQuery.Promise} + */ + saveOptions: function ( options ) { + var name, value, bundleable, + grouped = [], + promise = $.Deferred().resolve(); + + for ( name in options ) { + value = options[ name ] === null ? null : String( options[ name ] ); + + // Can we bundle this option, or does it need a separate request? + if ( this.defaults.useUS ) { + bundleable = name.indexOf( '=' ) === -1; + } else { + bundleable = + ( value === null || value.indexOf( '|' ) === -1 ) && + ( name.indexOf( '|' ) === -1 && name.indexOf( '=' ) === -1 ); + } + + if ( bundleable ) { + if ( value !== null ) { + grouped.push( name + '=' + value ); + } else { + // Omitting value resets the option + grouped.push( name ); + } + } else { + if ( value !== null ) { + promise = promise.then( function ( name, value ) { + return this.postWithToken( 'csrf', { + formatversion: 2, + action: 'options', + optionname: name, + optionvalue: value + } ); + }.bind( this, name, value ) ); + } else { + // Omitting value resets the option + promise = promise.then( function ( name ) { + return this.postWithToken( 'csrf', { + formatversion: 2, + action: 'options', + optionname: name + } ); + }.bind( this, name ) ); + } + } + } + + if ( grouped.length ) { + promise = promise.then( function () { + return this.postWithToken( 'csrf', { + formatversion: 2, + action: 'options', + change: grouped + } ); + }.bind( this ) ); + } + + return promise; + } + + } ); + + /** + * @class mw.Api + * @mixins mw.Api.plugin.options + */ + +}( mediaWiki, jQuery ) ); |