if ( !window.isekai ) { window.isekai = { ui: {} }; } if ( !window.isekai.ui ) { window.isekai.ui = {}; } /** * Input for create page and auto complete parent page * @class * @extends OO.ui.TextInputWidget * @mixins OO.ui.mixin.LookupElement * * @constructor * @param {Object} config Configuration options */ isekai.ui.CreatePageInputWidget = function IsekaiUiCreatePageInputWidget( config ) { // Parent constructor OO.ui.TextInputWidget.call( this, config ); // Mixin constructors OO.ui.mixin.LookupElement.call( this, config ); this.api = new mw.Api(); this.pagePrefix = config.pagePrefix || ""; this.loadedPageList = []; }; OO.inheritClass( isekai.ui.CreatePageInputWidget, OO.ui.TextInputWidget ); OO.mixinClass( isekai.ui.CreatePageInputWidget, OO.ui.mixin.LookupElement ); isekai.ui.CreatePageInputWidget.prototype.setPagePrefix = function ( pagePrefix ) { this.pagePrefix = pagePrefix; this.requestCache = {}; // Clear cache } /** * @inheritdoc */ isekai.ui.CreatePageInputWidget.prototype.getLookupRequest = function () { var value = this.getValue(), deferred = $.Deferred(); var api = this.api; var _this = this; var pageName = this.pagePrefix + value; this.getValidity().then( function () { api.get( { action: "opensearch", search: pageName, } ).done( function (data) { if ( Array.isArray(data) && data.length > 0 ) { var pageList = data[1]; pageList = pageList.map( function (pageTitle) { return pageTitle.substring( _this.pagePrefix.length ); } ); deferred.resolve( pageList ); // Set cache pageList.forEach( function (pageTitle) { if ( !_this.loadedPageList.includes( pageTitle ) ) { _this.loadedPageList.push( pageTitle ); } } ); } else { deferred.resolve( [] ); } } ); }, function () { // No results when the input contains invalid content deferred.resolve( [] ); } ); return deferred.promise( { abort: function () {} } ); }; /** * @inheritdoc */ isekai.ui.CreatePageInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) { return response || []; }; /** * @inheritdoc */ isekai.ui.CreatePageInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) { return ( data || [] ).map( function (one) { return new OO.ui.MenuOptionWidget( { data: one + "/", label: one } ) } ); };