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