@oneblink/apps-react 8.0.0-beta.1 → 8.0.0-beta.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.
- package/dist/components/formStore/table/FormElementTableCell.js +0 -1
- package/dist/components/formStore/table/FormElementTableCell.js.map +1 -1
- package/dist/components/formStore/table/Pickers.d.ts +1 -21
- package/dist/components/formStore/table/Pickers.js +1 -1
- package/dist/components/formStore/table/Pickers.js.map +1 -1
- package/dist/form-elements/FormElementCalculation.js +0 -2
- package/dist/form-elements/FormElementCalculation.js.map +1 -1
- package/dist/form-elements/FormElementDate.js +18 -24
- package/dist/form-elements/FormElementDate.js.map +1 -1
- package/dist/form-elements/FormElementDateTime.js +36 -21
- package/dist/form-elements/FormElementDateTime.js.map +1 -1
- package/dist/form-elements/FormElementSummary.js +0 -1
- package/dist/form-elements/FormElementSummary.js.map +1 -1
- package/dist/form-elements/FormElementTime.js +25 -23
- package/dist/form-elements/FormElementTime.js.map +1 -1
- package/dist/services/form-validation/validateSubmission.js +5 -5
- package/dist/services/form-validation/validateSubmission.js.map +1 -1
- package/dist/services/generate-default-data.d.ts +3 -2
- package/dist/services/generate-default-data.js +10 -22
- package/dist/services/generate-default-data.js.map +1 -1
- package/dist/styles/date.scss +8 -0
- package/dist/styles.css +9 -0
- package/dist/styles.scss +1 -0
- package/package.json +2 -2
- package/dist/hooks/form-date-picker/useFormDatePickerProps.d.ts +0 -26
- package/dist/hooks/form-date-picker/useFormDatePickerProps.js +0 -57
- package/dist/hooks/form-date-picker/useFormDatePickerProps.js.map +0 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FormElementSummary.js","sourceRoot":"","sources":["../../src/form-elements/FormElementSummary.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { localisationService } from '@oneblink/apps'\n\nimport { useFormSubmissionModelParent } from '../hooks/useFormSubmissionModelContext'\nimport useFlattenElements from '../hooks/useFlattenElementsContext'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { FormElementValueChangeHandler } from '../types/form'\ntype Props = {\n element: FormTypes.SummaryElement\n onChange: FormElementValueChangeHandler\n value: unknown\n}\n\nconst arraysAreEqual = (a: unknown[], b: unknown[]) => {\n if (!Array.isArray(a) || !Array.isArray(b)) {\n if (a !== b) return false\n return true\n }\n if (a.length !== b.length) return false\n\n for (let i = 0; i < a.length; i++) {\n if (Array.isArray(a[i]) && Array.isArray(b[i])) {\n const areEqual = arraysAreEqual(a[i] as unknown[], b[i] as unknown[])\n if (!areEqual) return false\n continue\n }\n if (a[i] !== b[i]) return false\n }\n return true\n}\nfunction FormElementSummary({ element, onChange, value }: Props) {\n const { formSubmissionModel } = useFormSubmissionModelParent()\n const flattenedElements = useFlattenElements()\n\n const reducer = React.useCallback(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n ) => {\n if (!('name' in formElement)) return partialSummary\n if (\n formElement.type !== 'repeatableSet' &&\n formElement.type !== 'form' &&\n !element.elementIds.some((elementId) => elementId === formElement.id)\n ) {\n return partialSummary\n }\n\n const formElementValue = submission[formElement.name]\n if (!formElementValue && formElementValue !== 0) {\n return partialSummary\n }\n\n switch (formElement.type) {\n case 'repeatableSet': {\n if (!Array.isArray(formElementValue)) return partialSummary\n // If we found a repeatable set, look through child elements\n // to find the summary elements. Need to start a new array for\n // this structure and look at each entry in the repeatable set\n for (const entry of formElementValue) {\n const repeatableSetSummaryValues = formElement.elements.reduce(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n ) =>\n reducer(\n partialSummary,\n formElement,\n // Pleasing TypeScript\n entry instanceof Object ? entry : {},\n ),\n [],\n )\n if (repeatableSetSummaryValues.length) {\n partialSummary.push(repeatableSetSummaryValues)\n }\n }\n break\n }\n case 'form': {\n const formSummaryValues = (formElement.elements || []).reduce(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n ) =>\n reducer(\n partialSummary,\n formElement,\n // @ts-expect-error Pleasing TypeScript\n formElementValue instanceof Object ? formElementValue : {},\n ),\n [],\n )\n if (formSummaryValues.length) {\n partialSummary.push(formSummaryValues)\n }\n\n break\n }\n case 'select':\n case 'autocomplete':\n case 'radio':\n case 'checkboxes': {\n const optionValues = []\n if (Array.isArray(formElementValue)) {\n optionValues.push(...formElementValue)\n } else {\n optionValues.push(formElementValue)\n }\n if (Array.isArray(formElement.options)) {\n partialSummary.push(\n ...optionValues.reduce((optionLabels, optionValue) => {\n const option = formElement.options?.find(\n ({ value }: FormTypes.ChoiceElementOption) =>\n optionValue === value,\n )\n if (option) {\n optionLabels.push(option.label)\n }\n return optionLabels\n }, []),\n )\n }\n break\n }\n case 'date': {\n const date = localisationService.generateDate({\n daysOffset: undefined,\n value: formElementValue as string,\n dateOnly: true,\n })\n if (date) {\n partialSummary.push(localisationService.formatDate(date))\n }\n break\n }\n case 'datetime': {\n if (typeof formElementValue !== 'string') return partialSummary\n partialSummary.push(\n localisationService.formatDatetime(new Date(formElementValue)),\n )\n break\n }\n case 'time': {\n if (typeof formElementValue !== 'string') return partialSummary\n partialSummary.push(\n localisationService.formatTime(new Date(formElementValue)),\n )\n break\n }\n default: {\n // Pleasing TypeScript WHILE COVERING ALL BASES\n if (\n typeof formElementValue !== 'string' &&\n typeof formElementValue !== 'object' &&\n typeof formElementValue !== 'number' &&\n typeof formElementValue !== 'function' &&\n typeof formElementValue !== 'boolean'\n ) {\n return partialSummary\n }\n\n partialSummary.push(formElementValue.toString())\n }\n }\n return partialSummary\n },\n [element.elementIds],\n )\n\n // MODEL LISTENER\n React.useEffect(() => {\n const summary = flattenedElements.reduce<FormElementSummaryResults>(\n (partialSummary, formElement) => {\n return reducer(partialSummary, formElement, formSubmissionModel)\n },\n\n [],\n )\n\n if (value === undefined) {\n if (!summary.length) return\n }\n if (arraysAreEqual(value as FormElementSummaryResults, summary)) {\n return\n }\n if (summary.length) {\n onChange(element, {\n value: summary,\n })\n } else {\n onChange(element, {\n value: undefined,\n })\n }\n }, [\n element,\n flattenedElements,\n formSubmissionModel,\n onChange,\n reducer,\n value,\n ])\n\n return (\n <div className=\"ob-form__element ob-summary cypress-summary-result \">\n {!!value && Array.isArray(value) && (\n <SummaryResult results={value}></SummaryResult>\n )}\n </div>\n )\n}\n\ntype FormElementSummaryResults = Array<string | FormElementSummaryResults>\ntype FormElementSummaryResultProps = {\n results: FormElementSummaryResults\n}\n\nconst SummaryResult = React.memo<FormElementSummaryResultProps>(\n function SummaryResult({ results }) {\n return (\n <>\n {results.map((result, i) => {\n return (\n <div\n key={`${result.toString()}-${i}`}\n className=\"ob-summary__result-container\"\n >\n {typeof result === 'string' ? (\n <p className=\"ob-summary__result has-line-breaks cypress-summary-result-text\">\n {result}\n </p>\n ) : (\n <SummaryResult results={result}></SummaryResult>\n )}\n </div>\n )\n })}\n </>\n )\n },\n)\n\nexport default React.memo(FormElementSummary)\n"]}
|
1
|
+
{"version":3,"file":"FormElementSummary.js","sourceRoot":"","sources":["../../src/form-elements/FormElementSummary.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { localisationService } from '@oneblink/apps'\n\nimport { useFormSubmissionModelParent } from '../hooks/useFormSubmissionModelContext'\nimport useFlattenElements from '../hooks/useFlattenElementsContext'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { FormElementValueChangeHandler } from '../types/form'\ntype Props = {\n element: FormTypes.SummaryElement\n onChange: FormElementValueChangeHandler\n value: unknown\n}\n\nconst arraysAreEqual = (a: unknown[], b: unknown[]) => {\n if (!Array.isArray(a) || !Array.isArray(b)) {\n if (a !== b) return false\n return true\n }\n if (a.length !== b.length) return false\n\n for (let i = 0; i < a.length; i++) {\n if (Array.isArray(a[i]) && Array.isArray(b[i])) {\n const areEqual = arraysAreEqual(a[i] as unknown[], b[i] as unknown[])\n if (!areEqual) return false\n continue\n }\n if (a[i] !== b[i]) return false\n }\n return true\n}\nfunction FormElementSummary({ element, onChange, value }: Props) {\n const { formSubmissionModel } = useFormSubmissionModelParent()\n const flattenedElements = useFlattenElements()\n\n const reducer = React.useCallback(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n ) => {\n if (!('name' in formElement)) return partialSummary\n if (\n formElement.type !== 'repeatableSet' &&\n formElement.type !== 'form' &&\n !element.elementIds.some((elementId) => elementId === formElement.id)\n ) {\n return partialSummary\n }\n\n const formElementValue = submission[formElement.name]\n if (!formElementValue && formElementValue !== 0) {\n return partialSummary\n }\n\n switch (formElement.type) {\n case 'repeatableSet': {\n if (!Array.isArray(formElementValue)) return partialSummary\n // If we found a repeatable set, look through child elements\n // to find the summary elements. Need to start a new array for\n // this structure and look at each entry in the repeatable set\n for (const entry of formElementValue) {\n const repeatableSetSummaryValues = formElement.elements.reduce(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n ) =>\n reducer(\n partialSummary,\n formElement,\n // Pleasing TypeScript\n entry instanceof Object ? entry : {},\n ),\n [],\n )\n if (repeatableSetSummaryValues.length) {\n partialSummary.push(repeatableSetSummaryValues)\n }\n }\n break\n }\n case 'form': {\n const formSummaryValues = (formElement.elements || []).reduce(\n (\n partialSummary: FormElementSummaryResults,\n formElement: FormTypes.FormElement,\n ) =>\n reducer(\n partialSummary,\n formElement,\n // @ts-expect-error Pleasing TypeScript\n formElementValue instanceof Object ? formElementValue : {},\n ),\n [],\n )\n if (formSummaryValues.length) {\n partialSummary.push(formSummaryValues)\n }\n\n break\n }\n case 'select':\n case 'autocomplete':\n case 'radio':\n case 'checkboxes': {\n const optionValues = []\n if (Array.isArray(formElementValue)) {\n optionValues.push(...formElementValue)\n } else {\n optionValues.push(formElementValue)\n }\n if (Array.isArray(formElement.options)) {\n partialSummary.push(\n ...optionValues.reduce((optionLabels, optionValue) => {\n const option = formElement.options?.find(\n ({ value }: FormTypes.ChoiceElementOption) =>\n optionValue === value,\n )\n if (option) {\n optionLabels.push(option.label)\n }\n return optionLabels\n }, []),\n )\n }\n break\n }\n case 'date': {\n const date = localisationService.generateDate({\n daysOffset: undefined,\n value: formElementValue as string,\n })\n if (date) {\n partialSummary.push(localisationService.formatDate(date))\n }\n break\n }\n case 'datetime': {\n if (typeof formElementValue !== 'string') return partialSummary\n partialSummary.push(\n localisationService.formatDatetime(new Date(formElementValue)),\n )\n break\n }\n case 'time': {\n if (typeof formElementValue !== 'string') return partialSummary\n partialSummary.push(\n localisationService.formatTime(new Date(formElementValue)),\n )\n break\n }\n default: {\n // Pleasing TypeScript WHILE COVERING ALL BASES\n if (\n typeof formElementValue !== 'string' &&\n typeof formElementValue !== 'object' &&\n typeof formElementValue !== 'number' &&\n typeof formElementValue !== 'function' &&\n typeof formElementValue !== 'boolean'\n ) {\n return partialSummary\n }\n\n partialSummary.push(formElementValue.toString())\n }\n }\n return partialSummary\n },\n [element.elementIds],\n )\n\n // MODEL LISTENER\n React.useEffect(() => {\n const summary = flattenedElements.reduce<FormElementSummaryResults>(\n (partialSummary, formElement) => {\n return reducer(partialSummary, formElement, formSubmissionModel)\n },\n\n [],\n )\n\n if (value === undefined) {\n if (!summary.length) return\n }\n if (arraysAreEqual(value as FormElementSummaryResults, summary)) {\n return\n }\n if (summary.length) {\n onChange(element, {\n value: summary,\n })\n } else {\n onChange(element, {\n value: undefined,\n })\n }\n }, [\n element,\n flattenedElements,\n formSubmissionModel,\n onChange,\n reducer,\n value,\n ])\n\n return (\n <div className=\"ob-form__element ob-summary cypress-summary-result \">\n {!!value && Array.isArray(value) && (\n <SummaryResult results={value}></SummaryResult>\n )}\n </div>\n )\n}\n\ntype FormElementSummaryResults = Array<string | FormElementSummaryResults>\ntype FormElementSummaryResultProps = {\n results: FormElementSummaryResults\n}\n\nconst SummaryResult = React.memo<FormElementSummaryResultProps>(\n function SummaryResult({ results }) {\n return (\n <>\n {results.map((result, i) => {\n return (\n <div\n key={`${result.toString()}-${i}`}\n className=\"ob-summary__result-container\"\n >\n {typeof result === 'string' ? (\n <p className=\"ob-summary__result has-line-breaks cypress-summary-result-text\">\n {result}\n </p>\n ) : (\n <SummaryResult results={result}></SummaryResult>\n )}\n </div>\n )\n })}\n </>\n )\n },\n)\n\nexport default React.memo(FormElementSummary)\n"]}
|
@@ -1,37 +1,37 @@
|
|
1
1
|
import * as React from 'react';
|
2
2
|
import { localisationService } from '@oneblink/apps';
|
3
|
-
import { TimePicker } from '@mui/x-date-pickers';
|
4
3
|
import CopyToClipboardButton from '../components/renderer/CopyToClipboardButton';
|
5
4
|
import LookupButton from '../components/renderer/LookupButton';
|
6
5
|
import FormElementLabelContainer from '../components/renderer/FormElementLabelContainer';
|
6
|
+
import MaterialIcon from '../components/MaterialIcon';
|
7
7
|
import { LookupNotificationContext } from '../hooks/useLookupNotification';
|
8
8
|
import useElementAriaDescribedby from '../hooks/useElementAriaDescribedby';
|
9
|
-
import
|
10
|
-
const timeFormat = localisationService.getDateFnsFormats().time;
|
9
|
+
import { format, parse } from 'date-fns';
|
11
10
|
function FormElementTime({ id, element, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, autocompleteAttributes, }) {
|
12
11
|
const ariaDescribedby = useElementAriaDescribedby(id, element);
|
13
12
|
const handleChange = React.useCallback((newValue) => {
|
13
|
+
if (newValue) {
|
14
|
+
try {
|
15
|
+
const timeValue = parse(newValue, 'HH:mm', new Date());
|
16
|
+
onChange(element, { value: timeValue.toISOString() });
|
17
|
+
return;
|
18
|
+
}
|
19
|
+
catch {
|
20
|
+
console.warn(`Error parsing time for element: ${element.id}`);
|
21
|
+
}
|
22
|
+
}
|
14
23
|
onChange(element, {
|
15
|
-
value:
|
24
|
+
value: undefined,
|
16
25
|
});
|
17
26
|
setIsDirty();
|
18
27
|
}, [element, onChange, setIsDirty]);
|
19
|
-
const
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
autocompleteAttributes,
|
27
|
-
placeholder: element.placeholderValue,
|
28
|
-
});
|
29
|
-
const timeProps = React.useMemo(() => {
|
30
|
-
// maxDate and minDate not applicable to a timepicker
|
31
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
32
|
-
const { maxDate, minDate, ...rest } = commonProps;
|
33
|
-
return rest;
|
34
|
-
}, [commonProps]);
|
28
|
+
const timeValue = React.useMemo(() => {
|
29
|
+
if (typeof value !== 'string') {
|
30
|
+
return '';
|
31
|
+
}
|
32
|
+
const date = new Date(value);
|
33
|
+
return format(date, 'HH:mm');
|
34
|
+
}, [value]);
|
35
35
|
const text = React.useMemo(() => {
|
36
36
|
if (typeof value !== 'string') {
|
37
37
|
return null;
|
@@ -44,9 +44,11 @@ function FormElementTime({ id, element, value, onChange, validationMessage, disp
|
|
44
44
|
React.createElement(FormElementLabelContainer, { className: "ob-time", id: id, element: element, required: element.required },
|
45
45
|
React.createElement("div", { className: "field has-addons" },
|
46
46
|
React.createElement("div", { className: "control is-expanded has-icons-right" },
|
47
|
-
React.createElement(
|
48
|
-
handleChange(
|
49
|
-
}
|
47
|
+
React.createElement("input", { id: id, type: "time", name: element.name, value: timeValue, placeholder: element.placeholderValue, disabled: element.readOnly, className: "input ob-input cypress-time-control", onBlur: setIsDirty, autoComplete: autocompleteAttributes, "aria-describedby": ariaDescribedby, onChange: (e) => {
|
48
|
+
handleChange(e.target.value);
|
49
|
+
} }),
|
50
|
+
React.createElement("span", { className: "ob-input-icon icon is-small is-right" },
|
51
|
+
React.createElement(MaterialIcon, { className: "is-size-5" }, "schedule"))),
|
50
52
|
!!element.readOnly && !!text && (React.createElement("div", { className: "control" },
|
51
53
|
React.createElement(CopyToClipboardButton, { className: "button is-input-addon copy-button cypress-copy-to-clipboard-button", text: text }))),
|
52
54
|
React.createElement(LookupButton, { isInputButton: true, value: value, validationMessage: validationMessage, lookupButtonConfig: element.lookupButton })),
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FormElementTime.js","sourceRoot":"","sources":["../../src/form-elements/FormElementTime.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;
|
1
|
+
{"version":3,"file":"FormElementTime.js","sourceRoot":"","sources":["../../src/form-elements/FormElementTime.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { localisationService } from '@oneblink/apps'\nimport { FormTypes } from '@oneblink/types'\n\nimport CopyToClipboardButton from '../components/renderer/CopyToClipboardButton'\nimport LookupButton from '../components/renderer/LookupButton'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport MaterialIcon from '../components/MaterialIcon'\n\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport { format, parse } from 'date-fns'\n\ntype Props = {\n id: string\n element: FormTypes.TimeElement\n value: unknown | undefined\n onChange: FormElementValueChangeHandler<string>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n autocompleteAttributes?: string\n} & IsDirtyProps\n\nfunction FormElementTime({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n isDirty,\n setIsDirty,\n autocompleteAttributes,\n}: Props) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n\n const handleChange = React.useCallback(\n (newValue: string | undefined) => {\n if (newValue) {\n try {\n const timeValue = parse(newValue, 'HH:mm', new Date())\n onChange(element, { value: timeValue.toISOString() })\n return\n } catch {\n console.warn(`Error parsing time for element: ${element.id}`)\n }\n }\n\n onChange(element, {\n value: undefined,\n })\n setIsDirty()\n },\n [element, onChange, setIsDirty],\n )\n\n const timeValue = React.useMemo(() => {\n if (typeof value !== 'string') {\n return ''\n }\n const date = new Date(value)\n return format(date, 'HH:mm')\n }, [value])\n\n const text = React.useMemo(() => {\n if (typeof value !== 'string') {\n return null\n }\n return localisationService.formatTime(new Date(value))\n }, [value])\n\n const { isLookingUp } = React.useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (isDirty || displayValidationMessage) && !!validationMessage && !isLookingUp\n\n return (\n <div className=\"cypress-time-element\">\n <FormElementLabelContainer\n className=\"ob-time\"\n id={id}\n element={element}\n required={element.required}\n >\n <div className=\"field has-addons\">\n <div className=\"control is-expanded has-icons-right\">\n <input\n id={id}\n type=\"time\"\n name={element.name}\n value={timeValue}\n placeholder={element.placeholderValue}\n disabled={element.readOnly}\n className=\"input ob-input cypress-time-control\"\n onBlur={setIsDirty}\n autoComplete={autocompleteAttributes}\n aria-describedby={ariaDescribedby}\n onChange={(e) => {\n handleChange(e.target.value)\n }}\n />\n <span className=\"ob-input-icon icon is-small is-right\">\n <MaterialIcon className=\"is-size-5\">schedule</MaterialIcon>\n </span>\n </div>\n {!!element.readOnly && !!text && (\n <div className=\"control\">\n <CopyToClipboardButton\n className=\"button is-input-addon copy-button cypress-copy-to-clipboard-button\"\n text={text}\n />\n </div>\n )}\n <LookupButton\n isInputButton\n value={value}\n validationMessage={validationMessage}\n lookupButtonConfig={element.lookupButton}\n />\n </div>\n\n {isDisplayingValidationMessage && (\n <div role=\"alert\" className=\"has-margin-top-8\">\n <div className=\"has-text-danger ob-error__text cypress-validation-message\">\n {validationMessage}\n </div>\n </div>\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementTime)\n"]}
|
@@ -3,7 +3,7 @@ import validationExtensions from './extensions';
|
|
3
3
|
import { checkFileNameExtensionIsValid, checkFileNameIsValid, getCleanRepeatableSetConfiguration, getCleanDateRangeConfiguration, } from './validators';
|
4
4
|
import generateCivicaNameRecordElements from '../generateCivicaNameRecordElements';
|
5
5
|
import generateFreshdeskDependentFieldElements from '../generateFreshdeskDependentFieldElements';
|
6
|
-
import { parseDateValue } from '../generate-default-data';
|
6
|
+
import { parseDateValue, DATE_ELEMENT_SUBMISSION_MODEL_FORMAT, } from '../generate-default-data';
|
7
7
|
import { localisationService } from '@oneblink/apps';
|
8
8
|
export const RECAPTCHA_OFFLINE_MESSAGE = 'We could not verify you are human while you are offline.';
|
9
9
|
export default function validateSubmission({ elements, submission, formElementsConditionallyShown, executedLookups, captchaType, isOffline, }) {
|
@@ -266,12 +266,12 @@ export default function validateSubmission({ elements, submission, formElementsC
|
|
266
266
|
dateOnly: true,
|
267
267
|
format: (date) => localisationService.formatDate(date),
|
268
268
|
earliest: parseDateValue({
|
269
|
-
|
269
|
+
dateFormat: DATE_ELEMENT_SUBMISSION_MODEL_FORMAT,
|
270
270
|
daysOffset: fromDateDaysOffset,
|
271
271
|
value: fromDate,
|
272
272
|
}),
|
273
273
|
latest: parseDateValue({
|
274
|
-
|
274
|
+
dateFormat: DATE_ELEMENT_SUBMISSION_MODEL_FORMAT,
|
275
275
|
daysOffset: toDateDaysOffset,
|
276
276
|
value: toDate,
|
277
277
|
}),
|
@@ -305,12 +305,12 @@ export default function validateSubmission({ elements, submission, formElementsC
|
|
305
305
|
...validators.datetime(value, {
|
306
306
|
format: (v) => localisationService.formatDatetime(v),
|
307
307
|
earliest: parseDateValue({
|
308
|
-
|
308
|
+
dateFormat: undefined,
|
309
309
|
daysOffset: fromDateDaysOffset,
|
310
310
|
value: fromDate,
|
311
311
|
}),
|
312
312
|
latest: parseDateValue({
|
313
|
-
|
313
|
+
dateFormat: undefined,
|
314
314
|
daysOffset: toDateDaysOffset,
|
315
315
|
value: toDate,
|
316
316
|
}),
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"validateSubmission.js","sourceRoot":"","sources":["../../../src/services/form-validation/validateSubmission.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,oBAAoB,MAAM,cAAc,CAAA;AAC/C,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,kCAAkC,EAClC,8BAA8B,GAC/B,MAAM,cAAc,CAAA;AACrB,OAAO,gCAAgC,MAAM,qCAAqC,CAAA;AAClF,OAAO,uCAAuC,MAAM,4CAA4C,CAAA;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,CAAC,MAAM,yBAAyB,GACpC,0DAA0D,CAAA;AAE5D,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EACzC,QAAQ,EACR,UAAU,EACV,8BAA8B,EAC9B,eAAe,EACf,WAAW,EACX,SAAS,GAQV;IACC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,MAAM,CAC5C,CAAC,6BAA6B,EAAE,WAAW,EAAE,EAAE;;QAC7C,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;YACzB,4CAA4C;YAC5C,KAAK,SAAS,CAAC;YACf,KAAK,aAAa,CAAC;YACnB,KAAK,OAAO,CAAC;YACb,KAAK,MAAM,CAAC;YACZ,KAAK,SAAS,CAAC;YACf,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,OAAO,6BAA6B,CAAA;YACtC,CAAC;QACH,CAAC;QAED,uEAAuE;QACvE,MAAM,6BAA6B,GACjC,8BAA8B,aAA9B,8BAA8B,uBAA9B,8BAA8B,CAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QACpD,IAAI,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,QAAQ,EAAE,CAAC;YAC5C,OAAO,6BAA6B,CAAA;QACtC,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QAE5C,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,+BAA+B,CAChC;oBACD,GAAG,oBAAoB,CAAC,UAAU,CAAC,KAAK,CAAC;iBAC1C,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,qBAAqB,CACtB;oBACD,GAAG,oBAAoB,CAAC,UAAU,CAAC,KAAK,CAAC;iBAC1C,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,QAAQ,WAAW,EAAE,CAAC;oBACpB,KAAK,WAAW;wBACd,MAAK;oBACP,KAAK,UAAU,CAAC;oBAChB,OAAO,CAAC,CAAC,CAAC;wBACR,MAAM,aAAa,GAAG;4BACpB,GAAG,oBAAoB,CAAC,OAAO,CAC7B,SAAS,EACT,yBAAyB,CAC1B;4BACD,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,EAAE,GAAG,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,EAClC,0CAA0C,CAC3C;yBACF,CAAA;wBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;4BACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC;gCAC7C,aAAa,CAAC,CAAC,CAAC,CAAA;wBACpB,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,0BAA0B,CAC3B;oBACD,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;oBAChE,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;oBACF,GAAG,oBAAoB,CAAC,WAAW,CAAC,KAAkB,CAAC;iBACxD,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,aAAa,GACjB,CAAA,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,IAAI,MAAK,aAAa;qBACrD,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,OAAO,CAAA;oBACpC,CAAC,CAAC,MAAA,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,OAAO,0CAAE,MAAM;oBAChD,CAAC,CAAC,MAAA,WAAW,CAAC,OAAO,0CAAE,MAAM,CAAA;gBACjC,MAAM,yBAAyB,GAAG,0BAA0B,CAAA;gBAC5D,MAAM,aAAa,GAAG,oBAAoB,CAAC,QAAQ,CACjD,KAAK,EACL;oBACE,GAAG,WAAW;oBACd,QAAQ,EACN,CAAC,CAAC,aAAa;wBACf,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC;iBACtD,EACD,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,UAAU,CACjE,CAAA;gBACD,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;oBAC5B,aAAa,CAAC,IAAI,CAChB,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE;wBAC1B,EAAE,EAAE,aAAa;wBACjB,OAAO,EACL,WAAW,CAAC,eAAe,IAAI,yBAAyB;qBAC3D,CAAC,CACH,CAAA;gBACH,CAAC;gBACD,aAAa,CAAC,IAAI,CAChB,GAAG,oBAAoB,CAAC,OAAO,CAAC;oBAC9B,WAAW;oBACX,eAAe;iBAChB,CAAC,CACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,KAAK,CAAC;YACX,KAAK,iBAAiB,CAAC;YACvB,KAAK,cAAc,CAAC;YACpB,KAAK,eAAe,CAAC;YACrB,KAAK,kBAAkB,CAAC;YACxB,KAAK,cAAc,CAAC;YACpB,KAAK,OAAO,CAAC;YACb,KAAK,QAAQ,CAAC;YACd,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;oBAChE,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,aAAa,GAAG,EAAE,CAAA;gBACxB,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;oBAC3C,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,IAAI,UAAU,CAAC,CAAA;gBAC/D,CAAC;gBACD,aAAa,CAAC,IAAI,CAChB,GAAG,oBAAoB,CAAC,OAAO,CAAC;oBAC9B,WAAW;oBACX,eAAe;iBAChB,CAAC,CACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,2BAA2B,CAC5B;oBACD,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,EAAE;wBACnC,OAAO,EAAE,aAAa;wBACtB,OAAO,EAAE,iCAAiC;qBAC3C,CAAC;oBACF,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,wCAAwC,CACzC;oBACD,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC;oBACjD,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,MAAM,CAAC;YACZ,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,sBAAsB,CACvB;oBACD,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE;wBAC1B,OAAO,EAAE,WAAW,CAAC,SAAS;wBAC9B,QAAQ,EACN,0DAA0D;wBAC5D,OAAO,EAAE,WAAW,CAAC,SAAS;wBAC9B,OAAO,EACL,yDAAyD;qBAC5D,CAAC;oBACF,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC;oBACjD,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,6BAA6B,CAC9B;oBACD,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC;oBACjD,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,+BAA+B,CAChC;oBACD,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE;wBACzB,OAAO,EAAE,2CAA2C;qBACrD,CAAC;oBACF,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC;oBACjD,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,sBAAsB,CACvB;oBACD,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC,GAAG,8BAA8B,CACnE;oBACE,IAAI,EAAE,WAAW,CAAC,QAAQ;oBAC1B,UAAU,EAAE,WAAW,CAAC,kBAAkB;oBAC1C,sBAAsB,EAAE,WAAW,CAAC,iBAAiB;iBACtD,EACD,QAAQ,EACR,UAAU,EACV,8BAA8B,CAC/B,CAAA;gBACD,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,8BAA8B,CAC/D;oBACE,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,UAAU,EAAE,WAAW,CAAC,gBAAgB;oBACxC,sBAAsB,EAAE,WAAW,CAAC,eAAe;iBACpD,EACD,QAAQ,EACR,UAAU,EACV,8BAA8B,CAC/B,CAAA;gBAED,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,sBAAsB,CACvB;oBACD,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE;wBAC5B,QAAQ,EAAE,IAAI;wBACd,MAAM,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC;wBAC5D,QAAQ,EAAE,cAAc,CAAC;4BACvB,QAAQ,EAAE,IAAI;4BACd,UAAU,EAAE,kBAAkB;4BAC9B,KAAK,EAAE,QAAQ;yBAChB,CAAC;wBACF,MAAM,EAAE,cAAc,CAAC;4BACrB,QAAQ,EAAE,IAAI;4BACd,UAAU,EAAE,gBAAgB;4BAC5B,KAAK,EAAE,MAAM;yBACd,CAAC;wBACF,QAAQ,EAAE,4BAA4B;wBACtC,QAAQ,EAAE,+BAA+B;wBACzC,OAAO,EAAE,8BAA8B;qBACxC,CAAC;oBACF,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC,GAAG,8BAA8B,CACnE;oBACE,IAAI,EAAE,WAAW,CAAC,QAAQ;oBAC1B,UAAU,EAAE,WAAW,CAAC,kBAAkB;oBAC1C,sBAAsB,EAAE,WAAW,CAAC,iBAAiB;iBACtD,EACD,QAAQ,EACR,UAAU,EACV,8BAA8B,CAC/B,CAAA;gBACD,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,8BAA8B,CAC/D;oBACE,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,UAAU,EAAE,WAAW,CAAC,gBAAgB;oBACxC,sBAAsB,EAAE,WAAW,CAAC,eAAe;iBACpD,EACD,QAAQ,EACR,UAAU,EACV,8BAA8B,CAC/B,CAAA;gBAED,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,+BAA+B,CAChC;oBACD,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE;wBAC5B,MAAM,EAAE,CAAC,CAAO,EAAE,EAAE,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC;wBAC1D,QAAQ,EAAE,cAAc,CAAC;4BACvB,QAAQ,EAAE,KAAK;4BACf,UAAU,EAAE,kBAAkB;4BAC9B,KAAK,EAAE,QAAQ;yBAChB,CAAC;wBACF,MAAM,EAAE,cAAc,CAAC;4BACrB,QAAQ,EAAE,KAAK;4BACf,UAAU,EAAE,gBAAgB;4BAC5B,KAAK,EAAE,MAAM;yBACd,CAAC;wBACF,QAAQ,EAAE,qCAAqC;wBAC/C,QAAQ,EAAE,wCAAwC;wBAClD,OAAO,EAAE,uCAAuC;qBACjD,CAAC;oBACF,GAAG,oBAAoB,CAAC,OAAO,CAAC;wBAC9B,WAAW;wBACX,eAAe;qBAChB,CAAC;iBACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,eAAe,GACjB,yDAAyD,CAAA;gBAC3D,IAAI,eAAe,GACjB,sDAAsD,CAAA;gBACxD,IACE,OAAO,WAAW,CAAC,SAAS,KAAK,QAAQ;oBACzC,OAAO,WAAW,CAAC,SAAS,KAAK,QAAQ,EACzC,CAAC;oBACD,eAAe;wBACb,eAAe,GAAG,iCAAiC,WAAW,CAAC,SAAS,QAAQ,WAAW,CAAC,SAAS,EAAE,CAAA;gBAC3G,CAAC;gBAED,MAAM,aAAa,GAAG;oBACpB,GAAG,oBAAoB,CAAC,QAAQ,CAC9B,KAAK,EACL,WAAW,EACX,uBAAuB,CACxB;oBACD,GAAG,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE;wBAChC,oBAAoB,EAAE,WAAW,CAAC,SAAS;wBAC3C,uBAAuB,EAAE,eAAe;wBACxC,iBAAiB,EAAE,WAAW,CAAC,SAAS;wBACxC,oBAAoB,EAAE,eAAe;wBACrC,WAAW,EAAE,WAAW,CAAC,SAAS;wBAClC,UAAU,EAAE,6BAA6B;wBACzC,QAAQ,EAAE,4BAA4B;qBACvC,CAAC;iBACH,CAAA;gBACD,IACE,WAAW,CAAC,YAAY;oBACxB,OAAO,KAAK,KAAK,QAAQ;oBACzB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EACpB,CAAC;oBACD,aAAa,CAAC,IAAI,CAChB,GAAG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAC7D,CAAA;gBACH,CAAC;gBACD,aAAa,CAAC,IAAI,CAChB,GAAG,oBAAoB,CAAC,OAAO,CAAC;oBAC9B,WAAW;oBACX,eAAe;iBAChB,CAAC,CACH,CAAA;gBACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,aAAa,GAAG,EAAE,CAAA;gBACxB,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;oBAC3B,aAAa,CAAC,IAAI,CAChB,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE;wBAC5B,OAAO,EAAE,0BACP,WAAW,CAAC,UACd,QAAQ,WAAW,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;qBAClD,CAAC,CACH,CAAA;gBACH,CAAC;gBACD,aAAa,CAAC,IAAI,CAChB,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE;oBAC1B,OAAO,EAAE,WAAW,CAAC,UAAU;oBAC/B,OAAO,EAAE,WAAW,CAAC,UAAU;oBAC/B,OAAO,EAAE,0CAA0C;oBACnD,QAAQ,EAAE,yCAAyC;iBACpD,CAAC,CACH,CAAA;gBAED,IACE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBACpB,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;wBAClB,OAAO,CAAC,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;oBAC1D,CAAC,CAAC,EACF,CAAC;oBACD,aAAa,CAAC,IAAI,CAChB,+CAA+C,CAC7C,WAAW,CAAC,mBAAmB,IAAI,EAAE,CACtC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACf,CAAA;gBACH,CAAC;gBAED,aAAa,CAAC,IAAI,CAChB,GAAG,oBAAoB,CAAC,WAAW,CAAC,KAAkB,CAAC,CACxD,CAAA;gBAED,MAAM,OAAO,GACX,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBACrB,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;wBACnB,OAAO,6BAA6B,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;oBAClE,CAAC,CAAC,CAAA;gBACJ,IAAI,CAAC,OAAO;oBAAE,aAAa,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;gBAElE,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;gBACpE,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,aAAa,GAAG,kCAAkC,CACtD,WAAW,CAAC,aAAa,EACzB,QAAQ,EACR,UAAU,EACV,8BAA8B,CAC/B,CAAA;gBACD,MAAM,aAAa,GAAG,kCAAkC,CACtD,WAAW,CAAC,aAAa,EACzB,QAAQ,EACR,UAAU,EACV,8BAA8B,CAC/B,CAAA;gBACD,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE;oBAChD,OAAO,EAAE,aAAa;oBACtB,OAAO,EAAE,aAAa;oBACtB,OAAO,EAAE,8CAA8C;oBACvD,QAAQ,EAAE,2CAA2C;iBACtD,CAAC,CAAA;gBACF,IAAI,aAAa,EAAE,CAAC;oBAClB,gBAAgB,CAAC,IAAI,CACnB,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE;wBAC5B,OAAO,EAAE,sBAAsB,aAAa,IAC1C,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAClC,EAAE;qBACH,CAAC,CACH,CAAA;gBACH,CAAC;gBAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;gBAEjD,MAAM,4BAA4B,GAChC,eAAe,KAAK,SAAS;oBAC7B,OAAO,eAAe,KAAK,SAAS;oBACpC,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;oBAC/B,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBAC9C,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC;oBACnC,CAAC,CAAC,EAAE,CAAA;gBAER,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACjE,MAAM,eAAe,GAAG,kBAAkB,CAAC;wBACzC,UAAU,EAAE,KAAK;wBACjB,QAAQ,EAAE,WAAW,CAAC,QAA2C;wBACjE,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,4BAA4B,CAAC;4BAC1D,CAAC,CAAC,4BAA4B,CAAC,KAAK,CAAC;4BACrC,CAAC,CAAC,EAAE;wBACN,8BAA8B,EAC5B,CAAA,6BAA6B,aAA7B,6BAA6B,uBAA7B,6BAA6B,CAAE,IAAI,MAAK,eAAe;4BACrD,CAAC,CAAC,6BAA6B,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;4BACzD,CAAC,CAAC,SAAS;wBACf,WAAW;wBACX,SAAS;qBACV,CAAC,CAAA;oBAEF,IAAI,eAAe,EAAE,CAAC;wBACpB,aAAa,CAAC,KAAK,CAAC,GAAG,eAAe,CAAA;oBACxC,CAAC;oBACD,OAAO,aAAa,CAAA;gBACtB,CAAC,EAAE,EAAE,CAAC,CAAA;gBAEN,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;oBACrD,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG;wBAChD,IAAI,EAAE,eAAe;wBACrB,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC;wBACxB,OAAO,EAAE,WAAW;qBACrB,CAAA;gBACH,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,cAAc,GAAG,gCAAgC,CACrD,WAAW,EACX,EAAE,CACH,CAAA;gBACD,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,cAAc,CAC9D,KAAK,EACL;oBACE,WAAW;oBACX,YAAY,EAAE,cAAc;oBAC5B,8BAA8B;oBAC9B,eAAe;oBACf,WAAW;oBACX,SAAS;iBACV,CACF,CAAA;gBACD,IAAI,oBAAoB,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC;wBAC7C,oBAAoB,CAAA;gBACxB,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,UAAU,CAAC;YAChB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,cAAc,CAC9D,KAAK,EACL;oBACE,WAAW;oBACX,YAAY,EACV,WAAW,CAAC,QAA2C;oBACzD,8BAA8B;oBAC9B,eAAe;oBACf,WAAW;oBACX,SAAS;iBACV,CACF,CAAA;gBACD,IAAI,oBAAoB,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC;wBAC7C,oBAAoB,CAAA;gBACxB,CAAC;gBACD,MAAK;YACP,CAAC;YACD,KAAK,yBAAyB,CAAC,CAAC,CAAC;gBAC/B,MAAM,cAAc,GAClB,uCAAuC,CAAC,WAAW,CAAC,CAAA;gBACtD,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,cAAc,CAC9D,KAAK,EACL;oBACE,WAAW;oBACX,YAAY,EAAE,cAAc;oBAC5B,8BAA8B;oBAC9B,eAAe;oBACf,WAAW;oBACX,SAAS;iBACV,CACF,CAAA;gBACD,IAAI,oBAAoB,EAAE,CAAC;oBACzB,6BAA6B,CAAC,WAAW,CAAC,IAAI,CAAC;wBAC7C,oBAAoB,CAAA;gBACxB,CAAC;gBACD,MAAK;YACP,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,WAAW,CAAC,CAAA;YACvE,CAAC;QACH,CAAC;QAED,OAAO,6BAA6B,CAAA;IACtC,CAAC,EACD,EAAE,CACH,CAAA;IAED,IAAI,OAAO,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACpC,OAAM;IACR,CAAC;IAED,OAAO,sBAAsB,CAAA;AAC/B,CAAC","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"]}
|
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 {\n parseDateValue,\n DATE_ELEMENT_SUBMISSION_MODEL_FORMAT,\n} 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 dateFormat: DATE_ELEMENT_SUBMISSION_MODEL_FORMAT,\n daysOffset: fromDateDaysOffset,\n value: fromDate,\n }),\n latest: parseDateValue({\n dateFormat: DATE_ELEMENT_SUBMISSION_MODEL_FORMAT,\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 dateFormat: undefined,\n daysOffset: fromDateDaysOffset,\n value: fromDate,\n }),\n latest: parseDateValue({\n dateFormat: undefined,\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"]}
|
@@ -1,11 +1,12 @@
|
|
1
1
|
import { FormTypes, SubmissionTypes } from '@oneblink/types';
|
2
|
+
export declare const DATE_ELEMENT_SUBMISSION_MODEL_FORMAT = "yyyy-MM-dd";
|
2
3
|
export declare const ENTRY_ID_PROPERTY_NAME = "$__id";
|
3
4
|
export declare const generateNewRepeatableSetEntry: () => {
|
4
5
|
$__id: string;
|
5
6
|
};
|
6
|
-
export declare function parseDateValue({
|
7
|
-
dateOnly: boolean;
|
7
|
+
export declare function parseDateValue({ daysOffset, value, dateFormat, }: {
|
8
8
|
daysOffset: number | undefined;
|
9
9
|
value: unknown;
|
10
|
+
dateFormat: string | undefined;
|
10
11
|
}): string | undefined;
|
11
12
|
export default function generateDefaultData(elements: FormTypes.FormElement[], preFillData: SubmissionTypes.S3SubmissionData['submission']): SubmissionTypes.S3SubmissionData['submission'];
|
@@ -1,8 +1,10 @@
|
|
1
1
|
import { v4 as uuidv4 } from 'uuid';
|
2
2
|
import { localisationService } from '@oneblink/apps';
|
3
|
+
import { format } from 'date-fns';
|
3
4
|
import { prepareNewAttachment } from './attachments';
|
4
5
|
import { dataUriToBlobSync } from './blob-utils';
|
5
6
|
import generateCivicaNameRecordElements from './generateCivicaNameRecordElements';
|
7
|
+
export const DATE_ELEMENT_SUBMISSION_MODEL_FORMAT = 'yyyy-MM-dd';
|
6
8
|
export const ENTRY_ID_PROPERTY_NAME = '$__id';
|
7
9
|
export const generateNewRepeatableSetEntry = () => ({
|
8
10
|
[ENTRY_ID_PROPERTY_NAME]: uuidv4(),
|
@@ -55,32 +57,16 @@ function parseFiles(element, value) {
|
|
55
57
|
}
|
56
58
|
}
|
57
59
|
}
|
58
|
-
export function parseDateValue({
|
60
|
+
export function parseDateValue({ daysOffset, value, dateFormat, }) {
|
59
61
|
if (typeof value !== 'string') {
|
60
62
|
return;
|
61
63
|
}
|
62
|
-
const date = localisationService.generateDate({ daysOffset, value
|
64
|
+
const date = localisationService.generateDate({ daysOffset, value });
|
63
65
|
if (!date) {
|
64
66
|
return;
|
65
67
|
}
|
66
|
-
if (
|
67
|
-
|
68
|
-
year: 'numeric',
|
69
|
-
month: '2-digit',
|
70
|
-
day: '2-digit',
|
71
|
-
})
|
72
|
-
.formatToParts(date)
|
73
|
-
.reduce((memo, { type, value }) => ({
|
74
|
-
...memo,
|
75
|
-
[type]: value,
|
76
|
-
}), {
|
77
|
-
year: '',
|
78
|
-
month: '',
|
79
|
-
day: '',
|
80
|
-
});
|
81
|
-
// This is a workaround for an iOS 15 bug where the year was being returned as 2 digits: https://bugs.webkit.org/show_bug.cgi?id=230827
|
82
|
-
const fixedYear = year.length === 2 ? date.getFullYear() : year;
|
83
|
-
return `${fixedYear}-${month}-${day}`;
|
68
|
+
if (dateFormat) {
|
69
|
+
return format(date, dateFormat);
|
84
70
|
}
|
85
71
|
else {
|
86
72
|
return date.toISOString();
|
@@ -166,7 +152,7 @@ function parsePreFillData(element, value) {
|
|
166
152
|
case 'datetime':
|
167
153
|
case 'date': {
|
168
154
|
return parseDateValue({
|
169
|
-
|
155
|
+
dateFormat: element.type === 'date' ? 'yyyy-MM-dd' : undefined,
|
170
156
|
daysOffset: undefined,
|
171
157
|
value,
|
172
158
|
});
|
@@ -395,7 +381,9 @@ export default function generateDefaultData(elements, preFillData) {
|
|
395
381
|
case 'time': {
|
396
382
|
if (el.defaultValue) {
|
397
383
|
m[el.name] = parseDateValue({
|
398
|
-
|
384
|
+
dateFormat: el.type === 'date'
|
385
|
+
? DATE_ELEMENT_SUBMISSION_MODEL_FORMAT
|
386
|
+
: undefined,
|
399
387
|
daysOffset: el.defaultValueDaysOffset,
|
400
388
|
value: el.defaultValue,
|
401
389
|
});
|