summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/UploadWizard/resources/details/uw.LanguageDropdownWidget.js
blob: c23c5954f6a80952e0ddacbe9e08191fcb831fd9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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 ) );