Merge "SpecialPages: Add ul { margin-top: 0; margin-bottom: 0 } for multicolumn"
[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 conditionalViews = {},
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 = $( [
39 '.mw-changeslist',
40 '.mw-changeslist-empty',
41 '.mw-changeslist-timeout',
42 '.mw-changeslist-notargetpage'
43 ].join( ', ' ) );
44
45 if ( specialPage === 'Recentchangeslinked' ) {
46 conditionalViews.recentChangesLinked = {
47 groups: [
48 {
49 name: 'page',
50 type: 'any_value',
51 title: '',
52 hidden: true,
53 isSticky: false,
54 filters: [
55 {
56 name: 'target',
57 'default': ''
58 }
59 ]
60 },
61 {
62 name: 'toOrFrom',
63 type: 'boolean',
64 title: '',
65 hidden: true,
66 isSticky: false,
67 filters: [
68 {
69 name: 'showlinkedto',
70 'default': false
71 }
72 ]
73 }
74 ]
75 };
76
77 }
78
79 // TODO: The changesListWrapperWidget should be able to initialize
80 // after the model is ready.
81
82 // eslint-disable-next-line no-new
83 new mw.rcfilters.ui.ChangesListWrapperWidget(
84 filtersModel, changesListModel, controller, $changesListRoot );
85
86 // Remove the -loading class that may have been added on the server side.
87 // If we are in fact going to load a default saved query, this .initialize()
88 // call will do that and add the -loading class right back.
89 $( 'body' ).removeClass( 'mw-rcfilters-ui-loading' );
90
91 // Remove Media namespace
92 namespaces = mw.config.get( 'wgFormattedNamespaces' );
93 delete namespaces[ mw.config.get( 'wgNamespaceIds' ).media ];
94
95 controller.initialize(
96 mw.config.get( 'wgStructuredChangeFilters' ),
97 namespaces,
98 mw.config.get( 'wgRCFiltersChangeTags' ),
99 conditionalViews
100 );
101
102 // eslint-disable-next-line no-new
103 new mw.rcfilters.ui.FormWrapperWidget(
104 filtersModel, changesListModel, controller, $( 'fieldset.cloptions' ) );
105
106 $( '.rcfilters-container' ).append( filtersWidget.$element );
107 $( 'body' )
108 .append( $overlay )
109 .addClass( 'mw-rcfilters-ui-initialized' );
110
111 $( 'a.mw-helplink' ).attr(
112 'href',
113 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review'
114 );
115
116 controller.replaceUrl();
117
118 if ( specialPage === 'Recentchanges' ) {
119 $topLinks = $( '.mw-recentchanges-toplinks' ).detach();
120
121 topSection = new mw.rcfilters.ui.RcTopSectionWidget(
122 savedLinksListWidget, $topLinks
123 );
124 filtersWidget.setTopSection( topSection.$element );
125 } // end Recentchanges
126
127 if ( specialPage === 'Recentchangeslinked' ) {
128 topSection = new mw.rcfilters.ui.RclTopSectionWidget(
129 savedLinksListWidget, controller,
130 filtersModel.getGroup( 'toOrFrom' ).getItemByParamName( 'showlinkedto' ),
131 filtersModel.getGroup( 'page' ).getItemByParamName( 'target' )
132 );
133 filtersWidget.setTopSection( topSection.$element );
134 } // end Recentchangeslinked
135
136 if ( specialPage === 'Watchlist' ) {
137 $( '#contentSub, form#mw-watchlist-resetbutton' ).detach();
138 $watchlistDetails = $( '.watchlistDetails' ).detach().contents();
139
140 topSection = new mw.rcfilters.ui.WatchlistTopSectionWidget(
141 controller, changesListModel, savedLinksListWidget, $watchlistDetails
142 );
143 filtersWidget.setTopSection( topSection.$element );
144 } // end Watchlist
145
146 /**
147 * Fired when initialization of the filtering interface for changes list is complete.
148 *
149 * @event structuredChangeFilters_ui_initialized
150 * @member mw.hook
151 */
152 mw.hook( 'structuredChangeFilters.ui.initialized' ).fire();
153 }
154 };
155
156 // Early execute of init
157 if ( document.readyState === 'interactive' || document.readyState === 'complete' ) {
158 rcfilters.init();
159 } else {
160 $( rcfilters.init );
161 }
162
163 module.exports = rcfilters;
164
165 }( mediaWiki, jQuery ) );