RCFilters: Actually be consistent when storing 'highlight' state
authorMoriel Schottlender <moriel@gmail.com>
Mon, 15 May 2017 19:10:07 +0000 (12:10 -0700)
committerCatrope <roan@wikimedia.org>
Mon, 15 May 2017 19:46:12 +0000 (19:46 +0000)
Saved queries are storing *filter* definitions, not parameters, so
highlight state (dictating whether highlights are enabled) are supposed
to be stored as boolean.

A previous fix that was meant to make sure we store and handle all
*parameters* as strings '0' and '1' was a bit overzealous, and stored
highlight state in saved queries as '1' and '0' too. The current state
then compared that to the filter-state, which produces false/true.

This resulting in saved queries only being matched to the current
state as never true, because the comparison goes by actual obejct
key-values, not symbolic values.

Bug: T165381
Change-Id: Ifdec3a8c058a0e004304e48a857c58639928b36f

resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js

index 04fb52b..b8f2db5 100644 (file)
                this.clearItems();
                $.each( savedQueries.queries || {}, function ( id, obj ) {
                        var normalizedData = $.extend( true, {}, baseState, obj.data );
+
+                       // Backwards-compat fix: We stored the 'highlight' state with
+                       // "1" and "0" instead of true/false; for already-stored states,
+                       // we need to fix that.
+                       // NOTE: Since this feature is only available in beta, we should
+                       // not need this line when we release this to the general wikis.
+                       // This method will automatically fix all saved queries anyways
+                       // for existing users, who are only betalabs users at the moment.
+                       normalizedData.highlights.highlight = !!Number( normalizedData.highlight );
+
                        items.push(
                                new mw.rcfilters.dm.SavedQueryItemModel(
                                        id,
index 4a9e780..e9274f5 100644 (file)
                        highlightedItems[ item.getName() ] = highlightEnabled ?
                                item.getHighlightColor() : null;
                } );
-               // Stored as a string '0' or '1'
-               highlightedItems.highlight = String( Number( this.filtersModel.isHighlightEnabled() ) );
+               // These are filter states; highlight is stored as boolean
+               highlightedItems.highlight = this.filtersModel.isHighlightEnabled();
 
                // Add item
                this.savedQueriesModel.addNewQuery(
                        this.filtersModel.toggleFiltersSelected( data.filters );
 
                        // Update highlight state
-                       this.filtersModel.toggleHighlight( !!highlights.highlight );
+                       this.filtersModel.toggleHighlight( !!Number( highlights.highlight ) );
                        this.filtersModel.getItems().forEach( function ( filterItem ) {
                                var color = highlights[ filterItem.getName() ];
                                if ( color ) {
                );
 
                // Update highlight state
-               this.filtersModel.toggleHighlight( !!parameters.highlight );
+               this.filtersModel.toggleHighlight( !!Number( parameters.highlight ) );
                this.filtersModel.getItems().forEach( function ( filterItem ) {
                        var color = parameters[ filterItem.getName() + '_color' ];
                        if ( color ) {
                        savedParams = this.filtersModel.getParametersFromFilters( data.filters || {} );
 
                        // Translate highlights to parameters
-                       savedHighlights.highlight = queryHighlights.highlight;
+                       savedHighlights.highlight = String( Number( queryHighlights.highlight ) );
                        $.each( queryHighlights, function ( filterName, color ) {
                                if ( filterName !== 'highlights' ) {
                                        savedHighlights[ filterName + '_color' ] = color;