From f16cb88a3218ac7bb32e43f0e0a2542d35c7a01b Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Wed, 17 Jun 2026 00:28:16 +0000
Subject: [PATCH] =Working on the Options Meta still. Group fields also needed some changes
---
assets/js/concise/FormController.js | 131 ++++++++++++++++++++++++++++++++-----------
1 files changed, 96 insertions(+), 35 deletions(-)
diff --git a/assets/js/concise/FormController.js b/assets/js/concise/FormController.js
index 19e4a81..617c3a6 100644
--- a/assets/js/concise/FormController.js
+++ b/assets/js/concise/FormController.js
@@ -210,7 +210,10 @@
let field = key.replace('_tempUpload', '');
if (Object.hasOwn(form.ui.uploads, field)) {
- uploads.push(value);
+ uploads = [
+ ... uploads,
+ ... value
+ ];
}
}
}
@@ -368,7 +371,7 @@
// Dependencies still need checking
if (this.dependencies.has(field.dataset.field)) {
let dependency = this.dependencies.get(field.dataset.field);
- dependency.items.forEach(item => {
+ dependency.forEach(item => {
this.checkFieldDependency(item, field.dataset.field);
});
}
@@ -384,7 +387,7 @@
//Dependencies
if (this.dependencies.has(field.dataset.field)) {
let dependency = this.dependencies.get(field.dataset.field);
- dependency.items.forEach(item => {
+ dependency.forEach(item => {
this.checkFieldDependency(item, field.dataset.field);
});
}
@@ -457,6 +460,10 @@
data: this.changes.get(form.id)?.changes??{},
});
}
+ if (form.options.endpoint) {
+ console.log('Submitting form...');
+ await this.handleServerSave(form, this.collectFormData(form.form));
+ }
}
@@ -483,11 +490,24 @@
});
}
let changes = this.changes.get(form.id);
- changes.changes[name] = value;
+ //If it is temporary uploads, we need to store them all
+ if (name.includes('_tempUpload')) {
+ if (!Object.hasOwn(changes.changes, name)) {
+ changes.changes[name] = [];
+ }
+ changes.changes[name].push(value);
+ } else {
+ changes.changes[name] = value;
+ }
+
this.changes.set(form.id, changes);
if (form.options.cache) {
this.scheduleBackup();
}
+
+ if (form.options.endpoint) {
+ this.scheduleServerSave(form, changes);
+ }
}
scheduleBackup() {
@@ -543,6 +563,37 @@
this.changes.delete(formId);
}
+ scheduleServerSave(form, changes){
+
+ window.debouncer.schedule(
+ `form_${form.id}_server_save`,
+ async () => {
+ await this.handleServerSave(form, changes);
+ },
+ 1500
+ );
+ }
+ cancelServerSave(formId) {
+ window.debouncer.cancel(`form_${formId}_server_save`);
+ }
+ async handleServerSave(form, changes) {
+ this.cancelServerSave(form.id);
+
+ if (window.jvbQueue) {
+ changes.user = window.auth.getUser();
+ window.jvbQueue.addToQueue({
+ endpoint: form.options.endpoint,
+ data: changes,
+ headers: form.options.headers??{},
+ });
+ } else {
+ await window.auth.fetch(jvbBase.api+form.options.endpoint, {
+ body: changes,
+ headers: form.options.headers??{},
+ });
+ }
+ }
+
/**
* Register a form for handling
@@ -550,6 +601,18 @@
* @param {object} options
*/
registerForm(form, options) {
+ options = {
+ autoUpload: false,
+ imageMeta: true,
+ delay: 1500,
+ endpoint: Object.hasOwn(form.dataset, 'save') ? form.dataset.save: '',
+ showStatus: true,
+ showSummary: false,
+ cache: true,
+ ignore: [],
+ ... options
+ };
+
//Bail if form already registered
if (Object.hasOwn(form.dataset, 'formId') && this.forms.has(form.dataset.formId)) return;
@@ -564,22 +627,17 @@
element: form,
id: formId,
status: '',
- options: {
- autoUpload: options.autoUpload??false,
- imageMeta: options.imageMeta??true,
- delay: options.delay??1500,
- endpoint: options.save??form.dataset.save??'',
- showStatus: options.showStatus??true,
- showSummary: options.showSummary??false,
- cache: options.cache??true,
- ignore: options.ignore??[]
- },
+ options: options,
ui: window.uiFromSelectors(this.selectors.forms, form)
};
+ config.ui.fields = {};
+ form.querySelectorAll('[data-field]').forEach((field) => {
+ config.ui.fields[field.dataset.field] = field;
+ });
+
this.initializeFields(form, config);
this.forms.set(formId, config);
-
return config;
}
clearForm(formId) {
@@ -603,10 +661,10 @@
}
// Clean up dependencies for this form
this.dependencies.forEach((dependency, fieldName) => {
- dependency.items = dependency.items.filter(item => item.form !== formId);
+ dependency = dependency.filter(item => item.form !== formId);
// Remove the dependency entry entirely if no items left
- if (dependency.items.length === 0) {
+ if (dependency.length === 0) {
this.dependencies.delete(fieldName);
}
});
@@ -1133,38 +1191,41 @@
const requiredValue = field.dataset.dependsValue;
const operator = field.dataset.dependsOperatior??'==';
+ let formData = this.forms.get(form.dataset.formId);
+
if (!this.dependencies.has(dependsOn)) {
- let element = document.querySelector(`[field="${dependsOn}"]`);
- if (element) {
- this.dependencies.set(dependsOn, {
- element: element,
- items: []
- });
+ if (Object.hasOwn(formData.ui.fields, dependsOn)) {
+ this.dependencies.set(dependsOn, []);
}
}
let dependency = this.dependencies.get(dependsOn);
- dependency.items.push({
- field: field,
- form: form.dataset.formId,
- requiredValue: requiredValue,
- operator: operator
- });
- this.dependencies.set(dependsOn, dependency);
- this.checkFieldDependency(dependency, dependsOn);
+ if (dependency) {
+ dependency.push({
+ field: field,
+ form: form.dataset.formId,
+ requiredValue: requiredValue,
+ operator: operator
+ });
+ this.dependencies.set(dependsOn, dependency);
+ }
+
+ this.checkFieldDependency(field, dependsOn);
});
}
checkFieldDependency(dependentField, controlFieldName) {
+ const form = this.getForm(dependentField);
const controlField = this.dependencies.get(controlFieldName);
if (!controlField) return;
- const controlValue = this.getFieldCheckedValue(controlField.element);
+
+ const controlValue = this.getFieldValue(form.ui.fields[controlFieldName]);
const shouldShow = this.evaluateCondition(
controlValue,
- dependentField.requiredValue,
- dependentField.operator
+ dependentField.dataset.dependsValue,
+ dependentField.dataset.dependsOperatior
);
- this.toggleFieldVisibility(dependentField.field, shouldShow);
+ this.toggleFieldVisibility(dependentField, shouldShow);
}
evaluateCondition(value, requiredValue, operator) {
const fieldStr = String(value || '');
--
Gitblit v1.10.0