Jake Vanderwerf
2026-05-31 d7e7d248cbe41cd7a9ef9c2fb022b6c4831f99a3
build/forms/view.js
@@ -1 +1,116 @@
(()=>{class o{constructor(){this.controller=window.jvbForm,document.querySelectorAll(".jvb-form-block form").forEach(o=>{this.controller.registerForm(o,{cache:!0,autoUpload:!1,imageMeta:!1})}),this.controller.subscribe((o,e)=>{"form-submit"===o&&this.handleFormSubmission(e).then(()=>{})})}async handleFormSubmission(o){const{config:e,data:r}=o,t=e.element,n=new FormData;for(const[o,e]of Object.entries(r))Array.isArray(e)?e.forEach(e=>n.append(`${o}[]`,e)):"object"==typeof e&&null!==e?n.append(o,JSON.stringify(e)):n.append(o,e);if(e.element.querySelectorAll('[name="form_id"],[name="form_type"],[name="timestamp"],[name="cf-turnstile-response"]').forEach(o=>{n.append(o.name,o.value)}),window.jvbUploads)try{(await window.jvbUploads.getFilesForForm(t)).forEach(({file:o,fieldName:e})=>{n.append(`${e}[]`,o)})}catch(o){console.error("Error getting files:",o)}this.controller.showFormStatus(e.id,"uploading");try{const o=await fetch(`${jvbSettings.api}forms`,{method:"POST",credentials:"same-origin",body:n}),a=await o.json();if(!o.ok)return this.controller.showFormStatus(e.id,"error"),void this.controller.handleFormError(t,a);if(this.controller.showFormStatus(e.id,"submitted"),this.controller.showSummary({changes:r,config:e}),window.jvbA11y.announce("Form successfully submitted!"),window.jvbUploads){const o=t.querySelectorAll("[data-upload-field]");for(const e of o){const o=window.jvbUploads.determineFieldId(e);await window.jvbUploads.clearFieldFromStores(o)}}}catch(o){console.error("Form submission error:",o),this.controller.showFormStatus(e.id,"error"),this.controller.handleFormError(t,{message:"Network error. Please check your connection and try again.",code:"network_error"})}finally{await this.controller.store.delete(e.id)}}}document.addEventListener("DOMContentLoaded",async function(){window.auth.subscribe(e=>{"auth-loaded"===e&&new o})})})();
/******/ (() => { // webpackBootstrap
/*!***************************!*\
  !*** ./src/forms/view.js ***!
  \***************************/
/**
 * 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 = window.jvbForm;
    document.querySelectorAll('.jvb-form-block form').forEach(form => {
      this.controller.registerForm(form, {
        cache: true,
        autoUpload: false,
        imageMeta: false
      });
    });
    this.controller.subscribe((event, data) => {
      if (event === 'form-submit') {
        this.handleFormSubmission(data).then(() => {});
      }
    });
  }
  async handleFormSubmission(eventData) {
    const {
      config,
      data
    } = eventData;
    const form = config.element;
    const submitData = new FormData();
    // Add regular form fields
    for (const [key, value] of Object.entries(data)) {
      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);
      }
    }
    config.element.querySelectorAll('[name="form_id"],[name="form_type"],[name="timestamp"],[name="cf-turnstile-response"]').forEach(input => {
      submitData.append(input.name, input.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(config.id, '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(config.id, 'error');
        this.controller.handleFormError(form, result);
        return;
      }
      this.controller.showFormStatus(config.id, 'submitted');
      // this.controller.handleFormSuccess(form, result);
      this.controller.showSummary({
        changes: data,
        config: config
      });
      window.jvbA11y.announce('Form successfully submitted!');
      // 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(config.id, 'error');
      this.controller.handleFormError(form, {
        message: 'Network error. Please check your connection and try again.',
        code: 'network_error'
      });
    } finally {
      await this.controller.store.delete(config.id);
    }
  }
}
document.addEventListener('DOMContentLoaded', async function () {
  window.auth.subscribe(event => {
    if (event === 'auth-loaded') {
      new FormBlock();
    }
  });
});
/******/ })()
;
//# sourceMappingURL=view.js.map