Files
gianca-s-event/script.js

83 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const form = document.getElementById('rsvp-form');
const statusNode = document.getElementById('form-status');
const attendanceFields = document.getElementById('attendance-fields');
const attendanceInputs = Array.from(document.querySelectorAll('input[name="attendance"]'));
const successModal = document.getElementById('success-modal');
const successOkButton = document.getElementById('success-ok');
const closeModalNodes = Array.from(document.querySelectorAll('[data-close-modal]'));
function updateAttendanceFields() {
const selected = document.querySelector('input[name="attendance"]:checked');
const attending = selected?.value === 'si';
attendanceFields.classList.toggle('attendance-fields--hidden', !attending);
attendanceFields.querySelectorAll('input, select, textarea').forEach((field) => {
field.disabled = !attending;
if (!attending && field.tagName === 'TEXTAREA') field.value = '';
if (!attending && field.tagName === 'SELECT') field.value = '0';
});
}
function openSuccessModal() {
if (!successModal) return;
successModal.classList.add('success-modal--open');
successModal.setAttribute('aria-hidden', 'false');
document.body.classList.add('modal-open');
successOkButton?.focus();
}
function closeSuccessModal() {
if (!successModal) return;
successModal.classList.remove('success-modal--open');
successModal.setAttribute('aria-hidden', 'true');
document.body.classList.remove('modal-open');
}
attendanceInputs.forEach((input) => input.addEventListener('change', updateAttendanceFields));
closeModalNodes.forEach((node) => node.addEventListener('click', closeSuccessModal));
successOkButton?.addEventListener('click', closeSuccessModal);
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape' && successModal?.classList.contains('success-modal--open')) {
closeSuccessModal();
}
});
updateAttendanceFields();
function encode(data) {
return new URLSearchParams(data).toString();
}
form?.addEventListener('submit', async (event) => {
event.preventDefault();
if (!form.reportValidity()) return;
const submitButton = form.querySelector('button[type="submit"]');
const formData = new FormData(form);
submitButton.disabled = true;
statusNode.textContent = 'Invio in corso...';
try {
const response = await fetch('/', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: encode(formData)
});
if (!response.ok) {
throw new Error('Submission failed');
}
form.reset();
updateAttendanceFields();
statusNode.textContent = '';
openSuccessModal();
} catch (error) {
statusNode.textContent = 'Cè stato un problema nellinvio. Riprova tra poco.';
} finally {
submitButton.disabled = false;
}
});