Files
breadcrumb-the-shire/web/js/components/app-confirm-actions.js
2026-03-04 15:56:58 +01:00

71 lines
2.0 KiB
JavaScript

const CONFIRM_ATTR = 'data-confirm-message';
const isSubmitControl = (element) => {
if (!(element instanceof HTMLElement)) {
return false;
}
if (element instanceof HTMLButtonElement) {
const type = String(element.getAttribute('type') || 'submit').trim().toLowerCase();
return type === '' || type === 'submit';
}
if (element instanceof HTMLInputElement) {
const type = String(element.type || '').trim().toLowerCase();
return type === 'submit' || type === 'image';
}
return false;
};
const submitterByForm = new Map();
const onClickCapture = (event) => {
const trigger = event.target instanceof HTMLElement ? event.target.closest('a, button, input') : null;
if (!(trigger instanceof HTMLElement)) {
return;
}
if (isSubmitControl(trigger)) {
const form = trigger.form instanceof HTMLFormElement ? trigger.form : null;
if (form) {
submitterByForm.set(form, trigger);
}
return;
}
const confirmMessage = String(trigger.getAttribute(CONFIRM_ATTR) || '').trim();
if (confirmMessage === '') {
return;
}
if (!window.confirm(confirmMessage)) {
event.preventDefault();
event.stopPropagation();
}
};
const onSubmitCapture = (event) => {
const form = event.target instanceof HTMLFormElement ? event.target : null;
if (!(form instanceof HTMLFormElement)) {
return;
}
const submitter = event.submitter instanceof HTMLElement
? event.submitter
: (submitterByForm.get(form) || null);
submitterByForm.delete(form);
const submitterMessage = String(submitter?.getAttribute(CONFIRM_ATTR) || '').trim();
const formMessage = String(form.getAttribute(CONFIRM_ATTR) || '').trim();
const confirmMessage = submitterMessage !== '' ? submitterMessage : formMessage;
if (confirmMessage === '') {
return;
}
if (!window.confirm(confirmMessage)) {
event.preventDefault();
event.stopPropagation();
}
};
document.addEventListener('click', onClickCapture, true);
document.addEventListener('submit', onSubmitCapture, true);