( function ( mw, uw, $, OO ) {
/**
* A ULS within a description field in UploadWizard's "Details" step form.
*
* @constructor
* @param {Object} [config]
* @cfg {Object} [languages] Keys are 2-letter language codes, values are language autonyms
* @cfg {Array} [classes] Classes to apply to the ULS container div
*/
uw.UlsWidget = function UWUlsWidget( config ) {
var i;
uw.UlsWidget.parent.call( this );
this.$element = $( '
' )
.append(
$( '' )
.attr( 'tabindex', 0 )
.addClass( 'oo-ui-dropdownWidget-handle' )
.addClass( 'oo-ui-widget' )
.addClass( 'oo-ui-indicatorElement' )
.append(
$( '' ).addClass( 'oo-ui-labelElement-label' ),
$( '' )
.addClass( 'oo-ui-indicatorElement-indicator' )
.addClass( 'oo-ui-indicator-down' )
)
)
.addClass( 'oo-ui-dropdownWidget' )
.addClass( 'oo-ui-widget-enabled' );
for ( i = 0; i < config.classes.length; i++ ) {
this.$element.addClass( config.classes[ i ] );
}
if ( mw.loader.getState( 'ext.uls.mediawiki' ) === 'ready' ) {
this.initialiseUls( config.languages );
}
};
OO.inheritClass( uw.UlsWidget, OO.ui.Widget );
OO.mixinClass( uw.UlsWidget, OO.EventEmitter );
uw.UlsWidget.prototype.initialiseUls = function ( languages ) {
var ulsWidget = this;
this.languages = languages;
this.uls = $( this.$element ).uls( {
onSelect: function ( language ) {
ulsWidget.setValue( language );
ulsWidget.$element.parent().find( '.oo-ui-inputWidget-input' ).focus();
},
languages: languages,
ulsPurpose: 'upload-wizard-description',
onVisible: function () {
// Re-position the ULS *after* the widget has been rendered, so that we can be
// sure it's in the right place
var offset = ulsWidget.$element.offset();
if ( this.$menu.css( 'direction' ) === 'rtl' ) {
offset.left =
offset.left - parseInt( this.$menu.css( 'width' ) ) + ulsWidget.$element.width();
}
this.$menu.css( offset );
}
} );
// Show the ULS when a user tabs into the language selection field
this.$element.find( '.oo-ui-dropdownWidget-handle' ).on( 'focus', function () {
$( this ).click();
} );
};
/**
* @param {object} languages
*/
uw.UlsWidget.prototype.updateLanguages = function ( languages ) {
this.uls.off().removeData( 'uls' );
this.initialiseUls( languages );
};
/**
* @param {string} value
*/
uw.UlsWidget.prototype.setValue = function ( value ) {
var current = this.languageValue;
this.languageValue = value;
this.$element.find( '.oo-ui-labelElement-label' ).text( this.languages[ value ] );
if ( current !== value ) {
this.emit( 'select' );
}
};
/**
* @return {string}
*/
uw.UlsWidget.prototype.getValue = function () {
return this.languageValue;
};
/**
* @return {uw.UlsWidget}
*/
uw.UlsWidget.prototype.getElement = function () {
return this.$element;
};
}( mediaWiki, mediaWiki.uploadWizard, jQuery, OO ) );