From 22193a19dd10c71ae11cba977a76c9259735ad3c Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Sun, 27 Jul 2014 15:19:49 -0400 Subject: [PATCH] 3235: Infinite scroll error handling: Show error message and "Retry" button instead of immediately repeating the failed request ad infinitum. --- .../app/assets/javascripts/infinite_scroll.js | 20 ++++++++++++++++--- .../assets/stylesheets/application.css.scss | 4 ++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/apps/workbench/app/assets/javascripts/infinite_scroll.js b/apps/workbench/app/assets/javascripts/infinite_scroll.js index a17b446c46..4df689b7ae 100644 --- a/apps/workbench/app/assets/javascripts/infinite_scroll.js +++ b/apps/workbench/app/assets/javascripts/infinite_scroll.js @@ -27,6 +27,7 @@ function maybe_load_more_content() { spinner + ''); } + $(container).find(".spinner").detach(); $(container).append(spinner); $.ajax(src, {dataType: 'json', @@ -34,9 +35,9 @@ function maybe_load_more_content() { data: {}, context: {container: container, src: src}}). always(function() { - $(this.container).find(".spinner").detach(); }). fail(function(jqxhr, status, error) { + var $faildiv; if (jqxhr.readyState == 0 || jqxhr.status == 0) { message = "Cancelled." } else if (jqxhr.responseJSON && jqxhr.responseJSON.errors) { @@ -44,17 +45,30 @@ function maybe_load_more_content() { } else { message = "Request failed."; } - // TODO: report this to the user. + // TODO: report the message to the user. console.log(message); - $(this.container).attr('data-infinite-content-href', this.src); + $faildiv = $('
'). + attr('data-infinite-content-href', this.src). + addClass('infinite-retry'). + append(' Oops, request failed. '); + $(this.container).find('div.spinner').replaceWith($faildiv); }). done(function(data, status, jqxhr) { + $(this.container).find(".spinner").detach(); $(this.container).append(data.content); $(this.container).attr('data-infinite-content-href', data.next_page_href); }); } } $(document). + on('click', 'div.infinite-retry button', function() { + var $retry_div = $(this).closest('.infinite-retry'); + var $scroller = $(this).closest('.infinite-scroller') + $scroller.attr('data-infinite-content-href', + $retry_div.attr('data-infinite-content-href')); + $retry_div.replaceWith('
'); + $scroller.trigger('scroll'); + }). on('ready ajax:complete', function() { $('[data-infinite-scroller]').each(function() { var $scroller = $($(this).attr('data-infinite-scroller')); diff --git a/apps/workbench/app/assets/stylesheets/application.css.scss b/apps/workbench/app/assets/stylesheets/application.css.scss index e3f4f0aa0a..a62bedd659 100644 --- a/apps/workbench/app/assets/stylesheets/application.css.scss +++ b/apps/workbench/app/assets/stylesheets/application.css.scss @@ -146,6 +146,10 @@ nav.navbar-fixed-top .navbar-nav.navbar-right > li > a:hover { margin-bottom: -15px; } +.infinite-scroller .fa-warning { + color: #800; +} + .inline-progress-container div.progress { margin-bottom: 0; } -- 2.30.2