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