RCFilters: Only normalize title with 'target' when it is needed
[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 $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 filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
19 changesListModel = new mw.rcfilters.dm.ChangesListViewModel( $initialFieldset ),
20 savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel( filtersModel ),
21 specialPage = mw.config.get( 'wgCanonicalSpecialPageName' ),
22 controller = new mw.rcfilters.Controller(
23 filtersModel, changesListModel, savedQueriesModel,
24 {
25 savedQueriesPreferenceName: savedQueriesPreferenceName,
26 daysPreferenceName: daysPreferenceName,
27 limitPreferenceName: limitPreferenceName,
28 normalizeTarget: specialPage === 'Recentchangeslinked'
29 }
30 );
31
32 // TODO: The changesListWrapperWidget should be able to initialize
33 // after the model is ready.
34
35 if ( specialPage === 'Recentchanges' ) {
36 $topSection = $( '.mw-recentchanges-toplinks' ).detach();
37 } else if ( specialPage === 'Watchlist' ) {
38 $( '#contentSub, form#mw-watchlist-resetbutton' ).remove();
39 $topSection = $( '.watchlistDetails' ).detach().contents();
40 } else if ( specialPage === 'Recentchangeslinked' ) {
41 conditionalViews.recentChangesLinked = {
42 groups: [
43 {
44 name: 'page',
45 type: 'any_value',
46 title: '',
47 hidden: true,
48 sticky: true,
49 filters: [
50 {
51 name: 'target',
52 'default': ''
53 }
54 ]
55 },
56 {
57 name: 'toOrFrom',
58 type: 'boolean',
59 title: '',
60 hidden: true,
61 sticky: true,
62 filters: [
63 {
64 name: 'showlinkedto',
65 'default': false
66 }
67 ]
68 }
69 ]
70 };
71 }
72
73 mainWrapperWidget = new mw.rcfilters.ui.MainWrapperWidget(
74 controller,
75 filtersModel,
76 savedQueriesModel,
77 changesListModel,
78 {
79 $topSection: $topSection,
80 $filtersContainer: $( '.rcfilters-container' ),
81 $changesListContainer: $( [
82 '.mw-changeslist',
83 '.mw-changeslist-empty',
84 '.mw-changeslist-timeout',
85 '.mw-changeslist-notargetpage'
86 ].join( ', ' ) ),
87 $formContainer: $initialFieldset
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 $( 'a.mw-helplink' ).attr(
105 'href',
106 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review'
107 );
108
109 controller.replaceUrl();
110
111 mainWrapperWidget.setTopSection( specialPage );
112
113 /**
114 * Fired when initialization of the filtering interface for changes list is complete.
115 *
116 * @event structuredChangeFilters_ui_initialized
117 * @member mw.hook
118 */
119 mw.hook( 'structuredChangeFilters.ui.initialized' ).fire();
120 },
121
122 /**
123 * Get list of namespaces and remove unused ones
124 *
125 * @member mw.rcfilters
126 * @private
127 *
128 * @param {Array} unusedNamespaces Names of namespaces to remove
129 * @return {Array} Filtered array of namespaces
130 */
131 getNamespaces: function ( unusedNamespaces ) {
132 var i, length, name, id,
133 namespaceIds = mw.config.get( 'wgNamespaceIds' ),
134 namespaces = mw.config.get( 'wgFormattedNamespaces' );
135
136 for ( i = 0, length = unusedNamespaces.length; i < length; i++ ) {
137 name = unusedNamespaces[ i ];
138 id = namespaceIds[ name.toLowerCase() ];
139 delete namespaces[ id ];
140 }
141
142 return namespaces;
143 }
144 };
145
146 // Early execute of init
147 if ( document.readyState === 'interactive' || document.readyState === 'complete' ) {
148 rcfilters.init();
149 } else {
150 $( rcfilters.init );
151 }
152
153 module.exports = rcfilters;
154
155 }( mediaWiki, jQuery ) );