/** * Frontend JavaScript for the Form Block * Handles form validation and submission */ // Wait for DOM to be ready document.addEventListener('DOMContentLoaded', function() { let formController = new window.jvbForm(); document.querySelectorAll('.jvb-form-block').forEach(block => { const formHandler = formController.registerForm(block.querySelector('form')); }); formController.subscribe((event, data) => { if (event === 'form-submit') { handleFormSubmission(null, data.data, data.config.element); } }); }); async function handleFormSubmission(event, data, form) { let headers = { 'X-WP-Nonce': jvbSettings.nonce, 'Content-Type': 'application/json' }; data['form_type'] = form.dataset.formId; data['form_id'] = form.id; let block = form.closest('.jvb-form-block'); let loading = window.getTemplate('spinner'); form.hidden = true; block.classList.add('loading'); block.prepend(loading); try { const response = await fetch (`${jvbSettings.api}forms`, { method: 'POST', headers, body: JSON.stringify(data) }); if (!response.ok) { const errorData = await response.json().catch(() => ({})); throw new Error(errorData.message|| `Request failed with status ${response.status}`); } updateUI(await response.json(), block); } catch (error) { throw error; } finally { block.classList.remove('loading'); } } function updateUI(response, block) { if (response.success === false) { let form = block.querySelector('form'); form.removeAttribute('hidden'); if ('required' in response) { response.required.forEach(required => { let item = form.querySelector(`[name=${required}]`); item.classList.add('required', 'error'); item.scrollIntoView(); }); } return; } let summary = window.getTemplate('formSummary'); summary.querySelector('h2').textContent = 'Success!'; console.log('Form Response: ', response); for (let [key, value] of Object.entries(response)) { let item = summary.querySelector(`#${key}`); let title = item.querySelector('h4'); if (title.innerText.includes('%s')) { title.innerHTML = title.replace('%s', ''+value+''); } else { item.querySelector('div').innerHTML = value; } } block.append(summary); }