jenkins-bot has submitted this change and it was merged.
Change subject: Allow API endpoint customization for mw.widgets.TitleWidget
......................................................................
Allow API endpoint customization for mw.widgets.TitleWidget
Currently the API is not customizable and always points to
current wiki's api returned by `new mw.Api()`.
This patch allows users to specify their own API object for
querying titles e.g. searching for titles on a different
language Wikipedia when translating pages.
Change-Id: I81811cdd1a0750a8335432eee8f971ab9e0b8ee7
---
M resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
M resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
2 files changed, 38 insertions(+), 14 deletions(-)
Approvals:
Krinkle: Looks good to me, but someone else must approve
Esanders: Looks good to me, approved
jenkins-bot: Verified
diff --git a/resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
b/resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
index 39bee7c..2ac75c5 100755
--- a/resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
+++ b/resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
@@ -78,7 +78,7 @@
* @inheritdoc mw.widgets.TitleWidget
*/
mw.widgets.SearchInputWidget.prototype.getSuggestionsPromise = function
() {
- var api = new mw.Api(),
+ var api = this.getApi(),
promise,
self = this;
diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
index e1e50ea..0e5e0c5 100644
--- a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
+++ b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
@@ -6,16 +6,6 @@
*/
( function ( $, mw ) {
- var interwikiPrefixesPromise = new mw.Api().get( {
- action: 'query',
- meta: 'siteinfo',
- siprop: 'interwikimap'
- } ).then( function ( data ) {
- return $.map( data.query.interwikimap, function ( interwiki ) {
- return interwiki.prefix;
- } );
- } );
-
/**
* Mixin for title widgets
*
@@ -36,6 +26,7 @@
* @cfg {boolean} [validateTitle=true] Whether the input must be a
valid title (if set to true,
* the widget will marks itself red for invalid inputs, including an
empty query).
* @cfg {Object} [cache] Result cache which implements a 'set' method,
taking keyed values as an argument
+ * @cfg {mw.Api} [api] API object to use, creates a default mw.Api
instance if not specified
*/
mw.widgets.TitleWidget = function MwWidgetsTitleWidget( config ) {
// Config initialization
@@ -56,6 +47,7 @@
this.excludeCurrentPage = !!config.excludeCurrentPage;
this.validateTitle = config.validateTitle !== undefined ?
config.validateTitle : true;
this.cache = config.cache;
+ this.api = config.api || new mw.Api();
// Initialization
this.$element.addClass( 'mw-widget-titleWidget' );
@@ -64,6 +56,10 @@
/* Setup */
OO.initClass( mw.widgets.TitleWidget );
+
+ /* Static properties */
+
+ mw.widgets.TitleWidget.static.interwikiPrefixesPromiseCache = {};
/* Methods */
@@ -93,6 +89,24 @@
this.namespace = namespace;
};
+ mw.widgets.TitleWidget.prototype.getInterwikiPrefixesPromise = function
() {
+ var api = this.getApi(),
+ cache =
this.constructor.static.interwikiPrefixesPromiseCache,
+ key = api.defaults.ajax.url;
+ if ( !cache.hasOwnProperty( key ) ) {
+ cache[ key ] = api.get( {
+ action: 'query',
+ meta: 'siteinfo',
+ siprop: 'interwikimap'
+ } ).then( function ( data ) {
+ return $.map( data.query.interwikimap, function
( interwiki ) {
+ return interwiki.prefix;
+ } );
+ } );
+ }
+ return cache[ key ];
+ };
+
/**
* Get a promise which resolves with an API repsonse for suggested
* links for the current query.
@@ -101,6 +115,7 @@
*/
mw.widgets.TitleWidget.prototype.getSuggestionsPromise = function () {
var req,
+ api = this.getApi(),
query = this.getQueryValue(),
widget = this,
promiseAbortObject = { abort: function () {
@@ -108,7 +123,7 @@
} };
if ( mw.Title.newFromText( query ) ) {
- return interwikiPrefixesPromise.then( function (
interwikiPrefixes ) {
+ return this.getInterwikiPrefixesPromise().then(
function ( interwikiPrefixes ) {
var params,
interwiki = query.substring( 0,
query.indexOf( ':' ) );
if (
@@ -142,11 +157,11 @@
params.prop.push( 'pageterms' );
params.wbptterms =
'description';
}
- req = new mw.Api().get( params );
+ req = api.get( params );
promiseAbortObject.abort =
req.abort.bind( req ); // TODO ew
return req.then( function ( ret ) {
if ( ret.query === undefined ) {
- ret = new mw.Api().get(
{ action: 'query', titles: query } );
+ ret = api.get( {
action: 'query', titles: query } );
promiseAbortObject.abort = ret.abort.bind( ret );
}
return ret;
@@ -161,6 +176,15 @@
};
/**
+ * Get the API object for title requests
+ *
+ * @return {mw.Api} MediaWiki API
+ */
+ mw.widgets.TitleWidget.prototype.getApi = function () {
+ return this.api;
+ };
+
+ /**
* Get option widgets from the server response
*
* @param {Object} data Query result
--
To view, visit https://gerrit.wikimedia.org/r/323502
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I81811cdd1a0750a8335432eee8f971ab9e0b8ee7
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Santhosh <[email protected]>
Gerrit-Reviewer: Bartosz DziewoĆski <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: Fomafix <[email protected]>
Gerrit-Reviewer: Jack Phoenix <[email protected]>
Gerrit-Reviewer: Krinkle <[email protected]>
Gerrit-Reviewer: Nikerabbit <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits