@oneblink/apps-react 6.11.0-beta.1 → 6.11.0-beta.10
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/dist/OneBlinkFormBase.js +4 -3
- package/dist/OneBlinkFormBase.js.map +1 -1
- package/dist/components/renderer/LookupButton.js +1 -1
- package/dist/components/renderer/LookupButton.js.map +1 -1
- package/dist/components/renderer/attachments/FileCard.js +1 -1
- package/dist/components/renderer/attachments/FileCard.js.map +1 -1
- package/dist/form-elements/FormElementCaptcha.d.ts +1 -1
- package/dist/form-elements/FormElementCaptcha.js +9 -5
- package/dist/form-elements/FormElementCaptcha.js.map +1 -1
- package/dist/form-elements/FormElementFiles.js +1 -1
- package/dist/form-elements/FormElementFiles.js.map +1 -1
- package/dist/form-elements/FormElementSection.js +1 -1
- package/dist/form-elements/FormElementSection.js.map +1 -1
- package/dist/form-elements/OptionButton.js +10 -2
- package/dist/form-elements/OptionButton.js.map +1 -1
- package/dist/hooks/useFormValidation.d.ts +1 -1
- package/dist/hooks/useFormValidation.js +10 -6
- package/dist/hooks/useFormValidation.js.map +1 -1
- package/dist/hooks/usePages.js +1 -1
- package/dist/hooks/usePages.js.map +1 -1
- package/dist/services/form-validation/extensions.d.ts +28 -0
- package/dist/services/form-validation/extensions.js +97 -0
- package/dist/services/form-validation/extensions.js.map +1 -0
- package/dist/services/form-validation/validate-dot-js.d.ts +63 -0
- package/dist/services/form-validation/validate-dot-js.js +328 -0
- package/dist/services/form-validation/validate-dot-js.js.map +1 -0
- package/dist/services/form-validation/validateSubmission.d.ts +11 -0
- package/dist/services/form-validation/validateSubmission.js +503 -0
- package/dist/services/form-validation/validateSubmission.js.map +1 -0
- package/dist/services/form-validation/validators.d.ts +13 -0
- package/dist/services/form-validation/validators.js +70 -0
- package/dist/services/form-validation/validators.js.map +1 -0
- package/dist/services/generateCivicaNameRecordElements.d.ts +1 -1
- package/dist/services/generateCivicaNameRecordElements.js.map +1 -1
- package/dist/styles/option-buttons.scss +5 -0
- package/dist/styles.css +6 -0
- package/dist/styles.scss +1 -0
- package/package.json +3 -3
- package/dist/services/form-validation.d.ts +0 -10
- package/dist/services/form-validation.js +0 -604
- package/dist/services/form-validation.js.map +0 -1
@@ -0,0 +1,503 @@
|
|
1
|
+
import { isEmpty, validators } from './validate-dot-js';
|
2
|
+
import validationExtensions from './extensions';
|
3
|
+
import { checkFileNameExtensionIsValid, checkFileNameIsValid, getCleanRepeatableSetConfiguration, getCleanDateRangeConfiguration, } from './validators';
|
4
|
+
import generateCivicaNameRecordElements from '../generateCivicaNameRecordElements';
|
5
|
+
import generateFreshdeskDependentFieldElements from '../generateFreshdeskDependentFieldElements';
|
6
|
+
import { parseDateValue } from '../generate-default-data';
|
7
|
+
import { localisationService } from '@oneblink/apps';
|
8
|
+
export const RECAPTCHA_OFFLINE_MESSAGE = 'We could not verify you are human while you are offline.';
|
9
|
+
export default function validateSubmission({ elements, submission, formElementsConditionallyShown, executedLookups, captchaType, isOffline, }) {
|
10
|
+
const formElementsValidation = elements.reduce((partialFormElementsValidation, formElement) => {
|
11
|
+
var _a, _b;
|
12
|
+
switch (formElement.type) {
|
13
|
+
// Elements that do not need to be validated
|
14
|
+
case 'summary':
|
15
|
+
case 'calculation':
|
16
|
+
case 'image':
|
17
|
+
case 'html':
|
18
|
+
case 'heading':
|
19
|
+
case 'arcGISWebMap': {
|
20
|
+
return partialFormElementsValidation;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
// If the element is current hidden, we do not need to apply validation
|
24
|
+
const formElementConditionallyShown = formElementsConditionallyShown === null || formElementsConditionallyShown === void 0 ? void 0 : formElementsConditionallyShown[formElement.name];
|
25
|
+
if (formElementConditionallyShown === null || formElementConditionallyShown === void 0 ? void 0 : formElementConditionallyShown.isHidden) {
|
26
|
+
return partialFormElementsValidation;
|
27
|
+
}
|
28
|
+
const value = submission === null || submission === void 0 ? void 0 : submission[formElement.name];
|
29
|
+
switch (formElement.type) {
|
30
|
+
case 'draw': {
|
31
|
+
const errorMessages = [
|
32
|
+
...validationExtensions.presence(value, formElement, 'A saved signature is required'),
|
33
|
+
...validationExtensions.attachment(value),
|
34
|
+
];
|
35
|
+
if (errorMessages.length) {
|
36
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
37
|
+
}
|
38
|
+
break;
|
39
|
+
}
|
40
|
+
case 'camera': {
|
41
|
+
const errorMessages = [
|
42
|
+
...validationExtensions.presence(value, formElement, 'A photo is required'),
|
43
|
+
...validationExtensions.attachment(value),
|
44
|
+
];
|
45
|
+
if (errorMessages.length) {
|
46
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
47
|
+
}
|
48
|
+
break;
|
49
|
+
}
|
50
|
+
case 'captcha': {
|
51
|
+
switch (captchaType) {
|
52
|
+
case 'INVISIBLE':
|
53
|
+
break;
|
54
|
+
case 'CHECKBOX':
|
55
|
+
default: {
|
56
|
+
const errorMessages = [
|
57
|
+
...validationExtensions.offline(isOffline, RECAPTCHA_OFFLINE_MESSAGE),
|
58
|
+
...validationExtensions.presence(value, { ...formElement, required: true }, 'Please complete the CAPTCHA successfully'),
|
59
|
+
];
|
60
|
+
if (errorMessages.length) {
|
61
|
+
partialFormElementsValidation[formElement.name] =
|
62
|
+
errorMessages[0];
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
break;
|
67
|
+
}
|
68
|
+
case 'location': {
|
69
|
+
const errorMessages = [
|
70
|
+
...validationExtensions.presence(value, formElement, 'Please select a location'),
|
71
|
+
...validationExtensions.lookups({
|
72
|
+
formElement,
|
73
|
+
executedLookups,
|
74
|
+
}),
|
75
|
+
];
|
76
|
+
if (errorMessages.length) {
|
77
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
78
|
+
}
|
79
|
+
break;
|
80
|
+
}
|
81
|
+
case 'compliance': {
|
82
|
+
const errorMessages = [
|
83
|
+
...validationExtensions.presence(value, formElement, 'Required'),
|
84
|
+
...validationExtensions.lookups({
|
85
|
+
formElement,
|
86
|
+
executedLookups,
|
87
|
+
}),
|
88
|
+
...validationExtensions.attachments(value),
|
89
|
+
];
|
90
|
+
if (errorMessages.length) {
|
91
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
92
|
+
}
|
93
|
+
break;
|
94
|
+
}
|
95
|
+
case 'checkboxes': {
|
96
|
+
const optionsLength = (formElementConditionallyShown === null || formElementConditionallyShown === void 0 ? void 0 : formElementConditionallyShown.type) === 'formElement' &&
|
97
|
+
(formElementConditionallyShown === null || formElementConditionallyShown === void 0 ? void 0 : formElementConditionallyShown.options)
|
98
|
+
? (_a = formElementConditionallyShown === null || formElementConditionallyShown === void 0 ? void 0 : formElementConditionallyShown.options) === null || _a === void 0 ? void 0 : _a.length
|
99
|
+
: (_b = formElement.options) === null || _b === void 0 ? void 0 : _b.length;
|
100
|
+
const requiredAllDefaultMessage = 'All options are required';
|
101
|
+
const errorMessages = validationExtensions.presence(value, {
|
102
|
+
...formElement,
|
103
|
+
required: !!optionsLength &&
|
104
|
+
(formElement.required || !!formElement.requiredAll),
|
105
|
+
}, formElement.requiredAll ? requiredAllDefaultMessage : 'Required');
|
106
|
+
if (formElement.requiredAll) {
|
107
|
+
errorMessages.push(...validators.length(value, {
|
108
|
+
is: optionsLength,
|
109
|
+
message: formElement.requiredMessage || requiredAllDefaultMessage,
|
110
|
+
}));
|
111
|
+
}
|
112
|
+
errorMessages.push(...validationExtensions.lookups({
|
113
|
+
formElement,
|
114
|
+
executedLookups,
|
115
|
+
}));
|
116
|
+
if (errorMessages.length) {
|
117
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
118
|
+
}
|
119
|
+
break;
|
120
|
+
}
|
121
|
+
case 'abn':
|
122
|
+
case 'geoscapeAddress':
|
123
|
+
case 'pointAddress':
|
124
|
+
case 'googleAddress':
|
125
|
+
case 'civicaStreetName':
|
126
|
+
case 'autocomplete':
|
127
|
+
case 'radio':
|
128
|
+
case 'select':
|
129
|
+
case 'apiNSWLiquorLicence': {
|
130
|
+
const errorMessages = [
|
131
|
+
...validationExtensions.presence(value, formElement, 'Required'),
|
132
|
+
...validationExtensions.lookups({
|
133
|
+
formElement,
|
134
|
+
executedLookups,
|
135
|
+
}),
|
136
|
+
];
|
137
|
+
if (errorMessages.length) {
|
138
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
139
|
+
}
|
140
|
+
break;
|
141
|
+
}
|
142
|
+
case 'boolean': {
|
143
|
+
const errorMessages = [];
|
144
|
+
if (value !== true && formElement.required) {
|
145
|
+
errorMessages.push(formElement.requiredMessage || 'Required');
|
146
|
+
}
|
147
|
+
errorMessages.push(...validationExtensions.lookups({
|
148
|
+
formElement,
|
149
|
+
executedLookups,
|
150
|
+
}));
|
151
|
+
if (errorMessages.length) {
|
152
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
153
|
+
}
|
154
|
+
break;
|
155
|
+
}
|
156
|
+
case 'bsb': {
|
157
|
+
const errorMessages = [
|
158
|
+
...validationExtensions.presence(value, formElement, 'Please enter a BSB number'),
|
159
|
+
...validators.regexValidation(value, {
|
160
|
+
pattern: /\d{3}-\d{3}/,
|
161
|
+
message: 'Please enter a valid BSB number',
|
162
|
+
}),
|
163
|
+
...validationExtensions.lookups({
|
164
|
+
formElement,
|
165
|
+
executedLookups,
|
166
|
+
}),
|
167
|
+
];
|
168
|
+
if (errorMessages.length) {
|
169
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
170
|
+
}
|
171
|
+
break;
|
172
|
+
}
|
173
|
+
case 'barcodeScanner': {
|
174
|
+
const errorMessages = [
|
175
|
+
...validationExtensions.presence(value, formElement, 'Please scan a barcode or enter a value'),
|
176
|
+
...validationExtensions.regex(value, formElement),
|
177
|
+
...validationExtensions.lookups({
|
178
|
+
formElement,
|
179
|
+
executedLookups,
|
180
|
+
}),
|
181
|
+
];
|
182
|
+
if (errorMessages.length) {
|
183
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
184
|
+
}
|
185
|
+
break;
|
186
|
+
}
|
187
|
+
case 'text':
|
188
|
+
case 'textarea': {
|
189
|
+
const errorMessages = [
|
190
|
+
...validationExtensions.presence(value, formElement, 'Please enter a value'),
|
191
|
+
...validators.length(value, {
|
192
|
+
minimum: formElement.minLength,
|
193
|
+
tooShort: 'Please enter a value with at least %{count} character(s)',
|
194
|
+
maximum: formElement.maxLength,
|
195
|
+
tooLong: 'Please enter a value with %{count} character(s) or less',
|
196
|
+
}),
|
197
|
+
...validationExtensions.regex(value, formElement),
|
198
|
+
...validationExtensions.lookups({
|
199
|
+
formElement,
|
200
|
+
executedLookups,
|
201
|
+
}),
|
202
|
+
];
|
203
|
+
if (errorMessages.length) {
|
204
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
205
|
+
}
|
206
|
+
break;
|
207
|
+
}
|
208
|
+
case 'telephone': {
|
209
|
+
const errorMessages = [
|
210
|
+
...validationExtensions.presence(value, formElement, 'Please enter a phone number'),
|
211
|
+
...validationExtensions.regex(value, formElement),
|
212
|
+
...validationExtensions.lookups({
|
213
|
+
formElement,
|
214
|
+
executedLookups,
|
215
|
+
}),
|
216
|
+
];
|
217
|
+
if (errorMessages.length) {
|
218
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
219
|
+
}
|
220
|
+
break;
|
221
|
+
}
|
222
|
+
case 'email': {
|
223
|
+
const errorMessages = [
|
224
|
+
...validationExtensions.presence(value, formElement, 'Please enter an email address'),
|
225
|
+
...validators.email(value, {
|
226
|
+
message: 'Please enter a valid email for this field',
|
227
|
+
}),
|
228
|
+
...validationExtensions.regex(value, formElement),
|
229
|
+
...validationExtensions.lookups({
|
230
|
+
formElement,
|
231
|
+
executedLookups,
|
232
|
+
}),
|
233
|
+
];
|
234
|
+
if (errorMessages.length) {
|
235
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
236
|
+
}
|
237
|
+
break;
|
238
|
+
}
|
239
|
+
case 'time': {
|
240
|
+
const errorMessages = [
|
241
|
+
...validationExtensions.presence(value, formElement, 'Please select a time'),
|
242
|
+
...validationExtensions.lookups({
|
243
|
+
formElement,
|
244
|
+
executedLookups,
|
245
|
+
}),
|
246
|
+
];
|
247
|
+
if (errorMessages.length) {
|
248
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
249
|
+
}
|
250
|
+
break;
|
251
|
+
}
|
252
|
+
case 'date': {
|
253
|
+
const [fromDate, fromDateDaysOffset] = getCleanDateRangeConfiguration({
|
254
|
+
date: formElement.fromDate,
|
255
|
+
daysOffset: formElement.fromDateDaysOffset,
|
256
|
+
referenceFormElementId: formElement.fromDateElementId,
|
257
|
+
}, elements, submission, formElementsConditionallyShown);
|
258
|
+
const [toDate, toDateDaysOffset] = getCleanDateRangeConfiguration({
|
259
|
+
date: formElement.toDate,
|
260
|
+
daysOffset: formElement.toDateDaysOffset,
|
261
|
+
referenceFormElementId: formElement.toDateElementId,
|
262
|
+
}, elements, submission, formElementsConditionallyShown);
|
263
|
+
const errorMessages = [
|
264
|
+
...validationExtensions.presence(value, formElement, 'Please select a date'),
|
265
|
+
...validators.datetime(value, {
|
266
|
+
dateOnly: true,
|
267
|
+
format: (date) => localisationService.formatDate(date),
|
268
|
+
earliest: parseDateValue({
|
269
|
+
dateOnly: true,
|
270
|
+
daysOffset: fromDateDaysOffset,
|
271
|
+
value: fromDate,
|
272
|
+
}),
|
273
|
+
latest: parseDateValue({
|
274
|
+
dateOnly: true,
|
275
|
+
daysOffset: toDateDaysOffset,
|
276
|
+
value: toDate,
|
277
|
+
}),
|
278
|
+
notValid: 'Please select a valid date',
|
279
|
+
tooEarly: 'Date cannot be before %{date}',
|
280
|
+
tooLate: 'Date cannot be after %{date}',
|
281
|
+
}),
|
282
|
+
...validationExtensions.lookups({
|
283
|
+
formElement,
|
284
|
+
executedLookups,
|
285
|
+
}),
|
286
|
+
];
|
287
|
+
if (errorMessages.length) {
|
288
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
289
|
+
}
|
290
|
+
break;
|
291
|
+
}
|
292
|
+
case 'datetime': {
|
293
|
+
const [fromDate, fromDateDaysOffset] = getCleanDateRangeConfiguration({
|
294
|
+
date: formElement.fromDate,
|
295
|
+
daysOffset: formElement.fromDateDaysOffset,
|
296
|
+
referenceFormElementId: formElement.fromDateElementId,
|
297
|
+
}, elements, submission, formElementsConditionallyShown);
|
298
|
+
const [toDate, toDateDaysOffset] = getCleanDateRangeConfiguration({
|
299
|
+
date: formElement.toDate,
|
300
|
+
daysOffset: formElement.toDateDaysOffset,
|
301
|
+
referenceFormElementId: formElement.toDateElementId,
|
302
|
+
}, elements, submission, formElementsConditionallyShown);
|
303
|
+
const errorMessages = [
|
304
|
+
...validationExtensions.presence(value, formElement, 'Please select a date and time'),
|
305
|
+
...validators.datetime(value, {
|
306
|
+
format: (v) => localisationService.formatDatetime(v),
|
307
|
+
earliest: parseDateValue({
|
308
|
+
dateOnly: false,
|
309
|
+
daysOffset: fromDateDaysOffset,
|
310
|
+
value: fromDate,
|
311
|
+
}),
|
312
|
+
latest: parseDateValue({
|
313
|
+
dateOnly: false,
|
314
|
+
daysOffset: toDateDaysOffset,
|
315
|
+
value: toDate,
|
316
|
+
}),
|
317
|
+
notValid: 'Please select a valid date and time',
|
318
|
+
tooEarly: 'Date and time cannot be before %{date}',
|
319
|
+
tooLate: 'Date and time cannot be after %{date}',
|
320
|
+
}),
|
321
|
+
...validationExtensions.lookups({
|
322
|
+
formElement,
|
323
|
+
executedLookups,
|
324
|
+
}),
|
325
|
+
];
|
326
|
+
if (errorMessages.length) {
|
327
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
328
|
+
}
|
329
|
+
break;
|
330
|
+
}
|
331
|
+
case 'number': {
|
332
|
+
let minErrorMessage = 'Please enter a number greater than or equal to %{count}';
|
333
|
+
let maxErrorMessage = 'Please enter a number less than or equal to %{count}';
|
334
|
+
if (typeof formElement.minNumber === 'number' &&
|
335
|
+
typeof formElement.maxNumber === 'number') {
|
336
|
+
minErrorMessage =
|
337
|
+
maxErrorMessage = `Please enter a number between ${formElement.minNumber} and ${formElement.maxNumber}`;
|
338
|
+
}
|
339
|
+
const errorMessages = [
|
340
|
+
...validationExtensions.presence(value, formElement, 'Please enter a number'),
|
341
|
+
...validators.numericality(value, {
|
342
|
+
greaterThanOrEqualTo: formElement.minNumber,
|
343
|
+
notGreaterThanOrEqualTo: minErrorMessage,
|
344
|
+
lessThanOrEqualTo: formElement.maxNumber,
|
345
|
+
notLessThanOrEqualTo: maxErrorMessage,
|
346
|
+
onlyInteger: formElement.isInteger,
|
347
|
+
notInteger: 'Please enter a whole number',
|
348
|
+
notValid: 'Enter enter a valid number',
|
349
|
+
}),
|
350
|
+
];
|
351
|
+
if (formElement.regexPattern &&
|
352
|
+
typeof value === 'number' &&
|
353
|
+
!Number.isNaN(value)) {
|
354
|
+
errorMessages.push(...validationExtensions.regex(value.toString(), formElement));
|
355
|
+
}
|
356
|
+
errorMessages.push(...validationExtensions.lookups({
|
357
|
+
formElement,
|
358
|
+
executedLookups,
|
359
|
+
}));
|
360
|
+
if (errorMessages.length) {
|
361
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
362
|
+
}
|
363
|
+
break;
|
364
|
+
}
|
365
|
+
case 'files': {
|
366
|
+
const errorMessages = [];
|
367
|
+
if (formElement.minEntries) {
|
368
|
+
errorMessages.push(...validators.presence(value, {
|
369
|
+
message: `Please upload at least ${formElement.minEntries} file${formElement.minEntries === 1 ? '' : 's'}`,
|
370
|
+
}));
|
371
|
+
}
|
372
|
+
errorMessages.push(...validators.length(value, {
|
373
|
+
minimum: formElement.minEntries,
|
374
|
+
maximum: formElement.maxEntries,
|
375
|
+
tooLong: 'Cannot upload more than %{count} file(s)',
|
376
|
+
tooShort: 'Please upload at least %{count} file(s)',
|
377
|
+
}));
|
378
|
+
if (Array.isArray(value) &&
|
379
|
+
value.some((file) => {
|
380
|
+
return !checkFileNameIsValid(formElement, file.fileName);
|
381
|
+
})) {
|
382
|
+
errorMessages.push(`Only the following file types are accepted: ${(formElement.restrictedFileTypes || []).join(', ')}`);
|
383
|
+
}
|
384
|
+
errorMessages.push(...validationExtensions.attachments(value));
|
385
|
+
const isValid = !Array.isArray(value) ||
|
386
|
+
value.every((file) => {
|
387
|
+
return checkFileNameExtensionIsValid(formElement, file.fileName);
|
388
|
+
});
|
389
|
+
if (!isValid)
|
390
|
+
errorMessages.push('All files must have extensions');
|
391
|
+
if (errorMessages.length) {
|
392
|
+
partialFormElementsValidation[formElement.name] = errorMessages[0];
|
393
|
+
}
|
394
|
+
break;
|
395
|
+
}
|
396
|
+
case 'repeatableSet': {
|
397
|
+
const minSetEntries = getCleanRepeatableSetConfiguration(formElement.minSetEntries, elements, submission, formElementsConditionallyShown);
|
398
|
+
const maxSetEntries = getCleanRepeatableSetConfiguration(formElement.maxSetEntries, elements, submission, formElementsConditionallyShown);
|
399
|
+
const setErrorMessages = validators.length(value, {
|
400
|
+
minimum: minSetEntries,
|
401
|
+
maximum: maxSetEntries,
|
402
|
+
tooLong: 'Cannot have more than %{count} entry/entries',
|
403
|
+
tooShort: 'Must have at least %{count} entry/entries',
|
404
|
+
});
|
405
|
+
if (minSetEntries) {
|
406
|
+
setErrorMessages.push(...validators.presence(value, {
|
407
|
+
message: `Must have at least ${minSetEntries} ${minSetEntries === 1 ? 'entry' : 'entries'}`,
|
408
|
+
}));
|
409
|
+
}
|
410
|
+
const entries = Array.isArray(value) ? value : [];
|
411
|
+
const repeatableSetExecutedLookups = executedLookups !== undefined &&
|
412
|
+
typeof executedLookups !== 'boolean' &&
|
413
|
+
!Array.isArray(executedLookups) &&
|
414
|
+
Array.isArray(executedLookups[formElement.name])
|
415
|
+
? executedLookups[formElement.name]
|
416
|
+
: [];
|
417
|
+
const entryErrors = entries.reduce((errorsByIndex, entry, index) => {
|
418
|
+
const entryValidation = validateSubmission({
|
419
|
+
submission: entry,
|
420
|
+
elements: formElement.elements,
|
421
|
+
executedLookups: Array.isArray(repeatableSetExecutedLookups)
|
422
|
+
? repeatableSetExecutedLookups[index]
|
423
|
+
: {},
|
424
|
+
formElementsConditionallyShown: (formElementConditionallyShown === null || formElementConditionallyShown === void 0 ? void 0 : formElementConditionallyShown.type) === 'repeatableSet'
|
425
|
+
? formElementConditionallyShown.entries[index.toString()]
|
426
|
+
: undefined,
|
427
|
+
captchaType,
|
428
|
+
isOffline,
|
429
|
+
});
|
430
|
+
if (entryValidation) {
|
431
|
+
errorsByIndex[index] = entryValidation;
|
432
|
+
}
|
433
|
+
return errorsByIndex;
|
434
|
+
}, {});
|
435
|
+
if (setErrorMessages.length || !isEmpty(entryErrors)) {
|
436
|
+
partialFormElementsValidation[formElement.name] = {
|
437
|
+
type: 'repeatableSet',
|
438
|
+
set: setErrorMessages[0],
|
439
|
+
entries: entryErrors,
|
440
|
+
};
|
441
|
+
}
|
442
|
+
break;
|
443
|
+
}
|
444
|
+
case 'civicaNameRecord': {
|
445
|
+
const nestedElements = generateCivicaNameRecordElements(formElement, []);
|
446
|
+
const nestedFormValidation = validationExtensions.nestedElements(value, {
|
447
|
+
formElement,
|
448
|
+
formElements: nestedElements,
|
449
|
+
formElementsConditionallyShown,
|
450
|
+
executedLookups,
|
451
|
+
captchaType,
|
452
|
+
isOffline,
|
453
|
+
});
|
454
|
+
if (nestedFormValidation) {
|
455
|
+
partialFormElementsValidation[formElement.name] =
|
456
|
+
nestedFormValidation;
|
457
|
+
}
|
458
|
+
break;
|
459
|
+
}
|
460
|
+
case 'infoPage':
|
461
|
+
case 'form': {
|
462
|
+
const nestedFormValidation = validationExtensions.nestedElements(value, {
|
463
|
+
formElement,
|
464
|
+
formElements: formElement.elements,
|
465
|
+
formElementsConditionallyShown,
|
466
|
+
executedLookups,
|
467
|
+
captchaType,
|
468
|
+
isOffline,
|
469
|
+
});
|
470
|
+
if (nestedFormValidation) {
|
471
|
+
partialFormElementsValidation[formElement.name] =
|
472
|
+
nestedFormValidation;
|
473
|
+
}
|
474
|
+
break;
|
475
|
+
}
|
476
|
+
case 'freshdeskDependentField': {
|
477
|
+
const nestedElements = generateFreshdeskDependentFieldElements(formElement);
|
478
|
+
const nestedFormValidation = validationExtensions.nestedElements(value, {
|
479
|
+
formElement,
|
480
|
+
formElements: nestedElements,
|
481
|
+
formElementsConditionallyShown,
|
482
|
+
executedLookups,
|
483
|
+
captchaType,
|
484
|
+
isOffline,
|
485
|
+
});
|
486
|
+
if (nestedFormValidation) {
|
487
|
+
partialFormElementsValidation[formElement.name] =
|
488
|
+
nestedFormValidation;
|
489
|
+
}
|
490
|
+
break;
|
491
|
+
}
|
492
|
+
default: {
|
493
|
+
console.info('Unsupported form element with validation', formElement);
|
494
|
+
}
|
495
|
+
}
|
496
|
+
return partialFormElementsValidation;
|
497
|
+
}, {});
|
498
|
+
if (isEmpty(formElementsValidation)) {
|
499
|
+
return;
|
500
|
+
}
|
501
|
+
return formElementsValidation;
|
502
|
+
}
|
503
|
+
//# sourceMappingURL=validateSubmission.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"validateSubmission.js","sourceRoot":"","sources":["../../../src/services/form-validation/validateSubmission.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport {\n CaptchaType,\n ExecutedLookups,\n FormElementsConditionallyShown,\n FormElementsValidation,\n} from '../../types/form'\n\nimport { isEmpty, validators } from './validate-dot-js'\nimport validationExtensions from './extensions'\nimport {\n checkFileNameExtensionIsValid,\n checkFileNameIsValid,\n getCleanRepeatableSetConfiguration,\n getCleanDateRangeConfiguration,\n} from './validators'\nimport generateCivicaNameRecordElements from '../generateCivicaNameRecordElements'\nimport generateFreshdeskDependentFieldElements from '../generateFreshdeskDependentFieldElements'\nimport { parseDateValue } from '../generate-default-data'\nimport { localisationService } from '@oneblink/apps'\n\nexport const RECAPTCHA_OFFLINE_MESSAGE =\n 'We could not verify you are human while you are offline.'\n\nexport default function validateSubmission({\n elements,\n submission,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n}: {\n elements: FormTypes.FormElementWithName[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined\n executedLookups: ExecutedLookups\n captchaType: CaptchaType\n isOffline: boolean\n}): FormElementsValidation | undefined {\n const formElementsValidation = elements.reduce<FormElementsValidation>(\n (partialFormElementsValidation, formElement) => {\n switch (formElement.type) {\n // Elements that do not need to be validated\n case 'summary':\n case 'calculation':\n case 'image':\n case 'html':\n case 'heading':\n case 'arcGISWebMap': {\n return partialFormElementsValidation\n }\n }\n\n // If the element is current hidden, we do not need to apply validation\n const formElementConditionallyShown =\n formElementsConditionallyShown?.[formElement.name]\n if (formElementConditionallyShown?.isHidden) {\n return partialFormElementsValidation\n }\n\n const value = submission?.[formElement.name]\n\n switch (formElement.type) {\n case 'draw': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'A saved signature is required',\n ),\n ...validationExtensions.attachment(value),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'camera': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'A photo is required',\n ),\n ...validationExtensions.attachment(value),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'captcha': {\n switch (captchaType) {\n case 'INVISIBLE':\n break\n case 'CHECKBOX':\n default: {\n const errorMessages = [\n ...validationExtensions.offline(\n isOffline,\n RECAPTCHA_OFFLINE_MESSAGE,\n ),\n ...validationExtensions.presence(\n value,\n { ...formElement, required: true },\n 'Please complete the CAPTCHA successfully',\n ),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] =\n errorMessages[0]\n }\n }\n }\n break\n }\n case 'location': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a location',\n ),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'compliance': {\n const errorMessages = [\n ...validationExtensions.presence(value, formElement, 'Required'),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ...validationExtensions.attachments(value as undefined),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'checkboxes': {\n const optionsLength =\n formElementConditionallyShown?.type === 'formElement' &&\n formElementConditionallyShown?.options\n ? formElementConditionallyShown?.options?.length\n : formElement.options?.length\n const requiredAllDefaultMessage = 'All options are required'\n const errorMessages = validationExtensions.presence(\n value,\n {\n ...formElement,\n required:\n !!optionsLength &&\n (formElement.required || !!formElement.requiredAll),\n },\n formElement.requiredAll ? requiredAllDefaultMessage : 'Required',\n )\n if (formElement.requiredAll) {\n errorMessages.push(\n ...validators.length(value, {\n is: optionsLength,\n message:\n formElement.requiredMessage || requiredAllDefaultMessage,\n }),\n )\n }\n errorMessages.push(\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n )\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'abn':\n case 'geoscapeAddress':\n case 'pointAddress':\n case 'googleAddress':\n case 'civicaStreetName':\n case 'autocomplete':\n case 'radio':\n case 'select':\n case 'apiNSWLiquorLicence': {\n const errorMessages = [\n ...validationExtensions.presence(value, formElement, 'Required'),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'boolean': {\n const errorMessages = []\n if (value !== true && formElement.required) {\n errorMessages.push(formElement.requiredMessage || 'Required')\n }\n errorMessages.push(\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n )\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'bsb': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a BSB number',\n ),\n ...validators.regexValidation(value, {\n pattern: /\\d{3}-\\d{3}/,\n message: 'Please enter a valid BSB number',\n }),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'barcodeScanner': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please scan a barcode or enter a value',\n ),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'text':\n case 'textarea': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a value',\n ),\n ...validators.length(value, {\n minimum: formElement.minLength,\n tooShort:\n 'Please enter a value with at least %{count} character(s)',\n maximum: formElement.maxLength,\n tooLong:\n 'Please enter a value with %{count} character(s) or less',\n }),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'telephone': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a phone number',\n ),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'email': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter an email address',\n ),\n ...validators.email(value, {\n message: 'Please enter a valid email for this field',\n }),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'time': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a time',\n ),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'date': {\n const [fromDate, fromDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.fromDate,\n daysOffset: formElement.fromDateDaysOffset,\n referenceFormElementId: formElement.fromDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const [toDate, toDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.toDate,\n daysOffset: formElement.toDateDaysOffset,\n referenceFormElementId: formElement.toDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a date',\n ),\n ...validators.datetime(value, {\n dateOnly: true,\n format: (date: Date) => localisationService.formatDate(date),\n earliest: parseDateValue({\n dateOnly: true,\n daysOffset: fromDateDaysOffset,\n value: fromDate,\n }),\n latest: parseDateValue({\n dateOnly: true,\n daysOffset: toDateDaysOffset,\n value: toDate,\n }),\n notValid: 'Please select a valid date',\n tooEarly: 'Date cannot be before %{date}',\n tooLate: 'Date cannot be after %{date}',\n }),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'datetime': {\n const [fromDate, fromDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.fromDate,\n daysOffset: formElement.fromDateDaysOffset,\n referenceFormElementId: formElement.fromDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const [toDate, toDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.toDate,\n daysOffset: formElement.toDateDaysOffset,\n referenceFormElementId: formElement.toDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a date and time',\n ),\n ...validators.datetime(value, {\n format: (v: Date) => localisationService.formatDatetime(v),\n earliest: parseDateValue({\n dateOnly: false,\n daysOffset: fromDateDaysOffset,\n value: fromDate,\n }),\n latest: parseDateValue({\n dateOnly: false,\n daysOffset: toDateDaysOffset,\n value: toDate,\n }),\n notValid: 'Please select a valid date and time',\n tooEarly: 'Date and time cannot be before %{date}',\n tooLate: 'Date and time cannot be after %{date}',\n }),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'number': {\n let minErrorMessage =\n 'Please enter a number greater than or equal to %{count}'\n let maxErrorMessage =\n 'Please enter a number less than or equal to %{count}'\n if (\n typeof formElement.minNumber === 'number' &&\n typeof formElement.maxNumber === 'number'\n ) {\n minErrorMessage =\n maxErrorMessage = `Please enter a number between ${formElement.minNumber} and ${formElement.maxNumber}`\n }\n\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a number',\n ),\n ...validators.numericality(value, {\n greaterThanOrEqualTo: formElement.minNumber,\n notGreaterThanOrEqualTo: minErrorMessage,\n lessThanOrEqualTo: formElement.maxNumber,\n notLessThanOrEqualTo: maxErrorMessage,\n onlyInteger: formElement.isInteger,\n notInteger: 'Please enter a whole number',\n notValid: 'Enter enter a valid number',\n }),\n ]\n if (\n formElement.regexPattern &&\n typeof value === 'number' &&\n !Number.isNaN(value)\n ) {\n errorMessages.push(\n ...validationExtensions.regex(value.toString(), formElement),\n )\n }\n errorMessages.push(\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n )\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'files': {\n const errorMessages = []\n if (formElement.minEntries) {\n errorMessages.push(\n ...validators.presence(value, {\n message: `Please upload at least ${\n formElement.minEntries\n } file${formElement.minEntries === 1 ? '' : 's'}`,\n }),\n )\n }\n errorMessages.push(\n ...validators.length(value, {\n minimum: formElement.minEntries,\n maximum: formElement.maxEntries,\n tooLong: 'Cannot upload more than %{count} file(s)',\n tooShort: 'Please upload at least %{count} file(s)',\n }),\n )\n\n if (\n Array.isArray(value) &&\n value.some((file) => {\n return !checkFileNameIsValid(formElement, file.fileName)\n })\n ) {\n errorMessages.push(\n `Only the following file types are accepted: ${(\n formElement.restrictedFileTypes || []\n ).join(', ')}`,\n )\n }\n\n errorMessages.push(\n ...validationExtensions.attachments(value as undefined),\n )\n\n const isValid =\n !Array.isArray(value) ||\n value.every((file) => {\n return checkFileNameExtensionIsValid(formElement, file.fileName)\n })\n if (!isValid) errorMessages.push('All files must have extensions')\n\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'repeatableSet': {\n const minSetEntries = getCleanRepeatableSetConfiguration(\n formElement.minSetEntries,\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const maxSetEntries = getCleanRepeatableSetConfiguration(\n formElement.maxSetEntries,\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const setErrorMessages = validators.length(value, {\n minimum: minSetEntries,\n maximum: maxSetEntries,\n tooLong: 'Cannot have more than %{count} entry/entries',\n tooShort: 'Must have at least %{count} entry/entries',\n })\n if (minSetEntries) {\n setErrorMessages.push(\n ...validators.presence(value, {\n message: `Must have at least ${minSetEntries} ${\n minSetEntries === 1 ? 'entry' : 'entries'\n }`,\n }),\n )\n }\n\n const entries = Array.isArray(value) ? value : []\n\n const repeatableSetExecutedLookups =\n executedLookups !== undefined &&\n typeof executedLookups !== 'boolean' &&\n !Array.isArray(executedLookups) &&\n Array.isArray(executedLookups[formElement.name])\n ? executedLookups[formElement.name]\n : []\n\n const entryErrors = entries.reduce((errorsByIndex, entry, index) => {\n const entryValidation = validateSubmission({\n submission: entry,\n elements: formElement.elements as FormTypes.FormElementWithName[],\n executedLookups: Array.isArray(repeatableSetExecutedLookups)\n ? repeatableSetExecutedLookups[index]\n : {},\n formElementsConditionallyShown:\n formElementConditionallyShown?.type === 'repeatableSet'\n ? formElementConditionallyShown.entries[index.toString()]\n : undefined,\n captchaType,\n isOffline,\n })\n\n if (entryValidation) {\n errorsByIndex[index] = entryValidation\n }\n return errorsByIndex\n }, {})\n\n if (setErrorMessages.length || !isEmpty(entryErrors)) {\n partialFormElementsValidation[formElement.name] = {\n type: 'repeatableSet',\n set: setErrorMessages[0],\n entries: entryErrors,\n }\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(\n formElement,\n [],\n )\n const nestedFormValidation = validationExtensions.nestedElements(\n value,\n {\n formElement,\n formElements: nestedElements,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n },\n )\n if (nestedFormValidation) {\n partialFormElementsValidation[formElement.name] =\n nestedFormValidation\n }\n break\n }\n case 'infoPage':\n case 'form': {\n const nestedFormValidation = validationExtensions.nestedElements(\n value,\n {\n formElement,\n formElements:\n formElement.elements as FormTypes.FormElementWithName[],\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n },\n )\n if (nestedFormValidation) {\n partialFormElementsValidation[formElement.name] =\n nestedFormValidation\n }\n break\n }\n case 'freshdeskDependentField': {\n const nestedElements =\n generateFreshdeskDependentFieldElements(formElement)\n const nestedFormValidation = validationExtensions.nestedElements(\n value,\n {\n formElement,\n formElements: nestedElements,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n },\n )\n if (nestedFormValidation) {\n partialFormElementsValidation[formElement.name] =\n nestedFormValidation\n }\n break\n }\n default: {\n console.info('Unsupported form element with validation', formElement)\n }\n }\n\n return partialFormElementsValidation\n },\n {},\n )\n\n if (isEmpty(formElementsValidation)) {\n return\n }\n\n return formElementsValidation\n}\n"]}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { FormsAppsTypes, FormTypes, SubmissionTypes } from '@oneblink/types';
|
2
|
+
import getDateRangeConfiguration, { DateRangeConfigurationOptions } from '../getDateRangeConfiguration';
|
3
|
+
import { FormElementsConditionallyShown, FormElementsValidation } from '../../types/form';
|
4
|
+
import { attachmentsService } from '@oneblink/apps';
|
5
|
+
import { FormElementBinaryStorageValue } from '../../types/attachments';
|
6
|
+
export declare function getCleanDateRangeConfiguration(options: DateRangeConfigurationOptions, elements: FormTypes.FormElement[], submission: SubmissionTypes.S3SubmissionData['submission'] | undefined, formElementsConditionallyShown: FormElementsConditionallyShown | undefined): ReturnType<typeof getDateRangeConfiguration>;
|
7
|
+
export declare function getCleanRepeatableSetConfiguration(setEntries: FormTypes.RepeatableSetElement['minSetEntries'], elements: FormTypes.FormElement[], submission: SubmissionTypes.S3SubmissionData['submission'] | undefined, formElementsConditionallyShown: FormElementsConditionallyShown | undefined): number | undefined;
|
8
|
+
export declare function checkFileNameIsValid(formElement: FormTypes.FilesElement, fileName: string): boolean;
|
9
|
+
export declare function checkFileNameExtensionIsValid(formElement: FormTypes.FilesElement, fileName: string): boolean;
|
10
|
+
export declare function checkSectionValidity(element: FormTypes.PageElement | FormTypes.SectionElement, formElementsValidation: FormElementsValidation | undefined): boolean;
|
11
|
+
export declare function getInvalidAttachment(value: unknown): attachmentsService.AttachmentError | undefined;
|
12
|
+
export declare function validateAttachments(value: FormElementBinaryStorageValue[] | undefined): string[];
|
13
|
+
export declare const generateLookupValidationMessage: (lookupButtonConfig?: FormsAppsTypes.ButtonConfiguration) => string;
|