Merge "selenium: invoke jobs to enforce eventual consistency"
[lhc/web/wiklou.git] / resources / src / mediawiki.rcfilters / mw.rcfilters.init.js
1 /*!
2 * JavaScript for Special:RecentChanges
3 */
4 ( function () {
5 var rcfilters = {
6 /**
7 * @member mw.rcfilters
8 * @private
9 */
10 init: function () {
11 var $topSection,
12 mainWrapperWidget,
13 conditionalViews = {},
14 $initialFieldset = $( 'fieldset.cloptions' ),
15 savedQueriesPreferenceName = mw.config.get( 'wgStructuredChangeFiltersSavedQueriesPreferenceName' ),
16 daysPreferenceName = mw.config.get( 'wgStructuredChangeFiltersDaysPreferenceName' ),
17 limitPreferenceName = mw.config.get( 'wgStructuredChangeFiltersLimitPreferenceName' ),
18 activeFiltersCollapsedName = mw.config.get( 'wgStructuredChangeFiltersCollapsedPreferenceName' ),
19 initialCollapsedState = mw.config.get( 'wgStructuredChangeFiltersCollapsedState' ),
20 filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
21 changesListModel = new mw.rcfilters.dm.ChangesListViewModel( $initialFieldset ),
22 savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel( filtersModel ),
23 specialPage = mw.config.get( 'wgCanonicalSpecialPageName' ),
24 controller = new mw.rcfilters.Controller(
25 filtersModel, changesListModel, savedQueriesModel,
26 {
27 savedQueriesPreferenceName: savedQueriesPreferenceName,
28 daysPreferenceName: daysPreferenceName,
29 limitPreferenceName: limitPreferenceName,
30 collapsedPreferenceName: activeFiltersCollapsedName,
31 normalizeTarget: specialPage === 'Recentchangeslinked'
32 }
33 );
34
35 // TODO: The changesListWrapperWidget should be able to initialize
36 // after the model is ready.
37
38 if ( specialPage === 'Recentchanges' ) {
39 $topSection = $( '.mw-recentchanges-toplinks' ).detach();
40 } else if ( specialPage === 'Watchlist' ) {
41 $( '#contentSub, form#mw-watchlist-resetbutton' ).remove();
42 $topSection = $( '.watchlistDetails' ).detach().contents();
43 } else if ( specialPage === 'Recentchangeslinked' ) {
44 conditionalViews.recentChangesLinked = {
45 groups: [
46 {
47 name: 'page',
48 type: 'any_value',
49 title: '',
50 hidden: true,
51 sticky: true,
52 filters: [
53 {
54 name: 'target',
55 'default': ''
56 }
57 ]
58 },
59 {
60 name: 'toOrFrom',
61 type: 'boolean',
62 title: '',
63 hidden: true,
64 sticky: true,
65 filters: [
66 {
67 name: 'showlinkedto',
68 'default': false
69 }
70 ]
71 }
72 ]
73 };
74 }
75
76 mainWrapperWidget = new mw.rcfilters.ui.MainWrapperWidget(
77 controller,
78 filtersModel,
79 savedQueriesModel,
80 changesListModel,
81 {
82 $wrapper: $( 'body' ),
83 $topSection: $topSection,
84 $filtersContainer: $( '.rcfilters-container' ),
85 $changesListContainer: $( '.mw-changeslist, .mw-changeslist-empty' ),
86 $formContainer: $initialFieldset,
87 collapsed: initialCollapsedState
88 }
89 );
90
91 // Remove the -loading class that may have been added on the server side.
92 // If we are in fact going to load a default saved query, this .initialize()
93 // call will do that and add the -loading class right back.
94 $( 'body' ).removeClass( 'mw-rcfilters-ui-loading' );
95
96 controller.initialize(
97 mw.config.get( 'wgStructuredChangeFilters' ),
98 // All namespaces without Media namespace
99 rcfilters.getNamespaces( [ 'Media' ] ),
100 mw.config.get( 'wgRCFiltersChangeTags' ),
101 conditionalViews
102 );
103
104 mainWrapperWidget.initFormWidget( specialPage );
105
106 $( 'a.mw-helplink' ).attr(
107 'href',
108 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review'
109 );
110
111 controller.replaceUrl();
112
113 mainWrapperWidget.setTopSection( specialPage );
114
115 /**
116 * Fired when initialization of the filtering interface for changes list is complete.
117 *
118 * @event structuredChangeFilters_ui_initialized
119 * @member mw.hook
120 */
121 mw.hook( 'structuredChangeFilters.ui.initialized' ).fire();
122 },
123
124 /**
125 * Get list of namespaces and remove unused ones
126 *
127 * @member mw.rcfilters
128 * @private
129 *
130 * @param {Array} unusedNamespaces Names of namespaces to remove
131 * @return {Array} Filtered array of namespaces
132 */
133 getNamespaces: function ( unusedNamespaces ) {
134 var i, length, name, id,
135 namespaceIds = mw.config.get( 'wgNamespaceIds' ),
136 namespaces = mw.config.get( 'wgFormattedNamespaces' );
137
138 for ( i = 0, length = unusedNamespaces.length; i < length; i++ ) {
139 name = unusedNamespaces[ i ];
140 id = namespaceIds[ name.toLowerCase() ];
141 delete namespaces[ id ];
142 }
143
144 return namespaces;
145 }
146 };
147
148 // Import i18n messages from config
149 mw.messages.set( mw.config.get( 'wgStructuredChangeFiltersMessages' ) );
150
151 // Early execute of init
152 if ( document.readyState === 'interactive' || document.readyState === 'complete' ) {
153 rcfilters.init();
154 } else {
155 $( rcfilters.init );
156 }
157
158 module.exports = rcfilters;
159
160 }() );