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