From ea9dffc34aaef097a0d7331b8bea93d76a7b5777 Mon Sep 17 00:00:00 2001 From: tracy loisel Date: Mon, 10 Oct 2022 15:32:40 +0200 Subject: [PATCH 1/3] fix 429 errors issue when they are too many async_panel in the same page --- .../activeadmin-async_panel.js.coffee | 67 ++++++++++--------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/app/assets/javascripts/activeadmin-async_panel.js.coffee b/app/assets/javascripts/activeadmin-async_panel.js.coffee index 1e48a50..02eb34e 100644 --- a/app/assets/javascripts/activeadmin-async_panel.js.coffee +++ b/app/assets/javascripts/activeadmin-async_panel.js.coffee @@ -17,35 +17,40 @@ # end $(document).on "page:load turbolinks:load turbo:load", -> - $('.async-panel').each (index, item) -> - item = $(item) - requiresClick = !!item.data('clickable') - worker = -> - item.addClass('processing') - $('h3', item).hide().show(0) - - $.ajax - url: item.data('url') - success: (data) -> - $('.panel_contents', item).html(data) - error: (data, status, error) -> - $('.panel_contents', item).html(error) - complete: -> - item.removeClass('processing') - - # Schedule the next request when the current one's completed - period = item.data('period') - if period - setTimeout worker, period * 1000 - - registerHandler = -> - item.addClass('clickable') - $('h3', item).on 'click', -> - $('h3', item).off('click') - item.removeClass('clickable') + $(window).scroll -> + $('.async-panel:not([data-loaded]):in-viewport').each (index, item) -> + $(item).attr('data-loaded', '0'); + + $('.async-panel[data-loaded=0]:in-viewport').each (index, item) -> + item = $(item) + requiresClick = !!item.data('clickable') + worker = -> + item.addClass('processing') + item.attr('data-loaded', '1'); + $('h3', item).hide().show(0) + + $.ajax + url: item.data('url') + success: (data) -> + $('.panel_contents', item).html(data) + error: (data, status, error) -> + $('.panel_contents', item).html(error) + complete: -> + item.removeClass('processing') + + # Schedule the next request when the current one's completed + period = item.data('period') + if period + setTimeout worker, period * 1000 + + registerHandler = -> + item.addClass('clickable') + $('h3', item).on 'click', -> + $('h3', item).off('click') + item.removeClass('clickable') + worker() + + if requiresClick + registerHandler() + else worker() - - if requiresClick - registerHandler() - else - worker() From af9d13b5eab7f9a05b561609e68149bc6ba61eb6 Mon Sep 17 00:00:00 2001 From: mvaragnat Date: Mon, 10 Oct 2022 15:52:24 +0200 Subject: [PATCH 2/3] Add initial loading of data --- .../activeadmin-async_panel.js.coffee | 74 ++++++++++--------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/app/assets/javascripts/activeadmin-async_panel.js.coffee b/app/assets/javascripts/activeadmin-async_panel.js.coffee index 02eb34e..d614814 100644 --- a/app/assets/javascripts/activeadmin-async_panel.js.coffee +++ b/app/assets/javascripts/activeadmin-async_panel.js.coffee @@ -17,40 +17,44 @@ # end $(document).on "page:load turbolinks:load turbo:load", -> + loadVisibleData() $(window).scroll -> - $('.async-panel:not([data-loaded]):in-viewport').each (index, item) -> - $(item).attr('data-loaded', '0'); - - $('.async-panel[data-loaded=0]:in-viewport').each (index, item) -> - item = $(item) - requiresClick = !!item.data('clickable') - worker = -> - item.addClass('processing') - item.attr('data-loaded', '1'); - $('h3', item).hide().show(0) - - $.ajax - url: item.data('url') - success: (data) -> - $('.panel_contents', item).html(data) - error: (data, status, error) -> - $('.panel_contents', item).html(error) - complete: -> - item.removeClass('processing') - - # Schedule the next request when the current one's completed - period = item.data('period') - if period - setTimeout worker, period * 1000 - - registerHandler = -> - item.addClass('clickable') - $('h3', item).on 'click', -> - $('h3', item).off('click') - item.removeClass('clickable') - worker() - - if requiresClick - registerHandler() - else + loadVisibleData() + +loadVisibleData = -> + $('.async-panel:not([data-loaded]):in-viewport').each (index, item) -> + $(item).attr('data-loaded', '0'); + + $('.async-panel[data-loaded=0]:in-viewport').each (index, item) -> + item = $(item) + requiresClick = !!item.data('clickable') + worker = -> + item.addClass('processing') + item.attr('data-loaded', '1'); + $('h3', item).hide().show(0) + + $.ajax + url: item.data('url') + success: (data) -> + $('.panel_contents', item).html(data) + error: (data, status, error) -> + $('.panel_contents', item).html(error) + complete: -> + item.removeClass('processing') + + # Schedule the next request when the current one's completed + period = item.data('period') + if period + setTimeout worker, period * 1000 + + registerHandler = -> + item.addClass('clickable') + $('h3', item).on 'click', -> + $('h3', item).off('click') + item.removeClass('clickable') worker() + + if requiresClick + registerHandler() + else + worker() From bd647dfcff90039ee39427ccae62ade307ebf4b3 Mon Sep 17 00:00:00 2001 From: Jonathan Sitti Date: Thu, 13 Oct 2022 16:14:44 +0200 Subject: [PATCH 3/3] Make it works without panel --- app/assets/javascripts/activeadmin-async_panel.js.coffee | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/activeadmin-async_panel.js.coffee b/app/assets/javascripts/activeadmin-async_panel.js.coffee index d614814..8f5e0fb 100644 --- a/app/assets/javascripts/activeadmin-async_panel.js.coffee +++ b/app/assets/javascripts/activeadmin-async_panel.js.coffee @@ -28,6 +28,11 @@ loadVisibleData = -> $('.async-panel[data-loaded=0]:in-viewport').each (index, item) -> item = $(item) requiresClick = !!item.data('clickable') + if ($('.panel_contents', item).length > 0) + data_target = $('.panel_contents', item) + else + data_target = item + worker = -> item.addClass('processing') item.attr('data-loaded', '1'); @@ -36,9 +41,9 @@ loadVisibleData = -> $.ajax url: item.data('url') success: (data) -> - $('.panel_contents', item).html(data) + $(data_target).html(data) error: (data, status, error) -> - $('.panel_contents', item).html(error) + $(data_target).html(error) complete: -> item.removeClass('processing')