From d5cd2be52ff342194f01acfc890a89b549195f0a Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Mon, 17 Jun 2024 14:47:19 +0200 Subject: [PATCH 01/17] prevent multiple eventListener binds on tab change --- app/assets/javascripts/shared/behaviors.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index cd6ac4f75..f2d3267ce 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -81,11 +81,13 @@ } // Update address bar with current tab param - $('[data-bs-toggle~=tab]').on('shown.bs.tab', function (e) { - let currentTab = $(e.target).attr('href').substring(1); - searchParams.set('tab', currentTab); - history.pushState(null, null, `?${searchParams.toString()}`); - }); + $('[data-bs-toggle~=tab]') + .unbind() + .on('shown.bs.tab', function (e) { + let currentTab = $(e.target).attr('href').substring(1); + searchParams.set('tab', currentTab); + history.pushState(null, null, `?${searchParams.toString()}`); + }); } document.addEventListener('turbolinks:load', function () { From 9a25d19b31e9bbb621a37cab126871d49bc2bfcb Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Mon, 17 Jun 2024 14:49:07 +0200 Subject: [PATCH 02/17] navigate to tabbed pages using browser back button --- app/assets/javascripts/shared/behaviors.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index f2d3267ce..a78b53c84 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -88,6 +88,14 @@ searchParams.set('tab', currentTab); history.pushState(null, null, `?${searchParams.toString()}`); }); + + // Allows users to navigate using the native browser back/forward buttons + // even when we manipulate the browser history with pushState() + $(window) + .unbind() + .on('popstate', function () { + location.reload(); + }); } document.addEventListener('turbolinks:load', function () { From 35bd3878da38a9192ed43b0630ba61b6876ca36e Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Mon, 17 Jun 2024 14:50:58 +0200 Subject: [PATCH 03/17] update changelog --- CHANGELOG | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 4968516d7..3a90ae93a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,8 +2,7 @@ - Liquid: Make project-level collections available for Liquid syntax - Upgraded gems: nokogiri, rails, rexml - Bugs fixes: - - [entity]: - - [future tense verb] [bug fix] + - Navigation: Restore functionality of native browser back/forward buttons - Bug tracker items: - [item] - New integrations: From c3fabbf24f7c540461c166680eec4bf24243f54c Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Tue, 18 Jun 2024 11:53:53 +0200 Subject: [PATCH 04/17] limit scope of eventLister to prevent N bindings --- app/assets/javascripts/shared/behaviors.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index a78b53c84..059d14f4e 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -81,8 +81,8 @@ } // Update address bar with current tab param - $('[data-bs-toggle~=tab]') - .unbind() + $(parentElement) + .find('[data-bs-toggle~=tab]') .on('shown.bs.tab', function (e) { let currentTab = $(e.target).attr('href').substring(1); searchParams.set('tab', currentTab); @@ -91,11 +91,9 @@ // Allows users to navigate using the native browser back/forward buttons // even when we manipulate the browser history with pushState() - $(window) - .unbind() - .on('popstate', function () { - location.reload(); - }); + $(window).on('popstate', function () { + location.reload(); + }); } document.addEventListener('turbolinks:load', function () { From 3d735cbd09a04a09ccaa8027d5a2fc437b62671c Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Wed, 19 Jun 2024 15:09:57 +0200 Subject: [PATCH 05/17] navigate with `Turbolinks` vs `location.reload()` --- app/assets/javascripts/shared/behaviors.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index 059d14f4e..6563983fd 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -86,14 +86,19 @@ .on('shown.bs.tab', function (e) { let currentTab = $(e.target).attr('href').substring(1); searchParams.set('tab', currentTab); - history.pushState(null, null, `?${searchParams.toString()}`); + let urlWithTab = `?${searchParams.toString()}`; + history.replaceState(null, null, urlWithTab); }); // Allows users to navigate using the native browser back/forward buttons // even when we manipulate the browser history with pushState() - $(window).on('popstate', function () { - location.reload(); - }); + $(window) + .off() + .on('popstate', function () { + if (location.search.length) { + Turbolinks.visit(location, { action: 'replace' }); + } + }); } document.addEventListener('turbolinks:load', function () { From fdccc4e821bcd1cd0fe6293dff114ce996770e64 Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Wed, 19 Jun 2024 15:14:30 +0200 Subject: [PATCH 06/17] add tab to history rather than replacing current history --- app/assets/javascripts/shared/behaviors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index 6563983fd..29bdaa231 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -87,7 +87,7 @@ let currentTab = $(e.target).attr('href').substring(1); searchParams.set('tab', currentTab); let urlWithTab = `?${searchParams.toString()}`; - history.replaceState(null, null, urlWithTab); + history.pushState(null, null, urlWithTab); }); // Allows users to navigate using the native browser back/forward buttons From 8625ec3e965e4e2b43d096e21e7d170679a29f67 Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Mon, 24 Jun 2024 18:11:12 +0200 Subject: [PATCH 07/17] set data in pushState to load page with tab param --- app/assets/javascripts/shared/behaviors.js | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index 29bdaa231..9aa1e52a0 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -87,17 +87,11 @@ let currentTab = $(e.target).attr('href').substring(1); searchParams.set('tab', currentTab); let urlWithTab = `?${searchParams.toString()}`; - history.pushState(null, null, urlWithTab); - }); - - // Allows users to navigate using the native browser back/forward buttons - // even when we manipulate the browser history with pushState() - $(window) - .off() - .on('popstate', function () { - if (location.search.length) { - Turbolinks.visit(location, { action: 'replace' }); - } + history.pushState( + { turbolinks: true, url: urlWithTab }, + '', + urlWithTab + ); }); } From dce4e533c44d947bc494520ff47aa41b30081c51 Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Wed, 26 Jun 2024 10:23:18 +0200 Subject: [PATCH 08/17] ensure issues table shows renamed affected nodes --- app/views/issues/_table.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/issues/_table.html.erb b/app/views/issues/_table.html.erb index 1ee054deb..86b6ad3a3 100644 --- a/app/views/issues/_table.html.erb +++ b/app/views/issues/_table.html.erb @@ -1,4 +1,4 @@ -<% cache ['issues-table', @all_columns, issues.map(&:id), @issues.map(&:updated_at).map(&:to_i).sort.last, @tags] do %> +<% cache ['issues-table', @all_columns, issues.map(&:affected), issues.map(&:id), @issues.map(&:updated_at).map(&:to_i).sort.last, @tags] do %> <% table_attributes = { behavior: 'dradis-datatable', 'default-columns': @default_columns.to_json, @@ -21,7 +21,7 @@ <% issues.each do |issue| %> - <% cache [issue, @all_columns, issue.try(:affected_count), issue.try(:state), 'issues-table', @tags] do %> + <% cache [issue, @all_columns, issue.try(:affected), issue.try(:state), 'issues-table', @tags] do %> <% @all_columns.each do |column| %> From 246b668c14f030af3f5cdd5d3e5cc3b41a1d9e5c Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Wed, 26 Jun 2024 10:28:52 +0200 Subject: [PATCH 09/17] Update CHANGELOG --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 3a90ae93a..8aaa76354 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ - Liquid: Make project-level collections available for Liquid syntax - Upgraded gems: nokogiri, rails, rexml - Bugs fixes: + - Issues: Update Affected column after a node has been renamed or merged - Navigation: Restore functionality of native browser back/forward buttons - Bug tracker items: - [item] From bec3f22c000ab395b3e6746be4214f5e309608b2 Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Mon, 17 Jun 2024 14:47:19 +0200 Subject: [PATCH 10/17] prevent multiple eventListener binds on tab change --- CHANGELOG | 1 - app/assets/javascripts/shared/behaviors.js | 11 +++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 8aaa76354..c2724509c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,7 +3,6 @@ - Upgraded gems: nokogiri, rails, rexml - Bugs fixes: - Issues: Update Affected column after a node has been renamed or merged - - Navigation: Restore functionality of native browser back/forward buttons - Bug tracker items: - [item] - New integrations: diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index 9aa1e52a0..f2d3267ce 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -81,17 +81,12 @@ } // Update address bar with current tab param - $(parentElement) - .find('[data-bs-toggle~=tab]') + $('[data-bs-toggle~=tab]') + .unbind() .on('shown.bs.tab', function (e) { let currentTab = $(e.target).attr('href').substring(1); searchParams.set('tab', currentTab); - let urlWithTab = `?${searchParams.toString()}`; - history.pushState( - { turbolinks: true, url: urlWithTab }, - '', - urlWithTab - ); + history.pushState(null, null, `?${searchParams.toString()}`); }); } From 07c5afe720da25c771fb4ac90306b67d4f3d008d Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Mon, 17 Jun 2024 14:49:07 +0200 Subject: [PATCH 11/17] navigate to tabbed pages using browser back button --- app/assets/javascripts/shared/behaviors.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index f2d3267ce..a78b53c84 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -88,6 +88,14 @@ searchParams.set('tab', currentTab); history.pushState(null, null, `?${searchParams.toString()}`); }); + + // Allows users to navigate using the native browser back/forward buttons + // even when we manipulate the browser history with pushState() + $(window) + .unbind() + .on('popstate', function () { + location.reload(); + }); } document.addEventListener('turbolinks:load', function () { From 9f845bd054b3ef7afe27ae70d442875b989ea9db Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Tue, 18 Jun 2024 11:53:53 +0200 Subject: [PATCH 12/17] limit scope of eventLister to prevent N bindings --- app/assets/javascripts/shared/behaviors.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index a78b53c84..059d14f4e 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -81,8 +81,8 @@ } // Update address bar with current tab param - $('[data-bs-toggle~=tab]') - .unbind() + $(parentElement) + .find('[data-bs-toggle~=tab]') .on('shown.bs.tab', function (e) { let currentTab = $(e.target).attr('href').substring(1); searchParams.set('tab', currentTab); @@ -91,11 +91,9 @@ // Allows users to navigate using the native browser back/forward buttons // even when we manipulate the browser history with pushState() - $(window) - .unbind() - .on('popstate', function () { - location.reload(); - }); + $(window).on('popstate', function () { + location.reload(); + }); } document.addEventListener('turbolinks:load', function () { From 52022ee405871f278b3addb7862865d8f1a864be Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Wed, 19 Jun 2024 15:09:57 +0200 Subject: [PATCH 13/17] navigate with `Turbolinks` vs `location.reload()` --- app/assets/javascripts/shared/behaviors.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index 059d14f4e..6563983fd 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -86,14 +86,19 @@ .on('shown.bs.tab', function (e) { let currentTab = $(e.target).attr('href').substring(1); searchParams.set('tab', currentTab); - history.pushState(null, null, `?${searchParams.toString()}`); + let urlWithTab = `?${searchParams.toString()}`; + history.replaceState(null, null, urlWithTab); }); // Allows users to navigate using the native browser back/forward buttons // even when we manipulate the browser history with pushState() - $(window).on('popstate', function () { - location.reload(); - }); + $(window) + .off() + .on('popstate', function () { + if (location.search.length) { + Turbolinks.visit(location, { action: 'replace' }); + } + }); } document.addEventListener('turbolinks:load', function () { From c998d1a5f3ec90dc9e0080686ffecabe5eb7dff5 Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Wed, 19 Jun 2024 15:14:30 +0200 Subject: [PATCH 14/17] add tab to history rather than replacing current history --- app/assets/javascripts/shared/behaviors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index 6563983fd..29bdaa231 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -87,7 +87,7 @@ let currentTab = $(e.target).attr('href').substring(1); searchParams.set('tab', currentTab); let urlWithTab = `?${searchParams.toString()}`; - history.replaceState(null, null, urlWithTab); + history.pushState(null, null, urlWithTab); }); // Allows users to navigate using the native browser back/forward buttons From 4bff9da686318a5dcf21df3889e3909a403e07e4 Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Mon, 24 Jun 2024 18:11:12 +0200 Subject: [PATCH 15/17] set data in pushState to load page with tab param --- app/assets/javascripts/shared/behaviors.js | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index 29bdaa231..9aa1e52a0 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -87,17 +87,11 @@ let currentTab = $(e.target).attr('href').substring(1); searchParams.set('tab', currentTab); let urlWithTab = `?${searchParams.toString()}`; - history.pushState(null, null, urlWithTab); - }); - - // Allows users to navigate using the native browser back/forward buttons - // even when we manipulate the browser history with pushState() - $(window) - .off() - .on('popstate', function () { - if (location.search.length) { - Turbolinks.visit(location, { action: 'replace' }); - } + history.pushState( + { turbolinks: true, url: urlWithTab }, + '', + urlWithTab + ); }); } From 64652f9144f9ef05e5dede6e0207034e6688d057 Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Wed, 26 Jun 2024 10:42:34 +0200 Subject: [PATCH 16/17] fix rebase --- app/assets/javascripts/shared/behaviors.js | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/shared/behaviors.js b/app/assets/javascripts/shared/behaviors.js index 9aa1e52a0..cd6ac4f75 100644 --- a/app/assets/javascripts/shared/behaviors.js +++ b/app/assets/javascripts/shared/behaviors.js @@ -81,18 +81,11 @@ } // Update address bar with current tab param - $(parentElement) - .find('[data-bs-toggle~=tab]') - .on('shown.bs.tab', function (e) { - let currentTab = $(e.target).attr('href').substring(1); - searchParams.set('tab', currentTab); - let urlWithTab = `?${searchParams.toString()}`; - history.pushState( - { turbolinks: true, url: urlWithTab }, - '', - urlWithTab - ); - }); + $('[data-bs-toggle~=tab]').on('shown.bs.tab', function (e) { + let currentTab = $(e.target).attr('href').substring(1); + searchParams.set('tab', currentTab); + history.pushState(null, null, `?${searchParams.toString()}`); + }); } document.addEventListener('turbolinks:load', function () { From 6c0e79de5b3eadfa0d5d4afb789535de8d7e433e Mon Sep 17 00:00:00 2001 From: Matt Budz Date: Thu, 27 Jun 2024 16:03:06 +0200 Subject: [PATCH 17/17] don't store all the details of `affected` in the cache key instead we are just keeping the updated_at value which will be enough to bust the cache Co-authored-by: Aaron Manaloto --- app/views/issues/_table.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/issues/_table.html.erb b/app/views/issues/_table.html.erb index 86b6ad3a3..57e778617 100644 --- a/app/views/issues/_table.html.erb +++ b/app/views/issues/_table.html.erb @@ -21,7 +21,7 @@ <% issues.each do |issue| %> - <% cache [issue, @all_columns, issue.try(:affected), issue.try(:state), 'issues-table', @tags] do %> + <% cache [issue, @all_columns, issue.try(:affected_count), issue.affected.pluck(:updated_at), issue.try(:state), 'issues-table', @tags] do %> <% @all_columns.each do |column| %>