first commit. all the code has been initialized by Codex

This commit is contained in:
bisco
2026-03-25 18:57:16 +01:00
parent 6c36825a93
commit 8f580745d8
5 changed files with 971 additions and 2 deletions

82
script.js Normal file
View File

@ -0,0 +1,82 @@
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;
}
});