Merge "RCFilters: Make 'days' and 'limit' sticky"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / mw.rcfilters.init.js
1 /*!
2 * JavaScript for Special:RecentChanges
3 */
4 ( function ( mw, $ ) {
5 var rcfilters = {
6 /**
7 * @member mw.rcfilters
8 * @private
9 */
10 init: function () {
11 var $topLinks,
12 rcTopSection,
13 $watchlistDetails,
14 wlTopSection,
15 namespaces,
16 savedQueriesPreferenceName = mw.config.get( 'wgStructuredChangeFiltersSavedQueriesPreferenceName' ),
17 daysPreferenceName = mw.config.get( 'wgStructuredChangeFiltersDaysPreferenceName' ),
18 limitPreferenceName = mw.config.get( 'wgStructuredChangeFiltersLimitPreferenceName' ),
19 filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
20 changesListModel = new mw.rcfilters.dm.ChangesListViewModel(),
21 savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel( filtersModel ),
22 controller = new mw.rcfilters.Controller(
23 filtersModel, changesListModel, savedQueriesModel,
24 {
25 savedQueriesPreferenceName: savedQueriesPreferenceName,
26 daysPreferenceName: daysPreferenceName,
27 limitPreferenceName: limitPreferenceName
28 }
29 ),
30 $overlay = $( '<div>' )
31 .addClass( 'mw-rcfilters-ui-overlay' ),
32 filtersWidget = new mw.rcfilters.ui.FilterWrapperWidget(
33 controller, filtersModel, savedQueriesModel, changesListModel, { $overlay: $overlay } ),
34 savedLinksListWidget = new mw.rcfilters.ui.SavedLinksListWidget(
35 controller, savedQueriesModel, { $overlay: $overlay }
36 ),
37 specialPage = mw.config.get( 'wgCanonicalSpecialPageName' ),
38 $changesListRoot = $( '.mw-changeslist, .mw-changeslist-empty, .mw-changeslist-timeout' );
39
40 // TODO: The changesListWrapperWidget should be able to initialize
41 // after the model is ready.
42
43 // eslint-disable-next-line no-new
44 new mw.rcfilters.ui.ChangesListWrapperWidget(
45 filtersModel, changesListModel, controller, $changesListRoot );
46
47 // Remove the -loading class that may have been added on the server side.
48 // If we are in fact going to load a default saved query, this .initialize()
49 // call will do that and add the -loading class right back.
50 $( 'body' ).removeClass( 'mw-rcfilters-ui-loading' );
51
52 // Remove Media namespace
53 namespaces = mw.config.get( 'wgFormattedNamespaces' );
54 delete namespaces[ mw.config.get( 'wgNamespaceIds' ).media ];
55
56 controller.initialize(
57 mw.config.get( 'wgStructuredChangeFilters' ),
58 namespaces,
59 mw.config.get( 'wgRCFiltersChangeTags' )
60 );
61
62 // eslint-disable-next-line no-new
63 new mw.rcfilters.ui.FormWrapperWidget(
64 filtersModel, changesListModel, controller, $( 'fieldset.cloptions' ) );
65
66 $( '.rcfilters-container' ).append( filtersWidget.$element );
67 $( 'body' )
68 .append( $overlay )
69 .addClass( 'mw-rcfilters-ui-initialized' );
70
71 $( 'a.mw-helplink' ).attr(
72 'href',
73 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review'
74 );
75
76 controller.replaceUrl();
77
78 if ( specialPage === 'Recentchanges' ||
79 specialPage === 'Recentchangeslinked' ) {
80 $topLinks = $( '.mw-recentchanges-toplinks' ).detach();
81
82 rcTopSection = new mw.rcfilters.ui.RcTopSectionWidget(
83 savedLinksListWidget, $topLinks
84 );
85 filtersWidget.setTopSection( rcTopSection.$element );
86 } // end Special:RC
87
88 if ( specialPage === 'Watchlist' ) {
89 $( '#contentSub, form#mw-watchlist-resetbutton' ).detach();
90 $watchlistDetails = $( '.watchlistDetails' ).detach().contents();
91
92 wlTopSection = new mw.rcfilters.ui.WatchlistTopSectionWidget(
93 controller, changesListModel, savedLinksListWidget, $watchlistDetails
94 );
95 filtersWidget.setTopSection( wlTopSection.$element );
96 } // end Special:WL
97
98 /**
99 * Fired when initialization of the filtering interface for changes list is complete.
100 *
101 * @event structuredChangeFilters_ui_initialized
102 * @member mw.hook
103 */
104 mw.hook( 'structuredChangeFilters.ui.initialized' ).fire();
105 }
106 };
107
108 // Early execute of init
109 if ( document.readyState === 'interactive' || document.readyState === 'complete' ) {
110 rcfilters.init();
111 } else {
112 $( rcfilters.init );
113 }
114
115 module.exports = rcfilters;
116
117 }( mediaWiki, jQuery ) );