const LanguageResultWidget = require( './LanguageResultWidget.js' ); /** * Creates a TemplateDataLanguageSearchWidget object. * This is a copy of ve.ui.LanguageSearchWidget. * * @class * @extends OO.ui.SearchWidget * * @constructor * @param {Object} [config] Configuration options */ function LanguageSearchWidget( config ) { // Configuration initialization config = Object.assign( { placeholder: mw.msg( 'templatedata-modal-search-input-placeholder' ) }, config ); // Parent constructor LanguageSearchWidget.super.call( this, config ); // Properties this.filteredLanguageResultWidgets = []; const languageCodes = Object.keys( $.uls.data.getAutonyms() ).sort(); this.languageResultWidgets = languageCodes.map( ( languageCode ) => new LanguageResultWidget( { data: { code: languageCode, name: $.uls.data.getAutonym( languageCode ), autonym: $.uls.data.getAutonym( languageCode ) } } ) ); this.setAvailableLanguages(); // Initialization this.$element.addClass( 'tdg-languageSearchWidget' ); } /* Inheritance */ OO.inheritClass( LanguageSearchWidget, OO.ui.SearchWidget ); /* Methods */ /** * FIXME: this should be inheritdoc */ LanguageSearchWidget.prototype.onQueryChange = function () { // Parent method LanguageSearchWidget.super.prototype.onQueryChange.apply( this, arguments ); // Populate this.addResults(); }; /** * Set available languages to show * * @param {string[]} [availableLanguages] Available language codes to show, all if undefined */ LanguageSearchWidget.prototype.setAvailableLanguages = function ( availableLanguages ) { if ( !availableLanguages ) { this.filteredLanguageResultWidgets = this.languageResultWidgets.slice(); return; } this.filteredLanguageResultWidgets = this.languageResultWidgets.map( ( languageResult ) => { const data = languageResult.getData(); if ( availableLanguages.indexOf( data.code ) !== -1 ) { return languageResult; } return null; } ).filter( ( languageResult ) => languageResult ); }; /** * Update search results from current query */ LanguageSearchWidget.prototype.addResults = function () { const matchProperties = [ 'name', 'autonym', 'code' ], query = this.query.getValue().trim(), compare = window.Intl && Intl.Collator ? new Intl.Collator( this.lang, { sensitivity: 'base' } ).compare : function ( a, b ) { return a.toLowerCase() === b.toLowerCase() ? 0 : 1; }, hasQuery = !!query.length, items = []; const results = this.getResults(); results.clearItems(); this.filteredLanguageResultWidgets.forEach( ( languageResult ) => { const data = languageResult.getData(); let matchedProperty = null; matchProperties.some( ( prop ) => { if ( data[ prop ] && compare( data[ prop ].slice( 0, query.length ), query ) === 0 ) { matchedProperty = prop; return true; } return false; } ); if ( query === '' || matchedProperty ) { items.push( languageResult .updateLabel( query, matchedProperty, compare ) .setSelected( false ) .setHighlighted( false ) // Forward keyboard-triggered events from the OptionWidget to the SelectWidget .off( 'choose' ) .connect( results, { choose: [ 'emit', 'choose' ] } ) ); } } ); results.addItems( items ); if ( hasQuery ) { results.highlightItem( results.findFirstSelectableItem() ); } }; module.exports = LanguageSearchWidget;