Files
fizzy/app/javascript/controllers/turbo_navigation_controller.js
T
Mike Dalessio 248fc5d3e7 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
2026-03-18 17:03:13 -04:00

49 lines
1.4 KiB
JavaScript

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) {
if (event.ctrlKey || event.metaKey || event.shiftKey) { return }
const link = event.target.closest("a")
const targetUrl = new URL(link.href)
if (this.#referrerPath && targetUrl.pathname === this.#referrerPath) {
event.preventDefault()
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
}
get #referrerUrl() {
return sessionStorage.getItem("referrerUrl")
}
get #referrerLabel() {
return sessionStorage.getItem("referrerLabel")
}
}