mediawiki-extensions-Math/modules/mw.widgets.MathWbEntitySelector.js

106 lines
2.9 KiB
JavaScript
Raw Permalink Normal View History

( function () {
'use strict';
/**
* Creates an mw.widgets.MathWbEntitySelector object. This class was inspired by
* mw.widgets.TitleInputWidget.
*
* @class
* @extends OO.ui.TextInputWidget
* @mixin mw.widgets.TitleWidget
* @mixin OO.ui.mixin.LookupElement
*
* @constructor
* @param {Object} [config] Configuration options
* @param {mw.Api} [config.api] API object to use, creates a mw.ForeignApi instance if not specified
*/
mw.widgets.MathWbEntitySelector = function ( config ) {
config = config || {};
this.api = config.api;
if ( !this.api ) {
this.api = new mw.ForeignApi(
mw.config.get( 'wgMathEntitySelectorUrl' ),
{ anonymous: true } );
}
OO.ui.TextInputWidget.call( this, config );
OO.ui.mixin.LookupElement.call( this, config );
this.$element.addClass( 'mw-widget-MathWbEntitySelector' );
};
OO.inheritClass( mw.widgets.MathWbEntitySelector, OO.ui.TextInputWidget );
OO.mixinClass( mw.widgets.MathWbEntitySelector, OO.ui.mixin.LookupElement );
/**
* Get the API object for wikibase requests
*
* @return {mw.Api} MediaWiki API
*/
mw.widgets.MathWbEntitySelector.prototype.getApi = function () {
return this.api;
};
/**
* Get the current value of the search query
*
* @abstract
* @return {string} Search query
*/
mw.widgets.MathWbEntitySelector.prototype.getQueryValue = function () {
return this.getValue();
};
/**
* @inheritdoc OO.ui.mixin.LookupElement
*/
mw.widgets.MathWbEntitySelector.prototype.getLookupCacheDataFromResponse = function ( response ) {
return response.search || {};
};
/**
* @inheritdoc OO.ui.mixin.LookupElement
*/
mw.widgets.MathWbEntitySelector.prototype.getLookupMenuOptionsFromData = function ( response ) {
return response.map( ( res ) => new OO.ui.MenuOptionWidget( { data: res.id, label: res.label, title: res.description } ) );
};
/**
* Get API params for a given query
*
* @param {string} query User query
* @return {Object} API params
*/
mw.widgets.MathWbEntitySelector.prototype.getApiParams = function ( query ) {
return {
action: 'wbsearchentities',
search: query,
format: 'json',
errorformat: 'plaintext',
language: mw.config.get( 'wgContentLanguage' ),
uselang: mw.config.get( 'wgContentLanguage' )
};
};
/**
* @inheritdoc
*/
mw.widgets.MathWbEntitySelector.prototype.getLookupRequest = function () {
const api = this.getApi(),
query = this.getQueryValue(),
promiseAbortObject = {
abort: function () {
// Do nothing. This is just so OOUI doesn't break due to abort being undefined.
// see also mw.widgets.TitleWidget.prototype.getSuggestionsPromise
}
},
req = api.get( this.getApiParams( query ) );
promiseAbortObject.abort = req.abort.bind( req );
return req.promise( promiseAbortObject );
};
// eslint-disable-next-line no-jquery/no-global-selector
const $wbEntitySelector = $( '#wbEntitySelector' );
if ( $wbEntitySelector.length ) {
OO.ui.infuse( $wbEntitySelector );
}
}() );