/**
|
* view.js
|
* Frontend JavaScript for the Form Block
|
* Handles form validation and submission
|
*/
|
class FormBlock {
|
constructor() {
|
this.controller = new window.jvbForm();
|
|
document.querySelectorAll('.jvb-form-block form').forEach(form => {
|
this.controller.registerForm(form, {autosave: true});
|
});
|
|
this.controller.subscribe((event, data) => {
|
if (event === 'form-submit') {
|
this.handleFormSubmission(data);
|
}
|
});
|
}
|
|
async handleFormSubmission(data) {
|
let formId = data.formId;
|
let formConfig = data.config;
|
let formData = data.fullData;
|
let form = formConfig.element;
|
|
let headers = {
|
'X-WP-Nonce': jvbSettings.nonce,
|
'Content-Type': 'application/json'
|
};
|
|
let block = form.closest('.jvb-form-block');
|
this.controller.showFormStatus(formId, 'uploading');
|
|
try {
|
const response = await fetch(`${jvbSettings.api}forms`, {
|
method: 'POST',
|
headers,
|
body: JSON.stringify(formData)
|
});
|
|
if (!response.ok) {
|
this.controller.showFormStatus(formId, 'error');
|
const errorData = await response.json().catch(() => ({}));
|
throw new Error(errorData.message || `Request failed with status ${response.status}`);
|
}
|
|
this.controller.showFormStatus(formId, 'submitted');
|
this.controller.showSummary(formId, '.jvb-form-block');
|
} catch (error) {
|
throw error;
|
} finally {
|
this.controller.store.delete(formId);
|
}
|
}
|
}
|
|
document.addEventListener('DOMContentLoaded', function() {
|
new FormBlock();
|
});
|