From 362a7c88e5e0223a84351ffde9f1b0e6eb4435e4 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Thu, 27 Feb 2025 15:40:18 +0000 Subject: [PATCH] Bug 39209: Set cookie consent bar as first focus This patch updates the cookie consent javascript, when the feature is enabled, to ensure that the cookie consent bar gets focused when it displays. Test plan 1) Enable the CookieConsent preference 2) Open any OPAC page 3) Hit 'tab' and note the display of 'Skip to main content' 4) Confirm that the cookie consent bar is displayed and continued 'tabs' eventually navigate to it 5) Apply this patch 6) Navigate to any OPAC page 7) Hit 'tab' and note that the 'Cookie consent' bar is focused, your keyboard navigation starts with the cookie consent buttons 8) Accept the essential cookies 9) Hit tab and note the focus is back to normal and shows the 'Skip to main content' button on first keyboard navigation. Signed-off-by: Owen Leonard Amended-by: Jonathan Druart Run tidy.pl Signed-off-by: Thomas Klausner --- .../opac-tmpl/bootstrap/js/cookieconsent.js | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/koha-tmpl/opac-tmpl/bootstrap/js/cookieconsent.js b/koha-tmpl/opac-tmpl/bootstrap/js/cookieconsent.js index e77146d7d5..3d7d607475 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/js/cookieconsent.js +++ b/koha-tmpl/opac-tmpl/bootstrap/js/cookieconsent.js @@ -71,12 +71,36 @@ const consentBar = $("#cookieConsentBar"); consentBar.attr("aria-hidden", "false"); consentBar.css("display", "flex"); + + // Set focus to the first focusable element within the consent bar + const firstFocusableElement = consentBar + .find("a, button, input, select, textarea") + .filter(":visible") + .first(); + if (firstFocusableElement.length) { + firstFocusableElement.focus(); + } else { + // If no focusable elements exist, add tabindex to the bar itself to make it focusable + consentBar.attr("tabindex", "-1").focus(); + } } function hideConsentBar() { const consentBar = $("#cookieConsentBar"); consentBar.attr("aria-hidden", "true"); consentBar.hide(); + + // Remove focus from any currently focused element + if (document.activeElement) { + document.activeElement.blur(); + } + + // Set focus to the body, which effectively removes visible focus indicators + // This allows the first Tab press to highlight the "Skip to main content" link + document.body.focus(); + document.querySelector("body").setAttribute("tabindex", "-1"); + document.querySelector("body").focus(); + document.querySelector("body").removeAttribute("tabindex"); } // Hides the appropriate consent container, depending on what -- 2.39.5