Jake Vanderwerf
5 days ago 0dfe1d8afafc59c4a5559c498342668d5a58d6ef
assets/js/concise/FormController.js
@@ -490,6 +490,7 @@
         e.preventDefault();
         console.log('Submitting form...', this.changes.get(form.id)?.changes ?? {});
         await this.handleServerSave(form, this.changes.get(form.id)?.changes ?? {});
      }
      if (form.options.showSummary) {
@@ -668,18 +669,69 @@
      this.cancelServerSave(form.id);
      if (form.useQueue && window.jvbQueue) {
         changes.user = window.auth.getUser();
         // changes.user = window.auth.getUser();
         window.jvbQueue.addToQueue({
            endpoint: form.options.endpoint,
            data: changes,
            headers: form.options.headers??{},
         });
      } else {
         await window.auth.fetch(jvbSettings.api+form.options.endpoint, {
            body: changes,
            headers: form.options.headers??{},
            method: 'POST',
         });
         try {
            let response = await window.auth.fetch(jvbSettings.api+form.options.endpoint, {
               body: changes,
               headers: form.options.headers??{},
               method: 'POST',
            });
            if (!response.ok) {
               let errorDetails;
               try {
                  // Attempt to parse the server's error payload as JSON
                  errorDetails = await response.json();
               } catch {
                  // Fallback if the error response isn't JSON (e.g., HTML error page)
                  errorDetails = { message: response.statusText || 'Unknown HTTP error' };
               }
               this.notify('form-error', {
                  config: form,
                  data: errorDetails
               });
               return;
            }
            let result = await response.json();
            this.notify('form-success', {
               config: form,
               result: result
            });
         } catch (error) {
            if (error.status) {
               this.notify('form-error', {
                  config: form,
                  data: error
               });
               // This is an HTTP error thrown manually (e.g., 404, 500)
            } else if (error instanceof SyntaxError) {
               this.notify('form-error', {
                  config: form,
                  data: {
                     status: 'error',
                     success: false,
                     message: 'Something went wrong'
                  }
               });
               // This happens if response.json() fails on a successful 200 OK response
               console.error('Data Error: Server returned invalid JSON format.');
            } else {
               this.notify('form-error', {
                  config: form,
                  data: {
                     status: 'network_error',
                     message: 'Network error: could not connect to the server'
                  }
               });
            }
         }
      }
   }
@@ -710,6 +762,9 @@
      if (!Object.hasOwn(form.dataset, 'formId')) {
         form.dataset.formId = window.generateID('form_');
      }
      if (Object.hasOwn(form.dataset, 'action')) {
         options.headers = window.auth.getHeader(form.dataset.action);
      }
      const formId = form.dataset.formId;
      this.addFormListeners(form);
@@ -845,7 +900,7 @@
               p: 'p',
            },
            setup({ el, refs, manyRefs, data }) {
               const skipFields = ['sendAll', ...data.config.options.ignore??[]];
               const skipFields = ['sendAll', ...data?.config?.options?.ignore??[]];
               for (let [key, value] of Object.entries(data.changes)) {
                  if (skipFields.includes(key) || form.isEmptyValue(value)) continue;
@@ -899,8 +954,6 @@
               }
               refs.result?.remove();
               data.config.element.after(el);
               window.fade(data.config.element, false);
            }
         }
      );
@@ -2307,6 +2360,9 @@
   window.auth.subscribe(event => {
      if (event === 'auth-loaded') {
         window.jvbForm = new FormController();
         document.querySelectorAll('form[data-auto]').forEach(form => {
            window.jvbForm.registerForm(form, {});
         });
      }
   });
});