From b0194e10a87e16797a568d8a30d53ebecd27d8a4 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sat, 18 Oct 2025 15:04:51 +0000
Subject: [PATCH] =DataStore.js and UploaderManager.js overhaul
---
assets/js/concise/FormController.js | 81 +++++++++++++++++++++++++---------------
1 files changed, 50 insertions(+), 31 deletions(-)
diff --git a/assets/js/concise/FormController.js b/assets/js/concise/FormController.js
index eea0597..6663484 100644
--- a/assets/js/concise/FormController.js
+++ b/assets/js/concise/FormController.js
@@ -3,11 +3,20 @@
* Works with DataStore for CRUD operations and standalone for front-end forms
*/
class FormController {
- constructor(store = null) {
- this.store = store; // Optional - for CRUD operations
- if (!store) {
- this.store = new window.jvbStore({name:'forms', TTL: 604800});
- }
+ constructor() {
+ this.store = new window.jvbStore({
+ name:'forms',
+ storeName: 'forms',
+ keyPath: 'formId',
+ indexes: [
+ { name: 'status', keyPath: 'status' },
+ { name: 'operationId', keyPath: 'operationId' },
+ { name: 'timestamp', keyPath: 'timestamp' },
+ { name: 'formType', keyPath: 'type' }
+ ],
+ TTL: 604800000, //7 days
+ });
+
this.debouncer = window.debouncer;
this.ignore = [];
@@ -52,21 +61,38 @@
// Check for pending operations on page load
await this.checkPendingOperations();
+ this.store.subscribe(this.handleStoreEvent.bind(this));
+
// Set up global form handlers for standalone forms
this.initListeners();
}
+ handleStoreEvent(event, data) {
+ switch(event) {
+ case 'item-saved':
+ if (data.item.status === 'autosave') {
+ this.showFormStatus(data.item.formId, 'autosave');
+ }
+ break;
+ case 'data-loaded':
+
+ break;
+ }
+ }
+
/**
* Check for pending operations from previous session
*/
async checkPendingOperations() {
- if (!this.store) return;
- try {
- let pending = this.store.getAllForms();
+ const pendingForms = await this.store.query('status', 'pending');
- } catch (error) {
- console.error('Failed to load pending forms:', error);
- }
+ if (pendingForms.length === 0) return;
+
+ // Group by form type or page
+ const grouped = this.groupPendingForms(pendingForms);
+
+ // Show consolidated notification
+ this.showPendingNotification(grouped);
}
/**
@@ -121,7 +147,7 @@
* Discard pending form data
*/
async discardPendingForm(formId) {
- this.store.clearForm(formId);
+ this.store.delete(formId);
if (window.jvbA11y) {
window.jvbA11y.announce('Previous changes discarded');
@@ -485,16 +511,18 @@
/**
* Initialize image upload fields
*/
- initImageUploadFields() {
- window.jvbUploads.scanFields();
+ initImageUploadFields(form) {
+ window.jvbUploads.scanFields(form);
}
/* ========== Event Handlers ========== */
handleSubmit(event) {
+ //TODO: submit data, if successful, delete from store
if (this.subscribers.size > 0 ){
const form = event.target;
if (!form.dataset.formId) return;
+ this.store.delete(form.dataset.formId);
event.preventDefault();
@@ -629,7 +657,6 @@
* Get appropriate delay based on field type and context
*/
getDelayForField(field) {
- console.log('Get Delay for Field', field);
// Text fields get longer delay for typing
if (field.type === 'text' || field.type === 'textarea') {
return this.autoSaveDefaults.typingDelay;
@@ -665,7 +692,14 @@
async autosave(formConfig) {
const formData = this.collectFormData(formConfig.element);
- this.cacheFormData(formConfig, formData);
+
+ await this.store.save({
+ formId: formConfig.id,
+ data: formData,
+ status: 'draft',
+ timestamp: Date.now()
+ });
+ this.showFormStatus(formConfig.id, 'saved');
// Get only changed fields
const changes = this.getChangedFields(formConfig.data, formData);
@@ -691,20 +725,6 @@
});
}
- cacheFormData(formConfig, formData) {
- try {
- this.store.storeForm(formConfig.id, {
- formId: formConfig.id,
- formData: formData,
- timestamp: Date.now(),
- status: 'pending',
- operationId: null
- });
- } catch (error) {
- console.error('Failed to cache form data:', error);
- }
- }
-
/**
* Check if form has unsaved changes
*/
@@ -971,7 +991,6 @@
cleanupForm(formId) {
const formConfig = this.forms.get(formId);
if (!formConfig) return;
- console.log('Cleaning up form', formConfig);
// Check for unsaved changes
if (this.hasUnsavedChanges(formId)) {
--
Gitblit v1.10.0