summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/UploadWizard/resources/details/uw.UlsWidget.js
blob: a1b13fb3273ec99216fe28c4f46f3e5aee817b12 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
( 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 = $( '<div>' )
			.append(
				$( '<span>' )
					.attr( 'tabindex', 0 )
					.addClass( 'oo-ui-dropdownWidget-handle' )
					.addClass( 'oo-ui-widget' )
					.addClass( 'oo-ui-indicatorElement' )
					.append(
						$( '<span>' ).addClass( 'oo-ui-labelElement-label' ),
						$( '<span>' )
							.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 ) );