2.4.3 Po prechode na ďalší krok podpisovania sa stratí zameranie klávesnice

Added by Milan Regec Milan R. (October 2, 2026)
Notes

URL: agp.dev.slovensko.digital/contracts/88f8ba3c-29c7-49bb-859e-bec1762ab044


Popis problému:

Kroky podpisovania sa načítavajú bez opätovného načítania stránky. Prvý krok („Vyberte akciu“ → odkaz „Pokračovať“) vymení obsah rámca Turbo: aktivovaný odkaz zmizne a document.activeElement je potom <body>; adresa ani názov stránky („Autogram Portal“) sa nezmenia. Druhý krok (tlačidlo „Pokračovať na podpisovanie“) prejde cez Turbo Drive na novú adresu …/sign s názvom „Dokument #88f8ba3c“ a zameranie je opäť na <body>.


Overené čítačom obrazovky NVDA 2026.2 vo Firefoxe 158 a v Chrome 154 (3. 10. 2026):


  • Po aktivovaní „Pokračovať“ NVDA nepovie nič. Príkaz na oznámenie zamerania (NVDA+Tab) hlási „Autogram Portal, document“.
  • Po aktivovaní „Pokračovať na podpisovanie“ NVDA vo Firefoxe oznámi iba nový názov „Dokument #88f8ba3c“, v Chrome iba „unavailable“ (tlačidlo sa počas odosielania zakáže). Obsah novej stránky nezačne čítať, ako to robí po bežnom načítaní stránky.


Ďalšie stlačenie tabulátora sa po prvom kroku presunie na prvú voľbu nového kroku (prehliadač si pamätá miesto odstráneného prvku). Po druhom kroku začína na začiatku stránky: pred formulárom je 12 zastávok tabulátora (logo, bočná navigácia, výber jazyka, odhlásenie).


Dopad:

Používateľ čítača obrazovky po aktivovaní „Pokračovať“ nepočuje nič a nevie, či sa niečo stalo a kde je nový obsah; musí ho sám vyhľadať. Po „Pokračovať na podpisovanie“ v Chrome nepočuje ani to, že sa načítala nová stránka, iba „unavailable“, čo pôsobí ako chyba. Používateľ klávesnice po oboch krokoch stratí viditeľné zameranie a po druhom kroku musí prejsť celú bočnú navigáciu, kým sa vráti k formuláru. Postihnutí sú nevidiaci a ťažko slabozrakí používatelia čítačov obrazovky, používatelia, ktorí ovládajú stránku iba klávesnicou, a používatelia s kognitívnym znevýhodnením.


Závažnosť: vysoká — opakuje sa v každom kroku hlavného procesu podpisovania.


Efektívne riešenie:

Pre splnenie kritéria úspešnosti je potrebné po každom kroku presunúť zameranie na nadpis nového kroku (nadpis dostane tabindex="-1"): pri výmene rámca v udalosti turbo:frame-load, pri prechode na novú stránku cez Turbo Drive v udalosti turbo:load (okrem prvého načítania stránky).


function focusHeading(root) {
  const heading = root.querySelector("h1, h2, h3")
  if (heading) { heading.setAttribute("tabindex", "-1"); heading.focus() }
}
document.addEventListener("turbo:frame-load", (event) => focusHeading(event.target))
let firstLoad = true
document.addEventListener("turbo:load", () => {
  if (firstLoad) { firstLoad = false; return }
  focusHeading(document.querySelector("main") || document)
})


Zároveň je vhodné aktualizovať document.title podľa kroku (pozri zistenie k názvom stránok).