3 * A widget representing a single toggle filter
5 * @extends mw.rcfilters.ui.ItemMenuOptionWidget
8 * @param {mw.rcfilters.Controller} controller RCFilters controller
9 * @param {mw.rcfilters.dm.FiltersViewModel} filtersViewModel
10 * @param {mw.rcfilters.dm.FilterItem} invertModel
11 * @param {mw.rcfilters.dm.FilterItem} itemModel Filter item model
12 * @param {mw.rcfilters.ui.HighlightPopupWidget} highlightPopup Shared highlight color picker popup
13 * @param {Object} config Configuration object
15 mw
.rcfilters
.ui
.FilterMenuOptionWidget
= function MwRcfiltersUiFilterMenuOptionWidget(
16 controller
, filtersViewModel
, invertModel
, itemModel
, highlightPopup
, config
18 config
= config
|| {};
20 this.controller
= controller
;
21 this.invertModel
= invertModel
;
22 this.model
= itemModel
;
25 mw
.rcfilters
.ui
.FilterMenuOptionWidget
.parent
.call( this, controller
, filtersViewModel
, this.invertModel
, itemModel
, highlightPopup
, config
);
28 this.model
.getGroupModel().connect( this, { update
: 'onGroupModelUpdate' } );
31 .addClass( 'mw-rcfilters-ui-filterMenuOptionWidget' );
35 OO
.inheritClass( mw
.rcfilters
.ui
.FilterMenuOptionWidget
, mw
.rcfilters
.ui
.ItemMenuOptionWidget
);
37 /* Static properties */
39 // We do our own scrolling to top
40 mw
.rcfilters
.ui
.FilterMenuOptionWidget
.static.scrollIntoViewOnSelect
= false;
47 mw
.rcfilters
.ui
.FilterMenuOptionWidget
.prototype.updateUiBasedOnState = function () {
49 mw
.rcfilters
.ui
.FilterMenuOptionWidget
.parent
.prototype.updateUiBasedOnState
.call( this );
51 this.setCurrentMuteState();
55 * Respond to item group model update event
57 mw
.rcfilters
.ui
.FilterMenuOptionWidget
.prototype.onGroupModelUpdate = function () {
58 this.setCurrentMuteState();
62 * Set the current muted view of the widget based on its state
64 mw
.rcfilters
.ui
.FilterMenuOptionWidget
.prototype.setCurrentMuteState = function () {
66 this.model
.getGroupModel().getView() === 'namespaces' &&
67 this.invertModel
.isSelected()
69 // This is an inverted behavior than the other rules, specifically
70 // for inverted namespaces
72 muted
: this.model
.isSelected()
77 this.model
.isConflicted() ||
79 // Item is also muted when any of the items in its group is active
80 this.model
.getGroupModel().isActive() &&
81 // But it isn't selected
82 !this.model
.isSelected() &&
83 // And also not included
84 !this.model
.isIncluded()