fix: focus cancel or ok button on confirm and alert modals

when opening the modal:
- remember previously focused element
- set focused element to the ok or cancel button

when closing the modal:
- restore the focus to the previously focused element
This commit is contained in:
Lukas
2026-03-24 12:52:57 +01:00
parent 850eaffc92
commit a5c853891f

View File

@@ -822,6 +822,7 @@ document.addEventListener('DOMContentLoaded', () => {
function showConfirmModal(message: string): Promise<boolean> { function showConfirmModal(message: string): Promise<boolean> {
return new Promise((resolve) => { return new Promise((resolve) => {
const previousActiveEl = document.activeElement as HTMLButtonElement | null;
const overlay = document.createElement('div'); const overlay = document.createElement('div');
overlay.className = 'modal-overlay'; overlay.className = 'modal-overlay';
@@ -842,19 +843,30 @@ function showConfirmModal(message: string): Promise<boolean> {
overlay.appendChild(modal); overlay.appendChild(modal);
modalContainer?.appendChild(overlay); modalContainer?.appendChild(overlay);
modal.querySelector('#modal-cancel')?.addEventListener('click', () => { const modalCancelBtn = modal.querySelector(
'#modal-cancel'
) as HTMLButtonElement | null;
const modalConfirmBtn = modal.querySelector(
'#modal-confirm'
) as HTMLButtonElement | null;
modalCancelBtn?.focus();
modalCancelBtn?.addEventListener('click', () => {
modalContainer?.removeChild(overlay); modalContainer?.removeChild(overlay);
previousActiveEl?.focus();
resolve(false); resolve(false);
}); });
modal.querySelector('#modal-confirm')?.addEventListener('click', () => { modalConfirmBtn?.addEventListener('click', () => {
modalContainer?.removeChild(overlay); modalContainer?.removeChild(overlay);
previousActiveEl?.focus();
resolve(true); resolve(true);
}); });
overlay.addEventListener('click', (e: MouseEvent) => { overlay.addEventListener('click', (e: MouseEvent) => {
if (e.target === overlay) { if (e.target === overlay) {
modalContainer?.removeChild(overlay); modalContainer?.removeChild(overlay);
previousActiveEl?.focus();
resolve(false); resolve(false);
} }
}); });
@@ -863,6 +875,7 @@ function showConfirmModal(message: string): Promise<boolean> {
function showAlertModal(title: string, message: string): Promise<boolean> { function showAlertModal(title: string, message: string): Promise<boolean> {
return new Promise((resolve) => { return new Promise((resolve) => {
const previousActiveEl = document.activeElement as HTMLButtonElement | null;
const overlay = document.createElement('div'); const overlay = document.createElement('div');
overlay.className = 'modal-overlay'; overlay.className = 'modal-overlay';
@@ -882,14 +895,19 @@ function showAlertModal(title: string, message: string): Promise<boolean> {
overlay.appendChild(modal); overlay.appendChild(modal);
modalContainer?.appendChild(overlay); modalContainer?.appendChild(overlay);
modal.querySelector('#modal-ok')?.addEventListener('click', () => { const okBtn = modal.querySelector('#modal-ok') as HTMLButtonElement | null;
okBtn?.focus();
okBtn?.addEventListener('click', () => {
modalContainer?.removeChild(overlay); modalContainer?.removeChild(overlay);
previousActiveEl?.focus();
resolve(true); resolve(true);
}); });
overlay.addEventListener('click', (e: MouseEvent) => { overlay.addEventListener('click', (e: MouseEvent) => {
if (e.target === overlay) { if (e.target === overlay) {
modalContainer?.removeChild(overlay); modalContainer?.removeChild(overlay);
previousActiveEl?.focus();
resolve(true); resolve(true);
} }
}); });