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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
'use strict';
/* eslint-disable no-implicit-globals */
/**
* @class
* @extends OO.ui.MenuTagMultiselectWidget
* @mixins OO.ui.mixin.RequestManager
* @mixins OO.ui.mixin.PendingElement
*
* @constructor
* @param {Object} [config] Configuration options
*
* @author Niklas Laxström
* @license GPL-2.0-or-later
* @since 2020.07
*/
var LanguagesMultiselectWidget = function ( config ) {
this.api = config.api;
this.allowedValues = Object.keys( config.languages );
this.languages = config.languages;
LanguagesMultiselectWidget.parent.call( this, $.extend( true,
{
allowEditTags: false,
allowArbitary: false,
menu: {
filterFromInput: false
}
},
config
) );
OO.ui.mixin.RequestManager.call( this, config );
OO.ui.mixin.PendingElement.call( this, $.extend( true, {}, config, {
$pending: this.$handle
} ) );
// No need for default values for the menu
this.menu.clearItems();
};
/* Setup */
OO.inheritClass( LanguagesMultiselectWidget, OO.ui.MenuTagMultiselectWidget );
OO.mixinClass( LanguagesMultiselectWidget, OO.ui.mixin.RequestManager );
OO.mixinClass( LanguagesMultiselectWidget, OO.ui.mixin.PendingElement );
/* Methods */
/** @inheritdoc OO.ui.MenuTagMultiselectWidget */
LanguagesMultiselectWidget.prototype.onInputChange = function () {
var widget = this;
this.getRequestData()
.then( function ( data ) {
// Reset
widget.menu.clearItems();
widget.menu.addItems( widget.getOptionsFromData( data ) );
} ).always( function () {
// Parent method
LanguagesMultiselectWidget.parent.prototype.onInputChange.call( widget );
} );
};
/**
* Get option widgets from the server response
*
* @param {Object} data Query result
* @return {OO.ui.MenuOptionWidget[]} Menu items
*/
LanguagesMultiselectWidget.prototype.getOptionsFromData = function ( data ) {
var options = [];
for ( var languageCode in data ) {
if ( this.languages[ languageCode ] !== undefined ) {
options.push( new OO.ui.MenuOptionWidget( {
data: languageCode,
label: this.languages[ languageCode ]
} ) );
}
}
return options;
};
/** @inheritdoc OO.ui.MenuTagMultiselectWidget */
LanguagesMultiselectWidget.prototype.setValue = function ( valueObject ) {
valueObject = Array.isArray( valueObject ) ? valueObject : [ valueObject ];
this.clearItems();
valueObject.forEach( function ( obj ) {
var data;
if ( typeof obj === 'string' ) {
data = obj;
} else {
data = obj.data;
}
this.addTag( data, this.languages[ data ] );
}.bind( this ) );
};
/** @inheritdoc OO.ui.mixin.RequestManager */
LanguagesMultiselectWidget.prototype.getRequestQuery = function () {
return this.input.getValue();
};
/** @inheritdoc OO.ui.mixin.RequestManager */
LanguagesMultiselectWidget.prototype.getRequest = function () {
return this.api.get( {
action: 'languagesearch',
formatversion: '2',
search: this.getRequestQuery()
} );
};
/** @inheritdoc OO.ui.mixin.RequestManager */
LanguagesMultiselectWidget.prototype.getRequestCacheDataFromResponse = function ( response ) {
return response.languagesearch || {};
};
module.exports = LanguagesMultiselectWidget;
|