3 * Controller for the filters in Recent Changes
5 * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model
6 * @param {mw.rcfilters.dm.ChangesListViewModel} changesListModel Changes list view model
8 mw
.rcfilters
.Controller
= function MwRcfiltersController( filtersModel
, changesListModel
) {
9 this.filtersModel
= filtersModel
;
10 this.changesListModel
= changesListModel
;
11 this.requestCounter
= 0;
15 OO
.initClass( mw
.rcfilters
.Controller
);
18 * Initialize the filter and parameter states
20 * @param {Object} filterStructure Filter definition and structure for the model
22 mw
.rcfilters
.Controller
.prototype.initialize = function ( filterStructure
) {
23 var uri
= new mw
.Uri();
25 // Initialize the model
26 this.filtersModel
.initializeFilters( filterStructure
);
28 // Set filter states based on defaults and URL params
29 this.filtersModel
.updateFilters(
30 this.filtersModel
.getFiltersFromParameters(
31 // Merge defaults with URL params for initialization
35 this.filtersModel
.getDefaultParams(),
36 // URI query overrides defaults
42 // Check all filter interactions
43 this.filtersModel
.reassessFilterInteractions();
47 * Reset to default filters
49 mw
.rcfilters
.Controller
.prototype.resetToDefaults = function () {
50 this.filtersModel
.setFiltersToDefaults();
52 this.updateChangesList();
56 * Empty all selected filters
58 mw
.rcfilters
.Controller
.prototype.emptyFilters = function () {
59 this.filtersModel
.emptyAllFilters();
61 this.updateChangesList();
65 * Update the state of a filter
67 * @param {string} filterName Filter name
68 * @param {boolean} isSelected Filter selected state
70 mw
.rcfilters
.Controller
.prototype.updateFilter = function ( filterName
, isSelected
) {
73 obj
[ filterName
] = isSelected
;
75 this.filtersModel
.updateFilters( obj
);
77 this.updateChangesList();
79 // Check filter interactions
80 this.filtersModel
.reassessFilterInteractions( this.filtersModel
.getItemByName( filterName
) );
84 * Update the URL of the page to reflect current filters
86 mw
.rcfilters
.Controller
.prototype.updateURL = function () {
87 var uri
= new mw
.Uri();
89 // Add to existing queries in URL
90 // TODO: Clean up the list of filters; perhaps 'falsy' filters
91 // shouldn't appear at all? Or compare to existing query string
92 // and see if current state of a specific filter is needed?
93 uri
.extend( this.filtersModel
.getParametersFromFilters() );
95 // Update the URL itself
96 window
.history
.pushState( { tag
: 'rcfilters' }, document
.title
, uri
.toString() );
100 * Fetch the list of changes from the server for the current filters
102 * @returns {jQuery.Promise} Promise object that will resolve with the changes list
104 mw
.rcfilters
.Controller
.prototype.fetchChangesList = function () {
105 var uri
= new mw
.Uri(),
106 requestId
= ++this.requestCounter
,
107 latestRequest = function () {
108 return requestId
=== this.requestCounter
;
110 uri
.extend( this.filtersModel
.getParametersFromFilters() );
111 return $.ajax( uri
.toString(), { contentType
: 'html' } )
112 .then( function ( html
) {
113 return latestRequest() ?
114 $( $.parseHTML( html
) ).find( '.mw-changeslist' ).first().contents() :
116 } ).then( null, function () {
117 return latestRequest() ? 'NO_RESULTS' : null;
122 * Update the list of changes and notify the model
124 mw
.rcfilters
.Controller
.prototype.updateChangesList = function () {
125 this.changesListModel
.invalidate();
126 this.fetchChangesList()
127 .always( function ( changesListContent
) {
128 if ( changesListContent
) {
129 this.changesListModel
.update( changesListContent
);
133 }( mediaWiki
, jQuery
) );