feat(delete): add undo toasts and harden delete modals

This commit is contained in:
Will Miao
2026-08-11 14:09:10 +08:00
parent eb0f6dd3b6
commit b2c68e6a65
27 changed files with 2555 additions and 51 deletions
+23
View File
@@ -434,6 +434,22 @@ export class ModalManager {
this.currentOpenModal = id; // Update currently open modal
document.body.style.top = `-${this.scrollPosition}px`;
document.body.classList.add('modal-open');
modal.restoreFocusTo = null;
if (this._isDeleteConfirmModal(modal.element)) {
const activeElement = document.activeElement;
modal.restoreFocusTo = activeElement && activeElement !== document.body
? activeElement
: null;
modal.element.querySelector('.cancel-btn')?.focus();
}
}
// Several non-delete modals share the delete-modal styling class, so an
// actual .delete-btn is required before focus is moved to Cancel.
_isDeleteConfirmModal(element) {
return element.classList.contains('delete-modal') &&
Boolean(element.querySelector('.delete-btn'));
}
closeModal(id) {
@@ -463,6 +479,13 @@ export class ModalManager {
modal.cleanupCallback();
modal.cleanupCallback = null;
}
if (modal.restoreFocusTo) {
if (modal.restoreFocusTo.isConnected) {
modal.restoreFocusTo.focus();
}
modal.restoreFocusTo = null;
}
}
handleEscape(e) {