Merge "Add more Czech special page aliases"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / ui / mw.rcfilters.ui.FilterWrapperWidget.js
1 ( function ( mw ) {
2 /**
3 * List displaying all filter groups
4 *
5 * @extends OO.ui.Widget
6 * @mixins OO.ui.mixin.PendingElement
7 *
8 * @constructor
9 * @param {mw.rcfilters.Controller} controller Controller
10 * @param {mw.rcfilters.dm.FiltersViewModel} model View model
11 * @param {Object} [config] Configuration object
12 * @cfg {Object} [filters] A definition of the filter groups in this list
13 * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
14 */
15 mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, config ) {
16 config = config || {};
17
18 // Parent
19 mw.rcfilters.ui.FilterWrapperWidget.parent.call( this, config );
20 // Mixin constructors
21 OO.ui.mixin.PendingElement.call( this, config );
22
23 this.controller = controller;
24 this.model = model;
25 this.$overlay = config.$overlay || this.$element;
26
27 this.filterPopup = new mw.rcfilters.ui.FiltersListWidget(
28 this.controller,
29 this.model,
30 {
31 label: mw.msg( 'rcfilters-filterlist-title' ),
32 $overlay: this.$overlay
33 }
34 );
35
36 this.textInput = new OO.ui.TextInputWidget( {
37 classes: [ 'mw-rcfilters-ui-filterWrapperWidget-search' ],
38 icon: 'search',
39 placeholder: mw.msg( 'rcfilters-search-placeholder' )
40 } );
41
42 this.capsule = new mw.rcfilters.ui.FilterCapsuleMultiselectWidget( controller, this.model, this.textInput, {
43 $overlay: this.$overlay,
44 popup: {
45 $content: this.filterPopup.$element,
46 classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ],
47 width: 650
48 }
49 } );
50
51 // Events
52 this.model.connect( this, {
53 initialize: 'onModelInitialize'
54 } );
55 this.textInput.connect( this, {
56 change: 'onTextInputChange'
57 } );
58 this.$element
59 .addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
60 .append( this.capsule.$element, this.textInput.$element );
61 };
62
63 /* Initialization */
64
65 OO.inheritClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.Widget );
66 OO.mixinClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.mixin.PendingElement );
67
68 /**
69 * Respond to text input change
70 *
71 * @param {string} newValue Current value
72 */
73 mw.rcfilters.ui.FilterWrapperWidget.prototype.onTextInputChange = function ( newValue ) {
74 // Filter the results
75 this.filterPopup.filter( this.model.findMatches( newValue ) );
76 };
77
78 /**
79 * Respond to model update event and set up the available filters to choose
80 * from.
81 */
82 mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelInitialize = function () {
83 var wrapper = this;
84
85 // Add defaults to capsule. We have to do this
86 // after we added to the capsule menu, since that's
87 // how the capsule multiselect widget knows which
88 // object to add
89 this.model.getItems().forEach( function ( filterItem ) {
90 if ( filterItem.isSelected() ) {
91 wrapper.capsule.addItemByName( filterItem.getName() );
92 }
93 } );
94 };
95 }( mediaWiki ) );