1 var FilterItemHighlightButton
= require( './FilterItemHighlightButton.js' ),
2 CheckboxInputWidget
= require( './CheckboxInputWidget.js' ),
6 * A widget representing a base toggle item
8 * @class mw.rcfilters.ui.ItemMenuOptionWidget
9 * @extends OO.ui.MenuOptionWidget
12 * @param {mw.rcfilters.Controller} controller RCFilters controller
13 * @param {mw.rcfilters.dm.FiltersViewModel} filtersViewModel
14 * @param {mw.rcfilters.dm.ItemModel} invertModel
15 * @param {mw.rcfilters.dm.ItemModel} itemModel Item model
16 * @param {mw.rcfilters.ui.HighlightPopupWidget} highlightPopup Shared highlight color picker
17 * @param {Object} config Configuration object
19 ItemMenuOptionWidget
= function MwRcfiltersUiItemMenuOptionWidget(
20 controller
, filtersViewModel
, invertModel
, itemModel
, highlightPopup
, config
26 .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label' );
28 config
= config
|| {};
30 this.controller
= controller
;
31 this.filtersViewModel
= filtersViewModel
;
32 this.invertModel
= invertModel
;
33 this.itemModel
= itemModel
;
36 ItemMenuOptionWidget
.parent
.call( this, $.extend( {
37 // Override the 'check' icon that OOUI defines
39 data
: this.itemModel
.getName(),
40 label
: this.itemModel
.getLabel()
43 this.checkboxWidget
= new CheckboxInputWidget( {
44 value
: this.itemModel
.getName(),
45 selected
: this.itemModel
.isSelected()
50 .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label-title' )
51 .append( $( '<bdi>' ).append( this.$label
) )
53 if ( this.itemModel
.getDescription() ) {
56 .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label-desc' )
57 .append( $( '<bdi>' ).text( this.itemModel
.getDescription() ) )
61 this.highlightButton
= new FilterItemHighlightButton(
66 $overlay
: config
.$overlay
|| this.$element
,
67 title
: mw
.msg( 'rcfilters-highlightmenu-help' )
70 this.highlightButton
.toggle( this.filtersViewModel
.isHighlightEnabled() );
72 this.excludeLabel
= new OO
.ui
.LabelWidget( {
73 label
: mw
.msg( 'rcfilters-filter-excluded' )
75 this.excludeLabel
.toggle(
76 this.itemModel
.getGroupModel().getView() === 'namespaces' &&
77 this.itemModel
.isSelected() &&
78 this.invertModel
.isSelected()
81 layout
= new OO
.ui
.FieldLayout( this.checkboxWidget
, {
87 this.filtersViewModel
.connect( this, { highlightChange
: 'updateUiBasedOnState' } );
88 this.invertModel
.connect( this, { update
: 'updateUiBasedOnState' } );
89 this.itemModel
.connect( this, { update
: 'updateUiBasedOnState' } );
90 // HACK: Prevent defaults on 'click' for the label so it
91 // doesn't steal the focus away from the input. This means
92 // we can continue arrow-movement after we click the label
93 // and is consistent with the checkbox *itself* also preventing
94 // defaults on 'click' as well.
95 layout
.$label
.on( 'click', false );
97 $widgetRow
= $( '<div>' )
98 .addClass( 'mw-rcfilters-ui-table' )
101 .addClass( 'mw-rcfilters-ui-row' )
104 .addClass( 'mw-rcfilters-ui-cell mw-rcfilters-ui-itemMenuOptionWidget-itemCheckbox' )
105 .append( layout
.$element
)
109 if ( !OO
.ui
.isMobile() ) {
110 $widgetRow
.find( '.mw-rcfilters-ui-row' ).append(
112 .addClass( 'mw-rcfilters-ui-cell mw-rcfilters-ui-itemMenuOptionWidget-excludeLabel' )
113 .append( this.excludeLabel
.$element
),
115 .addClass( 'mw-rcfilters-ui-cell mw-rcfilters-ui-itemMenuOptionWidget-highlightButton' )
116 .append( this.highlightButton
.$element
)
121 .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget' )
122 .addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-view-' + this.itemModel
.getGroupModel().getView() )
123 .append( $widgetRow
);
125 if ( this.itemModel
.getIdentifiers() ) {
126 this.itemModel
.getIdentifiers().forEach( function ( ident
) {
127 classes
.push( 'mw-rcfilters-ui-itemMenuOptionWidget-identifier-' + ident
);
130 this.$element
.addClass( classes
);
133 this.updateUiBasedOnState();
138 OO
.inheritClass( ItemMenuOptionWidget
, OO
.ui
.MenuOptionWidget
);
140 /* Static properties */
142 // We do our own scrolling to top
143 ItemMenuOptionWidget
.static.scrollIntoViewOnSelect
= false;
148 * Respond to item model update event
150 ItemMenuOptionWidget
.prototype.updateUiBasedOnState = function () {
151 this.checkboxWidget
.setSelected( this.itemModel
.isSelected() );
153 this.highlightButton
.toggle( this.filtersViewModel
.isHighlightEnabled() );
154 this.excludeLabel
.toggle(
155 this.itemModel
.getGroupModel().getView() === 'namespaces' &&
156 this.itemModel
.isSelected() &&
157 this.invertModel
.isSelected()
159 this.toggle( this.itemModel
.isVisible() );
163 * Get the name of this filter
165 * @return {string} Filter name
167 ItemMenuOptionWidget
.prototype.getName = function () {
168 return this.itemModel
.getName();
171 ItemMenuOptionWidget
.prototype.getModel = function () {
172 return this.itemModel
;
175 module
.exports
= ItemMenuOptionWidget
;