Merge "Align "What's this" vertically"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / mw.rcfilters.Controller.js
index 0085bd6..81bfb47 100644 (file)
@@ -8,11 +8,15 @@
         * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model
         * @param {mw.rcfilters.dm.ChangesListViewModel} changesListModel Changes list view model
         * @param {mw.rcfilters.dm.SavedQueriesModel} savedQueriesModel Saved queries model
+        * @param {Object} config Additional configuration
+        * @cfg {string} savedQueriesPreferenceName Where to save the saved queries
         */
-       mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel ) {
+       mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel, config ) {
                this.filtersModel = filtersModel;
                this.changesListModel = changesListModel;
                this.savedQueriesModel = savedQueriesModel;
+               this.savedQueriesPreferenceName = config.savedQueriesPreferenceName;
+
                this.requestCounter = {};
                this.baseFilterState = {};
                this.uriProcessor = null;
@@ -36,7 +40,7 @@
         * @param {Object} [tagList] Tag definition
         */
        mw.rcfilters.Controller.prototype.initialize = function ( filterStructure, namespaceStructure, tagList ) {
-               var parsedSavedQueries, limitDefault,
+               var parsedSavedQueries,
                        displayConfig = mw.config.get( 'StructuredChangeFiltersDisplayConfig' ),
                        controller = this,
                        views = {},
                        };
                }
 
-               // Convert the default from the old preference
-               // since the limit preference actually affects more
-               // than just the RecentChanges page
-               limitDefault = Number( mw.user.options.get( 'rclimit', '50' ) );
-
                // Add parameter range operations
                views.range = {
                        groups: [
                                                max: 1000
                                        },
                                        sortFunc: function ( a, b ) { return Number( a.name ) - Number( b.name ); },
-                                       'default': String( limitDefault ),
+                                       'default': displayConfig.limitDefault,
                                        // Temporarily making this not sticky until we resolve the problem
                                        // with the misleading preference. Note that if this is to be permanent
                                        // we should remove all sticky behavior methods completely
                                                        ( Number( i ) * 24 ).toFixed( 2 ) :
                                                        Number( i );
                                        },
-                                       'default': mw.user.options.get( 'rcdays', '30' ),
+                                       'default': displayConfig.daysDefault,
                                        // Temporarily making this not sticky while limit is not sticky, see above
                                        // isSticky: true,
                                        excludedFromSavedQueries: true,
                        this.filtersModel
                );
 
-               try {
-                       parsedSavedQueries = JSON.parse( mw.user.options.get( 'rcfilters-saved-queries' ) || '{}' );
-               } catch ( err ) {
-                       parsedSavedQueries = {};
-               }
+               if ( !mw.user.isAnon() ) {
+                       try {
+                               parsedSavedQueries = JSON.parse( mw.user.options.get( this.savedQueriesPreferenceName ) || '{}' );
+                       } catch ( err ) {
+                               parsedSavedQueries = {};
+                       }
 
-               // The queries are saved in a minimized state, so we need
-               // to send over the base state so the saved queries model
-               // can normalize them per each query item
-               this.savedQueriesModel.initialize(
-                       parsedSavedQueries,
-                       this._getBaseFilterState(),
-                       // This is for backwards compatibility - delete all excluded filter states
-                       Object.keys( this.filtersModel.getExcludedFiltersState() )
-               );
+                       // The queries are saved in a minimized state, so we need
+                       // to send over the base state so the saved queries model
+                       // can normalize them per each query item
+                       this.savedQueriesModel.initialize(
+                               parsedSavedQueries,
+                               this._getBaseFilterState(),
+                               // This is for backwards compatibility - delete all excluded filter states
+                               Object.keys( this.filtersModel.getExcludedFiltersState() )
+                       );
+               }
 
                // Check whether we need to load defaults.
                // We do this by checking whether the current URI query
                // or on request
                this.initializing = true;
                if (
-                       this.savedQueriesModel.getDefault() &&
+                       !mw.user.isAnon() && this.savedQueriesModel.getDefault() &&
                        !this.uriProcessor.doesQueryContainRecognizedParams( uri.query )
                ) {
                        // We have defaults from a saved query.
                        // so it gets processed
                        this.changesListModel.update(
                                $changesList.length ? $changesList : 'NO_RESULTS',
-                               $( 'fieldset.rcoptions' ).first(),
+                               $( 'fieldset.cloptions' ).first(),
                                true // We're using existing DOM elements
                        );
                }
                this.filtersModel.toggleInvertedNamespaces();
 
                if (
-                       this.filtersModel.getFiltersByView( 'namespaces' )
-                               .filter( function ( filterItem ) {
-                                       return filterItem.isSelected();
-                               } )
-                               .length
+                       this.filtersModel.getFiltersByView( 'namespaces' ).filter(
+                               function ( filterItem ) { return filterItem.isSelected(); }
+                       ).length
                ) {
                        // Only re-fetch results if there are namespace items that are actually selected
                        this.updateChangesList();
                        !this.filtersModel.hasConflict() &&
                        !this.changesListModel.getNewChangesExist() &&
                        !this.updatingChangesList &&
-                       mw.rcfilters.featureFlags.liveUpdate;
+                       this.changesListModel.getNextFrom();
        };
 
        /**
                }
 
                // Save the preference
-               new mw.Api().saveOption( 'rcfilters-saved-queries', stringified );
+               new mw.Api().saveOption( this.savedQueriesPreferenceName, stringified );
                // Update the preference for this session
-               mw.user.options.set( 'rcfilters-saved-queries', stringified );
+               mw.user.options.set( this.savedQueriesPreferenceName, stringified );
        };
 
        /**
         * Update the list of changes and notify the model
         *
         * @param {Object} [params] Extra parameters to add to the API call
-        * @param {string} [updateMode='filterChange'] One of 'filterChange', 'liveUpdate', 'showNewChanges'
+        * @param {string} [updateMode='filterChange'] One of 'filterChange', 'liveUpdate', 'showNewChanges', 'markSeen'
         * @return {jQuery.Promise} Promise that is resolved when the update is complete
         */
        mw.rcfilters.Controller.prototype.updateChangesList = function ( params, updateMode ) {
                var data, queryHighlights,
                        savedParams = {},
                        savedHighlights = {},
-                       defaultSavedQueryItem = this.savedQueriesModel.getItemByID( this.savedQueriesModel.getDefault() );
+                       defaultSavedQueryItem = !mw.user.isAnon() && this.savedQueriesModel.getItemByID( this.savedQueriesModel.getDefault() );
 
                if ( defaultSavedQueryItem ) {
                        data = defaultSavedQueryItem.getData();
                                }
                        } );
 
-                       return $.extend( true, {}, savedParams, savedHighlights );
+                       return $.extend( true, {}, savedParams, savedHighlights, { invert: String( Number( data.invert || 0 ) ) } );
                }
 
                return this.filtersModel.getDefaultParams();
 
                return $.ajax( uri.toString(), { contentType: 'html' } )
                        .then(
-                               // Success
                                function ( html ) {
-                                       var $parsed;
+                                       var $parsed,
+                                               pieces;
+
                                        if ( !latestRequest() ) {
                                                return $.Deferred().reject();
                                        }
 
                                        $parsed = $( $.parseHTML( html ) );
 
-                                       return {
+                                       pieces = {
                                                // Changes list
                                                changes: $parsed.find( '.mw-changeslist' ).first().contents(),
                                                // Fieldset
-                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                               fieldset: $parsed.find( 'fieldset.cloptions' ).first()
                                        };
+
+                                       // Watchlist returns 200 when there is no results
+                                       if ( pieces.changes.length === 0 ) {
+                                               pieces.changes = 'NO_RESULTS';
+                                       }
+
+                                       return pieces;
                                },
-                               // Failure
+                               // RC returns 404 when there is no results
                                function ( responseObj ) {
                                        var $parsed;
 
                                        // Force a resolve state to this promise
                                        return $.Deferred().resolve( {
                                                changes: 'NO_RESULTS',
-                                               fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+                                               fieldset: $parsed.find( 'fieldset.cloptions' ).first()
                                        } ).promise();
                                }
                        );
                        this.prevLoggedItems = filters;
                }
        };
+
+       /**
+        * Mark all changes as seen on Watchlist
+        */
+       mw.rcfilters.Controller.prototype.markAllChangesAsSeen = function () {
+               var api = new mw.Api();
+               api.postWithToken( 'csrf', {
+                       formatversion: 2,
+                       action: 'setnotificationtimestamp',
+                       entirewatchlist: true
+               } ).then( function () {
+                       this.updateChangesList( null, 'markSeen' );
+               }.bind( this ) );
+       };
 }( mediaWiki, jQuery ) );