Jake Vanderwerf
10 days ago 97e7c319d656a5f05489ca996e249e7359303d4d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/******/ (() => { // 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