fix(web): keep collapsed files closed in loaded windows and ignore held keys
- commit
- eb480cbe1886ccc8650d9b0f36c9ba8cc4003e77
- author
- brice · · 2026-10-20 08:12 UTC
- committer
- brice · · 2026-10-20 09:16 UTC
- parent
- 81bd47f
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +6 -2
M internal/adapters/web/static/js/lazy.js +6 -2
| @@ -64,8 +64,10 @@ window.ermiteLazy = (() => { | |||
| 64 | 64 | for (const f of [...t.content.querySelectorAll('details[data-file]')]) { | |
| 65 | 65 | const old = document.getElementById(f.id); | |
| 66 | 66 | if (!old || !old.querySelector('.dlazy')) continue; | |
| 67 | - | // A collapsed file opens once loaded; a file of a window keeps the fold. | |
| 68 | - | f.open = old.querySelector('.dlazy[data-manual]') ? true : old.open; | |
| 67 | + | // A file still collapsed stays closed; a collapsed file opens once | |
| 68 | + | // loaded; a file of a window keeps the fold. | |
| 69 | + | f.open = f.querySelector('.dlazy[data-manual]') ? false | |
| 70 | + | : old.querySelector('.dlazy[data-manual]') ? true : old.open; | |
| 69 | 71 | for (const p of $$('.dlazy', old)) lazyIO?.unobserve(p); | |
| 70 | 72 | old.replaceWith(f); | |
| 71 | 73 | window.htmx?.process(f); | |
| @@ -142,6 +144,8 @@ window.ermiteLazy = (() => { | |||
| 142 | 144 | // Enter makes the browser click a link by itself; Space does not. Both are | |
| 143 | 145 | // handled here, once (a fragment is fetched once). | |
| 144 | 146 | function onKey(e) { | |
| 147 | + | // A held key repeats: after the load, focus is on a line link. | |
| 148 | + | if (e.repeat) return false; | |
| 145 | 149 | if ((e.key !== 'Enter' && e.key !== ' ') || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) return false; | |
| 146 | 150 | const a = manualLink(e.target); | |
| 147 | 151 | if (!a) return false; | |
| @@ -64,8 +64,10 @@ window.ermiteLazy = (() => { | |||||
| 64 | for (const f of [...t.content.querySelectorAll('details[data-file]')]) { | 64 | for (const f of [...t.content.querySelectorAll('details[data-file]')]) { | ||
| 65 | const old = document.getElementById(f.id); | 65 | const old = document.getElementById(f.id); | ||
| 66 | if (!old || !old.querySelector('.dlazy')) continue; | 66 | if (!old || !old.querySelector('.dlazy')) continue; | ||
| 67 | - | // A collapsed file opens once loaded; a file of a window keeps the fold. | 67 | + | // A file still collapsed stays closed; a collapsed file opens once |
| 68 | - | f.open = old.querySelector('.dlazy[data-manual]') ? true : old.open; | 68 | + | // loaded; a file of a window keeps the fold. |
| 69 | + | f.open = f.querySelector('.dlazy[data-manual]') ? false | |||
| 70 | + | : old.querySelector('.dlazy[data-manual]') ? true : old.open; | |||
| 69 | for (const p of $$('.dlazy', old)) lazyIO?.unobserve(p); | 71 | for (const p of $$('.dlazy', old)) lazyIO?.unobserve(p); | ||
| 70 | old.replaceWith(f); | 72 | old.replaceWith(f); | ||
| 71 | window.htmx?.process(f); | 73 | window.htmx?.process(f); | ||
| @@ -142,6 +144,8 @@ window.ermiteLazy = (() => { | |||||
| 142 | // Enter makes the browser click a link by itself; Space does not. Both are | 144 | // Enter makes the browser click a link by itself; Space does not. Both are | ||
| 143 | // handled here, once (a fragment is fetched once). | 145 | // handled here, once (a fragment is fetched once). | ||
| 144 | function onKey(e) { | 146 | function onKey(e) { | ||
| 147 | + | // A held key repeats: after the load, focus is on a line link. | |||
| 148 | + | if (e.repeat) return false; | |||
| 145 | if ((e.key !== 'Enter' && e.key !== ' ') || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) return false; | 149 | if ((e.key !== 'Enter' && e.key !== ' ') || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) return false; | ||
| 146 | const a = manualLink(e.target); | 150 | const a = manualLink(e.target); | ||
| 147 | if (!a) return false; | 151 | if (!a) return false; | ||