From 7fd6e577499d6b04123e661e4e72d791832a971d Mon Sep 17 00:00:00 2001 From: Ismayil Khayredinov Date: Fri, 23 Mar 2018 15:36:08 +0100 Subject: [PATCH] feat(ajax): adds elgg/Ajax#forward method Adds a new method to elgg/Ajax AMD module that allows a redirect to a new page while keeping the spinner running --- docs/guides/ajax.rst | 11 +++++++++++ views/default/elgg/Ajax.js | 12 ++++++++++++ views/default/forms/login.js | 15 ++++++--------- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/docs/guides/ajax.rst b/docs/guides/ajax.rst index b9684d3581d..dbe3feb4024 100644 --- a/docs/guides/ajax.rst +++ b/docs/guides/ajax.rst @@ -249,6 +249,17 @@ Notes for forms: In ajax views and forms, note that ``$vars`` can be populated by client input. The data is filtered like ``get_input()``, but may not be the type you're expecting or may have unexpected keys. +Redirects +--------- + +Use ``ajax.forward()`` to start a spinner and redirect the user to a new destination. + +.. code-block:: js + + var Ajax = require('elgg/Ajax'); + var ajax = new Ajax(); + ajax.forward('/activity'); + Piggybacking on an Ajax request ------------------------------- diff --git a/views/default/elgg/Ajax.js b/views/default/elgg/Ajax.js index e0516691a4e..7b5ef088c3f 100644 --- a/views/default/elgg/Ajax.js +++ b/views/default/elgg/Ajax.js @@ -351,6 +351,18 @@ define(function (require) { return new FormData($(el)[0]); }; + + /** + * Issue a redirect and display a spinner + * + * @param destination String URL to forward to + * @returns {void} + */ + this.forward = function(destination) { + spinner_starts++; + spinner.start(); + elgg.forward(destination); + }; } /** diff --git a/views/default/forms/login.js b/views/default/forms/login.js index f75adaf3a34..6c733860842 100644 --- a/views/default/forms/login.js +++ b/views/default/forms/login.js @@ -4,33 +4,30 @@ define(function(require) { var Ajax = require('elgg/Ajax'); var spinner = require('elgg/spinner'); - // manage Spinner manually - var ajax = new Ajax(false); - $(document).on('submit', '.elgg-form-login', function(e) { var $form = $(this); - spinner.start(); + var ajax = new Ajax(); + ajax.action($form.prop('action'), { data: ajax.objectify($form) }).done(function(json, status, jqXHR) { - if (jqXHR.AjaxData.status == -1) { + if (jqXHR.AjaxData.status === -1) { $('input[name=password]', $form).val('').focus(); - spinner.stop(); return; } if (json) { if (typeof json.forward === 'string') { - elgg.forward(json.forward); + ajax.forward(json.forward); return; } else if (json.forward === -1) { - elgg.forward(location.href); + ajax.forward(location.href); return; } } - elgg.forward(); + ajax.forward(); }); e.preventDefault();