Merge "Upstream change to message 'summary-preview' from en.wiki"
[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 }
33 );
34
35 this.textInput = new OO.ui.TextInputWidget( {
36 classes: [ 'mw-rcfilters-ui-filterWrapperWidget-search' ],
37 icon: 'search',
38 placeholder: mw.msg( 'rcfilters-search-placeholder' )
39 } );
40
41 this.capsule = new mw.rcfilters.ui.FilterCapsuleMultiselectWidget( controller, this.model, this.textInput, {
42 $overlay: this.$overlay,
43 popup: {
44 $content: this.filterPopup.$element,
45 classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ],
46 width: 650
47 }
48 } );
49
50 // Events
51 this.model.connect( this, {
52 initialize: 'onModelInitialize'
53 } );
54 this.textInput.connect( this, {
55 change: 'onTextInputChange'
56 } );
57 this.$element
58 .addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
59 .append( this.capsule.$element, this.textInput.$element );
60 };
61
62 /* Initialization */
63
64 OO.inheritClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.Widget );
65 OO.mixinClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.mixin.PendingElement );
66
67 /**
68 * Respond to text input change
69 *
70 * @param {string} newValue Current value
71 */
72 mw.rcfilters.ui.FilterWrapperWidget.prototype.onTextInputChange = function ( newValue ) {
73 // Filter the results
74 this.filterPopup.filter( this.model.findMatches( newValue ) );
75 };
76
77 /**
78 * Respond to model update event and set up the available filters to choose
79 * from.
80 */
81 mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelInitialize = function () {
82 var wrapper = this;
83
84 // Add defaults to capsule. We have to do this
85 // after we added to the capsule menu, since that's
86 // how the capsule multiselect widget knows which
87 // object to add
88 this.model.getItems().forEach( function ( filterItem ) {
89 if ( filterItem.isSelected() ) {
90 wrapper.capsule.addItemByName( filterItem.getName() );
91 }
92 } );
93 };
94 }( mediaWiki ) );