diff options
Diffstat (limited to 'www/wiki/extensions/UploadWizard/resources/details/uw.LanguageDropdownWidget.js')
-rw-r--r-- | www/wiki/extensions/UploadWizard/resources/details/uw.LanguageDropdownWidget.js | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/www/wiki/extensions/UploadWizard/resources/details/uw.LanguageDropdownWidget.js b/www/wiki/extensions/UploadWizard/resources/details/uw.LanguageDropdownWidget.js new file mode 100644 index 00000000..c23c5954 --- /dev/null +++ b/www/wiki/extensions/UploadWizard/resources/details/uw.LanguageDropdownWidget.js @@ -0,0 +1,83 @@ +( function ( mw, uw, $, OO ) { + + /** + * A language dropdown within a description field in UploadWizard's "Details" step form. + * + * @constructor + * @param {Object} [config] + */ + uw.LanguageDropdownWidget = function UWLanguageDropdownWidget( config ) { + config = config || {}; + + uw.LanguageDropdownWidget.parent.call( this ); + + this.languageDropdown = new OO.ui.DropdownWidget( { + menu: { items: this.getLanguageMenuOptionWidgets( config.languages ) }, + classes: config.classes + } ); + this.languageDropdown.getMenu().connect( this, { select: [ 'emit', 'select' ] } ); + }; + OO.inheritClass( uw.LanguageDropdownWidget, OO.ui.Widget ); + OO.mixinClass( uw.LanguageDropdownWidget, OO.EventEmitter ); + + /** + * @param {object} languages + */ + uw.LanguageDropdownWidget.prototype.updateLanguages = function ( languages ) { + var menu = this.languageDropdown.getMenu(), + currentMenuItems = menu.getItems(), + currentValue = this.getValue(); + + // remove all items except the one currently selected (don't want + // to trigger another select by removing it) + menu.removeItems( currentMenuItems.filter( function ( item ) { return !item.isSelected(); } ) ); + + // and add the rest of the languages back in there + delete languages[ currentValue ]; + menu.addItems( this.getLanguageMenuOptionWidgets( languages ) ); + }; + + /** + * @param {string} value + */ + uw.LanguageDropdownWidget.prototype.setValue = function ( value ) { + this.languageDropdown.getMenu().selectItemByData( value ); + }; + + /** + * @return {string} + */ + uw.LanguageDropdownWidget.prototype.getValue = function () { + return this.languageDropdown.getMenu().findSelectedItem().getData(); + }; + + /** + * @return {OO.ui.DropdownWidget} + */ + uw.LanguageDropdownWidget.prototype.getElement = function () { + return this.languageDropdown.$element; + }; + + /** + * Get options for the dropdown list of all allowed languages. + * + * @private + * @param {Object} languages + * @return {OO.ui.MenuOptionWidget[]} + */ + uw.LanguageDropdownWidget.prototype.getLanguageMenuOptionWidgets = function ( languages ) { + var options; + + options = []; + $.each( languages, function ( code, language ) { + options.push( + new OO.ui.MenuOptionWidget( { + data: code, + label: language + } ) + ); + } ); + return options; + }; + +}( mediaWiki, mediaWiki.uploadWizard, jQuery, OO ) ); |