Catrope has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/328676 )

Change subject: [WIP] RC filters: AJAX and pushState/popState
......................................................................

[WIP] RC filters: AJAX and pushState/popState

Clicks on the Show button now refresh the results list using AJAX
instead of submitting the form.

Also added pushState to update the URL, and popstate handling
to make the back button work.

Bug: T153949
Change-Id: I8c1ec557ccfe4b1d20aaaab3ef0d3182a1993f24
---
M resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
M resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
M resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
3 files changed, 66 insertions(+), 30 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/76/328676/1

diff --git 
a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js 
b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
index 324d90b..e7ec170 100644
--- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
+++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
@@ -419,7 +419,7 @@
                                // Mark the group if it has any items that are 
selected
                                groupMap[ filterItem.getGroup() ].hasSelected = 
(
                                        groupMap[ filterItem.getGroup() 
].hasSelected ||
-                                       !!paramValue
+                                       !!Number( paramValue )
                                );
 
                                // Add the relevant filter into the group map
@@ -446,7 +446,7 @@
                                                // Flip the definition between 
the parameter
                                                // state and the filter state
                                                // This is what the 
'toggleSelected' value of the filter is
-                                               !params[ filterItem.getName() ] 
:
+                                               !Number( params[ 
filterItem.getName() ] ) :
                                                // Otherwise, there are no 
selected items in the
                                                // group, which means the state 
is false
                                                false;
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js 
b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
index 61c06ce..fc28fd6 100644
--- a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
+++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
@@ -8,6 +8,8 @@
                this.model = model;
 
                // TODO: When we are ready, update the URL when a filter is 
updated
+               // TODO should we do this on every itemUpdate, or only when the 
user submits the form
+               //      or takes some other explicit action like closing the 
popup?
                // this.model.connect( this, { itemUpdate: 'updateURL' } );
        };
 
@@ -18,8 +20,14 @@
         * Initialize the filter and parameter states
         */
        mw.rcfilters.Controller.prototype.initialize = function () {
-               var uri = new mw.Uri();
+               this.updateFromURL();
+       };
 
+       /**
+        * Update the model state based on the URL parameters.
+        */
+       mw.rcfilters.Controller.prototype.updateFromURL = function () {
+               var uri = new mw.Uri();
                this.model.updateFilters(
                        // Translate the url params to filter select states
                        this.model.getParametersToFilters( uri.query )
@@ -50,7 +58,7 @@
                uri.query = this.makeFiltersQuery();
 
                // Update the URL itself
-               window.history.pushState( uri.query, '', uri.toString() );
+               window.history.pushState( { tag: 'mw-rcfilters' }, '', 
uri.toString() );
        };
 
        /**
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js 
b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
index c87ce43..450dc55 100644
--- a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
+++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
@@ -11,7 +11,43 @@
                init: function () {
                        var model = new mw.rcfilters.dm.FiltersViewModel(),
                                controller = new mw.rcfilters.Controller( model 
),
-                               widget = new 
mw.rcfilters.ui.FilterWrapperWidget( controller, model );
+                               widget = new 
mw.rcfilters.ui.FilterWrapperWidget( controller, model ),
+                               $form = $( '.rcoptions form' ),
+                               submittingPromise = null;
+
+                       function updateResults( fromPopState ) {
+                               var $submitButton = $form.find( 
'input[type=submit]' ),
+                                       $changesList = $( '.mw-changeslist' ),
+                                       uri = new mw.Uri();
+                               if ( submittingPromise ) {
+                                       // If a submission is already pending, 
ignore this one
+                                       return;
+                               }
+
+                               $changesList.addClass( 
'oo-ui-pendingElement-pending' );
+                               $submitButton.prop( 'disabled', true );
+
+                               // FIXME in theory this should use 
controller.makeFiltersQuery() but its API
+                               // is not very useful and it breaks non-boolean 
params
+                               uri.extend( model.getFiltersToParameters() );
+                               submittingPromise = $.ajax( uri.toString(), { 
contentType: 'html' } );
+                               submittingPromise
+                                       .then( function ( html ) {
+                                               $changesList.empty().append(
+                                                       $( $.parseHTML( html ) 
).find( '.mw-changeslist' ).first().contents()
+                                               );
+                                               // FIXME ideally this would use 
controller.updateURL(); , but since it uses
+                                               // makeFiltersQuery() it also 
breaks non-boolean params
+                                               if ( !fromPopState ) {
+                                                       history.pushState( { 
tag: 'mw-rcfilters' }, document.title, uri.toString() );
+                                               }
+                                       } )
+                                       .always( function () {
+                                               $changesList.removeClass( 
'oo-ui-pendingElement-pending' );
+                                               $submitButton.prop( 'disabled', 
false );
+                                               submittingPromise = null;
+                                       } );
+                       }
 
                        model.toggleLoading( true );
                        model.initializeFilters( {
@@ -74,32 +110,24 @@
                        controller.initialize();
                        model.toggleLoading( false );
 
-                       $( '.rcoptions form' ).submit( function () {
-                               var $form = $( this );
-
-                               // Get current filter values
-                               $.each( model.getFiltersToParameters(), 
function ( paramName, paramValue ) {
-                                       var $existingInput = $form.find( 
'input[name=' + paramName + ']' );
-                                       // Check if the hidden input already 
exists
-                                       // This happens if the parameter was 
already given
-                                       // on load
-                                       if ( $existingInput.length ) {
-                                               // Update the value
-                                               $existingInput.val( paramValue 
);
-                                       } else {
-                                               // Append hidden fields with 
filter values
-                                               $form.append(
-                                                       $( '<input>' )
-                                                               .attr( 'type', 
'hidden' )
-                                                               .attr( 'name', 
paramName )
-                                                               .val( 
paramValue )
-                                               );
-                                       }
-                               } );
-
-                               // Continue the submission process
-                               return true;
+                       $form.submit( function () {
+                               updateResults();
+                               // Prevent native form submission
+                               return false;
                        } );
+
+                       window.addEventListener( 'popstate', function ( e ) {
+                               if ( !e.state || e.state.tag !== 'mw-rcfilters' 
) {
+                                       // Not our state, ignore
+                                       return;
+                               }
+                               controller.updateFromURL();
+                               updateResults( true );
+                       } );
+
+                       // Replace the current state with one that's marked 
with our tag, so that using the
+                       // back button to navigate to the initial state works
+                       history.replaceState( { tag: 'mw-rcfilters' }, 
document.title, location.href );
                }
        };
 

-- 
To view, visit https://gerrit.wikimedia.org/r/328676
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8c1ec557ccfe4b1d20aaaab3ef0d3182a1993f24
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Catrope <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to