Merge "Prepare for REL1_33 cut, labelling master as 1.34-alpha"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / ui / FilterMenuOptionWidget.js
1 var ItemMenuOptionWidget = require( './ItemMenuOptionWidget.js' ),
2 FilterMenuOptionWidget;
3
4 /**
5 * A widget representing a single toggle filter
6 *
7 * @class mw.rcfilters.ui.FilterMenuOptionWidget
8 * @extends mw.rcfilters.ui.ItemMenuOptionWidget
9 *
10 * @constructor
11 * @param {mw.rcfilters.Controller} controller RCFilters controller
12 * @param {mw.rcfilters.dm.FiltersViewModel} filtersViewModel
13 * @param {mw.rcfilters.dm.FilterItem} invertModel
14 * @param {mw.rcfilters.dm.FilterItem} itemModel Filter item model
15 * @param {mw.rcfilters.ui.HighlightPopupWidget} highlightPopup Shared highlight color picker popup
16 * @param {Object} config Configuration object
17 */
18 FilterMenuOptionWidget = function MwRcfiltersUiFilterMenuOptionWidget(
19 controller, filtersViewModel, invertModel, itemModel, highlightPopup, config
20 ) {
21 config = config || {};
22
23 this.controller = controller;
24 this.invertModel = invertModel;
25 this.model = itemModel;
26
27 // Parent
28 FilterMenuOptionWidget.parent.call( this, controller, filtersViewModel, this.invertModel, itemModel, highlightPopup, config );
29
30 // Event
31 this.model.getGroupModel().connect( this, { update: 'onGroupModelUpdate' } );
32
33 this.$element
34 .addClass( 'mw-rcfilters-ui-filterMenuOptionWidget' );
35 };
36
37 /* Initialization */
38 OO.inheritClass( FilterMenuOptionWidget, ItemMenuOptionWidget );
39
40 /* Static properties */
41
42 // We do our own scrolling to top
43 FilterMenuOptionWidget.static.scrollIntoViewOnSelect = false;
44
45 /* Methods */
46
47 /**
48 * @inheritdoc
49 */
50 FilterMenuOptionWidget.prototype.updateUiBasedOnState = function () {
51 // Parent
52 FilterMenuOptionWidget.parent.prototype.updateUiBasedOnState.call( this );
53
54 this.setCurrentMuteState();
55 };
56
57 /**
58 * Respond to item group model update event
59 */
60 FilterMenuOptionWidget.prototype.onGroupModelUpdate = function () {
61 this.setCurrentMuteState();
62 };
63
64 /**
65 * Set the current muted view of the widget based on its state
66 */
67 FilterMenuOptionWidget.prototype.setCurrentMuteState = function () {
68 if (
69 this.model.getGroupModel().getView() === 'namespaces' &&
70 this.invertModel.isSelected()
71 ) {
72 // This is an inverted behavior than the other rules, specifically
73 // for inverted namespaces
74 this.setFlags( {
75 muted: this.model.isSelected()
76 } );
77 } else {
78 this.setFlags( {
79 muted: (
80 this.model.isConflicted() ||
81 (
82 // Item is also muted when any of the items in its group is active
83 this.model.getGroupModel().isActive() &&
84 // But it isn't selected
85 !this.model.isSelected() &&
86 // And also not included
87 !this.model.isIncluded()
88 )
89 )
90 } );
91 }
92 };
93
94 module.exports = FilterMenuOptionWidget;