mediawiki-extensions-Visual.../modules/ve-mw/ui/widgets/ve.ui.MWTitleInputWidget.js
Timo Tijhof ee954cbdd5 Use String#slice instead of discouraged String#substr
Aside from the confusion and differences between substr() and
substring() and IE8 bugs with substr(), substr() was removed from
the spec as of ECMAScript 5. It's been standardised in the
optional Annex B section of ES5.

Change-Id: I221ef6ae6956ce20dd9bb74510500f747d04c3b1
2014-12-06 21:26:20 +00:00

144 lines
3.4 KiB
JavaScript

/*!
* VisualEditor UserInterface MWTitleInputWidget class.
*
* @copyright 2011-2014 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Creates an ve.ui.MWTitleInputWidget object.
*
* @class
* @extends OO.ui.TextInputWidget
* @mixins OO.ui.LookupInputWidget
*
* @constructor
* @param {Object} [config] Configuration options
* @cfg {number} [namespace] Namespace to prepend to queries
*/
ve.ui.MWTitleInputWidget = function VeUiMWTitleInputWidget( config ) {
// Config initialization
config = config || {};
// Parent constructor
OO.ui.TextInputWidget.call( this, config );
// Mixin constructors
OO.ui.LookupInputWidget.call( this, this, config );
// Properties
this.namespace = config.namespace || null;
// Events
this.lookupMenu.connect( this, { choose: 'onLookupMenuItemChoose' } );
// Initialization
this.$element.addClass( 've-ui-mwTitleInputWidget' );
this.lookupMenu.$element.addClass( 've-ui-mwTitleInputWidget-menu' );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWTitleInputWidget, OO.ui.TextInputWidget );
OO.mixinClass( ve.ui.MWTitleInputWidget, OO.ui.LookupInputWidget );
/* Methods */
/**
* Handle menu item select event.
*
* @method
* @param {OO.ui.MenuOptionWidget} item Selected item
*/
ve.ui.MWTitleInputWidget.prototype.onLookupMenuItemChoose = function ( item ) {
this.closeLookupMenu();
if ( item ) {
this.setLookupsDisabled( true );
this.setValue( item.getData() );
this.setLookupsDisabled( false );
}
};
/**
* @inheritdoc
*/
ve.ui.MWTitleInputWidget.prototype.getLookupRequest = function () {
var 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.charAt( 0 ) === ':' ) {
value = value.slice( 1 );
}
return ve.init.target.constructor.static.apiRequest( {
action: 'opensearch',
search: value,
suggest: ''
} );
};
/**
* @inheritdoc
*/
ve.ui.MWTitleInputWidget.prototype.getLookupCacheItemFromData = function ( data ) {
return data[1] || [];
};
/**
* @inheritdoc
*/
ve.ui.MWTitleInputWidget.prototype.getLookupMenuItemsFromData = function ( data ) {
var i, len, title, value,
menu$ = this.lookupMenu.$,
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 OO.ui.MenuOptionWidget( {
$: menu$,
data: value,
label: value
} ) );
}
ve.init.platform.linkCache.set( linkCacheUpdate );
}
return items;
};
/**
* Get title object corresponding to #getValue
*
* @returns {mw.Title|null} Title object, or null if value is invalid
*/
ve.ui.MWTitleInputWidget.prototype.getTitle = function () {
var title = this.getValue(),
//mw.Title doesn't handle null well
titleObj = mw.Title.newFromText( title, this.namespace !== null ? this.namespace : undefined );
return titleObj;
};
/**
* @inheritdoc
*/
ve.ui.MWTitleInputWidget.prototype.isValid = function () {
return $.Deferred().resolve( !!this.getTitle() ).promise();
};