Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 23 additions & 8 deletions src/document_anonymizer/web/static/js/review.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,11 @@
selectAlls[j].addEventListener("change", onSelectAllChange);
}

// Tier header toggle (collapse/expand) — click on header but not on checkbox
// Tier header toggle (collapse/expand) — click or Enter/Space on header
var tierHeaders = document.querySelectorAll("[data-tier-toggle]");
for (var k = 0; k < tierHeaders.length; k++) {
tierHeaders[k].addEventListener("click", onTierHeaderClick);
tierHeaders[k].addEventListener("keydown", onTierHeaderKeydown);
}

// Clickable <mark> tags in preview
Expand Down Expand Up @@ -119,18 +120,32 @@
function onTierHeaderClick(e) {
// Don't toggle collapse when clicking the checkbox itself
if (e.target.classList.contains("select-all-checkbox")) return;
toggleTierCollapse(e.currentTarget);
}

function onTierHeaderKeydown(e) {
// Enter or Space toggles collapse (standard button behavior)
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
toggleTierCollapse(e.currentTarget);
}
}
Comment on lines +126 to +132
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing checkbox guard in onTierHeaderKeydown

onTierHeaderClick correctly bails out when the click target is the select-all-checkbox, but onTierHeaderKeydown has no equivalent guard. Because keydown bubbles, pressing Space while the checkbox has focus will:

  1. Call e.preventDefault() — suppressing the checkbox's native toggle behaviour, so the checkbox state never changes.
  2. Proceed to call toggleTierCollapse, collapsing or expanding the tier instead.

This makes the select-all checkbox completely un-toggleable with the keyboard, which is a regression for keyboard users.

Suggested change
function onTierHeaderKeydown(e) {
// Enter or Space toggles collapse (standard button behavior)
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
toggleTierCollapse(e.currentTarget);
}
}
function onTierHeaderKeydown(e) {
// Don't interfere with the checkbox's native Space behaviour
if (e.target.classList.contains("select-all-checkbox")) return;
// Enter or Space toggles collapse (standard button behavior)
if (e.key === "Enter" || e.key === " ") {
e.preventDefault();
toggleTierCollapse(e.currentTarget);
}
}


var tier = e.currentTarget.dataset.tierToggle;
function toggleTierCollapse(header) {
var tier = header.dataset.tierToggle;
var body = document.getElementById("tier-body-" + tier);
var icon = document.getElementById("toggle-icon-" + tier);
if (!body) return;

if (body.hidden) {
body.hidden = false;
if (icon) icon.classList.remove("tier-toggle-icon--collapsed");
} else {
body.hidden = true;
if (icon) icon.classList.add("tier-toggle-icon--collapsed");
var expanded = !body.hidden;
body.hidden = expanded;
header.setAttribute("aria-expanded", String(!expanded));
if (icon) {
if (expanded) {
icon.classList.add("tier-toggle-icon--collapsed");
} else {
icon.classList.remove("tier-toggle-icon--collapsed");
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/document_anonymizer/web/templates/results.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ <h3 class="diff-heading">{{ _("results.review_heading") }}</h3>
{% set tier_entities = entities_by_tier.get(tier_key, []) %}
{% if tier_entities %}
<div class="tier-section" data-tier="{{ tier_key }}">
<div class="tier-header" data-tier-toggle="{{ tier_key }}">
<div class="tier-header" data-tier-toggle="{{ tier_key }}" role="button" tabindex="0" aria-expanded="true">
<span class="tier-toggle-icon" id="toggle-icon-{{ tier_key }}">&#9660;</span>
<input
type="checkbox"
Expand Down