From de699440ff94e9c0d8e8b5201ee93179c085bf60 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Thu, 01 Jan 2026 20:51:26 +0000
Subject: [PATCH] =Timeline fields in feedroutes.php

---
 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