diff options
Diffstat (limited to 'www/wiki/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js')
-rw-r--r-- | www/wiki/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/www/wiki/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js b/www/wiki/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js new file mode 100644 index 00000000..926502d2 --- /dev/null +++ b/www/wiki/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js @@ -0,0 +1,89 @@ +( function ( mw ) { + /** + * A widget representing a single toggle filter + * + * @extends mw.rcfilters.ui.ItemMenuOptionWidget + * + * @constructor + * @param {mw.rcfilters.Controller} controller RCFilters controller + * @param {mw.rcfilters.dm.FiltersViewModel} filtersViewModel + * @param {mw.rcfilters.dm.FilterItem} invertModel + * @param {mw.rcfilters.dm.FilterItem} itemModel Filter item model + * @param {Object} config Configuration object + */ + mw.rcfilters.ui.FilterMenuOptionWidget = function MwRcfiltersUiFilterMenuOptionWidget( + controller, filtersViewModel, invertModel, itemModel, config + ) { + config = config || {}; + + this.controller = controller; + this.invertModel = invertModel; + this.model = itemModel; + + // Parent + mw.rcfilters.ui.FilterMenuOptionWidget.parent.call( this, controller, filtersViewModel, this.invertModel, itemModel, config ); + + // Event + this.model.getGroupModel().connect( this, { update: 'onGroupModelUpdate' } ); + + this.$element + .addClass( 'mw-rcfilters-ui-filterMenuOptionWidget' ); + }; + + /* Initialization */ + OO.inheritClass( mw.rcfilters.ui.FilterMenuOptionWidget, mw.rcfilters.ui.ItemMenuOptionWidget ); + + /* Static properties */ + + // We do our own scrolling to top + mw.rcfilters.ui.FilterMenuOptionWidget.static.scrollIntoViewOnSelect = false; + + /* Methods */ + + /** + * @inheritdoc + */ + mw.rcfilters.ui.FilterMenuOptionWidget.prototype.updateUiBasedOnState = function () { + // Parent + mw.rcfilters.ui.FilterMenuOptionWidget.parent.prototype.updateUiBasedOnState.call( this ); + + this.setCurrentMuteState(); + }; + + /** + * Respond to item group model update event + */ + mw.rcfilters.ui.FilterMenuOptionWidget.prototype.onGroupModelUpdate = function () { + this.setCurrentMuteState(); + }; + + /** + * Set the current muted view of the widget based on its state + */ + mw.rcfilters.ui.FilterMenuOptionWidget.prototype.setCurrentMuteState = function () { + if ( + this.model.getGroupModel().getView() === 'namespaces' && + this.invertModel.isSelected() + ) { + // This is an inverted behavior than the other rules, specifically + // for inverted namespaces + this.setFlags( { + muted: this.model.isSelected() + } ); + } else { + this.setFlags( { + muted: ( + this.model.isConflicted() || + ( + // Item is also muted when any of the items in its group is active + this.model.getGroupModel().isActive() && + // But it isn't selected + !this.model.isSelected() && + // And also not included + !this.model.isIncluded() + ) + ) + } ); + } + }; +}( mediaWiki ) ); |