From 58dccc86754deda247eb49310c266f6cba86d36a Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Thu, 01 Jan 2026 23:40:35 +0000
Subject: [PATCH] Merge branch 'main' of https://github.com/jakevdwerf/jvb
---
src/forms/view.js | 123 ++++++++++++++++++++++++-----------------
1 files changed, 72 insertions(+), 51 deletions(-)
diff --git a/src/forms/view.js b/src/forms/view.js
index d8f6948..20b1f71 100644
--- a/src/forms/view.js
+++ b/src/forms/view.js
@@ -1,13 +1,21 @@
/**
+ * view.js
* Frontend JavaScript for the Form Block
* Handles form validation and submission
*/
+/**
+ * view.js
+ * Frontend JavaScript for the Form Block
+ */
class FormBlock {
constructor() {
this.controller = new window.jvbForm();
document.querySelectorAll('.jvb-form-block form').forEach(form => {
- this.controller.registerForm(form);
+ this.controller.registerForm(form, {
+ autosave: true,
+ autoUpload: false
+ });
});
this.controller.subscribe((event, data) => {
@@ -18,69 +26,82 @@
}
async handleFormSubmission(data) {
- let [
- formId,
- formConfig,
- formData
- ] = [
- data.formId,
- data.config,
- data.data
- ];
- let form = formConfig.element;
+ const { formId, config: formConfig, fullData: formData } = data;
+ const form = formConfig.element;
- let headers = {
- 'X-WP-Nonce': jvbSettings.nonce,
- 'Content-Type': 'application/json'
- };
+ const submitData = new FormData();
- data['form_type'] = formId;
- data['form_id'] = form.id;
- 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)
+ // Add regular form fields
+ for (const [key, value] of Object.entries(formData)) {
+ if (key === '_wpnonce' || key === '_wp_http_referer') continue;
+
+ if (Array.isArray(value)) {
+ value.forEach(v => submitData.append(`${key}[]`, v));
+ } else if (typeof value === 'object' && value !== null) {
+ submitData.append(key, JSON.stringify(value));
+ } else {
+ submitData.append(key, value);
+ }
+ }
+
+ // Add uploaded files
+ if (window.jvbUploads) {
+ try {
+ const files = await window.jvbUploads.getFilesForForm(form);
+ files.forEach(({ file, fieldName }) => {
+ submitData.append(`${fieldName}[]`, file);
});
+ } catch (error) {
+ console.error('Error getting files:', error);
+ }
+ }
+
+ this.controller.showFormStatus(formId, 'uploading');
+
+ try {
+ const response = await fetch(`${jvbSettings.api}forms`, {
+ method: 'POST',
+ credentials: 'same-origin',
+ body: submitData
+ });
+
+ const result = await response.json();
+
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.handleFormError(form, result);
+ return;
}
+
this.controller.showFormStatus(formId, 'submitted');
-
this.controller.showSummary(formId, '.jvb-form-block');
- this.controller.store.delete(formId);
- } catch (error) {
- throw error;
- }
- }
-
- updateUI(response, block) {
-
- let summary = window.getTemplate('formSummary');
- summary.querySelector('h2').textContent = 'Success!';
- console.log('Form Response: ', response);
- console.log(summary);
- for (let [key, value] of Object.entries(response)) {
- let item = summary.querySelector(`#${key}`);
- if (item) {
- let title = item.querySelector('h4');
- if (title.innerText.includes('%s')) {
- title.innerHTML = title.replace('%s', '<b>'+value+'</b>');
- } else {
- item.querySelector('div').innerHTML = value;
+ // Clean up uploaded files
+ if (window.jvbUploads) {
+ const uploadFields = form.querySelectorAll('[data-upload-field]');
+ for (const field of uploadFields) {
+ const fieldId = window.jvbUploads.determineFieldId(field);
+ await window.jvbUploads.clearFieldFromStores(fieldId);
}
}
+
+ } catch (error) {
+ console.error('Form submission error:', error);
+ this.controller.showFormStatus(formId, 'error');
+ this.controller.handleFormError(form, {
+ message: 'Network error. Please check your connection and try again.',
+ code: 'network_error'
+ });
+ } finally {
+ await this.controller.store.delete(formId);
}
- block.append(summary);
}
}
-document.addEventListener('DOMContentLoaded', function() {
- new FormBlock();
+document.addEventListener('DOMContentLoaded', async function() {
+ window.auth.subscribe(event => {
+ if (event === 'auth-loaded') {
+ new FormBlock();
+ }
+ });
});
--
Gitblit v1.10.0