88f32b4d9d952d7ff1e11989e745e67aaad599db
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 mw
.rcfilters
.Controller
.prototype.initialize = function () {
25 * Update the model state based on the URL parameters.
27 mw
.rcfilters
.Controller
.prototype.updateFromURL = function () {
28 var uri
= new mw
.Uri();
30 this.filtersModel
.updateFilters(
31 // Translate the url params to filter select states
32 this.filtersModel
.getFiltersFromParameters( uri
.query
)
37 * Reset to default filters
39 mw
.rcfilters
.Controller
.prototype.resetToDefaults = function () {
40 this.filtersModel
.setFiltersToDefaults();
42 this.updateChangesList();
46 * Empty all selected filters
48 mw
.rcfilters
.Controller
.prototype.emptyFilters = function () {
49 this.filtersModel
.emptyAllFilters();
51 this.updateChangesList();
55 * Update the state of a filter
57 * @param {string} filterName Filter name
58 * @param {boolean} isSelected Filter selected state
60 mw
.rcfilters
.Controller
.prototype.updateFilter = function ( filterName
, isSelected
) {
63 obj
[ filterName
] = isSelected
;
64 this.filtersModel
.updateFilters( obj
);
66 this.updateChangesList();
70 * Update the URL of the page to reflect current filters
72 mw
.rcfilters
.Controller
.prototype.updateURL = function () {
73 var uri
= new mw
.Uri();
75 // Add to existing queries in URL
76 // TODO: Clean up the list of filters; perhaps 'falsy' filters
77 // shouldn't appear at all? Or compare to existing query string
78 // and see if current state of a specific filter is needed?
79 uri
.extend( this.filtersModel
.getParametersFromFilters() );
81 // Update the URL itself
82 window
.history
.pushState( { tag
: 'rcfilters' }, document
.title
, uri
.toString() );
86 * Fetch the list of changes from the server for the current filters
88 * @returns {jQuery.Promise} Promise object that will resolve with the changes list
90 mw
.rcfilters
.Controller
.prototype.fetchChangesList = function () {
91 var uri
= new mw
.Uri(),
92 requestId
= ++this.requestCounter
,
93 latestRequest = function () {
94 return requestId
=== this.requestCounter
;
96 uri
.extend( this.filtersModel
.getParametersFromFilters() );
97 return $.ajax( uri
.toString(), { contentType
: 'html' } )
98 .then( function ( html
) {
99 return latestRequest() ?
100 $( $.parseHTML( html
) ).find( '.mw-changeslist' ).first().contents() :
102 } ).then( null, function () {
103 return latestRequest() ? 'NO_RESULTS' : null;
108 * Update the list of changes and notify the model
110 mw
.rcfilters
.Controller
.prototype.updateChangesList = function () {
111 this.changesListModel
.invalidate();
112 this.fetchChangesList()
113 .always( function ( changesListContent
) {
114 if ( changesListContent
) {
115 this.changesListModel
.update( changesListContent
);
119 }( mediaWiki
, jQuery
) );