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