From 4032c359ca4d2b11b8c09afaab35404ff8e3eee7 Mon Sep 17 00:00:00 2001 From: Providence-o <97491889+Providence-o@users.noreply.github.com> Date: Tue, 19 May 2026 15:03:10 +0100 Subject: [PATCH] Preserve tree scroll position after file review actions --- airlock/static/assets/file_browser/index.js | 34 ++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/airlock/static/assets/file_browser/index.js b/airlock/static/assets/file_browser/index.js index cb775d85..a495b815 100644 --- a/airlock/static/assets/file_browser/index.js +++ b/airlock/static/assets/file_browser/index.js @@ -1,3 +1,7 @@ +// Only disable browser scroll restoration when there is a position to restore +if (sessionStorage.getItem("treeScrollTop") && 'scrollRestoration' in history) { + history.scrollRestoration = 'manual'; +} // keep the selected class up to date in the tree on the client side function setTreeSelection(tree, event) { // target here is the hx-get link that has been clicked on @@ -155,4 +159,32 @@ if (document.readyState !== "loading") { // Every time a datatable is rendered we need to update the checkboxes // so they match the saved state -document.body.addEventListener("clusterize-table-updated", renderCheckboxStatus); \ No newline at end of file +document.body.addEventListener("clusterize-table-updated", renderCheckboxStatus); + +// Save scroll position before approve/request_changes form submits +document.body.addEventListener("submit", (event) => { + const form = event.target.closest("form"); + if (!form) return; + const action = form.getAttribute("action") || ""; + if (action.includes("/approve/") || action.includes("/request_changes/") || action.includes("/reset_review/")) { + sessionStorage.setItem("treeScrollTop", document.getElementById("tree-container").scrollTop); + } +}); + +// Restore scroll position on page load +document.addEventListener("DOMContentLoaded", () => { + const saved = sessionStorage.getItem("treeScrollTop"); + const treeContainer = document.getElementById("tree-container"); + + if (saved) { + sessionStorage.removeItem("treeScrollTop"); + treeContainer.style.visibility = "hidden"; + + // Wait for browser scroll restoration to complete before applying saved position. + // The browser may reset scrollTop after DOMContentLoaded, so we delay slightly. + setTimeout(() => { + treeContainer.scrollTop = parseInt(saved); + treeContainer.style.visibility = "visible"; + }, 125); + } +});