aboutsummaryrefslogtreecommitdiffstats
path: root/resources/src/mediawiki.api/options.js
diff options
context:
space:
mode:
authorTimo Tijhof <krinklemail@gmail.com>2018-05-20 15:39:47 +0200
committerTimo Tijhof <krinklemail@gmail.com>2018-05-20 16:51:48 +0200
commitecc812f06e7dff587b3f31dc18189adbf4616351 (patch)
treeb8cd389a41291d085fa2b925b4f7d48020039674 /resources/src/mediawiki.api/options.js
parenta6ad278b0e4aa20d9f4d8415ffe9c22762d441a0 (diff)
downloadmediawikicore-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.js102
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 ) );