5 * @mixins OO.EventEmitter
8 * @param {string} name Filter name
9 * @param {mw.rcfilters.dm.FilterGroup} groupModel Filter group model
10 * @param {Object} config Configuration object
11 * @cfg {string} [group] The group this item belongs to
12 * @cfg {string} [label] The label for the filter
13 * @cfg {string} [description] The description of the filter
14 * @cfg {boolean} [active=true] The filter is active and affecting the result
15 * @cfg {string[]} [excludes=[]] A list of filter names this filter, if
16 * selected, makes inactive.
17 * @cfg {boolean} [selected] The item is selected
18 * @cfg {string[]} [subset] Defining the names of filters that are a subset of this filter
19 * @cfg {string[]} [conflictsWith] Defining the names of filters that conflict with this item
20 * @cfg {string} [cssClass] The class identifying the results that match this filter
22 mw
.rcfilters
.dm
.FilterItem
= function MwRcfiltersDmFilterItem( name
, groupModel
, config
) {
23 config
= config
|| {};
26 OO
.EventEmitter
.call( this );
29 this.groupModel
= groupModel
;
31 this.label
= config
.label
|| this.name
;
32 this.description
= config
.description
;
33 this.selected
= !!config
.selected
;
35 // Interaction definitions
36 this.subset
= config
.subset
|| [];
37 this.conflicts
= config
.conflicts
|| [];
41 this.included
= false;
42 this.conflicted
= false;
43 this.fullyCovered
= false;
46 this.cssClass
= config
.cssClass
;
47 this.highlightColor
= null;
48 this.highlightEnabled
= false;
53 OO
.initClass( mw
.rcfilters
.dm
.FilterItem
);
54 OO
.mixinClass( mw
.rcfilters
.dm
.FilterItem
, OO
.EventEmitter
);
61 * The state of this filter has changed
67 * Get the name of this filter
69 * @return {string} Filter name
71 mw
.rcfilters
.dm
.FilterItem
.prototype.getName = function () {
76 * Get the model of the group this filter belongs to
78 * @return {mw.rcfilters.dm.FilterGroup} Filter group model
80 mw
.rcfilters
.dm
.FilterItem
.prototype.getGroupModel = function () {
81 return this.groupModel
;
85 * Get the group name this filter belongs to
87 * @return {string} Filter group name
89 mw
.rcfilters
.dm
.FilterItem
.prototype.getGroupName = function () {
90 return this.groupModel
.getName();
94 * Get the label of this filter
96 * @return {string} Filter label
98 mw
.rcfilters
.dm
.FilterItem
.prototype.getLabel = function () {
103 * Get the description of this filter
105 * @return {string} Filter description
107 mw
.rcfilters
.dm
.FilterItem
.prototype.getDescription = function () {
108 return this.description
;
112 * Get the default value of this filter
114 * @return {boolean} Filter default
116 mw
.rcfilters
.dm
.FilterItem
.prototype.getDefault = function () {
122 * This is a list of filter names that are defined to be included
123 * when this filter is selected.
125 * @return {string[]} Filter subset
127 mw
.rcfilters
.dm
.FilterItem
.prototype.getSubset = function () {
132 * Get filter superset
133 * This is a generated list of filters that define this filter
134 * to be included when either of them is selected.
136 * @return {string[]} Filter superset
138 mw
.rcfilters
.dm
.FilterItem
.prototype.getSuperset = function () {
139 return this.superset
;
143 * Get the selected state of this filter
145 * @return {boolean} Filter is selected
147 mw
.rcfilters
.dm
.FilterItem
.prototype.isSelected = function () {
148 return this.selected
;
152 * Check whether the filter is currently in a conflict state
154 * @return {boolean} Filter is in conflict state
156 mw
.rcfilters
.dm
.FilterItem
.prototype.isConflicted = function () {
157 return this.conflicted
;
161 * Check whether the filter is currently in an already included subset
163 * @return {boolean} Filter is in an already-included subset
165 mw
.rcfilters
.dm
.FilterItem
.prototype.isIncluded = function () {
166 return this.included
;
170 * Check whether the filter is currently fully covered
172 * @return {boolean} Filter is in fully-covered state
174 mw
.rcfilters
.dm
.FilterItem
.prototype.isFullyCovered = function () {
175 return this.fullyCovered
;
179 * Get filter conflicts
181 * @return {string[]} Filter conflicts
183 mw
.rcfilters
.dm
.FilterItem
.prototype.getConflicts = function () {
184 return this.conflicts
;
188 * Set filter conflicts
190 * @param {string[]} conflicts Filter conflicts
192 mw
.rcfilters
.dm
.FilterItem
.prototype.setConflicts = function ( conflicts
) {
193 this.conflicts
= conflicts
|| [];
197 * Set filter superset
199 * @param {string[]} superset Filter superset
201 mw
.rcfilters
.dm
.FilterItem
.prototype.setSuperset = function ( superset
) {
202 this.superset
= superset
|| [];
206 * Check whether a filter exists in the subset list for this filter
208 * @param {string} filterName Filter name
209 * @return {boolean} Filter name is in the subset list
211 mw
.rcfilters
.dm
.FilterItem
.prototype.existsInSubset = function ( filterName
) {
212 return this.subset
.indexOf( filterName
) > -1;
216 * Check whether this item has a potential conflict with the given item
218 * This checks whether the given item is in the list of conflicts of
219 * the current item, but makes no judgment about whether the conflict
220 * is currently at play (either one of the items may not be selected)
222 * @param {mw.rcfilters.dm.FilterItem} filterItem Filter item
223 * @return {boolean} This item has a conflict with the given item
225 mw
.rcfilters
.dm
.FilterItem
.prototype.existsInConflicts = function ( filterItem
) {
226 return this.conflicts
.indexOf( filterItem
.getName() ) > -1;
230 * Set the state of this filter as being conflicted
231 * (This means any filters in its conflicts are selected)
233 * @param {boolean} [conflicted] Filter is in conflict state
236 mw
.rcfilters
.dm
.FilterItem
.prototype.toggleConflicted = function ( conflicted
) {
237 conflicted
= conflicted
=== undefined ? !this.conflicted
: conflicted
;
239 if ( this.conflicted
!== conflicted
) {
240 this.conflicted
= conflicted
;
241 this.emit( 'update' );
246 * Set the state of this filter as being already included
247 * (This means any filters in its superset are selected)
249 * @param {boolean} [included] Filter is included as part of a subset
252 mw
.rcfilters
.dm
.FilterItem
.prototype.toggleIncluded = function ( included
) {
253 included
= included
=== undefined ? !this.included
: included
;
255 if ( this.included
!== included
) {
256 this.included
= included
;
257 this.emit( 'update' );
262 * Toggle the selected state of the item
264 * @param {boolean} [isSelected] Filter is selected
267 mw
.rcfilters
.dm
.FilterItem
.prototype.toggleSelected = function ( isSelected
) {
268 isSelected
= isSelected
=== undefined ? !this.selected
: isSelected
;
270 if ( this.selected
!== isSelected
) {
271 this.selected
= isSelected
;
272 this.emit( 'update' );
277 * Toggle the fully covered state of the item
279 * @param {boolean} [isFullyCovered] Filter is fully covered
282 mw
.rcfilters
.dm
.FilterItem
.prototype.toggleFullyCovered = function ( isFullyCovered
) {
283 isFullyCovered
= isFullyCovered
=== undefined ? !this.fullycovered
: isFullyCovered
;
285 if ( this.fullyCovered
!== isFullyCovered
) {
286 this.fullyCovered
= isFullyCovered
;
287 this.emit( 'update' );
292 * Set the highlight color
294 * @param {string|null} highlightColor
296 mw
.rcfilters
.dm
.FilterItem
.prototype.setHighlightColor = function ( highlightColor
) {
297 if ( this.highlightColor
!== highlightColor
) {
298 this.highlightColor
= highlightColor
;
299 this.emit( 'update' );
304 * Clear the highlight color
306 mw
.rcfilters
.dm
.FilterItem
.prototype.clearHighlightColor = function () {
307 this.setHighlightColor( null );
311 * Get the highlight color, or null if none is configured
313 * @return {string|null}
315 mw
.rcfilters
.dm
.FilterItem
.prototype.getHighlightColor = function () {
316 return this.highlightColor
;
320 * Get the CSS class that matches changes that fit this filter
321 * or null if none is configured
323 * @return {string|null}
325 mw
.rcfilters
.dm
.FilterItem
.prototype.getCssClass = function () {
326 return this.cssClass
;
330 * Toggle the highlight feature on and off for this filter.
331 * It only works if highlight is supported for this filter.
333 * @param {boolean} enable Highlight should be enabled
335 mw
.rcfilters
.dm
.FilterItem
.prototype.toggleHighlight = function ( enable
) {
336 enable
= enable
=== undefined ? !this.highlightEnabled
: enable
;
338 if ( !this.isHighlightSupported() ) {
342 if ( enable
=== this.highlightEnabled
) {
346 this.highlightEnabled
= enable
;
347 this.emit( 'update' );
351 * Check if the highlight feature is currently enabled for this filter
355 mw
.rcfilters
.dm
.FilterItem
.prototype.isHighlightEnabled = function () {
356 return !!this.highlightEnabled
;
360 * Check if the highlight feature is supported for this filter
364 mw
.rcfilters
.dm
.FilterItem
.prototype.isHighlightSupported = function () {
365 return !!this.getCssClass();