@verbb/formie-browser 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/chunks/{address-finder-CQW81kY0.js → address-finder-BjMuEiwF.js} +2 -2
  3. package/dist/chunks/{bpoint-D8OjLmsn.js → bpoint-KudsBCo2.js} +1 -1
  4. package/dist/chunks/{calculations-BqZsENCq.js → calculations-DlGSkQ3W.js} +2 -2
  5. package/dist/chunks/{captcha-eu-DIa6aUWz.js → captcha-eu-CterYFok.js} +2 -2
  6. package/dist/chunks/{checkbox-radio-BI-UjgMF.js → checkbox-radio-CBvgk3hR.js} +2 -2
  7. package/dist/chunks/{conditions-BVl6jTYo.js → conditions-DYy1-Hwt.js} +189 -163
  8. package/dist/chunks/{date-picker-69TgvErA.js → date-picker-BlD--zfe.js} +2 -2
  9. package/dist/chunks/{eway-1GPxH6DU.js → eway-qwc-B5Us.js} +2 -2
  10. package/dist/chunks/file-upload-CIgHrXfp.js +316 -0
  11. package/dist/chunks/{friendly-captcha-v1-DA2QPKA3.js → friendly-captcha-v1-EDFac33c.js} +1 -1
  12. package/dist/chunks/{friendly-captcha-v2-BorOWiz_.js → friendly-captcha-v2-BDpSvFGR.js} +1 -1
  13. package/dist/chunks/{go-cardless-DwBgERcA.js → go-cardless-DuDMVsnz.js} +1 -1
  14. package/dist/chunks/{google-address-BcTBncyS.js → google-address-Bmjp01pH.js} +77 -58
  15. package/dist/chunks/{hcaptcha-BchdVCqq.js → hcaptcha-BTQ6An6g.js} +2 -2
  16. package/dist/chunks/{hidden-D8RqSPt7.js → hidden-DbPdOxKb.js} +1 -1
  17. package/dist/chunks/{index-C1ZOKiAi.js → index-BcqwpPNE.js} +1261 -1176
  18. package/dist/chunks/{loqate-nXuTX7In.js → loqate-BdNGv93o.js} +2 -2
  19. package/dist/chunks/{mollie-qdCynQCd.js → mollie-DFOjTuGX.js} +1 -1
  20. package/dist/chunks/{moneris-BNEA-laO.js → moneris-BbFfl-EL.js} +1 -1
  21. package/dist/chunks/{opayo-BJtXOkuK.js → opayo-CmgYa9ya.js} +2 -2
  22. package/dist/chunks/{paddle-D72Pa8kr.js → paddle-BUi7w1_o.js} +2 -2
  23. package/dist/chunks/{paypal-Cqt2bned.js → paypal-A-ePfh6k.js} +2 -2
  24. package/dist/chunks/{payway-BjCqsc0H.js → payway-BqFCbhyo.js} +2 -2
  25. package/dist/chunks/{phone-country-K9pYAlzM.js → phone-country-DPMiqk4L.js} +2 -2
  26. package/dist/chunks/{place-kit-Dg6f_UoM.js → place-kit-CX7tamAg.js} +1 -1
  27. package/dist/chunks/{recaptcha-enterprise--VYAeeqz.js → recaptcha-enterprise-DxF6cW95.js} +2 -2
  28. package/dist/chunks/{recaptcha-shared-PSIEEEe1.js → recaptcha-shared-DhGcbiaq.js} +2 -2
  29. package/dist/chunks/{recaptcha-v2-checkbox-atBNe5ml.js → recaptcha-v2-checkbox-R9EfbZ4k.js} +2 -2
  30. package/dist/chunks/{recaptcha-v2-invisible-DnBufNPT.js → recaptcha-v2-invisible-DV9hswAp.js} +2 -2
  31. package/dist/chunks/{recaptcha-v3-CF6O8rDj.js → recaptcha-v3-V0xc-Edh.js} +2 -2
  32. package/dist/chunks/{repeater-CB7Yojvx.js → repeater-DKUT6TGI.js} +2 -2
  33. package/dist/chunks/{rich-text-nAV_SQZo.js → rich-text-SH7KiaKH.js} +1 -1
  34. package/dist/chunks/{scripts-BkAAux0i.js → scripts-D9N2d5rN.js} +1 -1
  35. package/dist/chunks/{shared-DGqeMvcJ.js → shared-BmntPmnW.js} +4 -4
  36. package/dist/chunks/{signature-BT6CsQ6n.js → signature-BA3tQsGT.js} +1 -1
  37. package/dist/chunks/{snaptcha-C7qQo02f.js → snaptcha-DV7p6J9k.js} +1 -1
  38. package/dist/chunks/{square-C5AH3trb.js → square-Bs-ndqYK.js} +2 -2
  39. package/dist/chunks/{stripe-EJK0RyUv.js → stripe-DkZAHxtn.js} +2 -2
  40. package/dist/chunks/{summary-DC_ipXCU.js → summary-Dq2i9TQk.js} +2 -2
  41. package/dist/chunks/{table-BEAI99qo.js → table-Cu4WfVcw.js} +2 -2
  42. package/dist/chunks/{text-limit-Blgq5G-G.js → text-limit-2ycmB-Ae.js} +1 -1
  43. package/dist/chunks/{turnstile-_uCRwnU-.js → turnstile-CId90tRr.js} +2 -2
  44. package/dist/css/theme/forms/_form.css +28 -0
  45. package/dist/index.js +1 -1
  46. package/dist/js/core/create-formie-client.d.ts.map +1 -1
  47. package/dist/js/core/submit-result-state.d.ts.map +1 -1
  48. package/dist/js/modules/address/google-address.d.ts +7 -0
  49. package/dist/js/modules/address/google-address.d.ts.map +1 -1
  50. package/dist/js/modules/fields/conditions/effects.d.ts +3 -1
  51. package/dist/js/modules/fields/conditions/effects.d.ts.map +1 -1
  52. package/dist/js/modules/fields/conditions.d.ts.map +1 -1
  53. package/dist/js/modules/fields/file-upload.d.ts.map +1 -1
  54. package/dist/js/submit/pipeline.d.ts.map +1 -1
  55. package/dist/js/validation/scope.d.ts +6 -0
  56. package/dist/js/validation/scope.d.ts.map +1 -0
  57. package/dist/js/validation/submit-readiness.d.ts +4 -0
  58. package/dist/js/validation/submit-readiness.d.ts.map +1 -0
  59. package/dist/js/validation/validator.d.ts +1 -0
  60. package/dist/js/validation/validator.d.ts.map +1 -1
  61. package/package.json +2 -2
  62. package/src/css/theme/forms/_form.css +28 -0
  63. package/src/js/core/create-formie-client.ts +6 -0
  64. package/src/js/core/submit-result-state.ts +17 -0
  65. package/src/js/modules/address/google-address.ts +33 -1
  66. package/src/js/modules/fields/conditions/effects.ts +79 -2
  67. package/src/js/modules/fields/conditions.ts +53 -11
  68. package/src/js/modules/fields/file-upload.ts +188 -96
  69. package/src/js/submit/pipeline.ts +3 -28
  70. package/src/js/validation/scope.ts +25 -0
  71. package/src/js/validation/submit-readiness.ts +157 -0
  72. package/src/js/validation/validator.ts +4 -0
  73. package/dist/chunks/file-upload-BDZZftgL.js +0 -281
@@ -0,0 +1,25 @@
1
+ export function getFormPages(form: HTMLFormElement): HTMLElement[] {
2
+ return Array.from(form.querySelectorAll('[data-formie-page]')) as HTMLElement[];
3
+ }
4
+
5
+ export function getValidationScope(form: HTMLFormElement): { scope: Element; final: boolean } {
6
+ const pages = getFormPages(form);
7
+
8
+ if (!pages.length) {
9
+ return {
10
+ scope: form,
11
+ final: true,
12
+ };
13
+ }
14
+
15
+ // Multi-page submits validate the visible page until the user reaches the
16
+ // final step, where hidden earlier pages are included again.
17
+ const currentPage = pages.find((page) => {
18
+ return !page.hasAttribute('data-formie-page-hidden');
19
+ }) || pages[pages.length - 1];
20
+
21
+ return {
22
+ scope: currentPage,
23
+ final: currentPage === pages[pages.length - 1],
24
+ };
25
+ }
@@ -0,0 +1,157 @@
1
+ import { getValidationScope } from '#validation/scope';
2
+ import type { FormieValidator } from '#validation/validator';
3
+
4
+ const SUBMIT_VALIDATION_DISABLED_ATTR = 'data-formie-submit-validation-disabled';
5
+ const PRESERVED_DISABLED_ATTR = 'data-formie-preserve-disabled';
6
+ const SUBMIT_READY_ATTR = 'data-formie-submit-ready';
7
+
8
+ function isSubmitReadinessEnabled(form: HTMLFormElement): boolean {
9
+ return form.dataset.formieDisableSubmitUntilValid === 'true';
10
+ }
11
+
12
+ function getPrimarySubmitButtons(form: HTMLFormElement): HTMLButtonElement[] {
13
+ return Array.from(form.querySelectorAll('button[data-formie-action="submit"]')).filter((button): button is HTMLButtonElement => {
14
+ return button instanceof HTMLButtonElement;
15
+ });
16
+ }
17
+
18
+ function isSubmitButtonVisible(button: HTMLButtonElement): boolean {
19
+ return !button.hasAttribute('data-formie-conditionally-hidden')
20
+ && !button.closest('[data-formie-conditionally-hidden]');
21
+ }
22
+
23
+ export function syncSubmitReadiness(form: HTMLFormElement, validator: FormieValidator): void {
24
+ if (!isSubmitReadinessEnabled(form)) {
25
+ return;
26
+ }
27
+
28
+ if (form.getAttribute('data-formie-loading') === 'true') {
29
+ return;
30
+ }
31
+
32
+ const { scope, final } = getValidationScope(form);
33
+ const isReady = validator.isValid(scope, {
34
+ includeHiddenPages: final,
35
+ });
36
+
37
+ form.setAttribute(SUBMIT_READY_ATTR, isReady ? 'true' : 'false');
38
+
39
+ getPrimarySubmitButtons(form).forEach((button) => {
40
+ if (!isSubmitButtonVisible(button)) {
41
+ return;
42
+ }
43
+
44
+ if (isReady) {
45
+ if (!button.hasAttribute(SUBMIT_VALIDATION_DISABLED_ATTR)) {
46
+ return;
47
+ }
48
+
49
+ if (button.hasAttribute(PRESERVED_DISABLED_ATTR)) {
50
+ button.disabled = true;
51
+ button.removeAttribute(PRESERVED_DISABLED_ATTR);
52
+ } else {
53
+ button.disabled = false;
54
+ }
55
+
56
+ button.removeAttribute(SUBMIT_VALIDATION_DISABLED_ATTR);
57
+ return;
58
+ }
59
+
60
+ if (!button.hasAttribute(SUBMIT_VALIDATION_DISABLED_ATTR)) {
61
+ if (button.disabled) {
62
+ button.setAttribute(PRESERVED_DISABLED_ATTR, 'true');
63
+ }
64
+
65
+ button.setAttribute(SUBMIT_VALIDATION_DISABLED_ATTR, 'true');
66
+ }
67
+
68
+ button.disabled = true;
69
+ });
70
+ }
71
+
72
+ export function bindSubmitReadiness(
73
+ form: HTMLFormElement,
74
+ validator: FormieValidator,
75
+ target: Element,
76
+ ): () => void {
77
+ if (!isSubmitReadinessEnabled(form)) {
78
+ return () => {};
79
+ }
80
+
81
+ let syncQueued = false;
82
+
83
+ const scheduleSync = (): void => {
84
+ if (syncQueued) {
85
+ return;
86
+ }
87
+
88
+ syncQueued = true;
89
+
90
+ queueMicrotask(() => {
91
+ syncQueued = false;
92
+ syncSubmitReadiness(form, validator);
93
+ });
94
+ };
95
+
96
+ scheduleSync();
97
+
98
+ const inputHandler = (): void => {
99
+ scheduleSync();
100
+ };
101
+
102
+ form.addEventListener('input', inputHandler, true);
103
+ form.addEventListener('change', inputHandler, true);
104
+
105
+ const resetHandler = (): void => {
106
+ window.setTimeout(() => {
107
+ scheduleSync();
108
+ }, 0);
109
+ };
110
+
111
+ form.addEventListener('reset', resetHandler);
112
+
113
+ const conditionsHandler = (): void => {
114
+ scheduleSync();
115
+ };
116
+
117
+ target.addEventListener('formie:conditions:evaluated', conditionsHandler as EventListener);
118
+
119
+ const observer = new MutationObserver((mutations) => {
120
+ const shouldSync = mutations.some((mutation) => {
121
+ if (mutation.type === 'attributes') {
122
+ const attributeName = mutation.attributeName || '';
123
+
124
+ return attributeName === 'data-formie-page-hidden'
125
+ || attributeName === 'data-formie-conditionally-hidden'
126
+ || attributeName === 'data-formie-loading'
127
+ || attributeName === 'disabled';
128
+ }
129
+
130
+ return mutation.type === 'childList';
131
+ });
132
+
133
+ if (shouldSync) {
134
+ scheduleSync();
135
+ }
136
+ });
137
+
138
+ observer.observe(form, {
139
+ childList: true,
140
+ subtree: true,
141
+ attributes: true,
142
+ attributeFilter: [
143
+ 'data-formie-page-hidden',
144
+ 'data-formie-conditionally-hidden',
145
+ 'data-formie-loading',
146
+ 'disabled',
147
+ ],
148
+ });
149
+
150
+ return () => {
151
+ form.removeEventListener('input', inputHandler, true);
152
+ form.removeEventListener('change', inputHandler, true);
153
+ form.removeEventListener('reset', resetHandler);
154
+ target.removeEventListener('formie:conditions:evaluated', conditionsHandler as EventListener);
155
+ observer.disconnect();
156
+ };
157
+ }
@@ -176,6 +176,10 @@ export class FormieValidator {
176
176
  return this.submitted || this.activated.has(input);
177
177
  }
178
178
 
179
+ isValid(inputOrSelector: Element | null = null, options: ValidateOptions = {}): boolean {
180
+ return this.validate(inputOrSelector, options).length === 0;
181
+ }
182
+
179
183
  validate(inputOrSelector: Element | null = null, options: ValidateOptions = {}): ValidationError[] {
180
184
  this.errors = [];
181
185
 
@@ -1,281 +0,0 @@
1
- import { b as R, r as D, d as K, a as P } from "./shared-DGqeMvcJ.js";
2
- import { e as V } from "./styles-C3aqgtek.js";
3
- import { k as C, l as x, m as O } from "./index-C1ZOKiAi.js";
4
- const B = "@layer formie-theme{.formie-file-input{padding:var(--formie-space-1);line-height:var(--formie-line-height-base);cursor:pointer}.formie-file-input::file-selector-button,.formie-file-input::-webkit-file-upload-button{appearance:none;-webkit-appearance:none;margin-inline-end:var(--formie-space-2);padding:calc(var(--formie-control-padding-y) - 1px) var(--formie-space-2);min-height:calc(var(--formie-control-height) - (var(--formie-space-1) * 2));border:var(--formie-border-width) solid var(--formie-color-border);border-radius:calc(var(--formie-radius-sm) - 1px);background:var(--formie-color-surface-subtle);color:var(--formie-color-heading);font-weight:var(--formie-font-weight-normal);font-size:var(--formie-font-size-xs);line-height:1.1;white-space:nowrap;cursor:pointer;transition:border-color .15s ease,background-color .15s ease,color .15s ease,box-shadow .15s ease}.formie-file-input:hover::file-selector-button,.formie-file-input:hover::-webkit-file-upload-button{border-color:color-mix(in srgb,var(--formie-color-border) 70%,var(--formie-color-heading) 30%);background:var(--formie-color-surface-muted)}.formie-file-input:focus{outline:0}.formie-file-input:focus-visible::file-selector-button,.formie-file-input:focus-visible::-webkit-file-upload-button{border-color:var(--formie-color-focus-ring)}.formie-field-has-error .formie-file-input::file-selector-button,.formie-field-has-error .formie-file-input::-webkit-file-upload-button{border-color:var(--formie-color-danger)}.formie-file-summary{padding:var(--formie-file-summary-padding);gap:var(--formie-gap-file-summary);border:var(--formie-border-width) solid var(--formie-color-border);border-radius:var(--formie-radius-sm)}.formie-file-summary-container{margin:0;padding-left:var(--formie-list-indent)}}", F = 'input[type="file"][data-formie-file-input]', N = C("uploaded"), L = x("reset"), q = "data-formie-file-upload-key", j = "data-formie-file-upload-hydrate-endpoint", b = "data-formie-file-upload-anchor", Y = "data-formie-file-upload-asset-id", $ = [
5
- "fileLimit",
6
- "fileSizeMinLimit",
7
- "fileSizeMaxLimit"
8
- ], U = "file-upload", I = "file-upload";
9
- V(I, [B]);
10
- function A(e) {
11
- return !!e && typeof e == "object" && !Array.isArray(e);
12
- }
13
- function v(e) {
14
- const r = Number(e);
15
- return Number.isInteger(r) && r > 0 ? r : null;
16
- }
17
- function p(e) {
18
- return typeof e == "string" ? e.trim() : "";
19
- }
20
- function J(e) {
21
- return e.getAttribute("data-formie-field-handle")?.trim() || "";
22
- }
23
- function H(e) {
24
- return e.name.endsWith("[]") ? e.name.slice(0, -2) : e.name;
25
- }
26
- function _(e) {
27
- return `${H(e)}[]`;
28
- }
29
- function W(e) {
30
- return e.getAttribute(q)?.trim() || e.getAttribute("data-formie-input-id")?.trim() || "";
31
- }
32
- function w(e) {
33
- return Array.from(e.querySelectorAll('input[type="hidden"]')).filter((r) => r instanceof HTMLInputElement);
34
- }
35
- function k(e, r) {
36
- const t = _(r);
37
- return w(e).filter((i) => i.name === t && i.value.trim() !== "");
38
- }
39
- function G(e, r) {
40
- const t = H(r), i = w(e).find((a) => a.hasAttribute(b) || a.name === t && a.value === "");
41
- if (i)
42
- return i.setAttribute(b, "true"), i.name = t, i.value = "", i;
43
- const n = document.createElement("input");
44
- return n.type = "hidden", n.name = t, n.value = "", n.setAttribute(b, "true"), r.insertAdjacentElement("afterend", n), n;
45
- }
46
- function T(e) {
47
- if (Array.isArray(e))
48
- return null;
49
- const r = v(e);
50
- if (r)
51
- return {
52
- assetId: r,
53
- filename: ""
54
- };
55
- if (!A(e))
56
- return null;
57
- const t = v(e.assetId ?? e.id ?? e.value), i = p(e.filename ?? e.title ?? e.label ?? e.name), n = p(e.url) || null;
58
- return !t && !i ? null : {
59
- assetId: t,
60
- filename: i,
61
- url: n
62
- };
63
- }
64
- function E(e) {
65
- if (!Array.isArray(e)) {
66
- const r = T(e);
67
- return r ? [r] : [];
68
- }
69
- return e.flatMap((r) => {
70
- if (Array.isArray(r))
71
- return E(r);
72
- const t = T(r);
73
- return t ? [t] : [];
74
- });
75
- }
76
- function Q(e) {
77
- return e ? Array.from(e.querySelectorAll("[data-formie-file-summary-item]")).map((r) => ({
78
- assetId: null,
79
- filename: r.textContent?.trim() || ""
80
- })).filter((r) => r.filename !== "") : [];
81
- }
82
- function X(e, r) {
83
- return k(e, r).map((t) => ({
84
- assetId: v(t.value),
85
- filename: ""
86
- })).filter((t) => t.assetId !== null);
87
- }
88
- function Z(e, r) {
89
- return e.length ? e.map((t, i) => ({
90
- assetId: t.assetId,
91
- filename: r[i]?.filename || ""
92
- })) : r;
93
- }
94
- function z(e) {
95
- return e.map((r) => r.trim().toLowerCase()).filter(Boolean);
96
- }
97
- function ee(e, r) {
98
- const t = z(e.map((n) => n.filename)), i = z(r);
99
- return !t.length || !i.length ? !1 : t.every((n) => i.includes(n));
100
- }
101
- function te(e) {
102
- D(e, U, (r) => {
103
- r.addValidator("fileLimit", ({ input: t }) => {
104
- const i = parseInt(t.getAttribute("data-formie-file-limit") || "", 10);
105
- return t.type !== "file" || !i || !("files" in t) || !t.files?.length ? !0 : t.files.length <= i;
106
- }, ({ input: t, t: i }) => i("Choose up to {files} files.", {
107
- files: t.getAttribute("data-formie-file-limit") || ""
108
- })), r.addValidator("fileSizeMinLimit", ({ input: t }) => {
109
- const n = parseFloat(t.getAttribute("data-formie-size-min-limit") || "") * 1e3 * 1e3;
110
- return t.type !== "file" || !n || !("files" in t) || !t.files?.length ? !0 : Array.from(t.files).every((a) => a.size >= n);
111
- }, ({ input: t, t: i }) => i("File must be larger than {filesize} MB.", {
112
- filesize: t.getAttribute("data-formie-size-min-limit") || ""
113
- })), r.addValidator("fileSizeMaxLimit", ({ input: t }) => {
114
- const n = parseFloat(t.getAttribute("data-formie-size-max-limit") || "") * 1e3 * 1e3;
115
- return t.type !== "file" || !n || !("files" in t) || !t.files?.length ? !0 : Array.from(t.files).every((a) => a.size <= n);
116
- }, ({ input: t, t: i }) => i("File must be smaller than {filesize} MB.", {
117
- filesize: t.getAttribute("data-formie-size-max-limit") || ""
118
- }));
119
- });
120
- }
121
- function re(e) {
122
- P(e, U, $);
123
- }
124
- function M(e, r) {
125
- const t = e.querySelector("[data-formie-file-summary]");
126
- if (t)
127
- return t;
128
- const i = document.createElement("div");
129
- return i.className = "formie-file-summary", i.setAttribute("data-formie-file-summary", "true"), r.insertAdjacentElement("afterend", i), i;
130
- }
131
- function h(e) {
132
- const r = e.pendingFiles.length ? e.pendingFiles : e.uploadedAssets.map((a) => a.filename || (a.assetId ? `Asset #${a.assetId}` : "")).filter(Boolean), t = e.summaryRoot || e.field.querySelector("[data-formie-file-summary]");
133
- if (!r.length) {
134
- t && (t.replaceChildren(), t.hidden = !0), e.summaryRoot = t;
135
- return;
136
- }
137
- const i = t || M(e.field, e.input);
138
- if (!i)
139
- return;
140
- i.hidden = !1, e.summaryRoot = i;
141
- const n = document.createElement("ul");
142
- n.className = "formie-file-summary-container", n.setAttribute("data-formie-file-summary-container", "true"), r.forEach((a) => {
143
- const o = document.createElement("li");
144
- o.className = "formie-file-summary-item", o.setAttribute("data-formie-file-summary-item", "true"), o.textContent = a, n.appendChild(o);
145
- }), i.replaceChildren(n);
146
- }
147
- function S(e, r, t) {
148
- let n = G(e, r);
149
- const a = _(r);
150
- k(e, r).forEach((o) => {
151
- o.remove();
152
- }), t.forEach((o) => {
153
- if (!o.assetId)
154
- return;
155
- const s = document.createElement("input");
156
- s.type = "hidden", s.name = a, s.value = String(o.assetId), s.setAttribute(Y, "true"), n.insertAdjacentElement("afterend", s), n = s;
157
- }), r.value = "";
158
- }
159
- async function ie(e, r, t) {
160
- const i = t.map((l) => l.assetId).filter((l) => l !== null);
161
- if (!i.length)
162
- return t;
163
- const n = r.getAttribute(j)?.trim() || "/actions/formie/file-upload/hydrate", a = new FormData();
164
- i.forEach((l) => {
165
- a.append("assetIds[]", String(l));
166
- });
167
- const o = await O(n, {
168
- method: "POST",
169
- body: a
170
- }), s = E(o.assets);
171
- if (!s.length)
172
- return t;
173
- const c = new Map(s.map((l) => [l.assetId, l]));
174
- return t.map((l) => {
175
- if (!l.assetId || !c.has(l.assetId))
176
- return l;
177
- const f = c.get(l.assetId);
178
- return {
179
- assetId: l.assetId,
180
- filename: f.filename || l.filename,
181
- url: f.url ?? l.url
182
- };
183
- });
184
- }
185
- function ne(e, r) {
186
- const t = e.detail;
187
- if (!A(t))
188
- return [];
189
- const i = p(t.fieldHandle), n = p(t.inputKey), a = p(t.inputName ?? t.name), o = A(t.data) ? t.data : null, s = p(o?.fieldHandle), c = p(o?.inputKey), l = p(o?.inputName ?? o?.name), f = [];
190
- let y = !1, g = !1, u = !1;
191
- if (n !== "" && n === r.inputKey && (y = !0, f.push(t.assets, t.assetIds, t.data)), a !== "" && a === r.inputName && (g = !0, f.push(t.assets, t.assetIds, t.data)), i === r.fieldHandle && (u = !0, f.push(t.assets, t.assetIds, t.data)), o) {
192
- const d = [
193
- o.assets,
194
- o.assetIds,
195
- o.uploadedAssets,
196
- o.data
197
- ];
198
- c !== "" && c === r.inputKey && (y = !0, f.push(...d)), l !== "" && l === r.inputName && (g = !0, f.push(...d)), s === r.fieldHandle && (u = !0, f.push(...d));
199
- }
200
- [t.assets, t.assetIds, t.data].forEach((d) => {
201
- A(d) && (r.inputKey && r.inputKey in d && (y = !0, f.push(d[r.inputKey])), r.inputName in d && (g = !0, f.push(d[r.inputName])), r.fieldHandle in d && f.push(d[r.fieldHandle]));
202
- });
203
- for (const d of f) {
204
- const m = E(d);
205
- if (m.length && (y || g || u || ee(m, r.pendingFiles)))
206
- return m;
207
- }
208
- return [];
209
- }
210
- const le = {
211
- id: I,
212
- kind: "field",
213
- match: (e) => !!e.target.querySelector(F),
214
- setup: async (e) => {
215
- const r = R(e), t = r || e.target, i = Array.from(t.querySelectorAll(F)).filter((o) => o instanceof HTMLInputElement), n = e.form;
216
- te(n);
217
- const a = i.map((o) => {
218
- if (!(r instanceof HTMLElement))
219
- return () => {
220
- };
221
- const s = {
222
- field: r,
223
- input: o,
224
- summaryRoot: M(r, o),
225
- uploadedAssets: Z(
226
- X(r, o),
227
- Q(r.querySelector("[data-formie-file-summary]"))
228
- ),
229
- pendingFiles: [],
230
- hydrationToken: 0
231
- }, c = () => {
232
- s.pendingFiles = Array.from(o.files || []).map((u) => u.name), h(s);
233
- }, l = async (u) => {
234
- s.hydrationToken += 1;
235
- const d = s.hydrationToken;
236
- s.pendingFiles = [], s.uploadedAssets = u, S(r, o, u), h(s);
237
- try {
238
- const m = await ie(r, o, u);
239
- if (d !== s.hydrationToken)
240
- return;
241
- s.uploadedAssets = m, h(s), K(r, I, "uploaded-assets-sync", {
242
- fileUpload: r,
243
- assets: m
244
- });
245
- } catch (m) {
246
- console.error("[formie] Failed to hydrate uploaded file details.", m);
247
- }
248
- }, f = () => {
249
- s.hydrationToken += 1, s.pendingFiles = [], s.uploadedAssets = [], S(r, o, []), h(s);
250
- }, y = (u) => {
251
- const d = J(r);
252
- if (!d)
253
- return;
254
- const m = ne(u, {
255
- fieldHandle: d,
256
- inputKey: W(o),
257
- inputName: o.name,
258
- pendingFiles: s.pendingFiles
259
- });
260
- m.length && l(m);
261
- }, g = () => {
262
- f();
263
- };
264
- return o.addEventListener("change", c), n?.addEventListener(N, y), n?.addEventListener(L, g), h(s), () => {
265
- o.removeEventListener("change", c), n?.removeEventListener(N, y), n?.removeEventListener(L, g);
266
- };
267
- });
268
- return await e.emit("formie:module:file-upload:init", {
269
- count: i.length
270
- }), {
271
- destroy: () => {
272
- a.forEach((o) => {
273
- o();
274
- }), re(n), e.emit("formie:module:file-upload:destroy", {});
275
- }
276
- };
277
- }
278
- };
279
- export {
280
- le as fileUploadModule
281
- };