()
| 555 | * Setup dropdown close handlers for dynamically created dropdowns |
| 556 | */ |
| 557 | export function setupDropdownCloseHandlers(): void { |
| 558 | if (dropdownHandlersReady) return; |
| 559 | dropdownHandlersReady = true; |
| 560 | |
| 561 | document.addEventListener( |
| 562 | "click", |
| 563 | (e) => { |
| 564 | const target = e.target as HTMLElement; |
| 565 | const dropdown = target.closest( |
| 566 | '.install-dropdown[data-install-scope="list"]' |
| 567 | ); |
| 568 | const toggle = target.closest( |
| 569 | ".install-btn-toggle" |
| 570 | ) as HTMLButtonElement | null; |
| 571 | const menuLink = target.closest( |
| 572 | ".install-dropdown-menu a" |
| 573 | ) as HTMLAnchorElement | null; |
| 574 | |
| 575 | if (dropdown) { |
| 576 | e.stopPropagation(); |
| 577 | |
| 578 | if (toggle) { |
| 579 | e.preventDefault(); |
| 580 | const isOpen = dropdown.classList.toggle("open"); |
| 581 | toggle.setAttribute("aria-expanded", String(isOpen)); |
| 582 | |
| 583 | if (isOpen) { |
| 584 | document |
| 585 | .querySelectorAll('.install-dropdown[data-install-scope="list"].open') |
| 586 | .forEach((openDropdown) => { |
| 587 | if (openDropdown === dropdown) return; |
| 588 | openDropdown.classList.remove("open"); |
| 589 | openDropdown.querySelector(".install-btn-toggle") |
| 590 | ?.setAttribute("aria-expanded", "false"); |
| 591 | }); |
| 592 | } |
| 593 | |
| 594 | return; |
| 595 | } |
| 596 | |
| 597 | if (menuLink) { |
| 598 | dropdown.classList.remove("open"); |
| 599 | const toggleBtn = dropdown.querySelector<HTMLButtonElement>( |
| 600 | ".install-btn-toggle" |
| 601 | ); |
| 602 | toggleBtn?.setAttribute("aria-expanded", "false"); |
| 603 | return; |
| 604 | } |
| 605 | |
| 606 | return; |
| 607 | } |
| 608 | |
| 609 | document |
| 610 | .querySelectorAll('.install-dropdown[data-install-scope="list"].open') |
| 611 | .forEach((openDropdown) => { |
| 612 | openDropdown.classList.remove("open"); |
| 613 | const toggleBtn = openDropdown.querySelector<HTMLButtonElement>( |
| 614 | ".install-btn-toggle" |
no test coverage detected