Fix back navigation from filter views to cards (#2725)
* test: update sign_in_as system test helper to be more generic and support fixture users with more than one board * test: backfill a test for the card "back link" when coming from a board filter page * Fix back navigation to filter views from cards When navigating from a filter view to a card, the back link now shows the filter's label and navigates back to the filter URL instead of the card's board. The turbo-navigation Stimulus controller stores the page title alongside the referrer URL in sessionStorage. On the card show page, a referrerBackLink target rewrites the back link's href and label from the stored values. This is scoped only to the card show page to avoid navigation loops in multi-level deep pages. * Add referrer allowlist to prevent stale referrer rewrites The back link is only rewritten when the stored referrer's path matches an allowlist of paths passed via prefer_referrer. This prevents stale referrers from unrelated pages (e.g., settings) from overriding the card's back link. * Move back link navigation tests to dedicated system test file Extract back link tests from smoke_test.rb into their own file since they test specific JavaScript behavior that needs regression coverage. Move sign_in_as helper to ApplicationSystemTestCase for reuse. * Move markdown paste tests to dedicated system test file
This commit is contained in:
@@ -1,8 +1,12 @@
|
||||
import { Controller } from "@hotwired/stimulus"
|
||||
|
||||
export default class extends Controller {
|
||||
static values = { label: String }
|
||||
static targets = [ "referrerBackLink" ]
|
||||
|
||||
rememberLocation() {
|
||||
sessionStorage.setItem("referrerUrl", window.location.href)
|
||||
sessionStorage.setItem("referrerLabel", this.labelValue)
|
||||
}
|
||||
|
||||
backIfSamePath(event) {
|
||||
@@ -16,6 +20,19 @@ export default class extends Controller {
|
||||
Turbo.visit(this.#referrerUrl)
|
||||
}
|
||||
}
|
||||
|
||||
referrerBackLinkTargetConnected(link) {
|
||||
if (!this.#referrerUrl || !this.#referrerLabel) { return }
|
||||
|
||||
const allowedPaths = (link.dataset.turboNavigationAllowedReferrerPaths || "").split(",")
|
||||
const referrerPath = new URL(this.#referrerUrl).pathname
|
||||
if (!allowedPaths.includes(referrerPath)) { return }
|
||||
|
||||
link.href = this.#referrerUrl
|
||||
const strong = link.querySelector("strong")
|
||||
if (strong) { strong.textContent = `Back to ${this.#referrerLabel}` }
|
||||
}
|
||||
|
||||
get #referrerPath() {
|
||||
if (!this.#referrerUrl) return null
|
||||
return new URL(this.#referrerUrl).pathname
|
||||
@@ -24,4 +41,8 @@ export default class extends Controller {
|
||||
get #referrerUrl() {
|
||||
return sessionStorage.getItem("referrerUrl")
|
||||
}
|
||||
|
||||
get #referrerLabel() {
|
||||
return sessionStorage.getItem("referrerLabel")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user