mediawiki-extensions-Visual.../modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js

125 lines
3.3 KiB
JavaScript
Raw Normal View History

/*!
* VisualEditor UserInterface MWTemplateTitleInputWidget class.
*
* @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Creates an ve.ui.MWTemplateTitleInputWidget object.
*
* @class
* @extends ve.ui.MWTitleInputWidget
*
* @constructor
* @param {Object} [config] Configuration options
* @cfg {number} [namespace] Namespace to prepend to queries. Defaults to template namespace.
*/
ve.ui.MWTemplateTitleInputWidget = function VeUiMWTemplateTitleInputWidget( config ) {
// Parent constructor
ve.ui.MWTitleInputWidget.call( this, config );
// Properties
this.namespace = config.namespace || mw.config.get( 'wgNamespaceIds' ).template;
this.descriptions = {};
// Initialization
this.$element.addClass( 've-ui-mwTemplateTitleInputWidget' );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWTemplateTitleInputWidget, ve.ui.MWTitleInputWidget );
/* Methods */
/**
* @inheritdoc
*/
ve.ui.MWTemplateTitleInputWidget.prototype.getLookupRequest = function () {
var xhr, pageId,
widget = this,
value = this.value;
// Prefix with default namespace name
if ( this.namespace !== null && mw.Title.newFromText( value, this.namespace ) ) {
value = mw.Title.newFromText( value, this.namespace ).getPrefixedText();
}
// Dont send leading ':' to open search
if ( value.slice( 0, 1 ) === ':' ) {
value = value.slice( 1 );
}
xhr = new mw.Api().get( {
action: 'opensearch',
search: value,
suggest: ''
} );
return xhr
// Also get descriptions
.then( function ( response ) {
var xhr,
templates = response[1];
widget.originalResponse = response;
if ( templates.length > 0 ) {
xhr = new mw.Api().get( {
action: 'templatedata',
titles: templates.join( '|' ),
lang: mw.config.get( 'wgUserLanguage' ),
redirects: '1'
} );
return xhr.promise( { abort: xhr.abort } );
} else {
return $.Deferred().resolve();
}
} )
.then( function ( templateDataResponse ) {
// Look for descriptions and cache them
if ( templateDataResponse ) {
for ( pageId in templateDataResponse.pages ) {
if ( templateDataResponse.pages[pageId].title && !widget.descriptions[templateDataResponse.pages[pageId].title] ) {
// Cache descriptions
widget.descriptions[templateDataResponse.pages[pageId].title] = templateDataResponse.pages[pageId].description;
}
}
}
// Return the original response
return widget.originalResponse;
} )
.promise( { abort: xhr.abort } );
};
/**
* @inheritdoc
*/
ve.ui.MWTemplateTitleInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {
var i, len, title, value,
items = [],
matchingPages = data,
linkCacheUpdate = {};
// Matching pages
if ( matchingPages && matchingPages.length ) {
for ( i = 0, len = matchingPages.length; i < len; i++ ) {
title = new mw.Title( matchingPages[i] );
linkCacheUpdate[matchingPages[i]] = { missing: false };
if ( this.namespace !== null ) {
value = title.getRelativeText( this.namespace );
} else {
value = title.getPrefixedText();
}
items.push( new ve.ui.MWTemplateMenuOptionWidget( {
templateName: value,
templateDescription: this.descriptions[matchingPages[i]],
label: value
} ) );
}
ve.init.platform.linkCache.set( linkCacheUpdate );
}
return items;
};