@verbb/formie-browser 1.0.0 → 1.0.2
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.
- package/CHANGELOG.md +16 -0
- package/dist/chunks/address-finder-CQW81kY0.js +37 -0
- package/dist/chunks/bpoint-D8OjLmsn.js +26 -0
- package/dist/chunks/calculations-BqZsENCq.js +147 -0
- package/dist/chunks/captcha-eu-DIa6aUWz.js +34 -0
- package/dist/chunks/checkbox-radio-BI-UjgMF.js +136 -0
- package/dist/chunks/conditions-BVl6jTYo.js +433 -0
- package/dist/chunks/date-picker-69TgvErA.js +4994 -0
- package/dist/chunks/eway-1GPxH6DU.js +74 -0
- package/dist/chunks/file-upload-BDZZftgL.js +281 -0
- package/dist/chunks/friendly-captcha-v1-DA2QPKA3.js +33 -0
- package/dist/chunks/friendly-captcha-v2-BorOWiz_.js +38 -0
- package/dist/chunks/go-cardless-DwBgERcA.js +24 -0
- package/dist/chunks/google-address-BcTBncyS.js +162 -0
- package/dist/chunks/hcaptcha-BchdVCqq.js +56 -0
- package/dist/chunks/hidden-D8RqSPt7.js +31 -0
- package/dist/chunks/index-BEsfee-D.js +1839 -0
- package/dist/chunks/index-BP7Unm5Y.js +863 -0
- package/dist/chunks/index-C1ZOKiAi.js +4229 -0
- package/dist/chunks/loqate-nXuTX7In.js +55 -0
- package/dist/chunks/mollie-qdCynQCd.js +24 -0
- package/dist/chunks/moneris-BNEA-laO.js +101 -0
- package/dist/chunks/opayo-BJtXOkuK.js +122 -0
- package/dist/chunks/paddle-D72Pa8kr.js +60 -0
- package/dist/chunks/paypal-Cqt2bned.js +100 -0
- package/dist/chunks/payway-BjCqsc0H.js +56 -0
- package/dist/chunks/phone-country-K9pYAlzM.js +3765 -0
- package/dist/chunks/place-kit-Dg6f_UoM.js +42 -0
- package/dist/chunks/placekit-autocomplete.esm-LAwfbPZl.js +1299 -0
- package/dist/chunks/recaptcha-enterprise--VYAeeqz.js +71 -0
- package/dist/chunks/recaptcha-shared-PSIEEEe1.js +15 -0
- package/dist/chunks/recaptcha-v2-checkbox-atBNe5ml.js +41 -0
- package/dist/chunks/recaptcha-v2-invisible-DnBufNPT.js +59 -0
- package/dist/chunks/recaptcha-v3-CF6O8rDj.js +28 -0
- package/dist/chunks/repeater-CB7Yojvx.js +124 -0
- package/dist/chunks/rich-text-nAV_SQZo.js +304 -0
- package/dist/chunks/scripts-BkAAux0i.js +36 -0
- package/dist/chunks/sdk-3SicTWby.js +1559 -0
- package/dist/chunks/shared-DGqeMvcJ.js +80 -0
- package/dist/chunks/signature-BT6CsQ6n.js +550 -0
- package/dist/chunks/snaptcha-C7qQo02f.js +8 -0
- package/dist/chunks/square-C5AH3trb.js +46 -0
- package/dist/chunks/stripe-EJK0RyUv.js +202 -0
- package/dist/chunks/styles-C3aqgtek.js +21 -0
- package/dist/chunks/summary-DC_ipXCU.js +126 -0
- package/dist/chunks/table-BEAI99qo.js +95 -0
- package/dist/chunks/text-limit-Blgq5G-G.js +135 -0
- package/dist/chunks/turnstile-_uCRwnU-.js +59 -0
- package/dist/chunks/utils-BntI3W4S.js +6149 -0
- package/dist/index.js +39 -3205
- package/package.json +5 -5
- package/src/js/modules/fields/file-upload.ts +1 -1
- package/src/js/modules/fields/repeater.ts +1 -1
- package/src/js/modules/fields/rich-text.ts +2 -2
- package/src/js/modules/fields/signature.ts +1 -1
- package/src/js/modules/fields/summary.ts +1 -1
- package/src/js/modules/fields/table.ts +1 -1
- package/src/js/modules/fields/text-limit.ts +1 -1
- package/src/js/modules/payments/paypal.ts +1 -1
- package/src/js/modules/payments/payway.ts +1 -1
- package/src/js/modules/payments/stripe.ts +1 -1
- package/dist/chunks/address-finder-DfMCiW89.js +0 -47
- package/dist/chunks/api-CbqEMQT5.js +0 -181
- package/dist/chunks/api-DE7LfK-R.js +0 -960
- package/dist/chunks/api-DOfDzYC_.js +0 -538
- package/dist/chunks/async-B3DUf1GZ.js +0 -26
- package/dist/chunks/bpoint-Ciy3yY9Q.js +0 -34
- package/dist/chunks/calculations-CkYAqO_-.js +0 -197
- package/dist/chunks/captcha-eu-DnOWhMwr.js +0 -43
- package/dist/chunks/checkbox-radio-0x7Tc0br.js +0 -197
- package/dist/chunks/chunk-K6L4z4UQ.js +0 -24
- package/dist/chunks/conditions-4fXKhEJS.js +0 -609
- package/dist/chunks/date-picker-B6iZkjHS.js +0 -6204
- package/dist/chunks/debug-KnZeKYBI.js +0 -39
- package/dist/chunks/dist-D09GnXMW.js +0 -2663
- package/dist/chunks/event-names-DamGPtXR.js +0 -51
- package/dist/chunks/eway-DEAYcwT0.js +0 -86
- package/dist/chunks/field-references.keys-BpBZ_quS.js +0 -24
- package/dist/chunks/field-references.resolver-Ba6xhiJC.js +0 -183
- package/dist/chunks/file-upload-Bh63PQSE.js +0 -430
- package/dist/chunks/friendly-captcha-v1-CqO4WVre.js +0 -40
- package/dist/chunks/friendly-captcha-v2-CyykcJcM.js +0 -47
- package/dist/chunks/friendly-challenge-Dg8XkStd.js +0 -1101
- package/dist/chunks/go-cardless-CuND59rR.js +0 -26
- package/dist/chunks/google-address--uR8WDSm.js +0 -208
- package/dist/chunks/hcaptcha-CmaFUesv.js +0 -72
- package/dist/chunks/hidden-CYnZYple.js +0 -36
- package/dist/chunks/http-18nn97DZ.js +0 -29
- package/dist/chunks/i18n-vUh-KGiH.js +0 -55
- package/dist/chunks/loqate-BICNJlVK.js +0 -97
- package/dist/chunks/mollie-DwlsgHZ1.js +0 -26
- package/dist/chunks/moneris-B_IFZFTx.js +0 -159
- package/dist/chunks/opayo-U2x_TOII.js +0 -192
- package/dist/chunks/paddle-BqXFrc79.js +0 -75
- package/dist/chunks/paypal-Cn_DYGDb.js +0 -121
- package/dist/chunks/payway-Rnq796eC.js +0 -75
- package/dist/chunks/phone-country-B6Me4lK0.js +0 -3317
- package/dist/chunks/place-kit-ldUl-u9w.js +0 -56
- package/dist/chunks/placekit-autocomplete.esm-D-lGeaZl.js +0 -1771
- package/dist/chunks/recaptcha-enterprise-DPJNyv1X.js +0 -72
- package/dist/chunks/recaptcha-shared-DTI4qWVR.js +0 -22
- package/dist/chunks/recaptcha-v2-checkbox-zFjpvJ5c.js +0 -49
- package/dist/chunks/recaptcha-v2-invisible-CnYtkNvz.js +0 -62
- package/dist/chunks/recaptcha-v3-EAlWhnkX.js +0 -33
- package/dist/chunks/repeater-CXD1eLSn.js +0 -151
- package/dist/chunks/rich-text-DkmZRhGj.js +0 -442
- package/dist/chunks/scripts-BGD_iU_6.js +0 -41
- package/dist/chunks/sdk-B7u9fTlP.js +0 -2103
- package/dist/chunks/shared-DC6_1u8X.js +0 -85
- package/dist/chunks/signature-E9KyYXS1.js +0 -765
- package/dist/chunks/snaptcha-CCDunGeb.js +0 -8
- package/dist/chunks/square-BLqK51rS.js +0 -61
- package/dist/chunks/stripe-B8gHpZNC.js +0 -273
- package/dist/chunks/styles-BIh6g7V_.js +0 -22
- package/dist/chunks/summary-EcNE0cvg.js +0 -191
- package/dist/chunks/table-yxEDL6kA.js +0 -124
- package/dist/chunks/text-limit-D0H_Ca2c.js +0 -179
- package/dist/chunks/theme-classes-vSHpdCUO.js +0 -59
- package/dist/chunks/turnstile-DP0bdR7T.js +0 -68
- package/dist/chunks/utils-ByrEVYrJ.js +0 -49584
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
import { a as getFormStateEventName, i as getFileUploadEventName } from "./event-names-DamGPtXR.js";
|
|
2
|
-
import { t as requestJson } from "./http-18nn97DZ.js";
|
|
3
|
-
import { t as ensureModuleStyles } from "./styles-BIh6g7V_.js";
|
|
4
|
-
import { c as retainFormValidators, i as getModuleFieldTarget, s as releaseFormValidators, t as dispatchFieldEvent } from "./shared-DC6_1u8X.js";
|
|
5
|
-
//#region src/css/theme/fields/_file.css?inline
|
|
6
|
-
var _file_default = "@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{appearance:none;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);white-space:nowrap;cursor:pointer;margin-inline-end:var(--formie-space-2);line-height:1.1;transition:border-color .15s,background-color .15s,color .15s,box-shadow .15s}.formie-file-input::-webkit-file-upload-button{appearance:none;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);white-space:nowrap;cursor:pointer;margin-inline-end:var(--formie-space-2);line-height:1.1;transition:border-color .15s,background-color .15s,color .15s,box-shadow .15s}.formie-file-input:hover::file-selector-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: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{border-color:var(--formie-color-focus-ring)}.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{border-color:var(--formie-color-danger)}.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{padding-left:var(--formie-list-indent);margin:0}}";
|
|
7
|
-
//#endregion
|
|
8
|
-
//#region src/js/modules/fields/file-upload.ts
|
|
9
|
-
var INPUT_SELECTOR = "input[type=\"file\"][data-formie-file-input]";
|
|
10
|
-
var FILE_UPLOAD_EVENT = getFileUploadEventName("uploaded");
|
|
11
|
-
var FORM_RESET_EVENT = getFormStateEventName("reset");
|
|
12
|
-
var FILE_UPLOAD_KEY_ATTR = "data-formie-file-upload-key";
|
|
13
|
-
var HYDRATE_ENDPOINT_ATTR = "data-formie-file-upload-hydrate-endpoint";
|
|
14
|
-
var HIDDEN_INPUT_ANCHOR_ATTR = "data-formie-file-upload-anchor";
|
|
15
|
-
var HIDDEN_INPUT_VALUE_ATTR = "data-formie-file-upload-asset-id";
|
|
16
|
-
var FILE_VALIDATORS = [
|
|
17
|
-
"fileLimit",
|
|
18
|
-
"fileSizeMinLimit",
|
|
19
|
-
"fileSizeMaxLimit"
|
|
20
|
-
];
|
|
21
|
-
var VALIDATOR_SCOPE = "file-upload";
|
|
22
|
-
var MODULE_ID = "file-upload";
|
|
23
|
-
ensureModuleStyles(MODULE_ID, [_file_default]);
|
|
24
|
-
function isRecord(value) {
|
|
25
|
-
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
26
|
-
}
|
|
27
|
-
function toPositiveInt(value) {
|
|
28
|
-
const parsed = Number(value);
|
|
29
|
-
return Number.isInteger(parsed) && parsed > 0 ? parsed : null;
|
|
30
|
-
}
|
|
31
|
-
function toTrimmedString(value) {
|
|
32
|
-
return typeof value === "string" ? value.trim() : "";
|
|
33
|
-
}
|
|
34
|
-
function getFieldHandle(field) {
|
|
35
|
-
return field.getAttribute("data-formie-field-handle")?.trim() || "";
|
|
36
|
-
}
|
|
37
|
-
function getFileValueName(input) {
|
|
38
|
-
return input.name.endsWith("[]") ? input.name.slice(0, -2) : input.name;
|
|
39
|
-
}
|
|
40
|
-
function getUploadedAssetInputName(input) {
|
|
41
|
-
return `${getFileValueName(input)}[]`;
|
|
42
|
-
}
|
|
43
|
-
function getFileUploadKey(input) {
|
|
44
|
-
return input.getAttribute(FILE_UPLOAD_KEY_ATTR)?.trim() || input.getAttribute("data-formie-input-id")?.trim() || "";
|
|
45
|
-
}
|
|
46
|
-
function getHiddenInputs(field) {
|
|
47
|
-
return Array.from(field.querySelectorAll("input[type=\"hidden\"]")).filter((input) => {
|
|
48
|
-
return input instanceof HTMLInputElement;
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
function getUploadedAssetInputs(field, input) {
|
|
52
|
-
const assetInputName = getUploadedAssetInputName(input);
|
|
53
|
-
return getHiddenInputs(field).filter((hiddenInput) => {
|
|
54
|
-
return hiddenInput.name === assetInputName && hiddenInput.value.trim() !== "";
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
function ensureUploadedAssetAnchor(field, input) {
|
|
58
|
-
const anchorName = getFileValueName(input);
|
|
59
|
-
const existingAnchor = getHiddenInputs(field).find((hiddenInput) => {
|
|
60
|
-
return hiddenInput.hasAttribute(HIDDEN_INPUT_ANCHOR_ATTR) || hiddenInput.name === anchorName && hiddenInput.value === "";
|
|
61
|
-
});
|
|
62
|
-
if (existingAnchor) {
|
|
63
|
-
existingAnchor.setAttribute(HIDDEN_INPUT_ANCHOR_ATTR, "true");
|
|
64
|
-
existingAnchor.name = anchorName;
|
|
65
|
-
existingAnchor.value = "";
|
|
66
|
-
return existingAnchor;
|
|
67
|
-
}
|
|
68
|
-
const anchor = document.createElement("input");
|
|
69
|
-
anchor.type = "hidden";
|
|
70
|
-
anchor.name = anchorName;
|
|
71
|
-
anchor.value = "";
|
|
72
|
-
anchor.setAttribute(HIDDEN_INPUT_ANCHOR_ATTR, "true");
|
|
73
|
-
input.insertAdjacentElement("afterend", anchor);
|
|
74
|
-
return anchor;
|
|
75
|
-
}
|
|
76
|
-
function normalizeUploadedAsset(candidate) {
|
|
77
|
-
if (Array.isArray(candidate)) return null;
|
|
78
|
-
const directId = toPositiveInt(candidate);
|
|
79
|
-
if (directId) return {
|
|
80
|
-
assetId: directId,
|
|
81
|
-
filename: ""
|
|
82
|
-
};
|
|
83
|
-
if (!isRecord(candidate)) return null;
|
|
84
|
-
const assetId = toPositiveInt(candidate.assetId ?? candidate.id ?? candidate.value);
|
|
85
|
-
const filename = toTrimmedString(candidate.filename ?? candidate.title ?? candidate.label ?? candidate.name);
|
|
86
|
-
const url = toTrimmedString(candidate.url) || null;
|
|
87
|
-
if (!assetId && !filename) return null;
|
|
88
|
-
return {
|
|
89
|
-
assetId,
|
|
90
|
-
filename,
|
|
91
|
-
url
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
function normalizeUploadedAssets(candidate) {
|
|
95
|
-
if (!Array.isArray(candidate)) {
|
|
96
|
-
const singleAsset = normalizeUploadedAsset(candidate);
|
|
97
|
-
return singleAsset ? [singleAsset] : [];
|
|
98
|
-
}
|
|
99
|
-
return candidate.flatMap((entry) => {
|
|
100
|
-
if (Array.isArray(entry)) return normalizeUploadedAssets(entry);
|
|
101
|
-
const asset = normalizeUploadedAsset(entry);
|
|
102
|
-
return asset ? [asset] : [];
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
function readSummaryItems(summaryRoot) {
|
|
106
|
-
if (!summaryRoot) return [];
|
|
107
|
-
return Array.from(summaryRoot.querySelectorAll("[data-formie-file-summary-item]")).map((item) => {
|
|
108
|
-
return {
|
|
109
|
-
assetId: null,
|
|
110
|
-
filename: item.textContent?.trim() || ""
|
|
111
|
-
};
|
|
112
|
-
}).filter((asset) => {
|
|
113
|
-
return asset.filename !== "";
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
function readUploadedAssetsFromHiddenInputs(field, input) {
|
|
117
|
-
return getUploadedAssetInputs(field, input).map((hiddenInput) => {
|
|
118
|
-
return {
|
|
119
|
-
assetId: toPositiveInt(hiddenInput.value),
|
|
120
|
-
filename: ""
|
|
121
|
-
};
|
|
122
|
-
}).filter((asset) => {
|
|
123
|
-
return asset.assetId !== null;
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
function mergeUploadedAssets(assetIds, summaryItems) {
|
|
127
|
-
if (!assetIds.length) return summaryItems;
|
|
128
|
-
return assetIds.map((asset, index) => {
|
|
129
|
-
return {
|
|
130
|
-
assetId: asset.assetId,
|
|
131
|
-
filename: summaryItems[index]?.filename || ""
|
|
132
|
-
};
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
function normalizeFilenameList(filenames) {
|
|
136
|
-
return filenames.map((filename) => {
|
|
137
|
-
return filename.trim().toLowerCase();
|
|
138
|
-
}).filter(Boolean);
|
|
139
|
-
}
|
|
140
|
-
function matchesPendingFiles(uploadedAssets, pendingFiles) {
|
|
141
|
-
const uploadedFilenames = normalizeFilenameList(uploadedAssets.map((asset) => {
|
|
142
|
-
return asset.filename;
|
|
143
|
-
}));
|
|
144
|
-
const normalizedPendingFiles = normalizeFilenameList(pendingFiles);
|
|
145
|
-
if (!uploadedFilenames.length || !normalizedPendingFiles.length) return false;
|
|
146
|
-
return uploadedFilenames.every((filename) => {
|
|
147
|
-
return normalizedPendingFiles.includes(filename);
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
function registerValidators(form) {
|
|
151
|
-
retainFormValidators(form, VALIDATOR_SCOPE, (validator) => {
|
|
152
|
-
validator.addValidator("fileLimit", ({ input }) => {
|
|
153
|
-
const limit = parseInt(input.getAttribute("data-formie-file-limit") || "", 10);
|
|
154
|
-
if (input.type !== "file" || !limit || !("files" in input) || !input.files?.length) return true;
|
|
155
|
-
return input.files.length <= limit;
|
|
156
|
-
}, ({ input, t }) => {
|
|
157
|
-
return t("Choose up to {files} files.", { files: input.getAttribute("data-formie-file-limit") || "" });
|
|
158
|
-
});
|
|
159
|
-
validator.addValidator("fileSizeMinLimit", ({ input }) => {
|
|
160
|
-
const sizeBytes = parseFloat(input.getAttribute("data-formie-size-min-limit") || "") * 1e3 * 1e3;
|
|
161
|
-
if (input.type !== "file" || !sizeBytes || !("files" in input) || !input.files?.length) return true;
|
|
162
|
-
return Array.from(input.files).every((file) => {
|
|
163
|
-
return file.size >= sizeBytes;
|
|
164
|
-
});
|
|
165
|
-
}, ({ input, t }) => {
|
|
166
|
-
return t("File must be larger than {filesize} MB.", { filesize: input.getAttribute("data-formie-size-min-limit") || "" });
|
|
167
|
-
});
|
|
168
|
-
validator.addValidator("fileSizeMaxLimit", ({ input }) => {
|
|
169
|
-
const sizeBytes = parseFloat(input.getAttribute("data-formie-size-max-limit") || "") * 1e3 * 1e3;
|
|
170
|
-
if (input.type !== "file" || !sizeBytes || !("files" in input) || !input.files?.length) return true;
|
|
171
|
-
return Array.from(input.files).every((file) => {
|
|
172
|
-
return file.size <= sizeBytes;
|
|
173
|
-
});
|
|
174
|
-
}, ({ input, t }) => {
|
|
175
|
-
return t("File must be smaller than {filesize} MB.", { filesize: input.getAttribute("data-formie-size-max-limit") || "" });
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
function unregisterValidators(form) {
|
|
180
|
-
releaseFormValidators(form, VALIDATOR_SCOPE, FILE_VALIDATORS);
|
|
181
|
-
}
|
|
182
|
-
function ensureSummaryRoot(field, input) {
|
|
183
|
-
const existingSummary = field.querySelector("[data-formie-file-summary]");
|
|
184
|
-
if (existingSummary) return existingSummary;
|
|
185
|
-
const summary = document.createElement("div");
|
|
186
|
-
summary.className = "formie-file-summary";
|
|
187
|
-
summary.setAttribute("data-formie-file-summary", "true");
|
|
188
|
-
input.insertAdjacentElement("afterend", summary);
|
|
189
|
-
return summary;
|
|
190
|
-
}
|
|
191
|
-
function renderSummary(state) {
|
|
192
|
-
const items = state.pendingFiles.length ? state.pendingFiles : state.uploadedAssets.map((asset) => {
|
|
193
|
-
return asset.filename || (asset.assetId ? `Asset #${asset.assetId}` : "");
|
|
194
|
-
}).filter(Boolean);
|
|
195
|
-
const existingSummary = state.summaryRoot || state.field.querySelector("[data-formie-file-summary]");
|
|
196
|
-
if (!items.length) {
|
|
197
|
-
if (existingSummary) {
|
|
198
|
-
existingSummary.replaceChildren();
|
|
199
|
-
existingSummary.hidden = true;
|
|
200
|
-
}
|
|
201
|
-
state.summaryRoot = existingSummary;
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
const summaryRoot = existingSummary || ensureSummaryRoot(state.field, state.input);
|
|
205
|
-
if (!summaryRoot) return;
|
|
206
|
-
summaryRoot.hidden = false;
|
|
207
|
-
state.summaryRoot = summaryRoot;
|
|
208
|
-
const list = document.createElement("ul");
|
|
209
|
-
list.className = "formie-file-summary-container";
|
|
210
|
-
list.setAttribute("data-formie-file-summary-container", "true");
|
|
211
|
-
items.forEach((filename) => {
|
|
212
|
-
const item = document.createElement("li");
|
|
213
|
-
item.className = "formie-file-summary-item";
|
|
214
|
-
item.setAttribute("data-formie-file-summary-item", "true");
|
|
215
|
-
item.textContent = filename;
|
|
216
|
-
list.appendChild(item);
|
|
217
|
-
});
|
|
218
|
-
summaryRoot.replaceChildren(list);
|
|
219
|
-
}
|
|
220
|
-
function updateUploadedAssetInputs(field, input, uploadedAssets) {
|
|
221
|
-
let insertionPoint = ensureUploadedAssetAnchor(field, input);
|
|
222
|
-
const anchorName = getUploadedAssetInputName(input);
|
|
223
|
-
getUploadedAssetInputs(field, input).forEach((hiddenInput) => {
|
|
224
|
-
hiddenInput.remove();
|
|
225
|
-
});
|
|
226
|
-
uploadedAssets.forEach((asset) => {
|
|
227
|
-
if (!asset.assetId) return;
|
|
228
|
-
const hiddenInput = document.createElement("input");
|
|
229
|
-
hiddenInput.type = "hidden";
|
|
230
|
-
hiddenInput.name = anchorName;
|
|
231
|
-
hiddenInput.value = String(asset.assetId);
|
|
232
|
-
hiddenInput.setAttribute(HIDDEN_INPUT_VALUE_ATTR, "true");
|
|
233
|
-
insertionPoint.insertAdjacentElement("afterend", hiddenInput);
|
|
234
|
-
insertionPoint = hiddenInput;
|
|
235
|
-
});
|
|
236
|
-
input.value = "";
|
|
237
|
-
}
|
|
238
|
-
async function hydrateUploadedAssets(field, input, uploadedAssets) {
|
|
239
|
-
const assetIds = uploadedAssets.map((asset) => {
|
|
240
|
-
return asset.assetId;
|
|
241
|
-
}).filter((assetId) => {
|
|
242
|
-
return assetId !== null;
|
|
243
|
-
});
|
|
244
|
-
if (!assetIds.length) return uploadedAssets;
|
|
245
|
-
const hydrateEndpoint = input.getAttribute(HYDRATE_ENDPOINT_ATTR)?.trim() || "/actions/formie/file-upload/hydrate";
|
|
246
|
-
const body = new FormData();
|
|
247
|
-
assetIds.forEach((assetId) => {
|
|
248
|
-
body.append("assetIds[]", String(assetId));
|
|
249
|
-
});
|
|
250
|
-
const hydratedAssets = normalizeUploadedAssets((await requestJson(hydrateEndpoint, {
|
|
251
|
-
method: "POST",
|
|
252
|
-
body
|
|
253
|
-
})).assets);
|
|
254
|
-
if (!hydratedAssets.length) return uploadedAssets;
|
|
255
|
-
const hydratedMap = new Map(hydratedAssets.map((asset) => {
|
|
256
|
-
return [asset.assetId, asset];
|
|
257
|
-
}));
|
|
258
|
-
return uploadedAssets.map((asset) => {
|
|
259
|
-
if (!asset.assetId || !hydratedMap.has(asset.assetId)) return asset;
|
|
260
|
-
const hydratedAsset = hydratedMap.get(asset.assetId);
|
|
261
|
-
return {
|
|
262
|
-
assetId: asset.assetId,
|
|
263
|
-
filename: hydratedAsset.filename || asset.filename,
|
|
264
|
-
url: hydratedAsset.url ?? asset.url
|
|
265
|
-
};
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
function getUploadedAssetsFromEvent(event, matcher) {
|
|
269
|
-
const detail = event.detail;
|
|
270
|
-
if (!isRecord(detail)) return [];
|
|
271
|
-
const detailFieldHandle = toTrimmedString(detail.fieldHandle);
|
|
272
|
-
const detailInputKey = toTrimmedString(detail.inputKey);
|
|
273
|
-
const detailInputName = toTrimmedString(detail.inputName ?? detail.name);
|
|
274
|
-
const nestedData = isRecord(detail.data) ? detail.data : null;
|
|
275
|
-
const nestedFieldHandle = toTrimmedString(nestedData?.fieldHandle);
|
|
276
|
-
const nestedInputKey = toTrimmedString(nestedData?.inputKey);
|
|
277
|
-
const nestedInputName = toTrimmedString(nestedData?.inputName ?? nestedData?.name);
|
|
278
|
-
const candidates = [];
|
|
279
|
-
let matchedByInputKey = false;
|
|
280
|
-
let matchedByInputName = false;
|
|
281
|
-
let matchedByFieldHandle = false;
|
|
282
|
-
if (detailInputKey !== "" && detailInputKey === matcher.inputKey) {
|
|
283
|
-
matchedByInputKey = true;
|
|
284
|
-
candidates.push(detail.assets, detail.assetIds, detail.data);
|
|
285
|
-
}
|
|
286
|
-
if (detailInputName !== "" && detailInputName === matcher.inputName) {
|
|
287
|
-
matchedByInputName = true;
|
|
288
|
-
candidates.push(detail.assets, detail.assetIds, detail.data);
|
|
289
|
-
}
|
|
290
|
-
if (detailFieldHandle === matcher.fieldHandle) {
|
|
291
|
-
matchedByFieldHandle = true;
|
|
292
|
-
candidates.push(detail.assets, detail.assetIds, detail.data);
|
|
293
|
-
}
|
|
294
|
-
if (nestedData) {
|
|
295
|
-
const nestedAssetCandidates = [
|
|
296
|
-
nestedData.assets,
|
|
297
|
-
nestedData.assetIds,
|
|
298
|
-
nestedData.uploadedAssets,
|
|
299
|
-
nestedData.data
|
|
300
|
-
];
|
|
301
|
-
if (nestedInputKey !== "" && nestedInputKey === matcher.inputKey) {
|
|
302
|
-
matchedByInputKey = true;
|
|
303
|
-
candidates.push(...nestedAssetCandidates);
|
|
304
|
-
}
|
|
305
|
-
if (nestedInputName !== "" && nestedInputName === matcher.inputName) {
|
|
306
|
-
matchedByInputName = true;
|
|
307
|
-
candidates.push(...nestedAssetCandidates);
|
|
308
|
-
}
|
|
309
|
-
if (nestedFieldHandle === matcher.fieldHandle) {
|
|
310
|
-
matchedByFieldHandle = true;
|
|
311
|
-
candidates.push(...nestedAssetCandidates);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
[
|
|
315
|
-
detail.assets,
|
|
316
|
-
detail.assetIds,
|
|
317
|
-
detail.data
|
|
318
|
-
].forEach((value) => {
|
|
319
|
-
if (!isRecord(value)) return;
|
|
320
|
-
if (matcher.inputKey && matcher.inputKey in value) {
|
|
321
|
-
matchedByInputKey = true;
|
|
322
|
-
candidates.push(value[matcher.inputKey]);
|
|
323
|
-
}
|
|
324
|
-
if (matcher.inputName in value) {
|
|
325
|
-
matchedByInputName = true;
|
|
326
|
-
candidates.push(value[matcher.inputName]);
|
|
327
|
-
}
|
|
328
|
-
if (matcher.fieldHandle in value) candidates.push(value[matcher.fieldHandle]);
|
|
329
|
-
});
|
|
330
|
-
for (const candidate of candidates) {
|
|
331
|
-
const uploadedAssets = normalizeUploadedAssets(candidate);
|
|
332
|
-
if (!uploadedAssets.length) continue;
|
|
333
|
-
if (matchedByInputKey || matchedByInputName || matchedByFieldHandle || matchesPendingFiles(uploadedAssets, matcher.pendingFiles)) return uploadedAssets;
|
|
334
|
-
}
|
|
335
|
-
return [];
|
|
336
|
-
}
|
|
337
|
-
var fileUploadModule = {
|
|
338
|
-
id: MODULE_ID,
|
|
339
|
-
kind: "field",
|
|
340
|
-
match: (ctx) => {
|
|
341
|
-
return !!ctx.target.querySelector(INPUT_SELECTOR);
|
|
342
|
-
},
|
|
343
|
-
setup: async (ctx) => {
|
|
344
|
-
const field = getModuleFieldTarget(ctx);
|
|
345
|
-
const scope = field || ctx.target;
|
|
346
|
-
const inputs = Array.from(scope.querySelectorAll(INPUT_SELECTOR)).filter((input) => {
|
|
347
|
-
return input instanceof HTMLInputElement;
|
|
348
|
-
});
|
|
349
|
-
const form = ctx.form;
|
|
350
|
-
registerValidators(form);
|
|
351
|
-
const unbinds = inputs.map((input) => {
|
|
352
|
-
if (!(field instanceof HTMLElement)) return () => {};
|
|
353
|
-
const state = {
|
|
354
|
-
field,
|
|
355
|
-
input,
|
|
356
|
-
summaryRoot: ensureSummaryRoot(field, input),
|
|
357
|
-
uploadedAssets: mergeUploadedAssets(readUploadedAssetsFromHiddenInputs(field, input), readSummaryItems(field.querySelector("[data-formie-file-summary]"))),
|
|
358
|
-
pendingFiles: [],
|
|
359
|
-
hydrationToken: 0
|
|
360
|
-
};
|
|
361
|
-
const syncPendingFiles = () => {
|
|
362
|
-
state.pendingFiles = Array.from(input.files || []).map((file) => {
|
|
363
|
-
return file.name;
|
|
364
|
-
});
|
|
365
|
-
renderSummary(state);
|
|
366
|
-
};
|
|
367
|
-
const syncUploadedAssets = async (uploadedAssets) => {
|
|
368
|
-
state.hydrationToken += 1;
|
|
369
|
-
const hydrationToken = state.hydrationToken;
|
|
370
|
-
state.pendingFiles = [];
|
|
371
|
-
state.uploadedAssets = uploadedAssets;
|
|
372
|
-
updateUploadedAssetInputs(field, input, uploadedAssets);
|
|
373
|
-
renderSummary(state);
|
|
374
|
-
try {
|
|
375
|
-
const hydratedAssets = await hydrateUploadedAssets(field, input, uploadedAssets);
|
|
376
|
-
if (hydrationToken !== state.hydrationToken) return;
|
|
377
|
-
state.uploadedAssets = hydratedAssets;
|
|
378
|
-
renderSummary(state);
|
|
379
|
-
dispatchFieldEvent(field, MODULE_ID, "uploaded-assets-sync", {
|
|
380
|
-
fileUpload: field,
|
|
381
|
-
assets: hydratedAssets
|
|
382
|
-
});
|
|
383
|
-
} catch (error) {
|
|
384
|
-
console.error("[formie] Failed to hydrate uploaded file details.", error);
|
|
385
|
-
}
|
|
386
|
-
};
|
|
387
|
-
const resetUploadedAssets = () => {
|
|
388
|
-
state.hydrationToken += 1;
|
|
389
|
-
state.pendingFiles = [];
|
|
390
|
-
state.uploadedAssets = [];
|
|
391
|
-
updateUploadedAssetInputs(field, input, []);
|
|
392
|
-
renderSummary(state);
|
|
393
|
-
};
|
|
394
|
-
const uploadedAssetHandler = (event) => {
|
|
395
|
-
const fieldHandle = getFieldHandle(field);
|
|
396
|
-
if (!fieldHandle) return;
|
|
397
|
-
const uploadedAssets = getUploadedAssetsFromEvent(event, {
|
|
398
|
-
fieldHandle,
|
|
399
|
-
inputKey: getFileUploadKey(input),
|
|
400
|
-
inputName: input.name,
|
|
401
|
-
pendingFiles: state.pendingFiles
|
|
402
|
-
});
|
|
403
|
-
if (!uploadedAssets.length) return;
|
|
404
|
-
syncUploadedAssets(uploadedAssets);
|
|
405
|
-
};
|
|
406
|
-
const resetHandler = () => {
|
|
407
|
-
resetUploadedAssets();
|
|
408
|
-
};
|
|
409
|
-
input.addEventListener("change", syncPendingFiles);
|
|
410
|
-
form?.addEventListener(FILE_UPLOAD_EVENT, uploadedAssetHandler);
|
|
411
|
-
form?.addEventListener(FORM_RESET_EVENT, resetHandler);
|
|
412
|
-
renderSummary(state);
|
|
413
|
-
return () => {
|
|
414
|
-
input.removeEventListener("change", syncPendingFiles);
|
|
415
|
-
form?.removeEventListener(FILE_UPLOAD_EVENT, uploadedAssetHandler);
|
|
416
|
-
form?.removeEventListener(FORM_RESET_EVENT, resetHandler);
|
|
417
|
-
};
|
|
418
|
-
});
|
|
419
|
-
await ctx.emit("formie:module:file-upload:init", { count: inputs.length });
|
|
420
|
-
return { destroy: () => {
|
|
421
|
-
unbinds.forEach((unbind) => {
|
|
422
|
-
unbind();
|
|
423
|
-
});
|
|
424
|
-
unregisterValidators(form);
|
|
425
|
-
ctx.emit("formie:module:file-upload:destroy", {});
|
|
426
|
-
} };
|
|
427
|
-
}
|
|
428
|
-
};
|
|
429
|
-
//#endregion
|
|
430
|
-
export { fileUploadModule };
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { t as defineCaptchaModule } from "./api-DOfDzYC_.js";
|
|
2
|
-
//#region src/js/modules/captchas/friendly-captcha-v1.ts
|
|
3
|
-
var friendlyCaptchaV1Module = defineCaptchaModule({
|
|
4
|
-
id: "friendly-captcha-v1",
|
|
5
|
-
defaultPlaceholderSelector: "[data-friendly-captcha-placeholder]",
|
|
6
|
-
defaultTokenFieldNames: ["frc-captcha-solution"],
|
|
7
|
-
load: async () => {
|
|
8
|
-
return import("./friendly-challenge-Dg8XkStd.js");
|
|
9
|
-
},
|
|
10
|
-
mount: ({ api, container, provider, services }) => {
|
|
11
|
-
return new api.WidgetInstance(container, {
|
|
12
|
-
sitekey: provider.siteKey || "",
|
|
13
|
-
startMode: provider.startMode || "none",
|
|
14
|
-
language: provider.language || "en",
|
|
15
|
-
solutionFieldName: "frc-captcha-solution",
|
|
16
|
-
doneCallback: (token) => {
|
|
17
|
-
if (typeof token === "string" && token.trim() !== "") services.tokens.write(token.trim());
|
|
18
|
-
services.errors.clear();
|
|
19
|
-
},
|
|
20
|
-
errorCallback: () => {
|
|
21
|
-
services.tokens.clear();
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
},
|
|
25
|
-
screen: async ({ widget, placeholder, services, stageCtx }) => {
|
|
26
|
-
if (services.tokens.has()) return;
|
|
27
|
-
await widget.start();
|
|
28
|
-
if (!await services.tokens.wait()) {
|
|
29
|
-
const message = services.errors.getDefaultMessage();
|
|
30
|
-
services.errors.show(message, placeholder);
|
|
31
|
-
stageCtx.abort(message);
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
unmount: ({ widget, services }) => {
|
|
35
|
-
widget.destroy();
|
|
36
|
-
services.tokens.clear();
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
//#endregion
|
|
40
|
-
export { friendlyCaptchaV1Module };
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { t as defineCaptchaModule } from "./api-DOfDzYC_.js";
|
|
2
|
-
//#region src/js/modules/captchas/friendly-captcha-v2.ts
|
|
3
|
-
var friendlyCaptchaV2Module = defineCaptchaModule({
|
|
4
|
-
id: "friendly-captcha-v2",
|
|
5
|
-
defaultPlaceholderSelector: "[data-friendly-captcha-placeholder]",
|
|
6
|
-
defaultTokenFieldNames: ["frc-captcha-response"],
|
|
7
|
-
load: async () => {
|
|
8
|
-
return import("./sdk-B7u9fTlP.js");
|
|
9
|
-
},
|
|
10
|
-
mount: ({ api, container, provider, services }) => {
|
|
11
|
-
const widget = new api.FriendlyCaptchaSDK().createWidget({
|
|
12
|
-
element: container,
|
|
13
|
-
sitekey: provider.siteKey || "",
|
|
14
|
-
formFieldName: "frc-captcha-response",
|
|
15
|
-
language: provider.language,
|
|
16
|
-
startMode: provider.startMode || "none"
|
|
17
|
-
});
|
|
18
|
-
widget.addEventListener("frc:widget.complete", (event) => {
|
|
19
|
-
const detail = event.detail;
|
|
20
|
-
if (typeof detail?.response === "string" && detail.response.trim() !== "") services.tokens.write(detail.response.trim());
|
|
21
|
-
services.errors.clear();
|
|
22
|
-
});
|
|
23
|
-
widget.addEventListener("frc:widget.expire", () => {
|
|
24
|
-
services.tokens.clear();
|
|
25
|
-
services.errors.clear();
|
|
26
|
-
});
|
|
27
|
-
widget.addEventListener("frc:widget.error", (event) => {
|
|
28
|
-
if (event.detail?.error) services.tokens.clear();
|
|
29
|
-
});
|
|
30
|
-
return widget;
|
|
31
|
-
},
|
|
32
|
-
screen: async ({ widget, placeholder, services, stageCtx }) => {
|
|
33
|
-
if (services.tokens.has()) return;
|
|
34
|
-
widget.start();
|
|
35
|
-
if (!await services.tokens.wait()) {
|
|
36
|
-
const message = services.errors.getDefaultMessage();
|
|
37
|
-
services.errors.show(message, placeholder);
|
|
38
|
-
stageCtx.abort(message);
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
unmount: ({ widget, services }) => {
|
|
42
|
-
widget.destroy();
|
|
43
|
-
services.tokens.clear();
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
//#endregion
|
|
47
|
-
export { friendlyCaptchaV2Module };
|