@oneblink/apps-react 12.0.0 → 13.0.0-beta.1
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/OneBlinkAutoSaveForm.d.ts +5 -2
- package/dist/OneBlinkAutoSaveForm.js.map +1 -1
- package/dist/OneBlinkForm.d.ts +12 -62
- package/dist/OneBlinkForm.js +5 -2
- package/dist/OneBlinkForm.js.map +1 -1
- package/dist/OneBlinkFormBase.js +10 -4
- package/dist/OneBlinkFormBase.js.map +1 -1
- package/dist/OneBlinkReadOnlyForm.d.ts +0 -2
- package/dist/OneBlinkReadOnlyForm.js +1 -40
- package/dist/OneBlinkReadOnlyForm.js.map +1 -1
- package/dist/apps/services/api/submissions.d.ts +18 -2
- package/dist/apps/services/api/submissions.js +40 -4
- package/dist/apps/services/api/submissions.js.map +1 -1
- package/dist/apps/services/errors/oneBlinkAppsError.d.ts +8 -0
- package/dist/apps/services/errors/oneBlinkAppsError.js +1 -0
- package/dist/apps/services/errors/oneBlinkAppsError.js.map +1 -1
- package/dist/apps/submission-service.d.ts +6 -2
- package/dist/apps/submission-service.js +2 -2
- package/dist/apps/submission-service.js.map +1 -1
- package/dist/components/ArcGISWebMap.d.ts +2 -1
- package/dist/components/ArcGISWebMap.js +12 -4
- package/dist/components/ArcGISWebMap.js.map +1 -1
- package/dist/components/renderer/LookupButton.d.ts +2 -1
- package/dist/components/renderer/LookupButton.js +5 -4
- package/dist/components/renderer/LookupButton.js.map +1 -1
- package/dist/components/renderer/LookupNotification.js +13 -3
- package/dist/components/renderer/LookupNotification.js.map +1 -1
- package/dist/components/renderer/OneBlinkFormElements.d.ts +16 -1
- package/dist/components/renderer/OneBlinkFormElements.js +83 -39
- package/dist/components/renderer/OneBlinkFormElements.js.map +1 -1
- package/dist/components/renderer/ReverseGeocode.js +13 -1
- package/dist/components/renderer/ReverseGeocode.js.map +1 -1
- package/dist/components/renderer/attachments/DropdownMenu.d.ts +1 -2
- package/dist/components/renderer/attachments/DropdownMenu.js +4 -10
- package/dist/components/renderer/attachments/DropdownMenu.js.map +1 -1
- package/dist/components/renderer/attachments/FileCard.d.ts +2 -1
- package/dist/components/renderer/attachments/FileCard.js +2 -2
- package/dist/components/renderer/attachments/FileCard.js.map +1 -1
- package/dist/form-elements/FormElementABN.d.ts +2 -1
- package/dist/form-elements/FormElementABN.js +4 -4
- package/dist/form-elements/FormElementABN.js.map +1 -1
- package/dist/form-elements/FormElementAPINSWLiquorLicence.d.ts +2 -1
- package/dist/form-elements/FormElementAPINSWLiquorLicence.js +2 -2
- package/dist/form-elements/FormElementAPINSWLiquorLicence.js.map +1 -1
- package/dist/form-elements/FormElementArcGISWebMap.d.ts +2 -1
- package/dist/form-elements/FormElementArcGISWebMap.js +5 -5
- package/dist/form-elements/FormElementArcGISWebMap.js.map +1 -1
- package/dist/form-elements/FormElementAutocomplete.d.ts +1 -0
- package/dist/form-elements/FormElementAutocomplete.js +4 -4
- package/dist/form-elements/FormElementAutocomplete.js.map +1 -1
- package/dist/form-elements/FormElementBSB.d.ts +2 -1
- package/dist/form-elements/FormElementBSB.js +4 -4
- package/dist/form-elements/FormElementBSB.js.map +1 -1
- package/dist/form-elements/FormElementBarcodeScanner.d.ts +2 -1
- package/dist/form-elements/FormElementBarcodeScanner.js +2 -2
- package/dist/form-elements/FormElementBarcodeScanner.js.map +1 -1
- package/dist/form-elements/FormElementBoolean.d.ts +2 -1
- package/dist/form-elements/FormElementBoolean.js +3 -3
- package/dist/form-elements/FormElementBoolean.js.map +1 -1
- package/dist/form-elements/FormElementCamera.d.ts +2 -1
- package/dist/form-elements/FormElementCamera.js +4 -4
- package/dist/form-elements/FormElementCamera.js.map +1 -1
- package/dist/form-elements/FormElementCheckBoxes.d.ts +2 -1
- package/dist/form-elements/FormElementCheckBoxes.js +5 -5
- package/dist/form-elements/FormElementCheckBoxes.js.map +1 -1
- package/dist/form-elements/FormElementCivicaNameRecord.js +1 -1
- package/dist/form-elements/FormElementCivicaNameRecord.js.map +1 -1
- package/dist/form-elements/FormElementCivicaStreetName.d.ts +2 -1
- package/dist/form-elements/FormElementCivicaStreetName.js +2 -2
- package/dist/form-elements/FormElementCivicaStreetName.js.map +1 -1
- package/dist/form-elements/FormElementCompliance.d.ts +2 -1
- package/dist/form-elements/FormElementCompliance.js +5 -12
- package/dist/form-elements/FormElementCompliance.js.map +1 -1
- package/dist/form-elements/FormElementDate.d.ts +2 -1
- package/dist/form-elements/FormElementDate.js +3 -3
- package/dist/form-elements/FormElementDate.js.map +1 -1
- package/dist/form-elements/FormElementDateTime.d.ts +2 -1
- package/dist/form-elements/FormElementDateTime.js +3 -3
- package/dist/form-elements/FormElementDateTime.js.map +1 -1
- package/dist/form-elements/FormElementEmail.d.ts +2 -1
- package/dist/form-elements/FormElementEmail.js +2 -2
- package/dist/form-elements/FormElementEmail.js.map +1 -1
- package/dist/form-elements/FormElementFile.d.ts +1 -0
- package/dist/form-elements/FormElementFile.js +2 -2
- package/dist/form-elements/FormElementFile.js.map +1 -1
- package/dist/form-elements/FormElementFiles.d.ts +2 -1
- package/dist/form-elements/FormElementFiles.js +4 -4
- package/dist/form-elements/FormElementFiles.js.map +1 -1
- package/dist/form-elements/FormElementForm.d.ts +21 -1
- package/dist/form-elements/FormElementForm.js +5 -12
- package/dist/form-elements/FormElementForm.js.map +1 -1
- package/dist/form-elements/FormElementFreshdeskDependentField.js +1 -1
- package/dist/form-elements/FormElementFreshdeskDependentField.js.map +1 -1
- package/dist/form-elements/FormElementGeoscapeAddress.d.ts +2 -1
- package/dist/form-elements/FormElementGeoscapeAddress.js +2 -2
- package/dist/form-elements/FormElementGeoscapeAddress.js.map +1 -1
- package/dist/form-elements/FormElementGoogleAddress.d.ts +2 -1
- package/dist/form-elements/FormElementGoogleAddress.js +2 -2
- package/dist/form-elements/FormElementGoogleAddress.js.map +1 -1
- package/dist/form-elements/FormElementLocation.d.ts +2 -1
- package/dist/form-elements/FormElementLocation.js +3 -3
- package/dist/form-elements/FormElementLocation.js.map +1 -1
- package/dist/form-elements/FormElementLookupButton.d.ts +2 -1
- package/dist/form-elements/FormElementLookupButton.js +6 -3
- package/dist/form-elements/FormElementLookupButton.js.map +1 -1
- package/dist/form-elements/FormElementNumber.d.ts +2 -1
- package/dist/form-elements/FormElementNumber.js +4 -4
- package/dist/form-elements/FormElementNumber.js.map +1 -1
- package/dist/form-elements/FormElementPointAddress.d.ts +2 -1
- package/dist/form-elements/FormElementPointAddress.js +2 -2
- package/dist/form-elements/FormElementPointAddress.js.map +1 -1
- package/dist/form-elements/FormElementPointAddressV3.d.ts +2 -1
- package/dist/form-elements/FormElementPointAddressV3.js +2 -2
- package/dist/form-elements/FormElementPointAddressV3.js.map +1 -1
- package/dist/form-elements/FormElementPointCadastralParcel.d.ts +2 -1
- package/dist/form-elements/FormElementPointCadastralParcel.js +3 -3
- package/dist/form-elements/FormElementPointCadastralParcel.js.map +1 -1
- package/dist/form-elements/FormElementRadio.d.ts +2 -1
- package/dist/form-elements/FormElementRadio.js +3 -3
- package/dist/form-elements/FormElementRadio.js.map +1 -1
- package/dist/form-elements/FormElementRepeatableSet.d.ts +13 -1
- package/dist/form-elements/FormElementRepeatableSet.js +10 -10
- package/dist/form-elements/FormElementRepeatableSet.js.map +1 -1
- package/dist/form-elements/FormElementSection.d.ts +7 -1
- package/dist/form-elements/FormElementSection.js +2 -2
- package/dist/form-elements/FormElementSection.js.map +1 -1
- package/dist/form-elements/FormElementSelect.d.ts +2 -1
- package/dist/form-elements/FormElementSelect.js +4 -4
- package/dist/form-elements/FormElementSelect.js.map +1 -1
- package/dist/form-elements/FormElementSignature.d.ts +2 -1
- package/dist/form-elements/FormElementSignature.js +9 -9
- package/dist/form-elements/FormElementSignature.js.map +1 -1
- package/dist/form-elements/FormElementTelephone.d.ts +2 -1
- package/dist/form-elements/FormElementTelephone.js +2 -2
- package/dist/form-elements/FormElementTelephone.js.map +1 -1
- package/dist/form-elements/FormElementText.d.ts +2 -1
- package/dist/form-elements/FormElementText.js +2 -2
- package/dist/form-elements/FormElementText.js.map +1 -1
- package/dist/form-elements/FormElementTextarea.d.ts +2 -1
- package/dist/form-elements/FormElementTextarea.js +4 -4
- package/dist/form-elements/FormElementTextarea.js.map +1 -1
- package/dist/form-elements/FormElementTime.d.ts +2 -1
- package/dist/form-elements/FormElementTime.js +3 -3
- package/dist/form-elements/FormElementTime.js.map +1 -1
- package/dist/form-elements/OptionButton.d.ts +1 -1
- package/dist/form-elements/OptionButton.js +2 -2
- package/dist/form-elements/OptionButton.js.map +1 -1
- package/dist/hooks/useDynamicOptionsLoaderState.js +5 -1
- package/dist/hooks/useDynamicOptionsLoaderState.js.map +1 -1
- package/dist/hooks/useFormValidation.d.ts +1 -1
- package/dist/hooks/useFormValidation.js +20 -8
- package/dist/hooks/useFormValidation.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/form-validation/extensions.d.ts +2 -1
- package/dist/services/form-validation/extensions.js +2 -1
- package/dist/services/form-validation/extensions.js.map +1 -1
- package/dist/services/form-validation/validateSubmission.d.ts +2 -1
- package/dist/services/form-validation/validateSubmission.js +38 -12
- package/dist/services/form-validation/validateSubmission.js.map +1 -1
- package/dist/services/generateCivicaNameRecordElements.js +0 -13
- package/dist/services/generateCivicaNameRecordElements.js.map +1 -1
- package/dist/services/generateFreshdeskDependentFieldElements.js +0 -3
- package/dist/services/generateFreshdeskDependentFieldElements.js.map +1 -1
- package/dist/services/isElementReadOnlyForAudience.d.ts +20 -0
- package/dist/services/isElementReadOnlyForAudience.js +46 -0
- package/dist/services/isElementReadOnlyForAudience.js.map +1 -0
- package/dist/services/resolveFormElementReadOnly.d.ts +10 -0
- package/dist/services/resolveFormElementReadOnly.js +17 -0
- package/dist/services/resolveFormElementReadOnly.js.map +1 -0
- package/package.json +2 -2
|
@@ -6,6 +6,8 @@ import { parseLocationValue } from '../../form-elements/FormElementLocation';
|
|
|
6
6
|
import useFormSubmissionModel from '../../hooks/useFormSubmissionModelContext';
|
|
7
7
|
import useFormDefinition from '../../hooks/useFormDefinition';
|
|
8
8
|
import useFormIsReadOnly from '../../hooks/useFormIsReadOnly';
|
|
9
|
+
import useFormAudience from '../../hooks/useFormAudience';
|
|
10
|
+
import isElementReadOnlyForAudience from '../../services/isElementReadOnlyForAudience';
|
|
9
11
|
const ReverseGeocodeContext = React.createContext({
|
|
10
12
|
isReverseGeocoding: false,
|
|
11
13
|
});
|
|
@@ -18,6 +20,7 @@ export default function ReverseGeocode({ value, element, onChange, children, })
|
|
|
18
20
|
const formDefinition = useFormDefinition();
|
|
19
21
|
const formSubmissionModel = useFormSubmissionModel();
|
|
20
22
|
const formIsReadOnly = useFormIsReadOnly();
|
|
23
|
+
const audience = useFormAudience();
|
|
21
24
|
const formattedAddressElement = React.useMemo(() => {
|
|
22
25
|
var _a;
|
|
23
26
|
if ((_a = element.reverseGeocoding) === null || _a === void 0 ? void 0 : _a.formattedAddressElementId) {
|
|
@@ -30,7 +33,14 @@ export default function ReverseGeocode({ value, element, onChange, children, })
|
|
|
30
33
|
formSubmissionModel.elements,
|
|
31
34
|
]);
|
|
32
35
|
React.useEffect(() => {
|
|
33
|
-
|
|
36
|
+
// Definition-level `readOnly` still allows a submitter's prefill or
|
|
37
|
+
// default location to populate its formatted-address field. An
|
|
38
|
+
// approver-locked location must not do so: opening a review should never
|
|
39
|
+
// replace the address saved with the original submission.
|
|
40
|
+
if (formIsReadOnly ||
|
|
41
|
+
isElementReadOnlyForAudience(element, audience) ||
|
|
42
|
+
!coords ||
|
|
43
|
+
!formattedAddressElement) {
|
|
34
44
|
return;
|
|
35
45
|
}
|
|
36
46
|
const abortController = new AbortController();
|
|
@@ -88,7 +98,9 @@ export default function ReverseGeocode({ value, element, onChange, children, })
|
|
|
88
98
|
effect();
|
|
89
99
|
return () => abortController.abort();
|
|
90
100
|
}, [
|
|
101
|
+
audience,
|
|
91
102
|
coords,
|
|
103
|
+
element,
|
|
92
104
|
formDefinition.id,
|
|
93
105
|
formIsReadOnly,
|
|
94
106
|
formattedAddressElement,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReverseGeocode.js","sourceRoot":"","sources":["../../../src/components/renderer/ReverseGeocode.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AAC5E,OAAO,sBAAsB,MAAM,2CAA2C,CAAA;AAC9E,OAAO,iBAAiB,MAAM,+BAA+B,CAAA;AAC7D,OAAO,iBAAiB,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"ReverseGeocode.js","sourceRoot":"","sources":["../../../src/components/renderer/ReverseGeocode.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\n\nimport { FormTypes, GeoscapeTypes } from '@oneblink/types'\nimport { formService, OneBlinkAppsError } from '../../apps'\nimport { formElementsService } from '@oneblink/sdk-core'\n\nimport { parseLocationValue } from '../../form-elements/FormElementLocation'\nimport useFormSubmissionModel from '../../hooks/useFormSubmissionModelContext'\nimport useFormDefinition from '../../hooks/useFormDefinition'\nimport useFormIsReadOnly from '../../hooks/useFormIsReadOnly'\nimport { FormElementValueChangeHandler } from '../../types/form'\nimport useFormAudience from '../../hooks/useFormAudience'\nimport isElementReadOnlyForAudience from '../../services/isElementReadOnlyForAudience'\n\ntype ReverseGeocodeContextValue = {\n isReverseGeocoding: boolean\n reverseGeocodingErrorMsg?: string\n}\n\nconst ReverseGeocodeContext = React.createContext<ReverseGeocodeContextValue>({\n isReverseGeocoding: false,\n})\n\nexport default function ReverseGeocode({\n value,\n element,\n onChange,\n children,\n}: React.PropsWithChildren<{\n value: unknown\n element: FormTypes.LocationElement\n onChange: FormElementValueChangeHandler<\n GeoscapeTypes.GeoscapeAddress | string\n >\n}>) {\n const coords = React.useMemo(() => parseLocationValue(value), [value])\n const [reverseGeocodingState, setReverseGeocodingState] =\n React.useState<ReverseGeocodeContextValue>({\n isReverseGeocoding: false,\n })\n\n const formDefinition = useFormDefinition()\n const formSubmissionModel = useFormSubmissionModel()\n const formIsReadOnly = useFormIsReadOnly()\n const audience = useFormAudience()\n\n const formattedAddressElement = React.useMemo(() => {\n if (element.reverseGeocoding?.formattedAddressElementId) {\n return formElementsService\n .flattenFormElements(formSubmissionModel.elements)\n .find(\n (el) => el.id === element.reverseGeocoding?.formattedAddressElementId,\n )\n }\n }, [\n element.reverseGeocoding?.formattedAddressElementId,\n formSubmissionModel.elements,\n ])\n\n React.useEffect(() => {\n // Definition-level `readOnly` still allows a submitter's prefill or\n // default location to populate its formatted-address field. An\n // approver-locked location must not do so: opening a review should never\n // replace the address saved with the original submission.\n if (\n formIsReadOnly ||\n isElementReadOnlyForAudience(element, audience) ||\n !coords ||\n !formattedAddressElement\n ) {\n return\n }\n\n const abortController = new AbortController()\n const effect = async () => {\n try {\n setReverseGeocodingState({ isReverseGeocoding: true })\n const { reverseGeocodeResult } =\n await formService.getGeoscapeReverseGeocoding({\n lat: coords.latitude,\n lng: coords.longitude,\n formId: formDefinition.id,\n abortSignal: abortController.signal,\n })\n switch (formattedAddressElement.type) {\n case 'text': {\n if (reverseGeocodeResult.addressDetails?.formattedAddress) {\n onChange(formattedAddressElement, {\n value: reverseGeocodeResult.addressDetails?.formattedAddress,\n })\n }\n break\n }\n case 'geoscapeAddress': {\n onChange(formattedAddressElement, {\n value: reverseGeocodeResult,\n })\n break\n }\n }\n setReverseGeocodingState({\n isReverseGeocoding: false,\n })\n } catch (e) {\n if (abortController.signal.aborted) {\n return\n }\n console.warn('Error attempting to reverse geocode location', e)\n let errorMsg = 'Could not find your address.'\n if (e instanceof OneBlinkAppsError) {\n if (e.httpStatusCode !== 404) {\n errorMsg = e.message\n } else if (e.isOffline) {\n errorMsg =\n 'It looks like you're offline. Please try again when connectivity is restored.'\n }\n }\n\n setReverseGeocodingState({\n isReverseGeocoding: false,\n reverseGeocodingErrorMsg: errorMsg,\n })\n }\n }\n\n effect()\n\n return () => abortController.abort()\n }, [\n audience,\n coords,\n element,\n formDefinition.id,\n formIsReadOnly,\n formattedAddressElement,\n onChange,\n ])\n\n return (\n <ReverseGeocodeContext.Provider value={reverseGeocodingState}>\n {children}\n </ReverseGeocodeContext.Provider>\n )\n}\n\nexport function useReverseGeocodeContext() {\n const reverseGeocodeContext = React.useContext(ReverseGeocodeContext)\n if (!reverseGeocodeContext) {\n throw new TypeError(\n 'You have attempted to run the hook \"useReverseGeocodeContext()\" outside of the \"ReverseGeocodeContext\" context.',\n )\n }\n return reverseGeocodeContext\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import { FormTypes } from '@oneblink/types';
|
|
3
2
|
interface Props {
|
|
4
|
-
|
|
3
|
+
readOnly: boolean;
|
|
5
4
|
/** If set to `undefined`, the remove button will be hidden */
|
|
6
5
|
onRemove: (() => void) | undefined;
|
|
7
6
|
onDownload?: () => void;
|
|
@@ -4,7 +4,7 @@ import clsx from 'clsx';
|
|
|
4
4
|
import useBooleanState from '../../../hooks/useBooleanState';
|
|
5
5
|
import useClickOutsideElement from '../../../hooks/useClickOutsideElement';
|
|
6
6
|
import MaterialIcon from '../../MaterialIcon';
|
|
7
|
-
const DropdownMenu = ({
|
|
7
|
+
const DropdownMenu = ({ readOnly, onRemove, onDownload, onRetry, attachmentUrl, onAnnotate, onCrop, }) => {
|
|
8
8
|
const dropDownRef = React.useRef(null);
|
|
9
9
|
const [isShowingMore, showMore, hideMore] = useBooleanState(false);
|
|
10
10
|
useClickOutsideElement(dropDownRef, React.useCallback(() => {
|
|
@@ -26,19 +26,13 @@ const DropdownMenu = ({ element, onRemove, onDownload, onRetry, attachmentUrl, o
|
|
|
26
26
|
gap: 2,
|
|
27
27
|
}, onClick: () => {
|
|
28
28
|
hideMore();
|
|
29
|
-
}, children: [_jsx("span", { children: "Open" }), _jsx(MaterialIcon, { className: "icon-small", children: "open_in_new" })] })), onRemove && (_jsx("a", { className:
|
|
30
|
-
'ob-files__menu-remove-hidden': element.readOnly,
|
|
31
|
-
}), onClick: () => {
|
|
29
|
+
}, children: [_jsx("span", { children: "Open" }), _jsx(MaterialIcon, { className: "icon-small", children: "open_in_new" })] })), onRemove && !readOnly && (_jsx("a", { className: "dropdown-item cypress-file-remove-button", onClick: () => {
|
|
32
30
|
hideMore();
|
|
33
31
|
onRemove();
|
|
34
|
-
}, role: "menuitem", children: "Remove" })), onAnnotate && (_jsx("a", { className:
|
|
35
|
-
'ob-files__menu-annotate-hidden': element.readOnly,
|
|
36
|
-
}), onClick: () => {
|
|
32
|
+
}, role: "menuitem", children: "Remove" })), onAnnotate && !readOnly && (_jsx("a", { className: "dropdown-item cypress-file-annotate-button", onClick: () => {
|
|
37
33
|
hideMore();
|
|
38
34
|
onAnnotate();
|
|
39
|
-
}, role: "menuitem", children: "Annotate" })), onCrop && (_jsx("a", { className:
|
|
40
|
-
'ob-files__menu-crop-hidden': element.readOnly,
|
|
41
|
-
}), onClick: () => {
|
|
35
|
+
}, role: "menuitem", children: "Annotate" })), onCrop && !readOnly && (_jsx("a", { className: "dropdown-item cypress-file-crop-button", onClick: () => {
|
|
42
36
|
hideMore();
|
|
43
37
|
onCrop();
|
|
44
38
|
}, role: "menuitem", children: "Crop" }))] }) })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.js","sourceRoot":"","sources":["../../../../src/components/renderer/attachments/DropdownMenu.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","sourceRoot":"","sources":["../../../../src/components/renderer/attachments/DropdownMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\nimport useBooleanState from '../../../hooks/useBooleanState'\nimport useClickOutsideElement from '../../../hooks/useClickOutsideElement'\nimport MaterialIcon from '../../MaterialIcon'\n\ninterface Props {\n readOnly: boolean\n /** If set to `undefined`, the remove button will be hidden */\n onRemove: (() => void) | undefined\n onDownload?: () => void\n onRetry?: () => void\n attachmentUrl: string | null | undefined\n onAnnotate?: () => void\n onCrop?: () => void\n}\n\nconst DropdownMenu = ({\n readOnly,\n onRemove,\n onDownload,\n onRetry,\n attachmentUrl,\n onAnnotate,\n onCrop,\n}: Props) => {\n const dropDownRef = React.useRef(null)\n const [isShowingMore, showMore, hideMore] = useBooleanState(false)\n\n useClickOutsideElement(\n dropDownRef,\n React.useCallback(() => {\n if (isShowingMore) {\n hideMore()\n }\n }, [hideMore, isShowingMore]),\n )\n\n return (\n <div\n className={clsx('dropdown is-right ob-files__menu', {\n 'is-active': isShowingMore,\n })}\n ref={dropDownRef}\n >\n <div className=\"dropdown-trigger\">\n <button\n type=\"button\"\n className=\"button ob-files__menu-button cypress-file-menu-button\"\n aria-haspopup=\"true\"\n aria-controls=\"dropdown-menu\"\n onClick={isShowingMore ? hideMore : showMore}\n >\n <MaterialIcon className=\"ob-files__menu-icon\">more_vert</MaterialIcon>\n </button>\n </div>\n <div className=\"dropdown-menu\" role=\"menu\">\n <div className=\"dropdown-content\">\n {onRetry && (\n <a\n className=\"dropdown-item cypress-file-retry-button\"\n onClick={() => {\n hideMore()\n onRetry()\n }}\n role=\"menuitem\"\n >\n Retry\n </a>\n )}\n {onDownload && (\n <a\n className=\"dropdown-item cypress-file-download-button\"\n onClick={() => {\n hideMore()\n onDownload()\n }}\n role=\"menuitem\"\n >\n Download\n </a>\n )}\n {attachmentUrl && (\n <a\n href={attachmentUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"dropdown-item cypress-file-open-button\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n }}\n onClick={() => {\n hideMore()\n }}\n >\n <span>Open</span>\n <MaterialIcon className=\"icon-small\">open_in_new</MaterialIcon>\n </a>\n )}\n {onRemove && !readOnly && (\n <a\n className=\"dropdown-item cypress-file-remove-button\"\n onClick={() => {\n hideMore()\n onRemove()\n }}\n role=\"menuitem\"\n >\n Remove\n </a>\n )}\n {onAnnotate && !readOnly && (\n <a\n className=\"dropdown-item cypress-file-annotate-button\"\n onClick={() => {\n hideMore()\n onAnnotate()\n }}\n role=\"menuitem\"\n >\n Annotate\n </a>\n )}\n {onCrop && !readOnly && (\n <a\n className=\"dropdown-item cypress-file-crop-button\"\n onClick={() => {\n hideMore()\n onCrop()\n }}\n role=\"menuitem\"\n >\n Crop\n </a>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default React.memo<Props>(DropdownMenu)\n"]}
|
|
@@ -2,6 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { FormTypes } from '@oneblink/types';
|
|
3
3
|
type Props = {
|
|
4
4
|
element: FormTypes.FilesElement;
|
|
5
|
+
readOnly: boolean;
|
|
5
6
|
isUploading?: boolean;
|
|
6
7
|
isUploadPaused?: boolean;
|
|
7
8
|
uploadErrorMessage?: string;
|
|
@@ -19,6 +20,6 @@ type Props = {
|
|
|
19
20
|
progress: undefined | number;
|
|
20
21
|
index: number;
|
|
21
22
|
};
|
|
22
|
-
declare function FileCard({ element, isUploading, isUploadPaused, uploadErrorMessage, loadAttachmentUrlError, isLoadingAttachmentUrl, isContentTypeImage, attachmentUrl, fileName, onDownload, onRemove, onRetry, onAnnotate, onCrop, progress, index, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
declare function FileCard({ element, readOnly, isUploading, isUploadPaused, uploadErrorMessage, loadAttachmentUrlError, isLoadingAttachmentUrl, isContentTypeImage, attachmentUrl, fileName, onDownload, onRemove, onRetry, onAnnotate, onCrop, progress, index, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
23
24
|
declare const _default: React.MemoExoticComponent<typeof FileCard>;
|
|
24
25
|
export default _default;
|
|
@@ -5,7 +5,7 @@ import AttachmentStatus from './AttachmentStatus';
|
|
|
5
5
|
import { checkFileNameIsValid, checkFileNameExtensionIsValid, } from '../../../services/form-validation/validators';
|
|
6
6
|
import ProgressBar from './ProgressBar';
|
|
7
7
|
import DropdownMenu from './DropdownMenu';
|
|
8
|
-
function FileCard({ element, isUploading, isUploadPaused, uploadErrorMessage, loadAttachmentUrlError, isLoadingAttachmentUrl, isContentTypeImage, attachmentUrl, fileName, onDownload, onRemove, onRetry, onAnnotate, onCrop, progress, index, }) {
|
|
8
|
+
function FileCard({ element, readOnly, isUploading, isUploadPaused, uploadErrorMessage, loadAttachmentUrlError, isLoadingAttachmentUrl, isContentTypeImage, attachmentUrl, fileName, onDownload, onRemove, onRetry, onAnnotate, onCrop, progress, index, }) {
|
|
9
9
|
const uploadError = React.useMemo(() => {
|
|
10
10
|
if (!checkFileNameIsValid(element, fileName)) {
|
|
11
11
|
return new Error(`${fileName.split('.').pop()} files are not allowed`);
|
|
@@ -17,7 +17,7 @@ function FileCard({ element, isUploading, isUploadPaused, uploadErrorMessage, lo
|
|
|
17
17
|
return new Error(uploadErrorMessage);
|
|
18
18
|
}
|
|
19
19
|
}, [element, fileName, uploadErrorMessage]);
|
|
20
|
-
return (_jsx("div", { className: "column is-one-quarter-ob", children: _jsxs("div", { className: "ob-files__box", children: [_jsx("div", { className: "ob-files__content", children: _jsx("a", { href: attachmentUrl || '', target: "_blank", rel: "noreferrer", className: "cypress-file-download-button", style: { pointerEvents: attachmentUrl ? 'auto' : 'none' }, children: _jsx(FileCardContent, { attachmentUrl: attachmentUrl, alt: `${element.label}: Attachment ${index + 1}`, isContentTypeImage: isContentTypeImage }) }) }), _jsx(DropdownMenu, {
|
|
20
|
+
return (_jsx("div", { className: "column is-one-quarter-ob", children: _jsxs("div", { className: "ob-files__box", children: [_jsx("div", { className: "ob-files__content", children: _jsx("a", { href: attachmentUrl || '', target: "_blank", rel: "noreferrer", className: "cypress-file-download-button", style: { pointerEvents: attachmentUrl ? 'auto' : 'none' }, children: _jsx(FileCardContent, { attachmentUrl: attachmentUrl, alt: `${element.label}: Attachment ${index + 1}`, isContentTypeImage: isContentTypeImage }) }) }), _jsx(DropdownMenu, { readOnly: readOnly, onDownload: onDownload, onRetry: onRetry, onRemove: onRemove, attachmentUrl: attachmentUrl || '', onAnnotate: onAnnotate, onCrop: onCrop }), _jsxs("div", { className: "ob-files__file-name is-size-6", children: [_jsx("span", { className: "ob-files__file-name-inner", children: fileName }), _jsx(AttachmentStatus, { isUploading: isUploading, isUploadPaused: isUploadPaused, uploadError: uploadError, loadAttachmentUrlError: loadAttachmentUrlError, isLoadingAttachmentUrl: isLoadingAttachmentUrl, attachmentUrl: attachmentUrl, progress: progress }), _jsx(ProgressBar, { progress: progress, isShowing: !!isUploading })] })] }) }));
|
|
21
21
|
}
|
|
22
22
|
export default React.memo(FileCard);
|
|
23
23
|
//# sourceMappingURL=FileCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileCard.js","sourceRoot":"","sources":["../../../../src/components/renderer/attachments/FileCard.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;AACjD,OAAO,EACL,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,8CAA8C,CAAA;AACrD,OAAO,WAAW,MAAM,eAAe,CAAA;AACvC,OAAO,YAAY,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"FileCard.js","sourceRoot":"","sources":["../../../../src/components/renderer/attachments/FileCard.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;AACjD,OAAO,EACL,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,8CAA8C,CAAA;AACrD,OAAO,WAAW,MAAM,eAAe,CAAA;AACvC,OAAO,YAAY,MAAM,gBAAgB,CAAA;AAuBzC,SAAS,QAAQ,CAAC,EAChB,OAAO,EACP,QAAQ,EACR,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,OAAO,EACP,UAAU,EACV,MAAM,EACN,QAAQ,EACR,KAAK,GACC;IACN,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,CAAC,6BAA6B,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,KAAK,CAAC,GAAG,QAAQ,yBAAyB,CAAC,CAAA;QACxD,CAAC;QACD,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACtC,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAE3C,OAAO,CACL,cAAK,SAAS,EAAC,0BAA0B,YACvC,eAAK,SAAS,EAAC,eAAe,aAC5B,cAAK,SAAS,EAAC,mBAAmB,YAChC,YACE,IAAI,EAAE,aAAa,IAAI,EAAE,EACzB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,EAChB,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,YAEzD,KAAC,eAAe,IACd,aAAa,EAAE,aAAa,EAC5B,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,gBAAgB,KAAK,GAAG,CAAC,EAAE,EAChD,kBAAkB,EAAE,kBAAkB,GACtC,GACA,GACA,EACN,KAAC,YAAY,IACX,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,IAAI,EAAE,EAClC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACd,EAEF,eAAK,SAAS,EAAC,+BAA+B,aAC5C,eAAM,SAAS,EAAC,2BAA2B,YAAE,QAAQ,GAAQ,EAC7D,KAAC,gBAAgB,IACf,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,sBAAsB,EAAE,sBAAsB,EAC9C,sBAAsB,EAAE,sBAAsB,EAC9C,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,GAClB,EACF,KAAC,WAAW,IAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,GAAI,IACzD,IACF,GACF,CACP,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport FileCardContent from './FileCardContent'\nimport AttachmentStatus from './AttachmentStatus'\nimport {\n checkFileNameIsValid,\n checkFileNameExtensionIsValid,\n} from '../../../services/form-validation/validators'\nimport ProgressBar from './ProgressBar'\nimport DropdownMenu from './DropdownMenu'\n\ntype Props = {\n element: FormTypes.FilesElement\n readOnly: boolean\n isUploading?: boolean\n isUploadPaused?: boolean\n uploadErrorMessage?: string\n loadAttachmentUrlError?: Error\n isLoadingAttachmentUrl?: boolean\n isContentTypeImage?: boolean\n fileName: string\n attachmentUrl: string | undefined | null\n /** If set to `undefined`, the remove button will be hidden */\n onRemove: (() => void) | undefined\n onDownload?: () => void\n onRetry?: () => void\n onAnnotate?: () => void\n onCrop?: () => void\n progress: undefined | number\n index: number\n}\n\nfunction FileCard({\n element,\n readOnly,\n isUploading,\n isUploadPaused,\n uploadErrorMessage,\n loadAttachmentUrlError,\n isLoadingAttachmentUrl,\n isContentTypeImage,\n attachmentUrl,\n fileName,\n onDownload,\n onRemove,\n onRetry,\n onAnnotate,\n onCrop,\n progress,\n index,\n}: Props) {\n const uploadError = React.useMemo(() => {\n if (!checkFileNameIsValid(element, fileName)) {\n return new Error(`${fileName.split('.').pop()} files are not allowed`)\n }\n if (!checkFileNameExtensionIsValid(element, fileName)) {\n return new Error(`${fileName} must have an extension`)\n }\n if (uploadErrorMessage) {\n return new Error(uploadErrorMessage)\n }\n }, [element, fileName, uploadErrorMessage])\n\n return (\n <div className=\"column is-one-quarter-ob\">\n <div className=\"ob-files__box\">\n <div className=\"ob-files__content\">\n <a\n href={attachmentUrl || ''}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"cypress-file-download-button\"\n style={{ pointerEvents: attachmentUrl ? 'auto' : 'none' }}\n >\n <FileCardContent\n attachmentUrl={attachmentUrl}\n alt={`${element.label}: Attachment ${index + 1}`}\n isContentTypeImage={isContentTypeImage}\n />\n </a>\n </div>\n <DropdownMenu\n readOnly={readOnly}\n onDownload={onDownload}\n onRetry={onRetry}\n onRemove={onRemove}\n attachmentUrl={attachmentUrl || ''}\n onAnnotate={onAnnotate}\n onCrop={onCrop}\n />\n\n <div className=\"ob-files__file-name is-size-6\">\n <span className=\"ob-files__file-name-inner\">{fileName}</span>\n <AttachmentStatus\n isUploading={isUploading}\n isUploadPaused={isUploadPaused}\n uploadError={uploadError}\n loadAttachmentUrlError={loadAttachmentUrlError}\n isLoadingAttachmentUrl={isLoadingAttachmentUrl}\n attachmentUrl={attachmentUrl}\n progress={progress}\n />\n <ProgressBar progress={progress} isShowing={!!isUploading} />\n </div>\n </div>\n </div>\n )\n}\n\nexport default React.memo(FileCard)\n"]}
|
|
@@ -4,12 +4,13 @@ import { FormElementValueChangeHandler, IsDirtyProps } from '../types/form';
|
|
|
4
4
|
type Props = {
|
|
5
5
|
id: string;
|
|
6
6
|
element: FormTypes.ABNElement;
|
|
7
|
+
readOnly: boolean;
|
|
7
8
|
value: MiscTypes.ABNRecord | undefined;
|
|
8
9
|
onChange: FormElementValueChangeHandler<MiscTypes.ABNRecord>;
|
|
9
10
|
displayValidationMessage: boolean;
|
|
10
11
|
validationMessage: string | undefined;
|
|
11
12
|
autocompleteAttributes?: string;
|
|
12
13
|
} & IsDirtyProps;
|
|
13
|
-
declare function FormElementABN({ id, element, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, autocompleteAttributes, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
declare function FormElementABN({ id, element, readOnly, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, autocompleteAttributes, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
14
15
|
declare const _default: React.MemoExoticComponent<typeof FormElementABN>;
|
|
15
16
|
export default _default;
|
|
@@ -12,7 +12,7 @@ import { abnService } from '@oneblink/sdk-core';
|
|
|
12
12
|
import { LookupNotificationContext } from '../hooks/useLookupNotification';
|
|
13
13
|
import useElementAriaDescribedby from '../hooks/useElementAriaDescribedby';
|
|
14
14
|
import FormElementValidationMessage from '../components/renderer/FormElementValidationMessage';
|
|
15
|
-
function FormElementABN({ id, element, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, autocompleteAttributes, }) {
|
|
15
|
+
function FormElementABN({ id, element, readOnly, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, autocompleteAttributes, }) {
|
|
16
16
|
const ariaDescribedby = useElementAriaDescribedby(id, element);
|
|
17
17
|
const abnLookupAuthenticationGuid = useAbnLookupAuthenticationGuid();
|
|
18
18
|
const [label, setLabel] = React.useState(value ? abnService.getABNNumberFromABNRecord(value) || '' : '');
|
|
@@ -137,7 +137,7 @@ function FormElementABN({ id, element, value, onChange, validationMessage, displ
|
|
|
137
137
|
!isLoading) ||
|
|
138
138
|
error) &&
|
|
139
139
|
!isLookingUp;
|
|
140
|
-
const hasCopyButton = !!value && !!
|
|
140
|
+
const hasCopyButton = !!value && !!readOnly;
|
|
141
141
|
const hasLookupButton = element.isDataLookup || element.isElementLookup;
|
|
142
142
|
return (_jsx("div", { className: "cypress-abn-element", children: _jsxs(FormElementLabelContainer, { className: "ob-abn", id: id, element: element, required: element.required, children: [_jsxs("div", { className: clsx('field has-addons', {
|
|
143
143
|
'no-addons-mobile': !hasCopyButton && !hasLookupButton,
|
|
@@ -150,10 +150,10 @@ function FormElementABN({ id, element, value, onChange, validationMessage, displ
|
|
|
150
150
|
value: undefined,
|
|
151
151
|
});
|
|
152
152
|
}
|
|
153
|
-
}, required: element.required, disabled:
|
|
153
|
+
}, required: element.required, disabled: readOnly, onBlur: () => {
|
|
154
154
|
setIsDirty();
|
|
155
155
|
removeFocus();
|
|
156
|
-
}, onFocus: setIsFocused, "aria-describedby": ariaDescribedby, autoComplete: autocompleteAttributes, "aria-required": element.required }) }), value && (_jsx(ABNDisplay, { abnRecord: value, className: "ob-abn__display-desktop" })), hasCopyButton && (_jsx("div", { className: "control", children: _jsx(CopyToClipboardButton, { className: "button is-input-addon copy-button cypress-copy-to-clipboard-button", text: label }) })), _jsx(LookupButton, { isInputButton: true, value: value, validationMessage: validationMessage, lookupButtonConfig: element.lookupButton, overrideRequiredMessage: undefined })] }), value && (_jsx(ABNDisplay, { abnRecord: value, className: "ob-abn__display-mobile" })), isDisplayingValidationMessage && (_jsx(FormElementValidationMessage, { message: (error === null || error === void 0 ? void 0 : error.message) || validationMessage }))] }) }));
|
|
156
|
+
}, onFocus: setIsFocused, "aria-describedby": ariaDescribedby, autoComplete: autocompleteAttributes, "aria-required": element.required }) }), value && (_jsx(ABNDisplay, { abnRecord: value, className: "ob-abn__display-desktop" })), hasCopyButton && (_jsx("div", { className: "control", children: _jsx(CopyToClipboardButton, { className: "button is-input-addon copy-button cypress-copy-to-clipboard-button", text: label }) })), _jsx(LookupButton, { readOnly: readOnly, isInputButton: true, value: value, validationMessage: validationMessage, lookupButtonConfig: element.lookupButton, overrideRequiredMessage: undefined })] }), value && (_jsx(ABNDisplay, { abnRecord: value, className: "ob-abn__display-mobile" })), isDisplayingValidationMessage && (_jsx(FormElementValidationMessage, { message: (error === null || error === void 0 ? void 0 : error.message) || validationMessage }))] }) }));
|
|
157
157
|
}
|
|
158
158
|
export default React.memo(FormElementABN);
|
|
159
159
|
const ABNDisplay = ({ abnRecord, className, }) => {
|
|
@@ -1 +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/renderer/CopyToClipboardButton'\nimport useBooleanState from '../hooks/useBooleanState'\nimport LookupButton from '../components/renderer/LookupButton'\nimport { FormTypes, MiscTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport useAbnLookupAuthenticationGuid from '../hooks/useAbnLookupAuthenticationGuid'\nimport { abnService } from '@oneblink/sdk-core'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\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 autocompleteAttributes?: string\n} & IsDirtyProps\n\nfunction FormElementABN({\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 const abnLookupAuthenticationGuid = useAbnLookupAuthenticationGuid()\n const [label, setLabel] = React.useState(\n value ? abnService.getABNNumberFromABNRecord(value) || '' : '',\n )\n const [isFocused, setIsFocused, removeFocus] = 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\n const currentABNNumber = value\n ? abnService.getABNNumberFromABNRecord(value)\n : ''\n if (!isSearchStringValid || currentABNNumber === 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\n .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(element, {\n value: 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 }, [abnLookupAuthenticationGuid, element, isFocused, label, onChange, value])\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 = abnService.getABNNumberFromABNRecord(value)\n if (!newLabel) {\n // Record in value had no ABN Number. This should never happen\n return\n }\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 const { isLookingUp } = React.useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (((isDirty || displayValidationMessage) &&\n !!validationMessage &&\n !isLoading) ||\n error) &&\n !isLookingUp\n\n const hasCopyButton = !!value && !!element.readOnly\n const hasLookupButton = element.isDataLookup || element.isElementLookup\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\n className={clsx('field has-addons', {\n 'no-addons-mobile': !hasCopyButton && !hasLookupButton,\n })}\n >\n <div\n className={clsx('control is-expanded', {\n 'is-loading': isLoading,\n })}\n >\n <InputMask\n mask={isFocused || value ? 'dd ddd ddd ddd' : 'ddd ddd ddd'}\n replacement={{ d: /\\d/ }}\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, {\n value: undefined,\n })\n }\n }}\n required={element.required}\n disabled={element.readOnly}\n onBlur={() => {\n setIsDirty()\n removeFocus()\n }}\n onFocus={setIsFocused}\n aria-describedby={ariaDescribedby}\n autoComplete={autocompleteAttributes}\n aria-required={element.required}\n />\n </div>\n {value && (\n <ABNDisplay abnRecord={value} className=\"ob-abn__display-desktop\" />\n )}\n {hasCopyButton && (\n <div className=\"control\">\n <CopyToClipboardButton\n className=\"button is-input-addon copy-button cypress-copy-to-clipboard-button\"\n text={label}\n />\n </div>\n )}\n <LookupButton\n isInputButton\n value={value}\n validationMessage={validationMessage}\n lookupButtonConfig={element.lookupButton}\n overrideRequiredMessage={undefined}\n />\n </div>\n {value && (\n <ABNDisplay abnRecord={value} className=\"ob-abn__display-mobile\" />\n )}\n {isDisplayingValidationMessage && (\n <FormElementValidationMessage\n message={error?.message || validationMessage}\n />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementABN)\n\nconst ABNDisplay = ({\n abnRecord,\n className,\n}: {\n abnRecord: MiscTypes.ABNRecord\n className: string\n}) => {\n return (\n <div className={`control ob-abn__record-control ${className}`}>\n <a className=\"button is-static ob-abn__record-button\">\n {abnService.displayBusinessNameFromABNRecord(abnRecord)}\n </a>\n </div>\n )\n}\n"]}
|
|
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/renderer/CopyToClipboardButton'\nimport useBooleanState from '../hooks/useBooleanState'\nimport LookupButton from '../components/renderer/LookupButton'\nimport { FormTypes, MiscTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport useAbnLookupAuthenticationGuid from '../hooks/useAbnLookupAuthenticationGuid'\nimport { abnService } from '@oneblink/sdk-core'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\ntype Props = {\n id: string\n element: FormTypes.ABNElement\n readOnly: boolean\n value: MiscTypes.ABNRecord | undefined\n onChange: FormElementValueChangeHandler<MiscTypes.ABNRecord>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n autocompleteAttributes?: string\n} & IsDirtyProps\n\nfunction FormElementABN({\n id,\n element,\n readOnly,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n isDirty,\n setIsDirty,\n autocompleteAttributes,\n}: Props) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const abnLookupAuthenticationGuid = useAbnLookupAuthenticationGuid()\n const [label, setLabel] = React.useState(\n value ? abnService.getABNNumberFromABNRecord(value) || '' : '',\n )\n const [isFocused, setIsFocused, removeFocus] = 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\n const currentABNNumber = value\n ? abnService.getABNNumberFromABNRecord(value)\n : ''\n if (!isSearchStringValid || currentABNNumber === 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\n .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(element, {\n value: 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 }, [abnLookupAuthenticationGuid, element, isFocused, label, onChange, value])\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 = abnService.getABNNumberFromABNRecord(value)\n if (!newLabel) {\n // Record in value had no ABN Number. This should never happen\n return\n }\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 const { isLookingUp } = React.useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (((isDirty || displayValidationMessage) &&\n !!validationMessage &&\n !isLoading) ||\n error) &&\n !isLookingUp\n\n const hasCopyButton = !!value && !!readOnly\n const hasLookupButton = element.isDataLookup || element.isElementLookup\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\n className={clsx('field has-addons', {\n 'no-addons-mobile': !hasCopyButton && !hasLookupButton,\n })}\n >\n <div\n className={clsx('control is-expanded', {\n 'is-loading': isLoading,\n })}\n >\n <InputMask\n mask={isFocused || value ? 'dd ddd ddd ddd' : 'ddd ddd ddd'}\n replacement={{ d: /\\d/ }}\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, {\n value: undefined,\n })\n }\n }}\n required={element.required}\n disabled={readOnly}\n onBlur={() => {\n setIsDirty()\n removeFocus()\n }}\n onFocus={setIsFocused}\n aria-describedby={ariaDescribedby}\n autoComplete={autocompleteAttributes}\n aria-required={element.required}\n />\n </div>\n {value && (\n <ABNDisplay abnRecord={value} className=\"ob-abn__display-desktop\" />\n )}\n {hasCopyButton && (\n <div className=\"control\">\n <CopyToClipboardButton\n className=\"button is-input-addon copy-button cypress-copy-to-clipboard-button\"\n text={label}\n />\n </div>\n )}\n <LookupButton\n readOnly={readOnly}\n isInputButton\n value={value}\n validationMessage={validationMessage}\n lookupButtonConfig={element.lookupButton}\n overrideRequiredMessage={undefined}\n />\n </div>\n {value && (\n <ABNDisplay abnRecord={value} className=\"ob-abn__display-mobile\" />\n )}\n {isDisplayingValidationMessage && (\n <FormElementValidationMessage\n message={error?.message || validationMessage}\n />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementABN)\n\nconst ABNDisplay = ({\n abnRecord,\n className,\n}: {\n abnRecord: MiscTypes.ABNRecord\n className: string\n}) => {\n return (\n <div className={`control ob-abn__record-control ${className}`}>\n <a className=\"button is-static ob-abn__record-button\">\n {abnService.displayBusinessNameFromABNRecord(abnRecord)}\n </a>\n </div>\n )\n}\n"]}
|
|
@@ -5,13 +5,14 @@ type Props = {
|
|
|
5
5
|
formId: number;
|
|
6
6
|
id: string;
|
|
7
7
|
element: FormTypes.APINSWLiquorLicenceElement;
|
|
8
|
+
readOnly: boolean;
|
|
8
9
|
value: APINSWTypes.LiquorLicenceDetails | undefined;
|
|
9
10
|
onChange: FormElementValueChangeHandler<APINSWTypes.LiquorLicenceDetails>;
|
|
10
11
|
displayValidationMessage: boolean;
|
|
11
12
|
validationMessage: string | undefined;
|
|
12
13
|
autocompleteAttributes?: string;
|
|
13
14
|
} & IsDirtyProps;
|
|
14
|
-
declare function FormElementAPINSWLiquorLicence({ formId, id, element, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, autocompleteAttributes, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
declare function FormElementAPINSWLiquorLicence({ formId, id, element, readOnly, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, autocompleteAttributes, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
15
16
|
export declare function LicenceDetailGridItem({ label, value, classNameSuffix, fullWidth, }: {
|
|
16
17
|
label: string;
|
|
17
18
|
value: string | undefined;
|
|
@@ -9,7 +9,7 @@ import useElementAriaDescribedby from '../hooks/useElementAriaDescribedby';
|
|
|
9
9
|
import { NotificationGrid, NotificationGridItem, } from '../components/NotificationGrid';
|
|
10
10
|
import FormElementValidationMessage from '../components/renderer/FormElementValidationMessage';
|
|
11
11
|
const liquorLicenceClassPrefix = 'ob-api-nsw-liquor-licence__';
|
|
12
|
-
function FormElementAPINSWLiquorLicence({ formId, id, element, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, autocompleteAttributes, }) {
|
|
12
|
+
function FormElementAPINSWLiquorLicence({ formId, id, element, readOnly, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, autocompleteAttributes, }) {
|
|
13
13
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
14
14
|
const ariaDescribedby = useElementAriaDescribedby(id, element);
|
|
15
15
|
const isMounted = useIsMounted();
|
|
@@ -72,7 +72,7 @@ function FormElementAPINSWLiquorLicence({ formId, id, element, value, onChange,
|
|
|
72
72
|
}
|
|
73
73
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
74
74
|
}, [value]);
|
|
75
|
-
return (_jsxs("div", { className: "cypress-api-nsw-liquor-licence-element", children: [_jsx(FormElementLabelContainer, { className: "ob-api-nsw-liquor-licence ob-autocomplete", id: id, element: element, required: element.required, children: _jsx(AutocompleteDropdown, { id: id, label: label, disabled:
|
|
75
|
+
return (_jsxs("div", { className: "cypress-api-nsw-liquor-licence-element", children: [_jsx(FormElementLabelContainer, { className: "ob-api-nsw-liquor-licence ob-autocomplete", id: id, element: element, required: element.required, children: _jsx(AutocompleteDropdown, { id: id, label: label, disabled: readOnly || isLoading, placeholder: element.placeholderValue, required: element.required, value: value, validationMessage: validationMessage, displayValidationMessage: displayValidationMessage, onChangeValue: fetchAndSelectSingleLicence, isLoading: isLoading, hasError: !!error, onChangeLabel: setLabel, searchDebounceMs: 750, searchMinCharacters: 2, onSearch: handleSearch, isDirty: isDirty, setIsDirty: setIsDirty, "aria-describedby": ariaDescribedby, autoComplete: autocompleteAttributes }) }), error && (_jsx(FormElementValidationMessage, { message: error.toString(), className: "cypress-api-nsw-liquor-licence-error-message" })), _jsx(Collapse, { in: !!value, children: _jsxs(NotificationGrid, { className: `${liquorLicenceClassPrefix}record-display has-margin-top-6`, gridClassName: `${liquorLicenceClassPrefix}container`, children: [((_a = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _a === void 0 ? void 0 : _a.licenceName) && (_jsx(Grid, { size: { xs: 12 }, className: `${liquorLicenceClassPrefix}licenceName`, children: _jsx("h6", { className: `is-size-5 has-text-weight-semibold ${liquorLicenceClassPrefix}name`, children: (_b = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _b === void 0 ? void 0 : _b.licenceName }) })), _jsx(LicenceDetailGridItem, { label: "Licence Number", value: (_c = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _c === void 0 ? void 0 : _c.licenceNumber, classNameSuffix: "licenceNumber" }), _jsx(LicenceDetailGridItem, { label: "Licence Type", value: (_d = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _d === void 0 ? void 0 : _d.licenceTypeName, classNameSuffix: "licenceTypeName" }), _jsx(LicenceDetailGridItem, { label: "Licensee", value: (_e = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _e === void 0 ? void 0 : _e.licensee, classNameSuffix: "licensee" }), _jsx(LicenceDetailGridItem, { label: "Licensee Birth Date", value: (_f = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _f === void 0 ? void 0 : _f.licenseeBirthdate, classNameSuffix: "licenseeBirthdate" }), _jsx(LicenceDetailGridItem, { label: "Licencee ABN", value: (_g = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _g === void 0 ? void 0 : _g.licenceeABN, classNameSuffix: "licenceeABN" }), _jsx(LicenceDetailGridItem, { label: "Licencee ACN", value: (_h = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _h === void 0 ? void 0 : _h.licenceeACN, classNameSuffix: "licenceeACN" }), _jsx(LicenceDetailGridItem, { label: "Refused Date", value: (_j = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _j === void 0 ? void 0 : _j.refusedDate, classNameSuffix: "refusedDate" }), _jsx(LicenceDetailGridItem, { label: "Start Date", value: (_k = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _k === void 0 ? void 0 : _k.startDate, classNameSuffix: "startDate" }), _jsx(LicenceDetailGridItem, { label: "Expiry Date", value: (_l = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _l === void 0 ? void 0 : _l.expiryDate, classNameSuffix: "expiryDate" }), _jsx(LicenceDetailGridItem, { label: "Status", value: (_m = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _m === void 0 ? void 0 : _m.status, classNameSuffix: "status" }), _jsx(LicenceDetailGridItem, { label: "Address Type", value: (_o = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _o === void 0 ? void 0 : _o.addressType, classNameSuffix: "addressType" }), _jsx(LicenceDetailGridItem, { label: "Address", value: (_p = value === null || value === void 0 ? void 0 : value.licenceDetail) === null || _p === void 0 ? void 0 : _p.address, classNameSuffix: "address", fullWidth: true })] }) })] }));
|
|
76
76
|
}
|
|
77
77
|
export function LicenceDetailGridItem({ label, value, classNameSuffix, fullWidth, }) {
|
|
78
78
|
return (_jsx(NotificationGridItem, { className: `${liquorLicenceClassPrefix}${classNameSuffix}`, fullWidth: fullWidth, value: value, label: label, labelClassName: `${liquorLicenceClassPrefix}detail-label`, valueClassName: `${liquorLicenceClassPrefix}detail-value` }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormElementAPINSWLiquorLicence.js","sourceRoot":"","sources":["../../src/form-elements/FormElementAPINSWLiquorLicence.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes, APINSWTypes } from '@oneblink/types'\nimport { formService } from '../apps'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport AutocompleteDropdown from '../components/renderer/AutocompleteDropdown'\nimport useIsMounted from '../hooks/useIsMounted'\nimport { Collapse, Grid } from '@mui/material'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport {\n NotificationGrid,\n NotificationGridItem,\n} from '../components/NotificationGrid'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\ntype Props = {\n formId: number\n id: string\n element: FormTypes.APINSWLiquorLicenceElement\n value: APINSWTypes.LiquorLicenceDetails | undefined\n onChange: FormElementValueChangeHandler<APINSWTypes.LiquorLicenceDetails>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n autocompleteAttributes?: string\n} & IsDirtyProps\n\nconst liquorLicenceClassPrefix = 'ob-api-nsw-liquor-licence__'\nfunction FormElementAPINSWLiquorLicence({\n formId,\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 const isMounted = useIsMounted()\n const [label, setLabel] = React.useState('')\n const [{ isLoading, error }, setState] = React.useState<{\n isLoading: boolean\n error: Error | null\n }>({\n isLoading: false,\n error: null,\n })\n\n const handleSearch = React.useCallback(\n async (searchText: string, abortSignal: AbortSignal) => {\n setState((current) => ({\n ...current,\n error: null,\n }))\n\n const results = await formService.searchAPINSWLiquorLicences(\n { formId, searchText },\n abortSignal,\n )\n\n return results.map((result, index) => ({\n value: result.licenceID || index.toString(),\n label:\n `${result.licenceNumber} | ${result.licenceName}`.trim() ||\n index.toString(),\n }))\n },\n [formId],\n )\n\n const fetchAndSelectSingleLicence = React.useCallback(\n async (newValue: string | undefined) => {\n console.log(`Selected: ${newValue}`)\n if (!newValue) {\n onChange(element, { value: undefined })\n return\n }\n setState((current) => ({\n ...current,\n isLoading: true,\n }))\n\n try {\n const result = await formService.getAPINSWLiquorLicence(\n formId,\n newValue,\n )\n if (result) {\n onChange(element, { value: result })\n }\n if (isMounted.current) {\n setState({\n isLoading: false,\n error: null,\n })\n }\n } catch (newError) {\n if (isMounted.current) {\n setState({\n isLoading: false,\n error: newError as Error,\n })\n }\n }\n },\n [element, formId, isMounted, onChange],\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 =\n `${value?.licenceDetail?.licenceNumber} | ${value?.licenceDetail?.licenceName}`.trim()\n if (label !== newLabel) {\n setLabel(newLabel || '')\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value])\n\n return (\n <div className=\"cypress-api-nsw-liquor-licence-element\">\n <FormElementLabelContainer\n className=\"ob-api-nsw-liquor-licence ob-autocomplete\"\n id={id}\n element={element}\n required={element.required}\n >\n <AutocompleteDropdown\n id={id}\n label={label}\n disabled={element.readOnly || isLoading}\n placeholder={element.placeholderValue}\n required={element.required}\n value={value}\n validationMessage={validationMessage}\n displayValidationMessage={displayValidationMessage}\n onChangeValue={fetchAndSelectSingleLicence}\n isLoading={isLoading}\n hasError={!!error}\n onChangeLabel={setLabel}\n searchDebounceMs={750}\n searchMinCharacters={2}\n onSearch={handleSearch}\n isDirty={isDirty}\n setIsDirty={setIsDirty}\n aria-describedby={ariaDescribedby}\n autoComplete={autocompleteAttributes}\n />\n </FormElementLabelContainer>\n\n {error && (\n <FormElementValidationMessage\n message={error.toString()}\n className=\"cypress-api-nsw-liquor-licence-error-message\"\n />\n )}\n <Collapse in={!!value}>\n <NotificationGrid\n className={`${liquorLicenceClassPrefix}record-display has-margin-top-6`}\n gridClassName={`${liquorLicenceClassPrefix}container`}\n >\n {value?.licenceDetail?.licenceName && (\n <Grid\n size={{ xs: 12 }}\n className={`${liquorLicenceClassPrefix}licenceName`}\n >\n <h6\n className={`is-size-5 has-text-weight-semibold ${liquorLicenceClassPrefix}name`}\n >\n {value?.licenceDetail?.licenceName}\n </h6>\n </Grid>\n )}\n <LicenceDetailGridItem\n label=\"Licence Number\"\n value={value?.licenceDetail?.licenceNumber}\n classNameSuffix=\"licenceNumber\"\n />\n <LicenceDetailGridItem\n label=\"Licence Type\"\n value={value?.licenceDetail?.licenceTypeName}\n classNameSuffix=\"licenceTypeName\"\n />\n <LicenceDetailGridItem\n label=\"Licensee\"\n value={value?.licenceDetail?.licensee}\n classNameSuffix=\"licensee\"\n />\n <LicenceDetailGridItem\n label=\"Licensee Birth Date\"\n value={value?.licenceDetail?.licenseeBirthdate}\n classNameSuffix=\"licenseeBirthdate\"\n />\n <LicenceDetailGridItem\n label=\"Licencee ABN\"\n value={value?.licenceDetail?.licenceeABN}\n classNameSuffix=\"licenceeABN\"\n />\n <LicenceDetailGridItem\n label=\"Licencee ACN\"\n value={value?.licenceDetail?.licenceeACN}\n classNameSuffix=\"licenceeACN\"\n />\n <LicenceDetailGridItem\n label=\"Refused Date\"\n value={value?.licenceDetail?.refusedDate}\n classNameSuffix=\"refusedDate\"\n />\n <LicenceDetailGridItem\n label=\"Start Date\"\n value={value?.licenceDetail?.startDate}\n classNameSuffix=\"startDate\"\n />\n <LicenceDetailGridItem\n label=\"Expiry Date\"\n value={value?.licenceDetail?.expiryDate}\n classNameSuffix=\"expiryDate\"\n />\n <LicenceDetailGridItem\n label=\"Status\"\n value={value?.licenceDetail?.status}\n classNameSuffix=\"status\"\n />\n <LicenceDetailGridItem\n label=\"Address Type\"\n value={value?.licenceDetail?.addressType}\n classNameSuffix=\"addressType\"\n />\n <LicenceDetailGridItem\n label=\"Address\"\n value={value?.licenceDetail?.address}\n classNameSuffix=\"address\"\n fullWidth\n />\n </NotificationGrid>\n </Collapse>\n </div>\n )\n}\n\nexport function LicenceDetailGridItem({\n label,\n value,\n classNameSuffix,\n fullWidth,\n}: {\n label: string\n value: string | undefined\n classNameSuffix: string\n fullWidth?: boolean\n}) {\n return (\n <NotificationGridItem\n className={`${liquorLicenceClassPrefix}${classNameSuffix}`}\n fullWidth={fullWidth}\n value={value}\n label={label}\n labelClassName={`${liquorLicenceClassPrefix}detail-label`}\n valueClassName={`${liquorLicenceClassPrefix}detail-value`}\n />\n )\n}\n\nexport default React.memo(FormElementAPINSWLiquorLicence)\n"]}
|
|
1
|
+
{"version":3,"file":"FormElementAPINSWLiquorLicence.js","sourceRoot":"","sources":["../../src/form-elements/FormElementAPINSWLiquorLicence.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,yBAAyB,MAAM,kDAAkD,CAAA;AAExF,OAAO,oBAAoB,MAAM,6CAA6C,CAAA;AAC9E,OAAO,YAAY,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,yBAAyB,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,gCAAgC,CAAA;AACvC,OAAO,4BAA4B,MAAM,qDAAqD,CAAA;AAc9F,MAAM,wBAAwB,GAAG,6BAA6B,CAAA;AAC9D,SAAS,8BAA8B,CAAC,EACtC,MAAM,EACN,EAAE,EACF,OAAO,EACP,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,wBAAwB,EACxB,OAAO,EACP,UAAU,EACV,sBAAsB,GAChB;;IACN,MAAM,eAAe,GAAG,yBAAyB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC9D,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAGpD;QACD,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CACpC,KAAK,EAAE,UAAkB,EAAE,WAAwB,EAAE,EAAE;QACrD,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrB,GAAG,OAAO;YACV,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC,CAAA;QAEH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,0BAA0B,CAC1D,EAAE,MAAM,EAAE,UAAU,EAAE,EACtB,WAAW,CACZ,CAAA;QAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACrC,KAAK,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE;YAC3C,KAAK,EACH,GAAG,MAAM,CAAC,aAAa,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;gBACxD,KAAK,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC,CAAA;IACL,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAA;IAED,MAAM,2BAA2B,GAAG,KAAK,CAAC,WAAW,CACnD,KAAK,EAAE,QAA4B,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAA;QACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACvC,OAAM;QACR,CAAC;QACD,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrB,GAAG,OAAO;YACV,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC,CAAA;QAEH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,sBAAsB,CACrD,MAAM,EACN,QAAQ,CACT,CAAA;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YACtC,CAAC;YACD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,QAAQ,CAAC;oBACP,SAAS,EAAE,KAAK;oBAChB,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,QAAQ,CAAC;oBACP,SAAS,EAAE,KAAK;oBAChB,KAAK,EAAE,QAAiB;iBACzB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CACvC,CAAA;IAED,wEAAwE;IACxE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;;QACnB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GACZ,GAAG,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,aAAa,MAAM,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;YACxF,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvB,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;QACD,uDAAuD;IACzD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,OAAO,CACL,eAAK,SAAS,EAAC,wCAAwC,aACrD,KAAC,yBAAyB,IACxB,SAAS,EAAC,2CAA2C,EACrD,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ,YAE1B,KAAC,oBAAoB,IACnB,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAC/B,WAAW,EAAE,OAAO,CAAC,gBAAgB,EACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,KAAK,EAAE,KAAK,EACZ,iBAAiB,EAAE,iBAAiB,EACpC,wBAAwB,EAAE,wBAAwB,EAClD,aAAa,EAAE,2BAA2B,EAC1C,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,CAAC,CAAC,KAAK,EACjB,aAAa,EAAE,QAAQ,EACvB,gBAAgB,EAAE,GAAG,EACrB,mBAAmB,EAAE,CAAC,EACtB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,sBACJ,eAAe,EACjC,YAAY,EAAE,sBAAsB,GACpC,GACwB,EAE3B,KAAK,IAAI,CACR,KAAC,4BAA4B,IAC3B,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,EACzB,SAAS,EAAC,8CAA8C,GACxD,CACH,EACD,KAAC,QAAQ,IAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YACnB,MAAC,gBAAgB,IACf,SAAS,EAAE,GAAG,wBAAwB,iCAAiC,EACvE,aAAa,EAAE,GAAG,wBAAwB,WAAW,aAEpD,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,WAAW,KAAI,CACpC,KAAC,IAAI,IACH,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAChB,SAAS,EAAE,GAAG,wBAAwB,aAAa,YAEnD,aACE,SAAS,EAAE,sCAAsC,wBAAwB,MAAM,YAE9E,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,WAAW,GAC/B,GACA,CACR,EACD,KAAC,qBAAqB,IACpB,KAAK,EAAC,gBAAgB,EACtB,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,aAAa,EAC1C,eAAe,EAAC,eAAe,GAC/B,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,cAAc,EACpB,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,eAAe,EAC5C,eAAe,EAAC,iBAAiB,GACjC,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,UAAU,EAChB,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,QAAQ,EACrC,eAAe,EAAC,UAAU,GAC1B,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,qBAAqB,EAC3B,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,iBAAiB,EAC9C,eAAe,EAAC,mBAAmB,GACnC,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,cAAc,EACpB,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,WAAW,EACxC,eAAe,EAAC,aAAa,GAC7B,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,cAAc,EACpB,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,WAAW,EACxC,eAAe,EAAC,aAAa,GAC7B,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,cAAc,EACpB,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,WAAW,EACxC,eAAe,EAAC,aAAa,GAC7B,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,YAAY,EAClB,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,SAAS,EACtC,eAAe,EAAC,WAAW,GAC3B,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,aAAa,EACnB,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,UAAU,EACvC,eAAe,EAAC,YAAY,GAC5B,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,QAAQ,EACd,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,MAAM,EACnC,eAAe,EAAC,QAAQ,GACxB,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,cAAc,EACpB,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,WAAW,EACxC,eAAe,EAAC,aAAa,GAC7B,EACF,KAAC,qBAAqB,IACpB,KAAK,EAAC,SAAS,EACf,KAAK,EAAE,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,0CAAE,OAAO,EACpC,eAAe,EAAC,SAAS,EACzB,SAAS,SACT,IACe,GACV,IACP,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EACpC,KAAK,EACL,KAAK,EACL,eAAe,EACf,SAAS,GAMV;IACC,OAAO,CACL,KAAC,oBAAoB,IACnB,SAAS,EAAE,GAAG,wBAAwB,GAAG,eAAe,EAAE,EAC1D,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,GAAG,wBAAwB,cAAc,EACzD,cAAc,EAAE,GAAG,wBAAwB,cAAc,GACzD,CACH,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport { FormTypes, APINSWTypes } from '@oneblink/types'\nimport { formService } from '../apps'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport AutocompleteDropdown from '../components/renderer/AutocompleteDropdown'\nimport useIsMounted from '../hooks/useIsMounted'\nimport { Collapse, Grid } from '@mui/material'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport {\n NotificationGrid,\n NotificationGridItem,\n} from '../components/NotificationGrid'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\ntype Props = {\n formId: number\n id: string\n element: FormTypes.APINSWLiquorLicenceElement\n readOnly: boolean\n value: APINSWTypes.LiquorLicenceDetails | undefined\n onChange: FormElementValueChangeHandler<APINSWTypes.LiquorLicenceDetails>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n autocompleteAttributes?: string\n} & IsDirtyProps\n\nconst liquorLicenceClassPrefix = 'ob-api-nsw-liquor-licence__'\nfunction FormElementAPINSWLiquorLicence({\n formId,\n id,\n element,\n readOnly,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n isDirty,\n setIsDirty,\n autocompleteAttributes,\n}: Props) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const isMounted = useIsMounted()\n const [label, setLabel] = React.useState('')\n const [{ isLoading, error }, setState] = React.useState<{\n isLoading: boolean\n error: Error | null\n }>({\n isLoading: false,\n error: null,\n })\n\n const handleSearch = React.useCallback(\n async (searchText: string, abortSignal: AbortSignal) => {\n setState((current) => ({\n ...current,\n error: null,\n }))\n\n const results = await formService.searchAPINSWLiquorLicences(\n { formId, searchText },\n abortSignal,\n )\n\n return results.map((result, index) => ({\n value: result.licenceID || index.toString(),\n label:\n `${result.licenceNumber} | ${result.licenceName}`.trim() ||\n index.toString(),\n }))\n },\n [formId],\n )\n\n const fetchAndSelectSingleLicence = React.useCallback(\n async (newValue: string | undefined) => {\n console.log(`Selected: ${newValue}`)\n if (!newValue) {\n onChange(element, { value: undefined })\n return\n }\n setState((current) => ({\n ...current,\n isLoading: true,\n }))\n\n try {\n const result = await formService.getAPINSWLiquorLicence(\n formId,\n newValue,\n )\n if (result) {\n onChange(element, { value: result })\n }\n if (isMounted.current) {\n setState({\n isLoading: false,\n error: null,\n })\n }\n } catch (newError) {\n if (isMounted.current) {\n setState({\n isLoading: false,\n error: newError as Error,\n })\n }\n }\n },\n [element, formId, isMounted, onChange],\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 =\n `${value?.licenceDetail?.licenceNumber} | ${value?.licenceDetail?.licenceName}`.trim()\n if (label !== newLabel) {\n setLabel(newLabel || '')\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value])\n\n return (\n <div className=\"cypress-api-nsw-liquor-licence-element\">\n <FormElementLabelContainer\n className=\"ob-api-nsw-liquor-licence ob-autocomplete\"\n id={id}\n element={element}\n required={element.required}\n >\n <AutocompleteDropdown\n id={id}\n label={label}\n disabled={readOnly || isLoading}\n placeholder={element.placeholderValue}\n required={element.required}\n value={value}\n validationMessage={validationMessage}\n displayValidationMessage={displayValidationMessage}\n onChangeValue={fetchAndSelectSingleLicence}\n isLoading={isLoading}\n hasError={!!error}\n onChangeLabel={setLabel}\n searchDebounceMs={750}\n searchMinCharacters={2}\n onSearch={handleSearch}\n isDirty={isDirty}\n setIsDirty={setIsDirty}\n aria-describedby={ariaDescribedby}\n autoComplete={autocompleteAttributes}\n />\n </FormElementLabelContainer>\n\n {error && (\n <FormElementValidationMessage\n message={error.toString()}\n className=\"cypress-api-nsw-liquor-licence-error-message\"\n />\n )}\n <Collapse in={!!value}>\n <NotificationGrid\n className={`${liquorLicenceClassPrefix}record-display has-margin-top-6`}\n gridClassName={`${liquorLicenceClassPrefix}container`}\n >\n {value?.licenceDetail?.licenceName && (\n <Grid\n size={{ xs: 12 }}\n className={`${liquorLicenceClassPrefix}licenceName`}\n >\n <h6\n className={`is-size-5 has-text-weight-semibold ${liquorLicenceClassPrefix}name`}\n >\n {value?.licenceDetail?.licenceName}\n </h6>\n </Grid>\n )}\n <LicenceDetailGridItem\n label=\"Licence Number\"\n value={value?.licenceDetail?.licenceNumber}\n classNameSuffix=\"licenceNumber\"\n />\n <LicenceDetailGridItem\n label=\"Licence Type\"\n value={value?.licenceDetail?.licenceTypeName}\n classNameSuffix=\"licenceTypeName\"\n />\n <LicenceDetailGridItem\n label=\"Licensee\"\n value={value?.licenceDetail?.licensee}\n classNameSuffix=\"licensee\"\n />\n <LicenceDetailGridItem\n label=\"Licensee Birth Date\"\n value={value?.licenceDetail?.licenseeBirthdate}\n classNameSuffix=\"licenseeBirthdate\"\n />\n <LicenceDetailGridItem\n label=\"Licencee ABN\"\n value={value?.licenceDetail?.licenceeABN}\n classNameSuffix=\"licenceeABN\"\n />\n <LicenceDetailGridItem\n label=\"Licencee ACN\"\n value={value?.licenceDetail?.licenceeACN}\n classNameSuffix=\"licenceeACN\"\n />\n <LicenceDetailGridItem\n label=\"Refused Date\"\n value={value?.licenceDetail?.refusedDate}\n classNameSuffix=\"refusedDate\"\n />\n <LicenceDetailGridItem\n label=\"Start Date\"\n value={value?.licenceDetail?.startDate}\n classNameSuffix=\"startDate\"\n />\n <LicenceDetailGridItem\n label=\"Expiry Date\"\n value={value?.licenceDetail?.expiryDate}\n classNameSuffix=\"expiryDate\"\n />\n <LicenceDetailGridItem\n label=\"Status\"\n value={value?.licenceDetail?.status}\n classNameSuffix=\"status\"\n />\n <LicenceDetailGridItem\n label=\"Address Type\"\n value={value?.licenceDetail?.addressType}\n classNameSuffix=\"addressType\"\n />\n <LicenceDetailGridItem\n label=\"Address\"\n value={value?.licenceDetail?.address}\n classNameSuffix=\"address\"\n fullWidth\n />\n </NotificationGrid>\n </Collapse>\n </div>\n )\n}\n\nexport function LicenceDetailGridItem({\n label,\n value,\n classNameSuffix,\n fullWidth,\n}: {\n label: string\n value: string | undefined\n classNameSuffix: string\n fullWidth?: boolean\n}) {\n return (\n <NotificationGridItem\n className={`${liquorLicenceClassPrefix}${classNameSuffix}`}\n fullWidth={fullWidth}\n value={value}\n label={label}\n labelClassName={`${liquorLicenceClassPrefix}detail-label`}\n valueClassName={`${liquorLicenceClassPrefix}detail-value`}\n />\n )\n}\n\nexport default React.memo(FormElementAPINSWLiquorLicence)\n"]}
|
|
@@ -6,6 +6,7 @@ export declare const defaultAutoSnapshotButtonLabel = "Finish Drawing";
|
|
|
6
6
|
type Props = {
|
|
7
7
|
id: string;
|
|
8
8
|
element: FormTypes.ArcGISWebMapElement;
|
|
9
|
+
readOnly: boolean;
|
|
9
10
|
value: ArcGISWebMapElementValue | undefined;
|
|
10
11
|
onChange: FormElementValueChangeHandler<ArcGISWebMapElementValue>;
|
|
11
12
|
displayValidationMessage: boolean;
|
|
@@ -13,6 +14,6 @@ type Props = {
|
|
|
13
14
|
} & IsDirtyProps;
|
|
14
15
|
export declare function stringifyArcgisInput(value: ArcGISWebMapElementValue | undefined): string;
|
|
15
16
|
export declare function generateArcGISAutomatedSnapshotFileName(element: FormTypes.ArcGISWebMapElement): string;
|
|
16
|
-
declare function FormElementArcGISWebMap({ id, element, value, onChange, displayValidationMessage, isDirty, validationMessage, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
declare function FormElementArcGISWebMap({ id, element, readOnly, value, onChange, displayValidationMessage, isDirty, validationMessage, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
17
18
|
declare const _default: React.MemoExoticComponent<typeof FormElementArcGISWebMap>;
|
|
18
19
|
export default _default;
|
|
@@ -20,7 +20,7 @@ export function stringifyArcgisInput(value) {
|
|
|
20
20
|
export function generateArcGISAutomatedSnapshotFileName(element) {
|
|
21
21
|
return `${element.name}_automated.png`;
|
|
22
22
|
}
|
|
23
|
-
function FormElementArcGISWebMap({ id, element, value, onChange, displayValidationMessage, isDirty, validationMessage, }) {
|
|
23
|
+
function FormElementArcGISWebMap({ id, element, readOnly, value, onChange, displayValidationMessage, isDirty, validationMessage, }) {
|
|
24
24
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
25
25
|
const ariaDescribedby = useElementAriaDescribedby(id, element);
|
|
26
26
|
const isOffline = useIsOffline();
|
|
@@ -112,20 +112,20 @@ function FormElementArcGISWebMap({ id, element, value, onChange, displayValidati
|
|
|
112
112
|
}
|
|
113
113
|
setIsTakingAutoSnapshots(false);
|
|
114
114
|
}, [automatedSnapshotFileName, element, onChange, takeSnapshot]);
|
|
115
|
-
return (_jsx("div", { className: "cypress-arcgis-web-map", children: _jsxs(FormElementLabelContainer, { className: "ob-arcgis-web-map", id: id, element: element, required: element.required, children: [isOffline ? (_jsx("figure", { className: "ob-figure", children: _jsx("div", { className: "figure-content has-text-centered", children: _jsx("h4", { className: "title is-4", role: "alert", children: "This Web Map is not available as you are currently offline" }) }) })) : (_jsx("figure", { className: "ob-figure", children: _jsx(Suspense, { fallback: _jsx("div", { className: "arcgis-web-map figure-content-absolute-center", children: _jsx(OnLoading, { small: true }) }), children: _jsx(ArcGISWebMap, { element: element, id: id, "aria-describedby": ariaDescribedby, value: value, onChange: onChange, takeScreenShotRef: takeScreenShotRef, automatedSnapshotFileName: automatedSnapshotFileName }) }) })), (!!element.manualSnapshotsEnabled ||
|
|
115
|
+
return (_jsx("div", { className: "cypress-arcgis-web-map", children: _jsxs(FormElementLabelContainer, { className: "ob-arcgis-web-map", id: id, element: element, required: element.required, children: [isOffline ? (_jsx("figure", { className: "ob-figure", children: _jsx("div", { className: "figure-content has-text-centered", children: _jsx("h4", { className: "title is-4", role: "alert", children: "This Web Map is not available as you are currently offline" }) }) })) : (_jsx("figure", { className: "ob-figure", children: _jsx(Suspense, { fallback: _jsx("div", { className: "arcgis-web-map figure-content-absolute-center", children: _jsx(OnLoading, { small: true }) }), children: _jsx(ArcGISWebMap, { element: element, readOnly: readOnly, id: id, "aria-describedby": ariaDescribedby, value: value, onChange: onChange, takeScreenShotRef: takeScreenShotRef, automatedSnapshotFileName: automatedSnapshotFileName }) }) })), (!!element.manualSnapshotsEnabled ||
|
|
116
116
|
!!((_a = element.autoSnapshotViews) === null || _a === void 0 ? void 0 : _a.length)) && (_jsx("div", { children: _jsxs("div", { className: "buttons ob-buttons ob-arcgis-web-map__buttons", children: [!!element.manualSnapshotsEnabled && (_jsx("button", { type: "button", className: clsx('is-primary button ob-button ob-button__capture-snapshot ob-arcgis-web-map__button cypress-arcgis-web-map-capture-snapshot-button', {
|
|
117
117
|
'is-loading': isTakingManualSnapshot,
|
|
118
|
-
}), onClick: takeManualSnapshot, disabled:
|
|
118
|
+
}), onClick: takeManualSnapshot, disabled: readOnly ||
|
|
119
119
|
isTakingManualSnapshot ||
|
|
120
120
|
(!!element.maxManualSnapshots &&
|
|
121
121
|
(((_c = (_b = value === null || value === void 0 ? void 0 : value.snapshotImages) === null || _b === void 0 ? void 0 : _b.filter((snapshotImage) => snapshotImage.fileName !== automatedSnapshotFileName)) === null || _c === void 0 ? void 0 : _c.length) || 0) >= element.maxManualSnapshots), children: _jsx(CustomisableButtonInner, { label: ((_d = element.manualSnapshotButton) === null || _d === void 0 ? void 0 : _d.label) || 'Capture Image', icon: (_e = element.manualSnapshotButton) === null || _e === void 0 ? void 0 : _e.icon }) })), !!((_f = element.autoSnapshotViews) === null || _f === void 0 ? void 0 : _f.length) && (_jsx("button", { type: "button", className: clsx('is-primary button ob-button ob-button__finish-drawing ob-arcgis-web-map__button cypress-arcgis-web-map-finish-drawing-button', {
|
|
122
122
|
'is-loading': isTakingAutoSnapshots,
|
|
123
|
-
}), onClick: takeAutoSnapshots, disabled:
|
|
123
|
+
}), onClick: takeAutoSnapshots, disabled: readOnly ||
|
|
124
124
|
isTakingAutoSnapshots ||
|
|
125
125
|
((_g = value === null || value === void 0 ? void 0 : value.snapshotImages) === null || _g === void 0 ? void 0 : _g.some((snapshotImage) => snapshotImage.fileName === automatedSnapshotFileName)), children: _jsx(CustomisableButtonInner, { label: ((_h = element.autoSnapshotButton) === null || _h === void 0 ? void 0 : _h.label) ||
|
|
126
126
|
defaultAutoSnapshotButtonLabel, icon: (_j = element.autoSnapshotButton) === null || _j === void 0 ? void 0 : _j.icon }) }))] }) })), !!((_k = value === null || value === void 0 ? void 0 : value.snapshotImages) === null || _k === void 0 ? void 0 : _k.length) && (_jsx("div", { className: "control cypress-files-control has-margin-top-9", children: _jsx("div", { className: "columns is-multiline ob-columns-container", children: value.snapshotImages.map((snapshotImage, index, snapshotImages) => {
|
|
127
127
|
const attachment = snapshotImage;
|
|
128
|
-
return (_jsx(FormElementFile, { element: filesElement, onRemove: snapshotImage.fileName !== automatedSnapshotFileName
|
|
128
|
+
return (_jsx(FormElementFile, { element: filesElement, readOnly: readOnly, onRemove: snapshotImage.fileName !== automatedSnapshotFileName
|
|
129
129
|
? removeAttachment
|
|
130
130
|
: undefined, file: attachment, onChange: changeAttachment, disableUpload: !!element.maxManualSnapshots &&
|
|
131
131
|
snapshotImages.filter((snapshotImage) => snapshotImage.fileName !==
|