RCFilters: Allow empty saved query
authorMoriel Schottlender <moriel@gmail.com>
Thu, 14 Sep 2017 00:13:26 +0000 (17:13 -0700)
committerMoriel Schottlender <moriel@gmail.com>
Fri, 15 Sep 2017 00:26:39 +0000 (17:26 -0700)
For this, we also need to check for saved query visibility on the
saved query model initialization, because since the model starts
its life all-empty, if the saved query is also all-empty, it will
not trigger any item updates on the main model.

Bonus: Actually check whether defaults are empty; there was a
typo and problem with the original test.

Bug: T172387
Change-Id: Ibc536b577e4c3abcc04fa229f9978b651b2f9e61

resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js

index 62ba002..1f9fd39 100644 (file)
        mw.rcfilters.dm.FiltersViewModel.prototype.areDefaultFiltersEmpty = function () {
                var defaultFilters;
 
-               if ( this.defaultFiltersEmpty !== null ) {
+               if ( this.defaultFiltersEmpty === null ) {
                        // We only need to do this test once,
                        // because defaults are set once per session
                        defaultFilters = this.getFiltersFromParameters( this.getDefaultParams() );
-                       this.defaultFiltersEmpty = Object.keys( defaultFilters ).every( function ( filterName ) {
+                       this.defaultFiltersEmpty = $.isEmptyObject( defaultFilters ) || Object.keys( defaultFilters ).every( function ( filterName ) {
                                return !defaultFilters[ filterName ];
                        } );
                }
index b15b034..76717e3 100644 (file)
                                click: 'onSaveQueryButtonClick',
                                saveCurrent: 'setSavedQueryVisibility'
                        } );
-                       this.queriesModel.connect( this, { itemUpdate: 'onSavedQueriesItemUpdate' } );
+                       this.queriesModel.connect( this, {
+                               itemUpdate: 'onSavedQueriesItemUpdate',
+                               initialize: 'onSavedQueriesInitialize'
+                       } );
                }
 
                this.emptyFilterMessage = new OO.ui.LabelWidget( {
                this.getMenu().toggle( false );
        };
 
+       /**
+        * Respond to save query model initialization
+        */
+       mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onSavedQueriesInitialize = function () {
+               this.setSavedQueryVisibility();
+       };
+
        /**
         * Respond to save query item change. Mainly this is done to update the label in case
         * a query item has been edited
                        this.matchingQuery ? this.matchingQuery.getLabel() : ''
                );
                this.savedQueryTitle.toggle( !!this.matchingQuery );
-               this.saveQueryButton.toggle(
-                       !this.isEmpty() &&
-                       !this.matchingQuery
-               );
+               this.saveQueryButton.toggle( !this.matchingQuery );
 
                if ( this.matchingQuery ) {
                        this.emphasize();
index 58e4d29..acbd0da 100644 (file)
                        } ),
                        'Default parameters are stored properly per filter and group'
                );
+
+               assert.ok(
+                       !model.areDefaultFiltersEmpty(),
+                       'Check if default filters are empty when defaults exist'
+               );
+
+               // Reset on special filter object that has no defaults
+               model = new mw.rcfilters.dm.FiltersViewModel();
+               model.initializeFilters(
+                       [ {
+                               name: 'group1',
+                               type: 'send_unselected_if_any',
+                               filters: [
+                                       { name: 'filter1', label: 'group1filter1-label', description: 'group1filter1-desc' },
+                                       { name: 'filter2', label: 'group1filter2-label', description: 'group1filter2-desc' },
+                                       { name: 'filter3', label: 'group1filter3-label', description: 'group1filter3-desc' }
+                               ]
+                       } ]
+               );
+
+               assert.ok(
+                       model.areDefaultFiltersEmpty(),
+                       'Check if default filters are empty when defaults do not exist'
+               );
        } );
 
        QUnit.test( 'Finding matching filters', function ( assert ) {