Merge "RCFilters: Only normalize title with 'target' when it is needed"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / mw.rcfilters.init.js
index 6ec1200..1f72484 100644 (file)
                 * @private
                 */
                init: function () {
-                       var $topLinks,
-                               topSection,
-                               $watchlistDetails,
-                               namespaces,
+                       var $topSection,
+                               mainWrapperWidget,
+                               conditionalViews = {},
+                               $initialFieldset = $( 'fieldset.cloptions' ),
                                savedQueriesPreferenceName = mw.config.get( 'wgStructuredChangeFiltersSavedQueriesPreferenceName' ),
                                daysPreferenceName = mw.config.get( 'wgStructuredChangeFiltersDaysPreferenceName' ),
                                limitPreferenceName = mw.config.get( 'wgStructuredChangeFiltersLimitPreferenceName' ),
                                filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
-                               changesListModel = new mw.rcfilters.dm.ChangesListViewModel(),
+                               changesListModel = new mw.rcfilters.dm.ChangesListViewModel( $initialFieldset ),
                                savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel( filtersModel ),
+                               specialPage = mw.config.get( 'wgCanonicalSpecialPageName' ),
                                controller = new mw.rcfilters.Controller(
                                        filtersModel, changesListModel, savedQueriesModel,
                                        {
                                                savedQueriesPreferenceName: savedQueriesPreferenceName,
                                                daysPreferenceName: daysPreferenceName,
-                                               limitPreferenceName: limitPreferenceName
+                                               limitPreferenceName: limitPreferenceName,
+                                               normalizeTarget: specialPage === 'Recentchangeslinked'
                                        }
-                               ),
-                               $overlay = $( '<div>' )
-                                       .addClass( 'mw-rcfilters-ui-overlay' ),
-                               filtersWidget = new mw.rcfilters.ui.FilterWrapperWidget(
-                                       controller, filtersModel, savedQueriesModel, changesListModel, { $overlay: $overlay } ),
-                               savedLinksListWidget = new mw.rcfilters.ui.SavedLinksListWidget(
-                                       controller, savedQueriesModel, { $overlay: $overlay }
-                               ),
-                               specialPage = mw.config.get( 'wgCanonicalSpecialPageName' ),
-                               $changesListRoot = $( '.mw-changeslist, .mw-changeslist-empty, .mw-changeslist-timeout' );
+                               );
 
                        // TODO: The changesListWrapperWidget should be able to initialize
                        // after the model is ready.
 
-                       // eslint-disable-next-line no-new
-                       new mw.rcfilters.ui.ChangesListWrapperWidget(
-                               filtersModel, changesListModel, controller, $changesListRoot );
+                       if ( specialPage === 'Recentchanges' ) {
+                               $topSection = $( '.mw-recentchanges-toplinks' ).detach();
+                       } else if ( specialPage === 'Watchlist' ) {
+                               $( '#contentSub, form#mw-watchlist-resetbutton' ).remove();
+                               $topSection = $( '.watchlistDetails' ).detach().contents();
+                       } else if ( specialPage === 'Recentchangeslinked' ) {
+                               conditionalViews.recentChangesLinked = {
+                                       groups: [
+                                               {
+                                                       name: 'page',
+                                                       type: 'any_value',
+                                                       title: '',
+                                                       hidden: true,
+                                                       sticky: true,
+                                                       filters: [
+                                                               {
+                                                                       name: 'target',
+                                                                       'default': ''
+                                                               }
+                                                       ]
+                                               },
+                                               {
+                                                       name: 'toOrFrom',
+                                                       type: 'boolean',
+                                                       title: '',
+                                                       hidden: true,
+                                                       sticky: true,
+                                                       filters: [
+                                                               {
+                                                                       name: 'showlinkedto',
+                                                                       'default': false
+                                                               }
+                                                       ]
+                                               }
+                                       ]
+                               };
+                       }
+
+                       mainWrapperWidget = new mw.rcfilters.ui.MainWrapperWidget(
+                               controller,
+                               filtersModel,
+                               savedQueriesModel,
+                               changesListModel,
+                               {
+                                       $topSection: $topSection,
+                                       $filtersContainer: $( '.rcfilters-container' ),
+                                       $changesListContainer: $( [
+                                               '.mw-changeslist',
+                                               '.mw-changeslist-empty',
+                                               '.mw-changeslist-timeout',
+                                               '.mw-changeslist-notargetpage'
+                                       ].join( ', ' ) ),
+                                       $formContainer: $initialFieldset
+                               }
+                       );
 
                        // Remove the -loading class that may have been added on the server side.
                        // If we are in fact going to load a default saved query, this .initialize()
                        // call will do that and add the -loading class right back.
                        $( 'body' ).removeClass( 'mw-rcfilters-ui-loading' );
 
-                       // Remove Media namespace
-                       namespaces = mw.config.get( 'wgFormattedNamespaces' );
-                       delete namespaces[ mw.config.get( 'wgNamespaceIds' ).media ];
-
                        controller.initialize(
                                mw.config.get( 'wgStructuredChangeFilters' ),
-                               namespaces,
-                               mw.config.get( 'wgRCFiltersChangeTags' )
+                               // All namespaces without Media namespace
+                               rcfilters.getNamespaces( [ 'Media' ] ),
+                               mw.config.get( 'wgRCFiltersChangeTags' ),
+                               conditionalViews
                        );
 
-                       // eslint-disable-next-line no-new
-                       new mw.rcfilters.ui.FormWrapperWidget(
-                               filtersModel, changesListModel, controller, $( 'fieldset.cloptions' ) );
-
-                       $( '.rcfilters-container' ).append( filtersWidget.$element );
-                       $( 'body' )
-                               .append( $overlay )
-                               .addClass( 'mw-rcfilters-ui-initialized' );
+                       mainWrapperWidget.initFormWidget( specialPage );
 
                        $( 'a.mw-helplink' ).attr(
                                'href',
 
                        controller.replaceUrl();
 
-                       if ( specialPage === 'Recentchanges' ) {
-                               $topLinks = $( '.mw-recentchanges-toplinks' ).detach();
-
-                               topSection = new mw.rcfilters.ui.RcTopSectionWidget(
-                                       savedLinksListWidget, $topLinks
-                               );
-                               filtersWidget.setTopSection( topSection.$element );
-                       } // end Recentchanges
-
-                       if ( specialPage === 'Recentchangeslinked' ) {
-                               topSection = new mw.rcfilters.ui.RclTopSectionWidget(
-                                       savedLinksListWidget, controller,
-                                       filtersModel.getGroup( 'toOrFrom' ).getItemByParamName( 'showlinkedto' ),
-                                       filtersModel.getGroup( 'page' ).getItemByParamName( 'target' )
-                               );
-                               filtersWidget.setTopSection( topSection.$element );
-                       } // end Recentchangeslinked
-
-                       if ( specialPage === 'Watchlist' ) {
-                               $( '#contentSub, form#mw-watchlist-resetbutton' ).detach();
-                               $watchlistDetails = $( '.watchlistDetails' ).detach().contents();
-
-                               topSection = new mw.rcfilters.ui.WatchlistTopSectionWidget(
-                                       controller, changesListModel, savedLinksListWidget, $watchlistDetails
-                               );
-                               filtersWidget.setTopSection( topSection.$element );
-                       } // end Watchlist
+                       mainWrapperWidget.setTopSection( specialPage );
 
                        /**
                         * Fired when initialization of the filtering interface for changes list is complete.
                         * @member mw.hook
                         */
                        mw.hook( 'structuredChangeFilters.ui.initialized' ).fire();
+               },
+
+               /**
+                * Get list of namespaces and remove unused ones
+                *
+                * @member mw.rcfilters
+                * @private
+                *
+                * @param {Array} unusedNamespaces Names of namespaces to remove
+                * @return {Array} Filtered array of namespaces
+                */
+               getNamespaces: function ( unusedNamespaces ) {
+                       var i, length, name, id,
+                               namespaceIds = mw.config.get( 'wgNamespaceIds' ),
+                               namespaces = mw.config.get( 'wgFormattedNamespaces' );
+
+                       for ( i = 0, length = unusedNamespaces.length; i < length; i++ ) {
+                               name = unusedNamespaces[ i ];
+                               id = namespaceIds[ name.toLowerCase() ];
+                               delete namespaces[ id ];
+                       }
+
+                       return namespaces;
                }
        };