2013-07-02 20:40:54 +00:00
|
|
|
/*!
|
|
|
|
* VisualEditor UserInterface MWParameterSearchWidget class.
|
|
|
|
*
|
2018-01-03 00:54:47 +00:00
|
|
|
* @copyright 2011-2018 VisualEditor Team and others; see AUTHORS.txt
|
2013-07-02 20:40:54 +00:00
|
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates an ve.ui.MWParameterSearchWidget object.
|
|
|
|
*
|
|
|
|
* @class
|
2013-10-09 20:09:59 +00:00
|
|
|
* @extends OO.ui.SearchWidget
|
2013-07-02 20:40:54 +00:00
|
|
|
*
|
|
|
|
* @constructor
|
2014-04-24 00:48:14 +00:00
|
|
|
* @param {ve.dm.MWTemplateModel} template Template model
|
2013-09-25 10:21:09 +00:00
|
|
|
* @param {Object} [config] Configuration options
|
2014-04-08 19:15:15 +00:00
|
|
|
* @cfg {number|null} [limit=3] Limit on the number of initial options to show, null to show all
|
2013-07-02 20:40:54 +00:00
|
|
|
*/
|
|
|
|
ve.ui.MWParameterSearchWidget = function VeUiMWParameterSearchWidget( template, config ) {
|
2014-11-21 13:00:50 +00:00
|
|
|
// Configuration initialization
|
2013-09-20 07:09:06 +00:00
|
|
|
config = ve.extendObject( {
|
2014-08-22 20:50:48 +00:00
|
|
|
placeholder: ve.msg( 'visualeditor-parameter-input-placeholder' ),
|
|
|
|
limit: 3
|
2013-09-20 07:09:06 +00:00
|
|
|
}, config );
|
2013-07-02 20:40:54 +00:00
|
|
|
|
|
|
|
// Parent constructor
|
2016-08-22 21:44:59 +00:00
|
|
|
ve.ui.MWParameterSearchWidget.super.call( this, config );
|
2013-07-02 20:40:54 +00:00
|
|
|
|
|
|
|
// Properties
|
|
|
|
this.template = template;
|
|
|
|
this.index = [];
|
2015-04-13 21:30:41 +00:00
|
|
|
this.showAll = !!config.showAll;
|
2014-04-08 19:15:15 +00:00
|
|
|
this.limit = config.limit || null;
|
2013-07-02 20:40:54 +00:00
|
|
|
|
|
|
|
// Events
|
2014-08-22 20:50:48 +00:00
|
|
|
this.template.connect( this, { add: 'buildIndex', remove: 'buildIndex' } );
|
2015-07-24 18:05:22 +00:00
|
|
|
this.getResults().connect( this, { choose: 'onSearchResultsChoose' } );
|
2013-07-02 20:40:54 +00:00
|
|
|
|
|
|
|
// Initialization
|
2013-11-01 19:45:59 +00:00
|
|
|
this.$element.addClass( 've-ui-mwParameterSearchWidget' );
|
2013-07-02 20:40:54 +00:00
|
|
|
this.buildIndex();
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Inheritance */
|
|
|
|
|
2013-10-09 20:09:59 +00:00
|
|
|
OO.inheritClass( ve.ui.MWParameterSearchWidget, OO.ui.SearchWidget );
|
2013-07-02 20:40:54 +00:00
|
|
|
|
|
|
|
/* Events */
|
|
|
|
|
|
|
|
/**
|
2015-07-24 18:05:22 +00:00
|
|
|
* @event choose
|
2013-07-02 20:40:54 +00:00
|
|
|
* @param {string|null} name Parameter name or null if no item is selected
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Methods */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle select widget select events.
|
|
|
|
*
|
|
|
|
* @method
|
|
|
|
* @param {string} value New value
|
|
|
|
*/
|
|
|
|
ve.ui.MWParameterSearchWidget.prototype.onQueryChange = function () {
|
|
|
|
// Parent method
|
2016-08-22 21:44:59 +00:00
|
|
|
ve.ui.MWParameterSearchWidget.super.prototype.onQueryChange.call( this );
|
2013-07-02 20:40:54 +00:00
|
|
|
|
|
|
|
// Populate
|
|
|
|
this.addResults();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2015-07-24 18:05:22 +00:00
|
|
|
* Handle SelectWidget choose events.
|
2013-07-02 20:40:54 +00:00
|
|
|
*
|
|
|
|
* @method
|
2013-10-09 20:09:59 +00:00
|
|
|
* @param {OO.ui.OptionWidget} item Selected item
|
2015-07-24 18:05:22 +00:00
|
|
|
* @fires choose
|
2015-04-13 21:30:41 +00:00
|
|
|
* @fires showAll
|
2013-07-02 20:40:54 +00:00
|
|
|
*/
|
2015-07-24 18:05:22 +00:00
|
|
|
ve.ui.MWParameterSearchWidget.prototype.onSearchResultsChoose = function ( item ) {
|
2014-04-08 19:15:15 +00:00
|
|
|
if ( item instanceof ve.ui.MWParameterResultWidget ) {
|
2015-07-24 18:05:22 +00:00
|
|
|
this.emit( 'choose', item.getData().name );
|
2014-04-08 19:15:15 +00:00
|
|
|
} else if ( item instanceof ve.ui.MWMoreParametersResultWidget ) {
|
|
|
|
this.showAll = true;
|
|
|
|
this.addResults();
|
2015-04-13 21:30:41 +00:00
|
|
|
this.emit( 'showAll' );
|
2014-04-08 19:15:15 +00:00
|
|
|
}
|
2013-07-02 20:40:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2015-12-09 16:47:13 +00:00
|
|
|
* Build a searchable index of parameters.
|
2013-07-02 20:40:54 +00:00
|
|
|
*
|
|
|
|
* @method
|
|
|
|
* @param {ve.dm.MWTemplateSpecModel} spec Template specification
|
|
|
|
*/
|
|
|
|
ve.ui.MWParameterSearchWidget.prototype.buildIndex = function () {
|
|
|
|
var i, len, name, label, aliases, description,
|
|
|
|
spec = this.template.getSpec(),
|
|
|
|
knownParams = spec.getParameterNames();
|
|
|
|
|
|
|
|
this.index.length = 0;
|
|
|
|
for ( i = 0, len = knownParams.length; i < len; i++ ) {
|
2015-08-19 17:33:02 +00:00
|
|
|
name = knownParams[ i ];
|
2013-07-11 00:33:21 +00:00
|
|
|
// Skip parameters already in use
|
|
|
|
if ( this.template.hasParameter( name ) ) {
|
2013-07-02 20:40:54 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
label = spec.getParameterLabel( name );
|
|
|
|
aliases = spec.getParameterAliases( name );
|
|
|
|
description = spec.getParameterDescription( name );
|
|
|
|
|
|
|
|
this.index.push( {
|
2014-03-06 20:10:42 +00:00
|
|
|
// Query information
|
2014-08-22 20:50:48 +00:00
|
|
|
text: [ label, description ].join( ' ' ).toLowerCase(),
|
|
|
|
names: [ name ].concat( aliases ).join( '|' ).toLowerCase(),
|
2014-03-06 20:10:42 +00:00
|
|
|
// Display information
|
2014-08-22 20:50:48 +00:00
|
|
|
name: name,
|
|
|
|
label: label,
|
|
|
|
aliases: aliases,
|
2018-12-11 14:56:16 +00:00
|
|
|
description: description,
|
|
|
|
deprecated: spec.isParameterDeprecated( name )
|
2013-07-02 20:40:54 +00:00
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Re-populate
|
|
|
|
this.onQueryChange();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle media query response events.
|
|
|
|
*
|
|
|
|
* @method
|
|
|
|
*/
|
|
|
|
ve.ui.MWParameterSearchWidget.prototype.addResults = function () {
|
2014-04-08 19:15:15 +00:00
|
|
|
var i, len, item, textMatch, nameMatch, remainder,
|
2013-07-02 20:40:54 +00:00
|
|
|
exactMatch = false,
|
2017-07-18 11:55:33 +00:00
|
|
|
value = this.query.getValue().trim().replace( /[|{}]/g, '' ),
|
2013-07-02 20:40:54 +00:00
|
|
|
query = value.toLowerCase(),
|
2014-04-08 19:15:15 +00:00
|
|
|
hasQuery = !!query.length,
|
2013-07-02 20:40:54 +00:00
|
|
|
items = [];
|
|
|
|
|
2014-04-08 19:15:15 +00:00
|
|
|
this.results.clearItems();
|
|
|
|
|
2013-07-02 20:40:54 +00:00
|
|
|
for ( i = 0, len = this.index.length; i < len; i++ ) {
|
2015-08-19 17:33:02 +00:00
|
|
|
item = this.index[ i ];
|
2014-04-08 19:15:15 +00:00
|
|
|
if ( hasQuery ) {
|
|
|
|
textMatch = item.text.indexOf( query ) >= 0;
|
|
|
|
nameMatch = item.names.indexOf( query ) >= 0;
|
|
|
|
}
|
|
|
|
if ( !hasQuery || textMatch || nameMatch ) {
|
2018-12-11 14:56:16 +00:00
|
|
|
// Only show exact matches for deprecated params
|
|
|
|
if ( item.deprecated && query !== item.name && item.aliases.indexOf( query ) === -1 ) {
|
|
|
|
continue;
|
|
|
|
}
|
2015-04-09 23:47:15 +00:00
|
|
|
items.push( new ve.ui.MWParameterResultWidget( { data: item } ) );
|
2014-04-08 19:15:15 +00:00
|
|
|
if ( hasQuery && nameMatch ) {
|
2013-07-02 20:40:54 +00:00
|
|
|
exactMatch = true;
|
|
|
|
}
|
|
|
|
}
|
2014-09-15 19:13:47 +00:00
|
|
|
if ( !hasQuery && !this.showAll && items.length >= this.limit ) {
|
2014-04-08 19:15:15 +00:00
|
|
|
remainder = len - i;
|
|
|
|
break;
|
|
|
|
}
|
2013-07-02 20:40:54 +00:00
|
|
|
}
|
|
|
|
|
2014-04-08 19:15:15 +00:00
|
|
|
if ( hasQuery && !exactMatch && value.length && !this.template.hasParameter( value ) ) {
|
2013-07-02 20:40:54 +00:00
|
|
|
items.unshift( new ve.ui.MWParameterResultWidget( {
|
2014-11-22 01:40:00 +00:00
|
|
|
data: {
|
|
|
|
name: value,
|
|
|
|
label: value,
|
|
|
|
aliases: [],
|
|
|
|
description: ve.msg( 'visualeditor-parameter-search-unknown' )
|
|
|
|
}
|
|
|
|
} ) );
|
2013-07-02 20:40:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( !items.length ) {
|
2014-11-22 01:40:00 +00:00
|
|
|
items.push( new ve.ui.MWNoParametersResultWidget( {
|
|
|
|
data: {},
|
|
|
|
disabled: true
|
|
|
|
} ) );
|
2014-04-08 19:15:15 +00:00
|
|
|
} else if ( remainder ) {
|
2014-11-22 01:40:00 +00:00
|
|
|
items.push( new ve.ui.MWMoreParametersResultWidget( {
|
|
|
|
data: { remainder: remainder }
|
|
|
|
} ) );
|
2013-07-02 20:40:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
this.results.addItems( items );
|
2014-04-24 00:48:14 +00:00
|
|
|
if ( hasQuery ) {
|
2017-09-06 05:42:42 +00:00
|
|
|
this.results.highlightItem( this.results.findFirstSelectableItem() );
|
2013-07-02 20:40:54 +00:00
|
|
|
}
|
|
|
|
};
|