@oneblink/apps-react 0.5.2 → 0.5.4-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,155 @@
1
+ import * as React from 'react';
2
+ import clsx from 'clsx';
3
+ import InputMask from 'react-input-mask';
4
+ import { parseString } from 'xml2js';
5
+ import CopyToClipboardButton from '../components/CopyToClipboardButton';
6
+ import useBooleanState from '../hooks/useBooleanState';
7
+ import LookupButton from '../components/LookupButton';
8
+ import FormElementLabelContainer from '../components/FormElementLabelContainer';
9
+ import useAbnLookupAuthenticationGuid from '../hooks/useAbnLookupAuthenticationGuid';
10
+ function FormElementABN({ id, element, value, onChange, validationMessage, displayValidationMessage, }) {
11
+ const abnLookupAuthenticationGuid = useAbnLookupAuthenticationGuid();
12
+ const [label, setLabel] = React.useState((value === null || value === void 0 ? void 0 : value.ABN.identifierValue) || '');
13
+ const [isFocused, setIsFocused, removeFocus] = useBooleanState(false);
14
+ const [isDirty, setIsDirty] = useBooleanState(false);
15
+ const [{ isLoading, error }, setState] = React.useState({
16
+ isLoading: false,
17
+ error: null,
18
+ });
19
+ React.useEffect(() => {
20
+ const searchString = label.replace(/[^\d]/g, '');
21
+ const isSearchStringValid = searchString.length === 11 || (searchString.length === 9 && !isFocused);
22
+ if (!isSearchStringValid || (value === null || value === void 0 ? void 0 : value.ABN.identifierValue) === searchString) {
23
+ return;
24
+ }
25
+ setState({
26
+ isLoading: true,
27
+ error: null,
28
+ });
29
+ const abortController = new AbortController();
30
+ const fetchRecord = async () => {
31
+ try {
32
+ const urlSearchParams = new URLSearchParams();
33
+ urlSearchParams.append('searchString', searchString);
34
+ urlSearchParams.append('includeHistoricalDetails', 'N');
35
+ if (abnLookupAuthenticationGuid) {
36
+ urlSearchParams.append('authenticationGuid', abnLookupAuthenticationGuid);
37
+ }
38
+ const url = searchString.length === 11
39
+ ? 'https://abr.business.gov.au/abrxmlsearch/AbrXmlSearch.asmx/SearchByABNv202001'
40
+ : 'https://abr.business.gov.au/abrxmlsearch/AbrXmlSearch.asmx/SearchByASICv201408';
41
+ const response = await fetch(`${url}?${urlSearchParams.toString()}`, {
42
+ mode: 'cors',
43
+ signal: abortController.signal,
44
+ });
45
+ const text = await response.text();
46
+ if (!response.ok) {
47
+ throw new Error(text);
48
+ }
49
+ const result = await new Promise((resolve, reject) => {
50
+ parseString(text, {
51
+ explicitArray: false,
52
+ }, (err, result) => {
53
+ if (err) {
54
+ reject(err);
55
+ }
56
+ else {
57
+ resolve(result);
58
+ }
59
+ });
60
+ });
61
+ if (result.ABRPayloadSearchResults.response.exception) {
62
+ throw new Error(result.ABRPayloadSearchResults.response.exception.exceptionDescription);
63
+ }
64
+ if (result.ABRPayloadSearchResults.response.businessEntity201408) {
65
+ result.ABRPayloadSearchResults.response.businessEntity202001 =
66
+ result.ABRPayloadSearchResults.response.businessEntity201408;
67
+ }
68
+ if (!Array.isArray(result.ABRPayloadSearchResults.response.businessEntity202001
69
+ .businessName)) {
70
+ result.ABRPayloadSearchResults.response.businessEntity202001.businessName =
71
+ [
72
+ result.ABRPayloadSearchResults.response.businessEntity202001
73
+ .businessName,
74
+ ];
75
+ }
76
+ if (!abortController.signal.aborted) {
77
+ onChange(element, result.ABRPayloadSearchResults.response.businessEntity202001);
78
+ setState({
79
+ isLoading: false,
80
+ error: null,
81
+ });
82
+ }
83
+ }
84
+ catch (err) {
85
+ if (!abortController.signal.aborted) {
86
+ setState({
87
+ isLoading: false,
88
+ error: err,
89
+ });
90
+ }
91
+ }
92
+ };
93
+ fetchRecord();
94
+ return () => {
95
+ abortController.abort();
96
+ };
97
+ }, [
98
+ abnLookupAuthenticationGuid,
99
+ element,
100
+ isFocused,
101
+ label,
102
+ onChange,
103
+ value === null || value === void 0 ? void 0 : value.ABN.identifierValue,
104
+ ]);
105
+ // Ensure the label is set if the value is set outside of this component
106
+ React.useEffect(() => {
107
+ if (value) {
108
+ const newLabel = value.ABN.identifierValue;
109
+ if (label !== newLabel) {
110
+ setLabel(newLabel.split('').reduce((memo, character, index) => {
111
+ switch (index) {
112
+ case 2:
113
+ case 5:
114
+ case 8: {
115
+ return `${memo} ${character}`;
116
+ }
117
+ default: {
118
+ return `${memo}${character}`;
119
+ }
120
+ }
121
+ }, ''));
122
+ }
123
+ }
124
+ // eslint-disable-next-line react-hooks/exhaustive-deps
125
+ }, [value]);
126
+ return (React.createElement("div", { className: "cypress-abn-element" },
127
+ React.createElement(FormElementLabelContainer, { className: "ob-abn", id: id, element: element, required: element.required },
128
+ React.createElement("div", { className: "field has-addons" },
129
+ React.createElement("div", { className: clsx('control is-expanded', {
130
+ 'is-loading': isLoading,
131
+ }) },
132
+ React.createElement(InputMask, { mask: isFocused || value ? '99 999 999 999' : '999 999 999',
133
+ // @ts-expect-error "maskChar" is not in the types, but it is in the docs
134
+ maskChar: " ", type: "text", id: id, name: element.name, className: "input ob-input cypress-abn-control", placeholder: element.placeholderValue, value: label, onChange: (e) => {
135
+ setLabel(e.target.value);
136
+ if (value) {
137
+ onChange(element, undefined);
138
+ }
139
+ }, required: element.required, disabled: element.readOnly, onBlur: () => {
140
+ setIsDirty();
141
+ removeFocus();
142
+ }, onFocus: setIsFocused })),
143
+ value && (React.createElement("div", { className: "control ob-abn__record-control" },
144
+ React.createElement("a", { className: "button is-static ob-abn__record-button" }, value.mainName.organisationName))),
145
+ !!element.readOnly && !!value && (React.createElement("div", { className: "control" },
146
+ React.createElement(CopyToClipboardButton, { className: "button is-input-addon cypress-copy-to-clipboard-button", isInputButton: true, text: label }))),
147
+ React.createElement(LookupButton, { isInputButton: true, value: value, validationMessage: validationMessage })),
148
+ (((isDirty || displayValidationMessage) &&
149
+ !!validationMessage &&
150
+ !isLoading) ||
151
+ error) && (React.createElement("div", { role: "alert", className: "has-margin-top-8" },
152
+ React.createElement("div", { className: "has-text-danger ob-error__text cypress-validation-message" }, (error === null || error === void 0 ? void 0 : error.message) || validationMessage))))));
153
+ }
154
+ export default React.memo(FormElementABN);
155
+ //# sourceMappingURL=FormElementABN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormElementABN.js","sourceRoot":"","sources":["../../src/form-elements/FormElementABN.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\nimport InputMask from 'react-input-mask'\nimport { parseString } from 'xml2js'\nimport CopyToClipboardButton from '../components/CopyToClipboardButton'\nimport useBooleanState from '../hooks/useBooleanState'\nimport LookupButton from '../components/LookupButton'\nimport { FormTypes, MiscTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/FormElementLabelContainer'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport useAbnLookupAuthenticationGuid from '../hooks/useAbnLookupAuthenticationGuid'\n\ntype Props = {\n id: string\n element: FormTypes.ABNElement\n value: MiscTypes.ABNRecord | undefined\n onChange: FormElementValueChangeHandler<MiscTypes.ABNRecord>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n}\n\nfunction FormElementABN({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n}: Props) {\n const abnLookupAuthenticationGuid = useAbnLookupAuthenticationGuid()\n const [label, setLabel] = React.useState(value?.ABN.identifierValue || '')\n const [isFocused, setIsFocused, removeFocus] = useBooleanState(false)\n const [isDirty, setIsDirty] = useBooleanState(false)\n const [{ isLoading, error }, setState] = React.useState<{\n isLoading: boolean\n error: Error | null\n }>({\n isLoading: false,\n error: null,\n })\n\n React.useEffect(() => {\n const searchString = label.replace(/[^\\d]/g, '')\n const isSearchStringValid =\n searchString.length === 11 || (searchString.length === 9 && !isFocused)\n if (!isSearchStringValid || value?.ABN.identifierValue === searchString) {\n return\n }\n\n setState({\n isLoading: true,\n error: null,\n })\n\n const abortController = new AbortController()\n const fetchRecord = async () => {\n try {\n const urlSearchParams = new URLSearchParams()\n urlSearchParams.append('searchString', searchString)\n urlSearchParams.append('includeHistoricalDetails', 'N')\n if (abnLookupAuthenticationGuid) {\n urlSearchParams.append(\n 'authenticationGuid',\n abnLookupAuthenticationGuid,\n )\n }\n\n const url =\n searchString.length === 11\n ? 'https://abr.business.gov.au/abrxmlsearch/AbrXmlSearch.asmx/SearchByABNv202001'\n : 'https://abr.business.gov.au/abrxmlsearch/AbrXmlSearch.asmx/SearchByASICv201408'\n const response = await fetch(`${url}?${urlSearchParams.toString()}`, {\n mode: 'cors',\n signal: abortController.signal,\n })\n const text = await response.text()\n if (!response.ok) {\n throw new Error(text)\n }\n\n const result = await new Promise<{\n ABRPayloadSearchResults: {\n response: {\n businessEntity201408?: MiscTypes.ABNRecord\n businessEntity202001: MiscTypes.ABNRecord\n exception?: {\n exceptionDescription: string\n exceptionCode: string\n }\n }\n }\n }>((resolve, reject) => {\n parseString(\n text,\n {\n explicitArray: false,\n },\n (err, result) => {\n if (err) {\n reject(err)\n } else {\n resolve(result)\n }\n },\n )\n })\n if (result.ABRPayloadSearchResults.response.exception) {\n throw new Error(\n result.ABRPayloadSearchResults.response.exception.exceptionDescription,\n )\n }\n\n if (result.ABRPayloadSearchResults.response.businessEntity201408) {\n result.ABRPayloadSearchResults.response.businessEntity202001 =\n result.ABRPayloadSearchResults.response.businessEntity201408\n }\n\n if (\n !Array.isArray(\n result.ABRPayloadSearchResults.response.businessEntity202001\n .businessName,\n )\n ) {\n result.ABRPayloadSearchResults.response.businessEntity202001.businessName =\n [\n result.ABRPayloadSearchResults.response.businessEntity202001\n .businessName,\n ]\n }\n\n if (!abortController.signal.aborted) {\n onChange(\n element,\n result.ABRPayloadSearchResults.response.businessEntity202001,\n )\n setState({\n isLoading: false,\n error: null,\n })\n }\n } catch (err) {\n if (!abortController.signal.aborted) {\n setState({\n isLoading: false,\n error: err as Error,\n })\n }\n }\n }\n\n fetchRecord()\n\n return () => {\n abortController.abort()\n }\n }, [\n abnLookupAuthenticationGuid,\n element,\n isFocused,\n label,\n onChange,\n value?.ABN.identifierValue,\n ])\n\n // Ensure the label is set if the value is set outside of this component\n React.useEffect(() => {\n if (value) {\n const newLabel = value.ABN.identifierValue\n if (label !== newLabel) {\n setLabel(\n newLabel.split('').reduce((memo, character, index) => {\n switch (index) {\n case 2:\n case 5:\n case 8: {\n return `${memo} ${character}`\n }\n default: {\n return `${memo}${character}`\n }\n }\n }, ''),\n )\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value])\n\n return (\n <div className=\"cypress-abn-element\">\n <FormElementLabelContainer\n className=\"ob-abn\"\n id={id}\n element={element}\n required={element.required}\n >\n <div className=\"field has-addons\">\n <div\n className={clsx('control is-expanded', {\n 'is-loading': isLoading,\n })}\n >\n <InputMask\n mask={isFocused || value ? '99 999 999 999' : '999 999 999'}\n // @ts-expect-error \"maskChar\" is not in the types, but it is in the docs\n maskChar=\" \"\n type=\"text\"\n id={id}\n name={element.name}\n className=\"input ob-input cypress-abn-control\"\n placeholder={element.placeholderValue}\n value={label}\n onChange={(e) => {\n setLabel(e.target.value)\n if (value) {\n onChange(element, undefined)\n }\n }}\n required={element.required}\n disabled={element.readOnly}\n onBlur={() => {\n setIsDirty()\n removeFocus()\n }}\n onFocus={setIsFocused}\n />\n </div>\n {value && (\n <div className=\"control ob-abn__record-control\">\n <a className=\"button is-static ob-abn__record-button\">\n {value.mainName.organisationName}\n </a>\n </div>\n )}\n {!!element.readOnly && !!value && (\n <div className=\"control\">\n <CopyToClipboardButton\n className=\"button is-input-addon cypress-copy-to-clipboard-button\"\n isInputButton\n text={label}\n />\n </div>\n )}\n <LookupButton\n isInputButton\n value={value}\n validationMessage={validationMessage}\n />\n </div>\n {(((isDirty || displayValidationMessage) &&\n !!validationMessage &&\n !isLoading) ||\n error) && (\n <div role=\"alert\" className=\"has-margin-top-8\">\n <div className=\"has-text-danger ob-error__text cypress-validation-message\">\n {error?.message || validationMessage}\n </div>\n </div>\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementABN)\n"]}
@@ -4,7 +4,9 @@ import _debounce from 'lodash.debounce';
4
4
  import useBooleanState from '../hooks/useBooleanState';
5
5
  import LookupButton from '../components/LookupButton';
6
6
  import FormElementLabelContainer from '../components/FormElementLabelContainer';
7
+ import useIsPageVisible from '../hooks/useIsPageVisible';
7
8
  function FormElementNumber({ id, element, value, onChange, validationMessage, displayValidationMessage, }) {
9
+ const isPageVisible = useIsPageVisible();
8
10
  const htmlInputElementRef = React.useRef(null);
9
11
  const [isDirty, setIsDirty] = useBooleanState(false);
10
12
  const text = React.useMemo(() => (typeof value === 'number' ? value.toString() : ''), [value]);
@@ -27,7 +29,7 @@ function FormElementNumber({ id, element, value, onChange, validationMessage, di
27
29
  React.createElement("i", { className: "material-icons is-size-5" }, "tag"))),
28
30
  !!element.readOnly && !!text && (React.createElement("div", { className: "control" },
29
31
  React.createElement(CopyToClipboardButton, { className: "button is-input-addon cypress-copy-to-clipboard-button", isInputButton: true, text: text }))),
30
- React.createElement(LookupButton, { isInputButton: true, value: value, validationMessage: validationMessage }))) : (React.createElement(SliderControl, { id: id, text: text, value: value, element: element, onChange: handleChange, onBlur: setIsDirty })),
32
+ React.createElement(LookupButton, { isInputButton: true, value: value, validationMessage: validationMessage }))) : isPageVisible ? (React.createElement(SliderControl, { id: id, text: text, value: value, element: element, onChange: handleChange, onBlur: setIsDirty })) : undefined,
31
33
  (isDirty || displayValidationMessage) && !!validationMessage && (React.createElement("div", { role: "alert", className: "has-margin-top-8" },
32
34
  React.createElement("div", { className: "has-text-danger ob-error__text cypress-validation-message" }, validationMessage))))));
33
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementNumber.js","sourceRoot":"","sources":["../../src/form-elements/FormElementNumber.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport CopyToClipboardButton from '../components/CopyToClipboardButton'\nimport _debounce from 'lodash.debounce'\nimport useBooleanState from '../hooks/useBooleanState'\nimport LookupButton from '../components/LookupButton'\nimport { FormTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/FormElementLabelContainer'\nimport { FormElementValueChangeHandler } from '../types/form'\n\ntype Props = {\n id: string\n element: FormTypes.NumberElement\n value: unknown\n onChange: FormElementValueChangeHandler<number>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n}\n\nfunction FormElementNumber({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n}: Props) {\n const htmlInputElementRef = React.useRef<HTMLInputElement>(null)\n\n const [isDirty, setIsDirty] = useBooleanState(false)\n const text = React.useMemo(\n () => (typeof value === 'number' ? value.toString() : ''),\n [value],\n )\n\n const handleChange = React.useCallback(\n (event) => {\n onChange(\n element,\n // e.target.value is a string so '0' becomes true\n event.target.value ? parseFloat(event.target.value) : undefined,\n )\n },\n [element, onChange],\n )\n\n React.useEffect(() => {\n if (htmlInputElementRef.current) {\n htmlInputElementRef.current.value = text\n }\n }, [htmlInputElementRef, text])\n\n return (\n <div className=\"cypress-number-element\">\n <FormElementLabelContainer\n className=\"ob-number\"\n id={id}\n element={element}\n required={element.required}\n >\n {!element.isSlider ? (\n <div className=\"field has-addons\">\n <div className=\"control is-expanded has-icons-right\">\n <input\n ref={htmlInputElementRef}\n type=\"number\"\n placeholder={element.placeholderValue}\n id={id}\n name={element.name}\n className=\"input ob-input cypress-number-control\"\n onChange={handleChange}\n required={element.required}\n disabled={element.readOnly}\n onBlur={setIsDirty}\n />\n <span className=\"ob-input-icon icon is-small is-right\">\n <i className=\"material-icons is-size-5\">tag</i>\n </span>\n </div>\n {!!element.readOnly && !!text && (\n <div className=\"control\">\n <CopyToClipboardButton\n className=\"button is-input-addon cypress-copy-to-clipboard-button\"\n isInputButton\n text={text}\n />\n </div>\n )}\n <LookupButton\n isInputButton\n value={value}\n validationMessage={validationMessage}\n />\n </div>\n ) : (\n <SliderControl\n id={id}\n text={text}\n value={value}\n element={element}\n onChange={handleChange}\n onBlur={setIsDirty}\n />\n )}\n\n {(isDirty || displayValidationMessage) && !!validationMessage && (\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\nconst sliderBubbleWidthInPixels = 24\n\nconst SliderControl = React.memo(function SliderControl({\n id,\n text,\n value,\n element,\n onChange,\n onBlur,\n}: {\n id: string\n text: string\n value: unknown\n element: FormTypes.NumberElement\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => unknown\n onBlur: () => void\n}) {\n const sliderOutputRef = React.useRef<HTMLOutputElement>(null)\n const sliderInputRef = React.useRef<HTMLInputElement>(null)\n\n const number = React.useMemo(\n () => (typeof value === 'number' ? value : parseFloat(value as string)),\n [value],\n )\n\n const removeIsDraggingClass = React.useMemo(\n () =>\n _debounce((outputElement: HTMLOutputElement) => {\n if (outputElement.classList.contains('is-dragging')) {\n outputElement.classList.remove('is-dragging')\n }\n }, 500),\n [],\n )\n\n React.useEffect(() => {\n if (\n Number.isNaN(number) ||\n typeof element.maxNumber !== 'number' ||\n typeof element.minNumber !== 'number'\n ) {\n return\n }\n\n const outputElement = sliderOutputRef.current\n const inputElement = sliderInputRef.current\n if (outputElement && inputElement) {\n const range = element.maxNumber - element.minNumber\n const percentage = (number - element.minNumber) / range\n const inputWidth = inputElement.getBoundingClientRect().width\n const outputWidth = outputElement.getBoundingClientRect().width\n const sliderBubbleOffSetPixels =\n (percentage - 0.5) * -sliderBubbleWidthInPixels\n\n outputElement.style.left = `${percentage * inputWidth}px`\n outputElement.style.marginLeft = `-${\n outputWidth / 2 - sliderBubbleOffSetPixels\n }px`\n\n if (!outputElement.classList.contains('is-dragging')) {\n outputElement.classList.add('is-dragging')\n }\n removeIsDraggingClass(outputElement)\n }\n }, [element.maxNumber, element.minNumber, number, removeIsDraggingClass])\n\n return (\n <div className=\"control\">\n <output\n ref={sliderOutputRef}\n className=\"ob-number__output cypress-number-output\"\n htmlFor={id}\n >\n {text}\n </output>\n <input\n ref={sliderInputRef}\n id={id}\n name={element.name}\n className=\"slider ob-input is-fullwidth cypress-slider-number-control is-large is-circle cypress-number-control\"\n step={element.sliderIncrement ? element.sliderIncrement : 1}\n min={element.minNumber}\n max={element.maxNumber}\n value={text}\n type=\"range\"\n onChange={onChange}\n required={element.required}\n disabled={element.readOnly}\n onBlur={onBlur}\n />\n </div>\n )\n})\n\nexport default React.memo(FormElementNumber)\n"]}
1
+ {"version":3,"file":"FormElementNumber.js","sourceRoot":"","sources":["../../src/form-elements/FormElementNumber.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport CopyToClipboardButton from '../components/CopyToClipboardButton'\nimport _debounce from 'lodash.debounce'\nimport useBooleanState from '../hooks/useBooleanState'\nimport LookupButton from '../components/LookupButton'\nimport { FormTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/FormElementLabelContainer'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport useIsPageVisible from '../hooks/useIsPageVisible'\n\ntype Props = {\n id: string\n element: FormTypes.NumberElement\n value: unknown\n onChange: FormElementValueChangeHandler<number>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n}\n\nfunction FormElementNumber({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n}: Props) {\n const isPageVisible = useIsPageVisible()\n const htmlInputElementRef = React.useRef<HTMLInputElement>(null)\n\n const [isDirty, setIsDirty] = useBooleanState(false)\n const text = React.useMemo(\n () => (typeof value === 'number' ? value.toString() : ''),\n [value],\n )\n\n const handleChange = React.useCallback(\n (event) => {\n onChange(\n element,\n // e.target.value is a string so '0' becomes true\n event.target.value ? parseFloat(event.target.value) : undefined,\n )\n },\n [element, onChange],\n )\n\n React.useEffect(() => {\n if (htmlInputElementRef.current) {\n htmlInputElementRef.current.value = text\n }\n }, [htmlInputElementRef, text])\n\n return (\n <div className=\"cypress-number-element\">\n <FormElementLabelContainer\n className=\"ob-number\"\n id={id}\n element={element}\n required={element.required}\n >\n {!element.isSlider ? (\n <div className=\"field has-addons\">\n <div className=\"control is-expanded has-icons-right\">\n <input\n ref={htmlInputElementRef}\n type=\"number\"\n placeholder={element.placeholderValue}\n id={id}\n name={element.name}\n className=\"input ob-input cypress-number-control\"\n onChange={handleChange}\n required={element.required}\n disabled={element.readOnly}\n onBlur={setIsDirty}\n />\n <span className=\"ob-input-icon icon is-small is-right\">\n <i className=\"material-icons is-size-5\">tag</i>\n </span>\n </div>\n {!!element.readOnly && !!text && (\n <div className=\"control\">\n <CopyToClipboardButton\n className=\"button is-input-addon cypress-copy-to-clipboard-button\"\n isInputButton\n text={text}\n />\n </div>\n )}\n <LookupButton\n isInputButton\n value={value}\n validationMessage={validationMessage}\n />\n </div>\n ) : isPageVisible ? (\n <SliderControl\n id={id}\n text={text}\n value={value}\n element={element}\n onChange={handleChange}\n onBlur={setIsDirty}\n />\n ) : undefined}\n\n {(isDirty || displayValidationMessage) && !!validationMessage && (\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\nconst sliderBubbleWidthInPixels = 24\n\nconst SliderControl = React.memo(function SliderControl({\n id,\n text,\n value,\n element,\n onChange,\n onBlur,\n}: {\n id: string\n text: string\n value: unknown\n element: FormTypes.NumberElement\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => unknown\n onBlur: () => void\n}) {\n const sliderOutputRef = React.useRef<HTMLOutputElement>(null)\n const sliderInputRef = React.useRef<HTMLInputElement>(null)\n\n const number = React.useMemo(\n () => (typeof value === 'number' ? value : parseFloat(value as string)),\n [value],\n )\n\n const removeIsDraggingClass = React.useMemo(\n () =>\n _debounce((outputElement: HTMLOutputElement) => {\n if (outputElement.classList.contains('is-dragging')) {\n outputElement.classList.remove('is-dragging')\n }\n }, 500),\n [],\n )\n\n React.useEffect(() => {\n if (\n Number.isNaN(number) ||\n typeof element.maxNumber !== 'number' ||\n typeof element.minNumber !== 'number'\n ) {\n return\n }\n\n const outputElement = sliderOutputRef.current\n const inputElement = sliderInputRef.current\n if (outputElement && inputElement) {\n const range = element.maxNumber - element.minNumber\n const percentage = (number - element.minNumber) / range\n const inputWidth = inputElement.getBoundingClientRect().width\n const outputWidth = outputElement.getBoundingClientRect().width\n const sliderBubbleOffSetPixels =\n (percentage - 0.5) * -sliderBubbleWidthInPixels\n\n outputElement.style.left = `${percentage * inputWidth}px`\n outputElement.style.marginLeft = `-${\n outputWidth / 2 - sliderBubbleOffSetPixels\n }px`\n\n if (!outputElement.classList.contains('is-dragging')) {\n outputElement.classList.add('is-dragging')\n }\n removeIsDraggingClass(outputElement)\n }\n }, [element.maxNumber, element.minNumber, number, removeIsDraggingClass])\n\n return (\n <div className=\"control\">\n <output\n ref={sliderOutputRef}\n className=\"ob-number__output cypress-number-output\"\n htmlFor={id}\n >\n {text}\n </output>\n <input\n ref={sliderInputRef}\n id={id}\n name={element.name}\n className=\"slider ob-input is-fullwidth cypress-slider-number-control is-large is-circle cypress-number-control\"\n step={element.sliderIncrement ? element.sliderIncrement : 1}\n min={element.minNumber}\n max={element.maxNumber}\n value={text}\n type=\"range\"\n onChange={onChange}\n required={element.required}\n disabled={element.readOnly}\n onBlur={onBlur}\n />\n </div>\n )\n})\n\nexport default React.memo(FormElementNumber)\n"]}
@@ -0,0 +1,3 @@
1
+ import * as React from 'react';
2
+ export declare const AbnLookupAuthenticationGuidContext: React.Context<string | undefined>;
3
+ export default function useAbnLookupAuthenticationGuid(): string | undefined;
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+ export const AbnLookupAuthenticationGuidContext = React.createContext(undefined);
3
+ export default function useAbnLookupAuthenticationGuid() {
4
+ return React.useContext(AbnLookupAuthenticationGuidContext);
5
+ }
6
+ //# sourceMappingURL=useAbnLookupAuthenticationGuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAbnLookupAuthenticationGuid.js","sourceRoot":"","sources":["../../src/hooks/useAbnLookupAuthenticationGuid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,MAAM,CAAC,MAAM,kCAAkC,GAAG,KAAK,CAAC,aAAa,CAEnE,SAAS,CAAC,CAAA;AAEZ,MAAM,CAAC,OAAO,UAAU,8BAA8B;IACpD,OAAO,KAAK,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAA;AAC7D,CAAC","sourcesContent":["import * as React from 'react'\n\nexport const AbnLookupAuthenticationGuidContext = React.createContext<\n string | undefined\n>(undefined)\n\nexport default function useAbnLookupAuthenticationGuid() {\n return React.useContext(AbnLookupAuthenticationGuidContext)\n}\n"]}
@@ -252,6 +252,7 @@ export function generateValidationSchema(elements, elementIdsWithLookupsExecuted
252
252
  };
253
253
  break;
254
254
  }
255
+ case 'abn':
255
256
  case 'geoscapeAddress':
256
257
  case 'pointAddress':
257
258
  case 'civicaStreetName':
@@ -1 +1 @@
1
- {"version":3,"file":"form-validation.js","sourceRoot":"","sources":["../../src/services/form-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import validate from 'validate.js'\nimport { localisationService } from '@oneblink/apps'\nimport { FormTypes } from '@oneblink/types'\nimport { FormElementBinaryStorageValue } from '../types/attachments'\nimport { PossibleFileConfiguration } from '../form-elements/FormElementFiles'\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\nimport { checkIsUsingLegacyStorage } from './attachments'\nimport { parseDateValue } from './generate-default-data'\nimport generateCivicaNameRecordElements from './generateCivicaNameRecordElements'\nimport {\n FormElementsConditionallyShown,\n FormElementsValidation,\n FormSubmissionModel,\n} from '../types/form'\n\nexport const lookupValidationMessage = 'Lookup is required'\n// https://validatejs.org/#validators-datetime\n// Before using it we must add the parse and format functions\n// Here is a sample implementation using moment.js\nvalidate.extend(validate.validators.datetime, {\n // The value is guaranteed not to be null or undefined but otherwise it\n // could be anything.\n parse: function (value: string) {\n return Date.parse(value)\n },\n // Input is a unix timestamp\n format: function (\n value: string,\n options: { format: (date: Date) => string },\n ) {\n const dateValue = new Date(value)\n return options.format(dateValue)\n },\n})\n\nvalidate.validators.entries = function (\n value: unknown,\n {\n setSchema,\n entrySchema,\n }: { setSchema: ValidateJSSchema; entrySchema: ValidateJSSchema },\n) {\n const entries = Array.isArray(value) ? value : []\n\n const entryErrors = entries.reduce((errorsByIndex, entry, index) => {\n const entryValidation = validateSingleMessageError(entry, entrySchema)\n if (entryValidation) {\n errorsByIndex[index] = entryValidation\n }\n return errorsByIndex\n }, {})\n\n const setErrorMessages = validate.single(value, setSchema)\n\n if (!setErrorMessages && validate.isEmpty(entryErrors)) {\n return\n }\n\n return {\n type: 'repeatableSet',\n set: setErrorMessages && setErrorMessages[0],\n entries: entryErrors,\n }\n}\n\nvalidate.validators.nestedElements = function (\n value: FormSubmissionModel | undefined,\n schema: ValidateJSSchema,\n) {\n const errors = validateSingleMessageError(value || {}, schema)\n if (!errors) {\n return\n }\n return {\n type: 'formElements',\n formElements: errors,\n }\n}\n\nfunction getInvalidAttachment(value: FormElementBinaryStorageValue) {\n if (\n value &&\n typeof value === 'object' &&\n value.type &&\n value.type === 'ERROR'\n ) {\n return value\n }\n}\nfunction validateAttachments(\n value: FormElementBinaryStorageValue[] | undefined,\n) {\n const invalidAttachmentNames = value?.reduce(\n (invalidAttachmentNames: string[], att) => {\n const attachmentName = getInvalidAttachment(att)?.fileName\n if (attachmentName) {\n invalidAttachmentNames.push(attachmentName)\n }\n return invalidAttachmentNames\n },\n [],\n )\n if (invalidAttachmentNames?.length) {\n return `${invalidAttachmentNames.join(', ')} could not be uploaded.`\n }\n}\nvalidate.validators.attachment = function (\n value: FormElementBinaryStorageValue,\n) {\n return getInvalidAttachment(value)?.errorMessage\n}\nvalidate.validators.attachments = function (\n value:\n | FormElementBinaryStorageValue[]\n | FormElementComplianceValue\n | undefined,\n) {\n if (Array.isArray(value)) {\n return validateAttachments(value)\n }\n return validateAttachments(\n value?.files as FormElementBinaryStorageValue[] | undefined,\n )\n}\n\n// Extend validator for lookups\nvalidate.validators.lookups = function (\n value: unknown,\n {\n elementIdsWithLookupsExecuted,\n formElement,\n }: {\n formElement: FormTypes.LookupFormElement & FormTypes.FormElementRequired\n elementIdsWithLookupsExecuted: string[]\n },\n) {\n if (!formElement.isDataLookup && !formElement.isElementLookup) {\n return\n }\n\n // Lookups must only be executed on required form elements\n if (formElement && !formElement.required) {\n return\n }\n\n if (elementIdsWithLookupsExecuted.includes(formElement.id)) {\n return\n }\n\n return lookupValidationMessage\n}\n\nvalidate.validators.numberRegex = function (value: unknown, format: unknown) {\n if (!format) {\n return\n }\n if (typeof value === 'number' && !Number.isNaN(value)) {\n value = value.toString()\n }\n const errorMessages = validate.single(value, { format })\n return errorMessages && errorMessages[0]\n}\n\nvalidate.validators.isTrue = function (value: unknown, message?: string) {\n if (!value) {\n return message || 'Must be set to true'\n }\n}\n\nvalidate.validators.needsExtension = function (\n value: PossibleFileConfiguration[] | undefined,\n formElement: FormTypes.FilesElement,\n) {\n const isValid =\n !Array.isArray(value) ||\n value.every((file) => {\n return checkFileNameExtensionIsValid(formElement, file.fileName)\n })\n if (!isValid) return 'All files must have extensions'\n}\n\nfunction getCustomRegexFormatConfig<DefaultValue>(\n formElement: FormTypes.FormElementWithInput<DefaultValue>,\n) {\n return formElement.regexPattern\n ? {\n pattern: formElement.regexPattern,\n flags: formElement.regexFlags,\n message: formElement.regexMessage,\n }\n : undefined\n}\n\ntype ValidateJSSchema = Record<string, unknown>\n\nexport function validateSubmission(\n schema: ValidateJSSchema,\n submission: FormSubmissionModel,\n formElementsConditionallyShown: FormElementsConditionallyShown,\n): FormElementsValidation | undefined {\n const formElementsValidation = validateSingleMessageError(submission, schema)\n if (formElementsValidation) {\n clearValidationMessagesForHiddenElements(\n formElementsValidation,\n formElementsConditionallyShown,\n )\n if (!validate.isEmpty(formElementsValidation)) {\n return formElementsValidation\n }\n }\n}\n\nconst clearValidationMessagesForHiddenElements = (\n formElementsValidation?: FormElementsValidation,\n formElementsConditionallyShown?: FormElementsConditionallyShown,\n) => {\n // If there is no validation to check, there are no invalid elements\n // If there is no conditionally shown elements, all invalid elements should display validation messages,\n if (!formElementsValidation || !formElementsConditionallyShown) {\n return\n }\n\n for (const key in formElementsValidation) {\n const formElementValidation = formElementsValidation[key]\n if (!formElementValidation) {\n continue\n }\n\n const formElementConditionallyShown = formElementsConditionallyShown[key]\n\n // If the validation is for an element that is being hidden,\n // we can remove the validation message and move to the next validation\n if (formElementConditionallyShown?.isHidden) {\n delete formElementsValidation[key]\n continue\n }\n\n // If the validation is for a single element (not nested elements),\n // we will always show the validation message\n if (typeof formElementValidation === 'string') {\n continue\n }\n\n // Here we will check to see if the nested elements that are\n // invalid are being shown, if not, remove validation messages\n switch (formElementValidation.type) {\n case 'repeatableSet': {\n for (const index in formElementValidation.entries) {\n clearValidationMessagesForHiddenElements(\n formElementValidation.entries[index],\n formElementConditionallyShown &&\n formElementConditionallyShown.type === 'repeatableSet'\n ? formElementConditionallyShown.entries[index]\n : undefined,\n )\n if (validate.isEmpty(formElementValidation.entries[index])) {\n delete formElementValidation.entries[index]\n }\n }\n // Remove the validation if all entries are valid and the set is also valid\n if (\n validate.isEmpty(formElementValidation.entries) &&\n !formElementValidation.set\n ) {\n delete formElementsValidation[key]\n }\n break\n }\n case 'formElements': {\n clearValidationMessagesForHiddenElements(\n formElementValidation.formElements,\n formElementConditionallyShown?.type === 'formElements'\n ? formElementConditionallyShown?.formElements\n : undefined,\n )\n if (validate.isEmpty(formElementValidation.formElements)) {\n delete formElementsValidation[key]\n }\n break\n }\n }\n }\n}\n\nconst presence = (required: boolean, message: string) =>\n required ? { message } : false\n\nconst escapeElementName = (elementName: string) => {\n const escapedName = elementName.replace(/\\./g, '\\\\.')\n return escapedName\n}\n\nexport function generateValidationSchema(\n elements: FormTypes.FormElement[],\n elementIdsWithLookupsExecuted: string[],\n): ValidateJSSchema {\n return elements.reduce<ValidateJSSchema>((partialSchema, formElement) => {\n switch (formElement.type) {\n case 'summary':\n case 'calculation':\n case 'image':\n case 'html':\n case 'infoPage':\n case 'heading': {\n break\n }\n case 'section':\n case 'page': {\n const nestedSchema = generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n )\n Object.assign(partialSchema, nestedSchema)\n break\n }\n case 'draw': {\n partialSchema[escapeElementName(formElement.name)] = {\n attachment: !checkIsUsingLegacyStorage(formElement),\n presence: presence(formElement.required, 'A signature is required'),\n }\n break\n }\n case 'camera': {\n partialSchema[escapeElementName(formElement.name)] = {\n attachment: !checkIsUsingLegacyStorage(formElement),\n presence: presence(formElement.required, 'A photo is required'),\n }\n break\n }\n case 'captcha': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(true, 'Please complete the CAPTCHA successfully'),\n }\n break\n }\n case 'location': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please select a location'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'compliance': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Required'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n attachments: !checkIsUsingLegacyStorage(formElement),\n }\n break\n }\n case 'geoscapeAddress':\n case 'pointAddress':\n case 'civicaStreetName':\n case 'autocomplete':\n case 'checkboxes':\n case 'radio':\n case 'select': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Required'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'boolean': {\n partialSchema[escapeElementName(formElement.name)] = {\n isTrue: formElement.required && 'Required',\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'bsb': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please enter a BSB number'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: {\n pattern: /\\d{3}-\\d{3}/,\n message: 'Please enter a valid BSB number',\n },\n }\n break\n }\n case 'barcodeScanner': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement.required,\n 'Please scan a barcode or enter a value',\n ),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'text':\n case 'textarea': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please enter a value'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n length: {\n minimum: formElement.minLength,\n tooShort:\n 'Please enter a value with at least %{count} character(s)',\n maximum: formElement.maxLength,\n tooLong: 'Please enter a value with %{count} character(s) or less',\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'telephone': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement.required,\n 'Please enter a phone number',\n ),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'email': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement.required,\n 'Please enter an email address',\n ),\n email: {\n message: 'Please enter a valid email for this field',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'time': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please select a time'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'date': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please select a date'),\n date: {\n format: (v: Date) => localisationService.formatDate(v),\n earliest: parseDateValue({\n dateOnly: true,\n daysOffset: formElement.fromDateDaysOffset,\n value: formElement.fromDate,\n }),\n latest: parseDateValue({\n dateOnly: true,\n daysOffset: formElement.toDateDaysOffset,\n value: formElement.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 lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'datetime': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement.required,\n 'Please select a date and time',\n ),\n datetime: {\n format: (v: Date) => localisationService.formatDatetime(v),\n earliest: parseDateValue({\n dateOnly: false,\n daysOffset: formElement.fromDateDaysOffset,\n value: formElement.fromDate,\n }),\n latest: parseDateValue({\n dateOnly: false,\n daysOffset: formElement.toDateDaysOffset,\n value: formElement.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 lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\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 partialSchema[escapeElementName(formElement.name)] = {\n type: 'number',\n presence: presence(formElement.required, 'Please enter a number'),\n numericality: {\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 },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n numberRegex: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'files': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n !!formElement.minEntries,\n `Please upload at least ${formElement.minEntries || 1} file(s)`,\n ),\n length: {\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 type: {\n type: (files: PossibleFileConfiguration[] | undefined) => {\n return (\n !Array.isArray(files) ||\n files.every((file) => {\n return checkFileNameIsValid(formElement, file.fileName)\n })\n )\n },\n message: `Only the following file types are accepted: ${(\n formElement.restrictedFileTypes || []\n ).join(', ')}`,\n },\n needsExtension: formElement,\n attachments: !checkIsUsingLegacyStorage(formElement),\n }\n break\n }\n case 'repeatableSet': {\n partialSchema[escapeElementName(formElement.name)] = {\n entries: {\n setSchema: {\n presence: presence(\n !!formElement.minSetEntries,\n `Must have at least ${\n formElement.minSetEntries || 1\n } entry/entries`,\n ),\n length: {\n minimum: formElement.minSetEntries,\n maximum: formElement.maxSetEntries,\n tooLong: 'Cannot have more than %{count} entry/entries',\n tooShort: 'Must have at least %{count} entry/entries',\n },\n },\n entrySchema: generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n ),\n },\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(formElement, [])\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n nestedElements,\n elementIdsWithLookupsExecuted,\n ),\n }\n break\n }\n case 'form': {\n if (formElement.elements) {\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n ),\n }\n }\n break\n }\n default: {\n console.info('Unsupported form element with validation', formElement)\n }\n }\n return partialSchema\n }, {})\n}\n\nconst validateSingleMessageError = (\n submission: FormSubmissionModel,\n schema: ValidateJSSchema,\n): FormElementsValidation | undefined => {\n const errorsAsArray = validate(submission, schema, {\n format: 'grouped',\n fullMessages: false,\n })\n if (!errorsAsArray || validate.isEmpty(errorsAsArray)) {\n return\n }\n\n const errors = Object.keys(errorsAsArray || {}).reduce(\n (messagesByFormElementName: FormElementsValidation, key) => {\n const validationMessage = errorsAsArray[key][0]\n if (validationMessage) {\n messagesByFormElementName[key.replace(/\\\\./g, '.')] = validationMessage\n }\n return messagesByFormElementName\n },\n {},\n )\n if (validate.isEmpty(errors)) {\n return\n }\n\n return errors\n}\n\nexport function checkFileNameIsValid(\n formElement: FormTypes.FilesElement,\n fileName: string,\n) {\n const extension = fileName.split('.').pop()\n return (\n !formElement.restrictedFileTypes ||\n formElement.restrictedFileTypes.some(\n (fileType) => fileType.toLowerCase() === extension?.toLowerCase(),\n )\n )\n}\n\nexport function checkFileNameExtensionIsValid(\n formElement: FormTypes.FilesElement,\n fileName: string,\n) {\n return (\n formElement.allowExtensionlessAttachments || fileName.split('.').length >= 2\n )\n}\n\nexport function checkSectionValidity(\n element: FormTypes.PageElement | FormTypes.SectionElement,\n formElementsValidation: FormElementsValidation | undefined,\n): boolean {\n // If everything is valid, no need to check elements\n if (!formElementsValidation) {\n return false\n }\n\n // If there is no elements on the page that are invalid, we will treat as valid\n return element.elements.some((formElement) => {\n switch (formElement.type) {\n case 'page':\n case 'section': {\n return checkSectionValidity(formElement, formElementsValidation)\n }\n default: {\n return formElementsValidation[formElement.name]\n }\n }\n })\n}\n"]}
1
+ {"version":3,"file":"form-validation.js","sourceRoot":"","sources":["../../src/services/form-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import validate from 'validate.js'\nimport { localisationService } from '@oneblink/apps'\nimport { FormTypes } from '@oneblink/types'\nimport { FormElementBinaryStorageValue } from '../types/attachments'\nimport { PossibleFileConfiguration } from '../form-elements/FormElementFiles'\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\nimport { checkIsUsingLegacyStorage } from './attachments'\nimport { parseDateValue } from './generate-default-data'\nimport generateCivicaNameRecordElements from './generateCivicaNameRecordElements'\nimport {\n FormElementsConditionallyShown,\n FormElementsValidation,\n FormSubmissionModel,\n} from '../types/form'\n\nexport const lookupValidationMessage = 'Lookup is required'\n// https://validatejs.org/#validators-datetime\n// Before using it we must add the parse and format functions\n// Here is a sample implementation using moment.js\nvalidate.extend(validate.validators.datetime, {\n // The value is guaranteed not to be null or undefined but otherwise it\n // could be anything.\n parse: function (value: string) {\n return Date.parse(value)\n },\n // Input is a unix timestamp\n format: function (\n value: string,\n options: { format: (date: Date) => string },\n ) {\n const dateValue = new Date(value)\n return options.format(dateValue)\n },\n})\n\nvalidate.validators.entries = function (\n value: unknown,\n {\n setSchema,\n entrySchema,\n }: { setSchema: ValidateJSSchema; entrySchema: ValidateJSSchema },\n) {\n const entries = Array.isArray(value) ? value : []\n\n const entryErrors = entries.reduce((errorsByIndex, entry, index) => {\n const entryValidation = validateSingleMessageError(entry, entrySchema)\n if (entryValidation) {\n errorsByIndex[index] = entryValidation\n }\n return errorsByIndex\n }, {})\n\n const setErrorMessages = validate.single(value, setSchema)\n\n if (!setErrorMessages && validate.isEmpty(entryErrors)) {\n return\n }\n\n return {\n type: 'repeatableSet',\n set: setErrorMessages && setErrorMessages[0],\n entries: entryErrors,\n }\n}\n\nvalidate.validators.nestedElements = function (\n value: FormSubmissionModel | undefined,\n schema: ValidateJSSchema,\n) {\n const errors = validateSingleMessageError(value || {}, schema)\n if (!errors) {\n return\n }\n return {\n type: 'formElements',\n formElements: errors,\n }\n}\n\nfunction getInvalidAttachment(value: FormElementBinaryStorageValue) {\n if (\n value &&\n typeof value === 'object' &&\n value.type &&\n value.type === 'ERROR'\n ) {\n return value\n }\n}\nfunction validateAttachments(\n value: FormElementBinaryStorageValue[] | undefined,\n) {\n const invalidAttachmentNames = value?.reduce(\n (invalidAttachmentNames: string[], att) => {\n const attachmentName = getInvalidAttachment(att)?.fileName\n if (attachmentName) {\n invalidAttachmentNames.push(attachmentName)\n }\n return invalidAttachmentNames\n },\n [],\n )\n if (invalidAttachmentNames?.length) {\n return `${invalidAttachmentNames.join(', ')} could not be uploaded.`\n }\n}\nvalidate.validators.attachment = function (\n value: FormElementBinaryStorageValue,\n) {\n return getInvalidAttachment(value)?.errorMessage\n}\nvalidate.validators.attachments = function (\n value:\n | FormElementBinaryStorageValue[]\n | FormElementComplianceValue\n | undefined,\n) {\n if (Array.isArray(value)) {\n return validateAttachments(value)\n }\n return validateAttachments(\n value?.files as FormElementBinaryStorageValue[] | undefined,\n )\n}\n\n// Extend validator for lookups\nvalidate.validators.lookups = function (\n value: unknown,\n {\n elementIdsWithLookupsExecuted,\n formElement,\n }: {\n formElement: FormTypes.LookupFormElement & FormTypes.FormElementRequired\n elementIdsWithLookupsExecuted: string[]\n },\n) {\n if (!formElement.isDataLookup && !formElement.isElementLookup) {\n return\n }\n\n // Lookups must only be executed on required form elements\n if (formElement && !formElement.required) {\n return\n }\n\n if (elementIdsWithLookupsExecuted.includes(formElement.id)) {\n return\n }\n\n return lookupValidationMessage\n}\n\nvalidate.validators.numberRegex = function (value: unknown, format: unknown) {\n if (!format) {\n return\n }\n if (typeof value === 'number' && !Number.isNaN(value)) {\n value = value.toString()\n }\n const errorMessages = validate.single(value, { format })\n return errorMessages && errorMessages[0]\n}\n\nvalidate.validators.isTrue = function (value: unknown, message?: string) {\n if (!value) {\n return message || 'Must be set to true'\n }\n}\n\nvalidate.validators.needsExtension = function (\n value: PossibleFileConfiguration[] | undefined,\n formElement: FormTypes.FilesElement,\n) {\n const isValid =\n !Array.isArray(value) ||\n value.every((file) => {\n return checkFileNameExtensionIsValid(formElement, file.fileName)\n })\n if (!isValid) return 'All files must have extensions'\n}\n\nfunction getCustomRegexFormatConfig<DefaultValue>(\n formElement: FormTypes.FormElementWithInput<DefaultValue>,\n) {\n return formElement.regexPattern\n ? {\n pattern: formElement.regexPattern,\n flags: formElement.regexFlags,\n message: formElement.regexMessage,\n }\n : undefined\n}\n\ntype ValidateJSSchema = Record<string, unknown>\n\nexport function validateSubmission(\n schema: ValidateJSSchema,\n submission: FormSubmissionModel,\n formElementsConditionallyShown: FormElementsConditionallyShown,\n): FormElementsValidation | undefined {\n const formElementsValidation = validateSingleMessageError(submission, schema)\n if (formElementsValidation) {\n clearValidationMessagesForHiddenElements(\n formElementsValidation,\n formElementsConditionallyShown,\n )\n if (!validate.isEmpty(formElementsValidation)) {\n return formElementsValidation\n }\n }\n}\n\nconst clearValidationMessagesForHiddenElements = (\n formElementsValidation?: FormElementsValidation,\n formElementsConditionallyShown?: FormElementsConditionallyShown,\n) => {\n // If there is no validation to check, there are no invalid elements\n // If there is no conditionally shown elements, all invalid elements should display validation messages,\n if (!formElementsValidation || !formElementsConditionallyShown) {\n return\n }\n\n for (const key in formElementsValidation) {\n const formElementValidation = formElementsValidation[key]\n if (!formElementValidation) {\n continue\n }\n\n const formElementConditionallyShown = formElementsConditionallyShown[key]\n\n // If the validation is for an element that is being hidden,\n // we can remove the validation message and move to the next validation\n if (formElementConditionallyShown?.isHidden) {\n delete formElementsValidation[key]\n continue\n }\n\n // If the validation is for a single element (not nested elements),\n // we will always show the validation message\n if (typeof formElementValidation === 'string') {\n continue\n }\n\n // Here we will check to see if the nested elements that are\n // invalid are being shown, if not, remove validation messages\n switch (formElementValidation.type) {\n case 'repeatableSet': {\n for (const index in formElementValidation.entries) {\n clearValidationMessagesForHiddenElements(\n formElementValidation.entries[index],\n formElementConditionallyShown &&\n formElementConditionallyShown.type === 'repeatableSet'\n ? formElementConditionallyShown.entries[index]\n : undefined,\n )\n if (validate.isEmpty(formElementValidation.entries[index])) {\n delete formElementValidation.entries[index]\n }\n }\n // Remove the validation if all entries are valid and the set is also valid\n if (\n validate.isEmpty(formElementValidation.entries) &&\n !formElementValidation.set\n ) {\n delete formElementsValidation[key]\n }\n break\n }\n case 'formElements': {\n clearValidationMessagesForHiddenElements(\n formElementValidation.formElements,\n formElementConditionallyShown?.type === 'formElements'\n ? formElementConditionallyShown?.formElements\n : undefined,\n )\n if (validate.isEmpty(formElementValidation.formElements)) {\n delete formElementsValidation[key]\n }\n break\n }\n }\n }\n}\n\nconst presence = (required: boolean, message: string) =>\n required ? { message } : false\n\nconst escapeElementName = (elementName: string) => {\n const escapedName = elementName.replace(/\\./g, '\\\\.')\n return escapedName\n}\n\nexport function generateValidationSchema(\n elements: FormTypes.FormElement[],\n elementIdsWithLookupsExecuted: string[],\n): ValidateJSSchema {\n return elements.reduce<ValidateJSSchema>((partialSchema, formElement) => {\n switch (formElement.type) {\n case 'summary':\n case 'calculation':\n case 'image':\n case 'html':\n case 'infoPage':\n case 'heading': {\n break\n }\n case 'section':\n case 'page': {\n const nestedSchema = generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n )\n Object.assign(partialSchema, nestedSchema)\n break\n }\n case 'draw': {\n partialSchema[escapeElementName(formElement.name)] = {\n attachment: !checkIsUsingLegacyStorage(formElement),\n presence: presence(formElement.required, 'A signature is required'),\n }\n break\n }\n case 'camera': {\n partialSchema[escapeElementName(formElement.name)] = {\n attachment: !checkIsUsingLegacyStorage(formElement),\n presence: presence(formElement.required, 'A photo is required'),\n }\n break\n }\n case 'captcha': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(true, 'Please complete the CAPTCHA successfully'),\n }\n break\n }\n case 'location': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please select a location'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'compliance': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Required'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n attachments: !checkIsUsingLegacyStorage(formElement),\n }\n break\n }\n case 'abn':\n case 'geoscapeAddress':\n case 'pointAddress':\n case 'civicaStreetName':\n case 'autocomplete':\n case 'checkboxes':\n case 'radio':\n case 'select': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Required'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'boolean': {\n partialSchema[escapeElementName(formElement.name)] = {\n isTrue: formElement.required && 'Required',\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'bsb': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please enter a BSB number'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: {\n pattern: /\\d{3}-\\d{3}/,\n message: 'Please enter a valid BSB number',\n },\n }\n break\n }\n case 'barcodeScanner': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement.required,\n 'Please scan a barcode or enter a value',\n ),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'text':\n case 'textarea': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please enter a value'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n length: {\n minimum: formElement.minLength,\n tooShort:\n 'Please enter a value with at least %{count} character(s)',\n maximum: formElement.maxLength,\n tooLong: 'Please enter a value with %{count} character(s) or less',\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'telephone': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement.required,\n 'Please enter a phone number',\n ),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'email': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement.required,\n 'Please enter an email address',\n ),\n email: {\n message: 'Please enter a valid email for this field',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'time': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please select a time'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'date': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement.required, 'Please select a date'),\n date: {\n format: (v: Date) => localisationService.formatDate(v),\n earliest: parseDateValue({\n dateOnly: true,\n daysOffset: formElement.fromDateDaysOffset,\n value: formElement.fromDate,\n }),\n latest: parseDateValue({\n dateOnly: true,\n daysOffset: formElement.toDateDaysOffset,\n value: formElement.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 lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'datetime': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement.required,\n 'Please select a date and time',\n ),\n datetime: {\n format: (v: Date) => localisationService.formatDatetime(v),\n earliest: parseDateValue({\n dateOnly: false,\n daysOffset: formElement.fromDateDaysOffset,\n value: formElement.fromDate,\n }),\n latest: parseDateValue({\n dateOnly: false,\n daysOffset: formElement.toDateDaysOffset,\n value: formElement.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 lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\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 partialSchema[escapeElementName(formElement.name)] = {\n type: 'number',\n presence: presence(formElement.required, 'Please enter a number'),\n numericality: {\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 },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n numberRegex: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'files': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n !!formElement.minEntries,\n `Please upload at least ${formElement.minEntries || 1} file(s)`,\n ),\n length: {\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 type: {\n type: (files: PossibleFileConfiguration[] | undefined) => {\n return (\n !Array.isArray(files) ||\n files.every((file) => {\n return checkFileNameIsValid(formElement, file.fileName)\n })\n )\n },\n message: `Only the following file types are accepted: ${(\n formElement.restrictedFileTypes || []\n ).join(', ')}`,\n },\n needsExtension: formElement,\n attachments: !checkIsUsingLegacyStorage(formElement),\n }\n break\n }\n case 'repeatableSet': {\n partialSchema[escapeElementName(formElement.name)] = {\n entries: {\n setSchema: {\n presence: presence(\n !!formElement.minSetEntries,\n `Must have at least ${\n formElement.minSetEntries || 1\n } entry/entries`,\n ),\n length: {\n minimum: formElement.minSetEntries,\n maximum: formElement.maxSetEntries,\n tooLong: 'Cannot have more than %{count} entry/entries',\n tooShort: 'Must have at least %{count} entry/entries',\n },\n },\n entrySchema: generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n ),\n },\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(formElement, [])\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n nestedElements,\n elementIdsWithLookupsExecuted,\n ),\n }\n break\n }\n case 'form': {\n if (formElement.elements) {\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n ),\n }\n }\n break\n }\n default: {\n console.info('Unsupported form element with validation', formElement)\n }\n }\n return partialSchema\n }, {})\n}\n\nconst validateSingleMessageError = (\n submission: FormSubmissionModel,\n schema: ValidateJSSchema,\n): FormElementsValidation | undefined => {\n const errorsAsArray = validate(submission, schema, {\n format: 'grouped',\n fullMessages: false,\n })\n if (!errorsAsArray || validate.isEmpty(errorsAsArray)) {\n return\n }\n\n const errors = Object.keys(errorsAsArray || {}).reduce(\n (messagesByFormElementName: FormElementsValidation, key) => {\n const validationMessage = errorsAsArray[key][0]\n if (validationMessage) {\n messagesByFormElementName[key.replace(/\\\\./g, '.')] = validationMessage\n }\n return messagesByFormElementName\n },\n {},\n )\n if (validate.isEmpty(errors)) {\n return\n }\n\n return errors\n}\n\nexport function checkFileNameIsValid(\n formElement: FormTypes.FilesElement,\n fileName: string,\n) {\n const extension = fileName.split('.').pop()\n return (\n !formElement.restrictedFileTypes ||\n formElement.restrictedFileTypes.some(\n (fileType) => fileType.toLowerCase() === extension?.toLowerCase(),\n )\n )\n}\n\nexport function checkFileNameExtensionIsValid(\n formElement: FormTypes.FilesElement,\n fileName: string,\n) {\n return (\n formElement.allowExtensionlessAttachments || fileName.split('.').length >= 2\n )\n}\n\nexport function checkSectionValidity(\n element: FormTypes.PageElement | FormTypes.SectionElement,\n formElementsValidation: FormElementsValidation | undefined,\n): boolean {\n // If everything is valid, no need to check elements\n if (!formElementsValidation) {\n return false\n }\n\n // If there is no elements on the page that are invalid, we will treat as valid\n return element.elements.some((formElement) => {\n switch (formElement.type) {\n case 'page':\n case 'section': {\n return checkSectionValidity(formElement, formElementsValidation)\n }\n default: {\n return formElementsValidation[formElement.name]\n }\n }\n })\n}\n"]}
@@ -237,6 +237,23 @@ function parsePreFillData(element, value) {
237
237
  case 'boolean': {
238
238
  return typeof value === 'boolean' ? value : false;
239
239
  }
240
+ case 'abn': {
241
+ return parseUnknownAsRecord(value, (record) => {
242
+ const hasABN = parseUnknownAsRecord(record.ABN, (ABN) => {
243
+ if (parseStringValue(ABN.identifierValue)) {
244
+ return true;
245
+ }
246
+ });
247
+ const hasMainName = parseUnknownAsRecord(record.mainName, (mainName) => {
248
+ if (parseStringValue(mainName.organisationName)) {
249
+ return true;
250
+ }
251
+ });
252
+ if (hasABN && hasMainName) {
253
+ return record;
254
+ }
255
+ });
256
+ }
240
257
  case 'pointAddress':
241
258
  case 'geoscapeAddress': {
242
259
  return parseUnknownAsRecord(value, (record) => {
@@ -390,13 +407,13 @@ export default function generateDefaultData(elements, preFillData) {
390
407
  case 'pointAddress':
391
408
  case 'civicaStreetName':
392
409
  case 'camera':
410
+ case 'abn':
393
411
  case 'bsb':
394
412
  case 'text':
395
413
  case 'barcodeScanner':
396
414
  case 'email':
397
415
  case 'telephone':
398
416
  case 'textarea':
399
- case 'file':
400
417
  case 'files':
401
418
  case 'draw':
402
419
  case 'location': {