first commit. all the code has been initialized by Codex
This commit is contained in:
82
script.js
Normal file
82
script.js
Normal 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 nell’invio. Riprova tra poco.';
|
||||
} finally {
|
||||
submitButton.disabled = false;
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user