@oneblink/apps-react 2.0.0-beta.1 → 2.0.0-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.
Files changed (31) hide show
  1. package/dist/components/Lists.d.ts +1 -1
  2. package/dist/components/formStore/table/ColumnFilters.js +12 -4
  3. package/dist/components/formStore/table/ColumnFilters.js.map +1 -1
  4. package/dist/components/pickers/V4CompatibleDatePicker.d.ts +1 -1
  5. package/dist/components/pickers/V4CompatibleDatePicker.js +1 -1
  6. package/dist/components/pickers/V4CompatibleDatePicker.js.map +1 -1
  7. package/dist/components/pickers/V4CompatibleDateTimePicker.d.ts +1 -1
  8. package/dist/components/pickers/V4CompatibleDateTimePicker.js.map +1 -1
  9. package/dist/components/pickers/V4CompatibleTimePicker.d.ts +1 -1
  10. package/dist/components/pickers/V4CompatibleTimePicker.js.map +1 -1
  11. package/dist/components/renderer/AnnotationModal.js +1 -3
  12. package/dist/components/renderer/AnnotationModal.js.map +1 -1
  13. package/dist/form-elements/FormElementABN.js +3 -1
  14. package/dist/form-elements/FormElementABN.js.map +1 -1
  15. package/dist/form-elements/FormElementBSB.js +3 -1
  16. package/dist/form-elements/FormElementBSB.js.map +1 -1
  17. package/dist/form-elements/FormElementFiles.js +27 -7
  18. package/dist/form-elements/FormElementFiles.js.map +1 -1
  19. package/dist/form-elements/FormElementSignature.js +2 -2
  20. package/dist/form-elements/FormElementSignature.js.map +1 -1
  21. package/dist/hooks/useContrastColor.d.ts +1 -1
  22. package/dist/hooks/useInfiniteScrollDataLoad.d.ts +1 -1
  23. package/dist/hooks/useLookups.d.ts +1 -1
  24. package/dist/services/blob-utils.js +0 -1
  25. package/dist/services/blob-utils.js.map +1 -1
  26. package/dist/services/generate-default-data.js +6 -4
  27. package/dist/services/generate-default-data.js.map +1 -1
  28. package/package.json +33 -34
  29. package/dist/components/renderer/attachments/Files.d.ts +0 -14
  30. package/dist/components/renderer/attachments/Files.js +0 -27
  31. package/dist/components/renderer/attachments/Files.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import Files from '../components/renderer/attachments/Files';
2
+ import FormElementLabelContainer from '../components/renderer/FormElementLabelContainer';
3
3
  import FormElementFile from './FormElementFile';
4
4
  import useAttachments from '../hooks/attachments/useAttachments';
5
5
  import { checkFileNameIsValid, checkFileNameExtensionIsValid, } from '../services/form-validation';
@@ -11,13 +11,33 @@ export function stringifyAttachments(value) {
11
11
  }
12
12
  function FormElementFiles({ id, element, value, onChange, validationMessage, displayValidationMessage, }) {
13
13
  const { isDirty, addAttachments, removeAttachment, changeAttachment } = useAttachments(element, onChange);
14
+ const inputRef = React.useRef(null);
15
+ const handleAdd = React.useCallback(() => {
16
+ if (!inputRef.current)
17
+ return;
18
+ // RESET HTML FILE INPUT VALUE SO FILES PREVIOUSLY ADDED AND REMOVED ARE RECOGNISED
19
+ inputRef.current.value = '';
20
+ inputRef.current.click();
21
+ }, []);
14
22
  const attachments = value || [];
15
- const handleRenderAttachment = React.useCallback((attachment, index) => {
16
- return (React.createElement(FormElementFile, { key: index, element: element, onRemove: removeAttachment, file: attachment, onChange: changeAttachment, disableUpload: (!!element.maxEntries && attachments.length > element.maxEntries) ||
17
- !checkFileNameIsValid(element, attachment.fileName) ||
18
- !checkFileNameExtensionIsValid(element, attachment.fileName) }));
19
- }, [attachments.length, changeAttachment, element, removeAttachment]);
20
- return (React.createElement(Files, { id: id, isDirty: isDirty, element: element, attachments: attachments, displayValidationMessage: displayValidationMessage, validationMessage: validationMessage, onAddFiles: addAttachments, onRenderAttachment: handleRenderAttachment }));
23
+ return (React.createElement("div", { className: "cypress-files-element" },
24
+ React.createElement(FormElementLabelContainer, { className: "ob-files", element: element, id: id, required: !!element.minEntries },
25
+ React.createElement("input", { ref: inputRef, type: "file", name: element.name, id: id, className: "file-input ob-input", multiple: element.maxEntries !== 1, disabled: element.readOnly, onChange: (event) => addAttachments(event.target.files ? Array.from(event.target.files) : []) }),
26
+ React.createElement("div", { className: "control cypress-files-control" },
27
+ React.createElement("div", { className: "columns is-multiline" },
28
+ attachments.map((attachment) => {
29
+ return (React.createElement(FormElementFile, { key: attachment.type ? attachment._id : attachment.id, element: element, onRemove: removeAttachment, file: attachment, onChange: changeAttachment, disableUpload: (!!element.maxEntries &&
30
+ attachments.length > element.maxEntries) ||
31
+ !checkFileNameIsValid(element, attachment.fileName) ||
32
+ !checkFileNameExtensionIsValid(element, attachment.fileName) }));
33
+ }),
34
+ !element.readOnly &&
35
+ (!element.maxEntries ||
36
+ attachments.length < element.maxEntries) && (React.createElement("div", { className: "column is-one-quarter" },
37
+ React.createElement("button", { type: "button", className: "button ob-files__add-new-button", onClick: handleAdd },
38
+ React.createElement("i", { className: "material-icons icon-x-large" }, "add")))))),
39
+ (isDirty || displayValidationMessage) && !!validationMessage && (React.createElement("div", { role: "alert", className: "has-margin-top-8" },
40
+ React.createElement("div", { className: "has-text-danger ob-error__text cypress-validation-message" }, validationMessage))))));
21
41
  }
22
42
  export default React.memo(FormElementFiles);
23
43
  //# sourceMappingURL=FormElementFiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementFiles.js","sourceRoot":"","sources":["../../src/form-elements/FormElementFiles.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,MAAM,0CAA0C,CAAA;AAC5D,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,cAAc,MAAM,qCAAqC,CAAA;AAChE,OAAO,EACL,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,6BAA6B,CAAA;AAIpC,MAAM,UAAU,oBAAoB,CAAC,KAA+B;IAClE,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;KAC7B;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,EAAE,EACF,OAAO,EACP,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,wBAAwB,GAQzB;IACC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GACnE,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAEnC,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE,CAAA;IAE/B,MAAM,sBAAsB,GAAG,KAAK,CAAC,WAAW,CAC9C,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;QACpB,OAAO,CACL,oBAAC,eAAe,IACd,GAAG,EAAE,KAAK,EACV,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EACX,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;gBACjE,CAAC,oBAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC;gBACnD,CAAC,6BAA6B,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,GAE9D,CACH,CAAA;IACH,CAAC,EACD,CAAC,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAClE,CAAA;IAED,OAAO,CACL,oBAAC,KAAK,IACJ,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,wBAAwB,EAAE,wBAAwB,EAClD,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,cAAc,EAC1B,kBAAkB,EAAE,sBAAsB,GAC1C,CACH,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport Files from '../components/renderer/attachments/Files'\nimport FormElementFile from './FormElementFile'\nimport useAttachments from '../hooks/attachments/useAttachments'\nimport {\n checkFileNameIsValid,\n checkFileNameExtensionIsValid,\n} from '../services/form-validation'\nimport { Attachment } from '../types/attachments'\nimport { FormElementValueChangeHandler } from '../types/form'\n\nexport function stringifyAttachments(value: Attachment[] | undefined): string {\n if (value?.every((attachment) => !attachment.type)) {\n return JSON.stringify(value)\n }\n return ''\n}\n\nfunction FormElementFiles({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n}: {\n id: string\n element: FormTypes.FilesElement\n value?: Attachment[]\n onChange: FormElementValueChangeHandler<Attachment[]>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n}) {\n const { isDirty, addAttachments, removeAttachment, changeAttachment } =\n useAttachments(element, onChange)\n\n const attachments = value || []\n\n const handleRenderAttachment = React.useCallback(\n (attachment, index) => {\n return (\n <FormElementFile\n key={index}\n element={element}\n onRemove={removeAttachment}\n file={attachment}\n onChange={changeAttachment}\n disableUpload={\n (!!element.maxEntries && attachments.length > element.maxEntries) ||\n !checkFileNameIsValid(element, attachment.fileName) ||\n !checkFileNameExtensionIsValid(element, attachment.fileName)\n }\n />\n )\n },\n [attachments.length, changeAttachment, element, removeAttachment],\n )\n\n return (\n <Files\n id={id}\n isDirty={isDirty}\n element={element}\n attachments={attachments}\n displayValidationMessage={displayValidationMessage}\n validationMessage={validationMessage}\n onAddFiles={addAttachments}\n onRenderAttachment={handleRenderAttachment}\n />\n )\n}\n\nexport default React.memo(FormElementFiles)\n"]}
1
+ {"version":3,"file":"FormElementFiles.js","sourceRoot":"","sources":["../../src/form-elements/FormElementFiles.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport FormElementFile from './FormElementFile'\nimport useAttachments from '../hooks/attachments/useAttachments'\nimport {\n checkFileNameIsValid,\n checkFileNameExtensionIsValid,\n} from '../services/form-validation'\nimport { Attachment } from '../types/attachments'\nimport { FormElementValueChangeHandler } from '../types/form'\n\nexport function stringifyAttachments(value: Attachment[] | undefined): string {\n if (value?.every((attachment) => !attachment.type)) {\n return JSON.stringify(value)\n }\n return ''\n}\n\nfunction FormElementFiles({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n}: {\n id: string\n element: FormTypes.FilesElement\n value?: Attachment[]\n onChange: FormElementValueChangeHandler<Attachment[]>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n}) {\n const { isDirty, addAttachments, removeAttachment, changeAttachment } =\n useAttachments(element, onChange)\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const handleAdd = React.useCallback(() => {\n if (!inputRef.current) return\n // RESET HTML FILE INPUT VALUE SO FILES PREVIOUSLY ADDED AND REMOVED ARE RECOGNISED\n inputRef.current.value = ''\n inputRef.current.click()\n }, [])\n\n const attachments = value || []\n\n return (\n <div className=\"cypress-files-element\">\n <FormElementLabelContainer\n className=\"ob-files\"\n element={element}\n id={id}\n required={!!element.minEntries}\n >\n <input\n ref={inputRef}\n type=\"file\"\n name={element.name}\n id={id}\n className=\"file-input ob-input\"\n multiple={element.maxEntries !== 1}\n disabled={element.readOnly}\n onChange={(event) =>\n addAttachments(\n event.target.files ? Array.from(event.target.files) : [],\n )\n }\n />\n <div className=\"control cypress-files-control\">\n <div className=\"columns is-multiline\">\n {attachments.map((attachment) => {\n return (\n <FormElementFile\n key={attachment.type ? attachment._id : attachment.id}\n element={element}\n onRemove={removeAttachment}\n file={attachment}\n onChange={changeAttachment}\n disableUpload={\n (!!element.maxEntries &&\n attachments.length > element.maxEntries) ||\n !checkFileNameIsValid(element, attachment.fileName) ||\n !checkFileNameExtensionIsValid(element, attachment.fileName)\n }\n />\n )\n })}\n {!element.readOnly &&\n (!element.maxEntries ||\n attachments.length < element.maxEntries) && (\n <div className=\"column is-one-quarter\">\n <button\n type=\"button\"\n className=\"button ob-files__add-new-button\"\n onClick={handleAdd}\n >\n <i className=\"material-icons icon-x-large\">add</i>\n </button>\n </div>\n )}\n </div>\n </div>\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\nexport default React.memo(FormElementFiles)\n"]}
@@ -104,11 +104,11 @@ const SignatureDisplay = React.memo(function SignatureDisplay({ element, value,
104
104
  return (React.createElement(React.Fragment, null,
105
105
  React.createElement("figure", { className: "ob-figure" },
106
106
  React.createElement("div", { className: "figure-content" },
107
- React.createElement(DisplayImage, { element: element, ...result }))),
107
+ React.createElement(DisplayImage, { ...result }))),
108
108
  React.createElement("div", { className: "buttons ob-buttons" },
109
109
  React.createElement("button", { type: "button", className: "button ob-button is-light ob-button__clear cypress-clear-signature", onClick: () => onChange(element, undefined), disabled: element.readOnly }, "Clear"))));
110
110
  });
111
- const DisplayImage = React.memo(function DisplayImage({ element, uploadErrorMessage, isUploading, isLoadingImageUrl, imageUrl, loadImageUrlError, }) {
111
+ const DisplayImage = React.memo(function DisplayImage({ uploadErrorMessage, isUploading, isLoadingImageUrl, imageUrl, loadImageUrlError, }) {
112
112
  if (uploadErrorMessage) {
113
113
  return (React.createElement(React.Fragment, null,
114
114
  React.createElement("h3", { className: "title is-3" }, "Upload Failed"),
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementSignature.js","sourceRoot":"","sources":["../../src/form-elements/FormElementSignature.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport SignatureCanvas from 'react-signature-canvas'\nimport { FormTypes } from '@oneblink/types'\n\nimport scrollingService from '../services/scrolling-service'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport OnLoading from '../components/renderer/OnLoading'\nimport useAttachment from '../hooks/attachments/useAttachment'\nimport { FormElementBinaryStorageValue } from '../types/attachments'\nimport { prepareNewAttachment } from '../services/attachments'\nimport AttachmentStatus from '../components/renderer/attachments/AttachmentStatus'\nimport useBooleanState from '../hooks/useBooleanState'\nimport { canvasToBlob } from '../services/blob-utils'\nimport ImagePreviewUnavailable from '../components/renderer/attachments/ImagePreviewUnavailable'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport useIsPageVisible from '../hooks/useIsPageVisible'\n\ntype Props = {\n id: string\n element: FormTypes.DrawElement\n value: FormElementBinaryStorageValue\n onChange: FormElementValueChangeHandler<FormElementBinaryStorageValue>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n}\n\nfunction FormElementSignature({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n}: Props) {\n const [isDirty, setIsDirty] = useBooleanState(false)\n const isPageVisible = useIsPageVisible()\n\n const handleChange = React.useCallback(\n (formElement, newValue) => {\n setIsDirty()\n onChange(formElement, newValue)\n },\n [onChange, setIsDirty],\n )\n\n return (\n <div className=\"cypress-signature-element\">\n <FormElementLabelContainer\n className=\"ob-signature\"\n id={id}\n element={element}\n required={element.required}\n >\n <div className=\"control\">\n {value ? (\n <SignatureDisplay\n element={element}\n value={value}\n onChange={handleChange}\n />\n ) : isPageVisible ? (\n <SignatureDrawing element={element} onChange={handleChange} />\n ) : null}\n </div>\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\nexport default React.memo(FormElementSignature)\n\nconst SignatureDrawing = React.memo(function SignatureDrawing({\n element,\n onChange,\n}: {\n element: Props['element']\n onChange: Props['onChange']\n}) {\n const canvasRef = React.useRef<SignatureCanvas>(null)\n\n const [isEmpty, setIsEmpty] = React.useState(true)\n const [canvasDimensions, setCanvasDimensions] = React.useState({})\n\n const handleClear = React.useCallback(() => {\n if (canvasRef.current) {\n console.log('Clearing signature...')\n canvasRef.current.clear()\n }\n setIsEmpty(true)\n }, [])\n\n const handleDone = React.useCallback(async () => {\n if (!canvasRef.current) return\n const trimmedCanvas = canvasRef.current.getTrimmedCanvas()\n\n // Convert base64 data uri to blob and send it on its way\n const blob = await canvasToBlob(trimmedCanvas)\n onChange(element, prepareNewAttachment(blob, 'signature.png', element))\n }, [element, onChange])\n\n // HANDLING CANVAS CHANGE\n const handleEndDraw = React.useCallback(() => {\n if (window.cordova) {\n scrollingService.enableScrolling()\n }\n if (isEmpty) {\n setIsEmpty(false)\n }\n }, [isEmpty])\n\n // HANDLE RESIZE\n React.useEffect(() => {\n const signatureCanvas = canvasRef.current\n if (!signatureCanvas) return\n const resize = () => {\n const parentDiv = signatureCanvas.getCanvas().parentNode\n if (parentDiv) {\n setCanvasDimensions({\n // @ts-expect-error ???\n width: parentDiv.clientWidth,\n // @ts-expect-error ???\n height: parentDiv.clientHeight,\n })\n }\n }\n window.addEventListener('resize', resize)\n resize()\n\n return () => {\n window.removeEventListener('resize', resize)\n }\n }, [canvasRef])\n\n // REACTIVE DISABLING OF CANVAS\n React.useEffect(() => {\n if (!canvasRef.current) return\n if (element.readOnly) {\n canvasRef.current.off()\n } else {\n canvasRef.current.on()\n }\n }, [canvasRef, element.readOnly])\n\n return (\n <>\n <div>\n <SignatureCanvas\n ref={canvasRef}\n canvasProps={{\n ...canvasDimensions,\n className:\n 'input ob-signature__control cypress-signature-control signature-pad',\n // @ts-expect-error ???\n disabled: element.readOnly,\n }}\n onEnd={handleEndDraw}\n onBegin={\n window.cordova ? scrollingService.disableScrolling : undefined\n }\n />\n </div>\n\n <div className=\"buttons ob-buttons\">\n <button\n type=\"button\"\n className=\"button ob-button is-light ob-button__clear cypress-clear-signature\"\n onClick={handleClear}\n disabled={element.readOnly || isEmpty}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"button ob-button ob-button__done is-primary cypress-done-signature-button\"\n onClick={handleDone}\n disabled={element.readOnly || isEmpty}\n >\n Done\n </button>\n </div>\n </>\n )\n})\n\nconst SignatureDisplay = React.memo(function SignatureDisplay({\n element,\n value,\n onChange,\n}: {\n element: Props['element']\n value: Props['value']\n onChange: Props['onChange']\n}) {\n const result = useAttachment(\n value,\n element,\n React.useCallback(\n (id, attachment) => {\n onChange(element, attachment)\n },\n [element, onChange],\n ),\n )\n\n return (\n <>\n <figure className=\"ob-figure\">\n <div className=\"figure-content\">\n <DisplayImage element={element} {...result} />\n </div>\n </figure>\n\n <div className=\"buttons ob-buttons\">\n <button\n type=\"button\"\n className=\"button ob-button is-light ob-button__clear cypress-clear-signature\"\n onClick={() => onChange(element, undefined)}\n disabled={element.readOnly}\n >\n Clear\n </button>\n </div>\n </>\n )\n})\n\nconst DisplayImage = React.memo(function DisplayImage({\n element,\n uploadErrorMessage,\n isUploading,\n isLoadingImageUrl,\n imageUrl,\n loadImageUrlError,\n}: ReturnType<typeof useAttachment> & {\n element: FormTypes.DrawElement\n}) {\n if (uploadErrorMessage) {\n return (\n <>\n <h3 className=\"title is-3\">Upload Failed</h3>\n <p>\n Your signature failed to upload, please press the <b>Clear</b> button\n and try again.\n </p>\n </>\n )\n }\n\n if (loadImageUrlError) {\n return (\n <>\n <h3 className=\"title is-3\">Preview Failed</h3>\n <p>{loadImageUrlError.message}</p>\n </>\n )\n }\n\n if (isLoadingImageUrl) {\n return <OnLoading small className=\"cypress-signature-loading-image\" />\n }\n\n if (imageUrl) {\n return (\n <>\n <span className=\"ob-figure__status\">\n <AttachmentStatus\n isLoadingImageUrl={isLoadingImageUrl}\n loadImageUrlError={loadImageUrlError}\n isUploading={isUploading}\n imageUrl={imageUrl}\n />\n </span>\n <img\n src={imageUrl}\n className=\"cypress-signature-image ob-signature__img\"\n />\n </>\n )\n }\n\n return <ImagePreviewUnavailable />\n})\n"]}
1
+ {"version":3,"file":"FormElementSignature.js","sourceRoot":"","sources":["../../src/form-elements/FormElementSignature.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,eAAe,MAAM,wBAAwB,CAAA;AAGpD,OAAO,gBAAgB,MAAM,+BAA+B,CAAA;AAC5D,OAAO,yBAAyB,MAAM,kDAAkD,CAAA;AACxF,OAAO,SAAS,MAAM,kCAAkC,CAAA;AACxD,OAAO,aAAa,MAAM,oCAAoC,CAAA;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,gBAAgB,MAAM,qDAAqD,CAAA;AAClF,OAAO,eAAe,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,uBAAuB,MAAM,4DAA4D,CAAA;AAEhG,OAAO,gBAAgB,MAAM,2BAA2B,CAAA;AAWxD,SAAS,oBAAoB,CAAC,EAC5B,EAAE,EACF,OAAO,EACP,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,wBAAwB,GAClB;IACN,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACpD,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAA;IAExC,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CACpC,CAAC,WAAW,EAAE,QAAQ,EAAE,EAAE;QACxB,UAAU,EAAE,CAAA;QACZ,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACjC,CAAC,EACD,CAAC,QAAQ,EAAE,UAAU,CAAC,CACvB,CAAA;IAED,OAAO,CACL,6BAAK,SAAS,EAAC,2BAA2B;QACxC,oBAAC,yBAAyB,IACxB,SAAS,EAAC,cAAc,EACxB,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAE1B,6BAAK,SAAS,EAAC,SAAS,IACrB,KAAK,CAAC,CAAC,CAAC,CACP,oBAAC,gBAAgB,IACf,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,YAAY,GACtB,CACH,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAClB,oBAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,GAAI,CAC/D,CAAC,CAAC,CAAC,IAAI,CACJ;YAEL,CAAC,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAC/D,6BAAK,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,kBAAkB;gBAC5C,6BAAK,SAAS,EAAC,2DAA2D,IACvE,iBAAiB,CACd,CACF,CACP,CACyB,CACxB,CACP,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;AAE/C,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,gBAAgB,CAAC,EAC5D,OAAO,EACP,QAAQ,GAIT;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAkB,IAAI,CAAC,CAAA;IAErD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAClD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAElE,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACzC,IAAI,SAAS,CAAC,OAAO,EAAE;YACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;YACpC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;SAC1B;QACD,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAC9C,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAM;QAC9B,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAA;QAE1D,yDAAyD;QACzD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,CAAA;QAC9C,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;IACzE,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEvB,yBAAyB;IACzB,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC3C,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,gBAAgB,CAAC,eAAe,EAAE,CAAA;SACnC;QACD,IAAI,OAAO,EAAE;YACX,UAAU,CAAC,KAAK,CAAC,CAAA;SAClB;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,gBAAgB;IAChB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAA;QACzC,IAAI,CAAC,eAAe;YAAE,OAAM;QAC5B,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC,UAAU,CAAA;YACxD,IAAI,SAAS,EAAE;gBACb,mBAAmB,CAAC;oBAClB,uBAAuB;oBACvB,KAAK,EAAE,SAAS,CAAC,WAAW;oBAC5B,uBAAuB;oBACvB,MAAM,EAAE,SAAS,CAAC,YAAY;iBAC/B,CAAC,CAAA;aACH;QACH,CAAC,CAAA;QACD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACzC,MAAM,EAAE,CAAA;QAER,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC9C,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,+BAA+B;IAC/B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAM;QAC9B,IAAI,OAAO,CAAC,QAAQ,EAAE;YACpB,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA;SACxB;aAAM;YACL,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,CAAA;SACvB;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEjC,OAAO,CACL;QACE;YACE,oBAAC,eAAe,IACd,GAAG,EAAE,SAAS,EACd,WAAW,EAAE;oBACX,GAAG,gBAAgB;oBACnB,SAAS,EACP,qEAAqE;oBACvE,uBAAuB;oBACvB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,EACD,KAAK,EAAE,aAAa,EACpB,OAAO,EACL,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,GAEhE,CACE;QAEN,6BAAK,SAAS,EAAC,oBAAoB;YACjC,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,oEAAoE,EAC9E,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,YAG9B;YACT,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,2EAA2E,EACrF,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,WAG9B,CACL,CACL,CACJ,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,gBAAgB,CAAC,EAC5D,OAAO,EACP,KAAK,EACL,QAAQ,GAKT;IACC,MAAM,MAAM,GAAG,aAAa,CAC1B,KAAK,EACL,OAAO,EACP,KAAK,CAAC,WAAW,CACf,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE;QACjB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAC/B,CAAC,EACD,CAAC,OAAO,EAAE,QAAQ,CAAC,CACpB,CACF,CAAA;IAED,OAAO,CACL;QACE,gCAAQ,SAAS,EAAC,WAAW;YAC3B,6BAAK,SAAS,EAAC,gBAAgB;gBAC7B,oBAAC,YAAY,OAAK,MAAM,GAAI,CACxB,CACC;QAET,6BAAK,SAAS,EAAC,oBAAoB;YACjC,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,oEAAoE,EAC9E,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,EAC3C,QAAQ,EAAE,OAAO,CAAC,QAAQ,YAGnB,CACL,CACL,CACJ,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,EACpD,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,GACgB;IACjC,IAAI,kBAAkB,EAAE;QACtB,OAAO,CACL;YACE,4BAAI,SAAS,EAAC,YAAY,oBAAmB;YAC7C;;gBACoD,uCAAY;yCAE5D,CACH,CACJ,CAAA;KACF;IAED,IAAI,iBAAiB,EAAE;QACrB,OAAO,CACL;YACE,4BAAI,SAAS,EAAC,YAAY,qBAAoB;YAC9C,+BAAI,iBAAiB,CAAC,OAAO,CAAK,CACjC,CACJ,CAAA;KACF;IAED,IAAI,iBAAiB,EAAE;QACrB,OAAO,oBAAC,SAAS,IAAC,KAAK,QAAC,SAAS,EAAC,iCAAiC,GAAG,CAAA;KACvE;IAED,IAAI,QAAQ,EAAE;QACZ,OAAO,CACL;YACE,8BAAM,SAAS,EAAC,mBAAmB;gBACjC,oBAAC,gBAAgB,IACf,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,iBAAiB,EACpC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,GAClB,CACG;YACP,6BACE,GAAG,EAAE,QAAQ,EACb,SAAS,EAAC,2CAA2C,GACrD,CACD,CACJ,CAAA;KACF;IAED,OAAO,oBAAC,uBAAuB,OAAG,CAAA;AACpC,CAAC,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport SignatureCanvas from 'react-signature-canvas'\nimport { FormTypes } from '@oneblink/types'\n\nimport scrollingService from '../services/scrolling-service'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport OnLoading from '../components/renderer/OnLoading'\nimport useAttachment from '../hooks/attachments/useAttachment'\nimport { FormElementBinaryStorageValue } from '../types/attachments'\nimport { prepareNewAttachment } from '../services/attachments'\nimport AttachmentStatus from '../components/renderer/attachments/AttachmentStatus'\nimport useBooleanState from '../hooks/useBooleanState'\nimport { canvasToBlob } from '../services/blob-utils'\nimport ImagePreviewUnavailable from '../components/renderer/attachments/ImagePreviewUnavailable'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport useIsPageVisible from '../hooks/useIsPageVisible'\n\ntype Props = {\n id: string\n element: FormTypes.DrawElement\n value: FormElementBinaryStorageValue\n onChange: FormElementValueChangeHandler<FormElementBinaryStorageValue>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n}\n\nfunction FormElementSignature({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n}: Props) {\n const [isDirty, setIsDirty] = useBooleanState(false)\n const isPageVisible = useIsPageVisible()\n\n const handleChange = React.useCallback(\n (formElement, newValue) => {\n setIsDirty()\n onChange(formElement, newValue)\n },\n [onChange, setIsDirty],\n )\n\n return (\n <div className=\"cypress-signature-element\">\n <FormElementLabelContainer\n className=\"ob-signature\"\n id={id}\n element={element}\n required={element.required}\n >\n <div className=\"control\">\n {value ? (\n <SignatureDisplay\n element={element}\n value={value}\n onChange={handleChange}\n />\n ) : isPageVisible ? (\n <SignatureDrawing element={element} onChange={handleChange} />\n ) : null}\n </div>\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\nexport default React.memo(FormElementSignature)\n\nconst SignatureDrawing = React.memo(function SignatureDrawing({\n element,\n onChange,\n}: {\n element: Props['element']\n onChange: Props['onChange']\n}) {\n const canvasRef = React.useRef<SignatureCanvas>(null)\n\n const [isEmpty, setIsEmpty] = React.useState(true)\n const [canvasDimensions, setCanvasDimensions] = React.useState({})\n\n const handleClear = React.useCallback(() => {\n if (canvasRef.current) {\n console.log('Clearing signature...')\n canvasRef.current.clear()\n }\n setIsEmpty(true)\n }, [])\n\n const handleDone = React.useCallback(async () => {\n if (!canvasRef.current) return\n const trimmedCanvas = canvasRef.current.getTrimmedCanvas()\n\n // Convert base64 data uri to blob and send it on its way\n const blob = await canvasToBlob(trimmedCanvas)\n onChange(element, prepareNewAttachment(blob, 'signature.png', element))\n }, [element, onChange])\n\n // HANDLING CANVAS CHANGE\n const handleEndDraw = React.useCallback(() => {\n if (window.cordova) {\n scrollingService.enableScrolling()\n }\n if (isEmpty) {\n setIsEmpty(false)\n }\n }, [isEmpty])\n\n // HANDLE RESIZE\n React.useEffect(() => {\n const signatureCanvas = canvasRef.current\n if (!signatureCanvas) return\n const resize = () => {\n const parentDiv = signatureCanvas.getCanvas().parentNode\n if (parentDiv) {\n setCanvasDimensions({\n // @ts-expect-error ???\n width: parentDiv.clientWidth,\n // @ts-expect-error ???\n height: parentDiv.clientHeight,\n })\n }\n }\n window.addEventListener('resize', resize)\n resize()\n\n return () => {\n window.removeEventListener('resize', resize)\n }\n }, [canvasRef])\n\n // REACTIVE DISABLING OF CANVAS\n React.useEffect(() => {\n if (!canvasRef.current) return\n if (element.readOnly) {\n canvasRef.current.off()\n } else {\n canvasRef.current.on()\n }\n }, [canvasRef, element.readOnly])\n\n return (\n <>\n <div>\n <SignatureCanvas\n ref={canvasRef}\n canvasProps={{\n ...canvasDimensions,\n className:\n 'input ob-signature__control cypress-signature-control signature-pad',\n // @ts-expect-error ???\n disabled: element.readOnly,\n }}\n onEnd={handleEndDraw}\n onBegin={\n window.cordova ? scrollingService.disableScrolling : undefined\n }\n />\n </div>\n\n <div className=\"buttons ob-buttons\">\n <button\n type=\"button\"\n className=\"button ob-button is-light ob-button__clear cypress-clear-signature\"\n onClick={handleClear}\n disabled={element.readOnly || isEmpty}\n >\n Clear\n </button>\n <button\n type=\"button\"\n className=\"button ob-button ob-button__done is-primary cypress-done-signature-button\"\n onClick={handleDone}\n disabled={element.readOnly || isEmpty}\n >\n Done\n </button>\n </div>\n </>\n )\n})\n\nconst SignatureDisplay = React.memo(function SignatureDisplay({\n element,\n value,\n onChange,\n}: {\n element: Props['element']\n value: Props['value']\n onChange: Props['onChange']\n}) {\n const result = useAttachment(\n value,\n element,\n React.useCallback(\n (id, attachment) => {\n onChange(element, attachment)\n },\n [element, onChange],\n ),\n )\n\n return (\n <>\n <figure className=\"ob-figure\">\n <div className=\"figure-content\">\n <DisplayImage {...result} />\n </div>\n </figure>\n\n <div className=\"buttons ob-buttons\">\n <button\n type=\"button\"\n className=\"button ob-button is-light ob-button__clear cypress-clear-signature\"\n onClick={() => onChange(element, undefined)}\n disabled={element.readOnly}\n >\n Clear\n </button>\n </div>\n </>\n )\n})\n\nconst DisplayImage = React.memo(function DisplayImage({\n uploadErrorMessage,\n isUploading,\n isLoadingImageUrl,\n imageUrl,\n loadImageUrlError,\n}: ReturnType<typeof useAttachment>) {\n if (uploadErrorMessage) {\n return (\n <>\n <h3 className=\"title is-3\">Upload Failed</h3>\n <p>\n Your signature failed to upload, please press the <b>Clear</b> button\n and try again.\n </p>\n </>\n )\n }\n\n if (loadImageUrlError) {\n return (\n <>\n <h3 className=\"title is-3\">Preview Failed</h3>\n <p>{loadImageUrlError.message}</p>\n </>\n )\n }\n\n if (isLoadingImageUrl) {\n return <OnLoading small className=\"cypress-signature-loading-image\" />\n }\n\n if (imageUrl) {\n return (\n <>\n <span className=\"ob-figure__status\">\n <AttachmentStatus\n isLoadingImageUrl={isLoadingImageUrl}\n loadImageUrlError={loadImageUrlError}\n isUploading={isUploading}\n imageUrl={imageUrl}\n />\n </span>\n <img\n src={imageUrl}\n className=\"cypress-signature-image ob-signature__img\"\n />\n </>\n )\n }\n\n return <ImagePreviewUnavailable />\n})\n"]}
@@ -1,2 +1,2 @@
1
- declare const _default: (colorToGetContrastFor?: string | undefined) => "#000000" | "#FFFFFF";
1
+ declare const _default: (colorToGetContrastFor?: string) => "#000000" | "#FFFFFF";
2
2
  export default _default;
@@ -23,7 +23,7 @@ export default function useInfiniteScrollDataLoad<Filters, T>({ limit, debounceS
23
23
  loadError: Error | null;
24
24
  records: T[];
25
25
  onRefresh: () => void;
26
- onTryAgain: (newOffset?: number | undefined) => void;
26
+ onTryAgain: (newOffset?: number) => void;
27
27
  filters: Filters;
28
28
  onChangeFilters: OnChangeFilters<Filters>;
29
29
  onReplace: (replacer: (record: T) => T) => void;
@@ -1,5 +1,5 @@
1
1
  import { FormTypes } from '@oneblink/types';
2
2
  import { FormSubmissionModel, SetFormSubmission } from '../types/form';
3
3
  export default function useLookups(formId: number, setFormSubmission: SetFormSubmission): {
4
- handlePagesLookupResult: (element: FormTypes.LookupFormElement, elementLookupData: FormTypes.PageElement[], dataLookupResult?: FormSubmissionModel | undefined) => void;
4
+ handlePagesLookupResult: (element: FormTypes.LookupFormElement, elementLookupData: FormTypes.PageElement[], dataLookupResult?: FormSubmissionModel) => void;
5
5
  };
@@ -67,7 +67,6 @@ export async function canvasToBlob(canvas) {
67
67
  }
68
68
  export async function getBlobOrientation(blob) {
69
69
  var _a;
70
- // @ts-expect-error For some reason, the types do not include this function returning a promise
71
70
  const imageMetaData = await loadImage.parseMetaData(blob);
72
71
  const orientation = (_a = imageMetaData.exif) === null || _a === void 0 ? void 0 : _a.get('Orientation');
73
72
  return orientation;
@@ -1 +1 @@
1
- {"version":3,"file":"blob-utils.js","sourceRoot":"","sources":["../../src/services/blob-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { authService } from '@oneblink/apps'\nimport loadImage from 'blueimp-load-image'\n\n// Copied from https://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript\nconst b64toBlob = (b64Data: string, contentType = '', sliceSize = 512) => {\n const byteCharacters = atob(b64Data)\n const byteArrays = []\n\n for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n const slice = byteCharacters.slice(offset, offset + sliceSize)\n\n const byteNumbers = new Array(slice.length)\n for (let i = 0; i < slice.length; i++) {\n byteNumbers[i] = slice.charCodeAt(i)\n }\n\n const byteArray = new Uint8Array(byteNumbers)\n byteArrays.push(byteArray)\n }\n\n const blob = new Blob(byteArrays, { type: contentType })\n return blob\n}\n\nexport function dataUriToBlobSync(dataUri: string) {\n const [prefix, b64Data] = dataUri.split(',')\n const matches = prefix.match(/data:(.*);base64/)\n const [, contentType] = matches || []\n return b64toBlob(b64Data, contentType)\n}\n\nasync function generateRequestInit(\n isPrivate?: boolean,\n abortSignal?: AbortSignal,\n): Promise<RequestInit | undefined> {\n if (!isPrivate) {\n return {\n signal: abortSignal,\n }\n }\n\n const idToken = await authService.getIdToken()\n if (idToken) {\n return {\n signal: abortSignal,\n headers: {\n Authorization: `Bearer ${idToken}`,\n },\n }\n }\n}\n\nexport async function urlToBlobAsync(\n url: string,\n isPrivate?: boolean,\n abortSignal?: AbortSignal,\n) {\n const requestInit = await generateRequestInit(isPrivate, abortSignal)\n const response = await fetch(url, requestInit)\n if (!response.ok) {\n throw new Error(\n `Unable to download file. HTTP Status Code: ${response.status}`,\n )\n }\n return await response.blob()\n}\n\nexport async function blobToCanvas(\n blob: Blob,\n orientation?: number,\n): Promise<HTMLCanvasElement> {\n const loadImageResult = await loadImage(blob, {\n canvas: true,\n orientation: orientation,\n })\n // @ts-expect-error this it always be a HTMLCanvasElement because we passed `canvas: true` above\n const canvas: HTMLCanvasElement = loadImageResult.image\n return canvas\n}\n\nexport async function canvasToBlob(canvas: HTMLCanvasElement) {\n const blob: Blob = await new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) resolve(blob)\n reject(new Error('Failed to convert canvas back to blob.'))\n })\n })\n return blob\n}\n\nexport async function getBlobOrientation(\n blob: Blob,\n): Promise<number | undefined> {\n // @ts-expect-error For some reason, the types do not include this function returning a promise\n const imageMetaData: loadImage.MetaData = await loadImage.parseMetaData(blob)\n const orientation = imageMetaData.exif?.get('Orientation')\n return orientation as number | undefined\n}\n"]}
1
+ {"version":3,"file":"blob-utils.js","sourceRoot":"","sources":["../../src/services/blob-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { authService } from '@oneblink/apps'\nimport loadImage from 'blueimp-load-image'\n\n// Copied from https://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript\nconst b64toBlob = (b64Data: string, contentType = '', sliceSize = 512) => {\n const byteCharacters = atob(b64Data)\n const byteArrays = []\n\n for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n const slice = byteCharacters.slice(offset, offset + sliceSize)\n\n const byteNumbers = new Array(slice.length)\n for (let i = 0; i < slice.length; i++) {\n byteNumbers[i] = slice.charCodeAt(i)\n }\n\n const byteArray = new Uint8Array(byteNumbers)\n byteArrays.push(byteArray)\n }\n\n const blob = new Blob(byteArrays, { type: contentType })\n return blob\n}\n\nexport function dataUriToBlobSync(dataUri: string) {\n const [prefix, b64Data] = dataUri.split(',')\n const matches = prefix.match(/data:(.*);base64/)\n const [, contentType] = matches || []\n return b64toBlob(b64Data, contentType)\n}\n\nasync function generateRequestInit(\n isPrivate?: boolean,\n abortSignal?: AbortSignal,\n): Promise<RequestInit | undefined> {\n if (!isPrivate) {\n return {\n signal: abortSignal,\n }\n }\n\n const idToken = await authService.getIdToken()\n if (idToken) {\n return {\n signal: abortSignal,\n headers: {\n Authorization: `Bearer ${idToken}`,\n },\n }\n }\n}\n\nexport async function urlToBlobAsync(\n url: string,\n isPrivate?: boolean,\n abortSignal?: AbortSignal,\n) {\n const requestInit = await generateRequestInit(isPrivate, abortSignal)\n const response = await fetch(url, requestInit)\n if (!response.ok) {\n throw new Error(\n `Unable to download file. HTTP Status Code: ${response.status}`,\n )\n }\n return await response.blob()\n}\n\nexport async function blobToCanvas(\n blob: Blob,\n orientation?: number,\n): Promise<HTMLCanvasElement> {\n const loadImageResult = await loadImage(blob, {\n canvas: true,\n orientation: orientation,\n })\n // @ts-expect-error this it always be a HTMLCanvasElement because we passed `canvas: true` above\n const canvas: HTMLCanvasElement = loadImageResult.image\n return canvas\n}\n\nexport async function canvasToBlob(canvas: HTMLCanvasElement) {\n const blob: Blob = await new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (blob) resolve(blob)\n reject(new Error('Failed to convert canvas back to blob.'))\n })\n })\n return blob\n}\n\nexport async function getBlobOrientation(\n blob: Blob,\n): Promise<number | undefined> {\n const imageMetaData: loadImage.MetaData = await loadImage.parseMetaData(blob)\n const orientation = imageMetaData.exif?.get('Orientation')\n return orientation as number | undefined\n}\n"]}
@@ -163,7 +163,6 @@ function parsePreFillData(element, value) {
163
163
  else {
164
164
  return parseAttachment(value);
165
165
  }
166
- break;
167
166
  }
168
167
  case 'files': {
169
168
  return parseFiles(element, value);
@@ -423,11 +422,16 @@ export default function generateDefaultData(elements, preFillData) {
423
422
  }
424
423
  break;
425
424
  }
425
+ case 'camera':
426
+ case 'draw':
427
+ case 'files': {
428
+ m[el.name] = parsePreFillData(el, el.defaultValue);
429
+ break;
430
+ }
426
431
  case 'freshdeskDependentField':
427
432
  case 'geoscapeAddress':
428
433
  case 'pointAddress':
429
434
  case 'civicaStreetName':
430
- case 'camera':
431
435
  case 'abn':
432
436
  case 'bsb':
433
437
  case 'text':
@@ -435,8 +439,6 @@ export default function generateDefaultData(elements, preFillData) {
435
439
  case 'email':
436
440
  case 'telephone':
437
441
  case 'textarea':
438
- case 'files':
439
- case 'draw':
440
442
  case 'location': {
441
443
  if (el.defaultValue) {
442
444
  m[el.name] = el.defaultValue;
@@ -1 +1 @@
1
- {"version":3,"file":"generate-default-data.js","sourceRoot":"","sources":["../../src/services/generate-default-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { localisationService } from '@oneblink/apps'\nimport { Attachment } from '../types/attachments'\nimport { FormSubmissionModel } from '../types/form'\nimport { prepareNewAttachment } from './attachments'\nimport { dataUriToBlobSync } from './blob-utils'\nimport generateCivicaNameRecordElements from './generateCivicaNameRecordElements'\n\nfunction parseAttachment(value: unknown): Attachment | undefined {\n return parseUnknownAsRecord(value, (record) => {\n // Check for attachments that have not been uploaded yet\n if (\n record.data instanceof Blob &&\n typeof record.type === 'string' &&\n typeof record._id === 'string' &&\n typeof record.fileName === 'string' &&\n typeof record.isPrivate === 'boolean'\n ) {\n return record as Attachment\n }\n\n // Check for attachments that have been uploaded already\n if (\n typeof record.id === 'string' &&\n typeof record.fileName === 'string' &&\n typeof record.url === 'string' &&\n typeof record.contentType === 'string' &&\n typeof record.isPrivate === 'boolean' &&\n parseUnknownAsRecord(\n record.s3,\n (s3) =>\n typeof s3.bucket === 'string' &&\n typeof s3.key === 'string' &&\n typeof s3.region === 'string',\n )\n ) {\n return record as SubmissionTypes.FormSubmissionAttachment\n }\n })\n}\n\nfunction parseFile(\n element: FormTypes.FormElementBinaryStorage,\n value: unknown,\n): Attachment | undefined {\n return parseUnknownAsRecord(value, (record) => {\n if (\n record.type === undefined &&\n typeof record.fileName === 'string' &&\n typeof record.data === 'string'\n ) {\n const blob = dataUriToBlobSync(record.data)\n return prepareNewAttachment(blob, record.fileName, element)\n }\n\n return parseAttachment(record)\n })\n}\n\nfunction parseFiles(\n element: FormTypes.FormElementBinaryStorage,\n value: unknown,\n): Array<Attachment> | undefined {\n if (Array.isArray(value)) {\n const files = value.reduce<Array<Attachment>>((files, v) => {\n const file = parseFile(element, v)\n if (file) {\n files.push(file)\n }\n return files\n }, [])\n if (files.length) {\n return files\n }\n }\n}\n\nexport const generateDate = ({\n daysOffset,\n value,\n dateOnly,\n}: {\n daysOffset: number | undefined\n value: string\n dateOnly: boolean\n}): Date | undefined => {\n if (value === 'NOW') {\n const date = new Date()\n if (daysOffset === undefined) {\n return date\n } else {\n date.setDate(date.getDate() + daysOffset)\n return date\n }\n } else {\n const timestamp = Date.parse(value)\n if (!Number.isNaN(timestamp)) {\n const date = new Date(timestamp)\n if (dateOnly) {\n const offset = date.getTimezoneOffset()\n return new Date(date.getTime() + offset * 60000)\n }\n return date\n }\n }\n}\n\nexport function parseDateValue({\n dateOnly,\n daysOffset,\n value,\n}: {\n dateOnly: boolean\n daysOffset: number | undefined\n value: unknown\n}): string | undefined {\n if (typeof value !== 'string') {\n return\n }\n\n const date = generateDate({ daysOffset, value, dateOnly })\n if (!date) {\n return\n }\n\n if (dateOnly) {\n const { year, month, day } = new Intl.DateTimeFormat(\n localisationService.getLocale(),\n {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n },\n )\n .formatToParts(date)\n .reduce(\n (memo, { type, value }) => ({\n ...memo,\n [type]: value,\n }),\n {\n year: '',\n month: '',\n day: '',\n },\n )\n // This is a workaround for an iOS 15 bug where the year was being returned as 2 digits: https://bugs.webkit.org/show_bug.cgi?id=230827\n const fixedYear = year.length === 2 ? date.getFullYear() : year\n return `${fixedYear}-${month}-${day}`\n } else {\n return date.toISOString()\n }\n}\n\nfunction parseStringValue(value: unknown) {\n if (typeof value === 'string' && !!value) {\n return value\n }\n return\n}\n\nfunction parseNumberValue(value: unknown) {\n if (typeof value === 'number' && !isNaN(value)) {\n return value\n }\n return\n}\n\nfunction parseStringArrayValue(value: unknown) {\n if (Array.isArray(value)) {\n return value.filter((val) => typeof val === 'string')\n }\n return\n}\n\nfunction parseUnknownAsRecord<T>(\n value: unknown,\n validate: (value: Record<string, unknown>) => T | undefined,\n): T | undefined {\n if (typeof value === 'object' && value !== null) {\n return validate(value as Record<string, unknown>)\n }\n}\n\nfunction parseFormSubmissionModel(\n elements: FormTypes.FormElement[],\n value: unknown,\n): FormSubmissionModel | undefined {\n return parseUnknownAsRecord(value, (record) => {\n return elements.reduce<FormSubmissionModel>((model, element) => {\n switch (element.type) {\n case 'section':\n case 'page': {\n const partialModel = parseFormSubmissionModel(element.elements, model)\n Object.assign(model, partialModel)\n break\n }\n default: {\n model[element.name] = parsePreFillData(element, record[element.name])\n }\n }\n\n return model\n }, record)\n })\n}\n\nfunction parsePreFillData(\n element: FormTypes.FormElement,\n value: unknown,\n): unknown {\n switch (element.type) {\n // If a form element is pre-filled with the \"legacy\" storage type\n // format (base64), the data should be uploaded to S3 and set in the\n // submission data. This is to cater for instances of pre-fill data\n // being created before the \"legacy\" storage type was removed.\n case 'camera':\n case 'draw': {\n if (!value) {\n break\n } else if (typeof value === 'string') {\n const blob = dataUriToBlobSync(value)\n return prepareNewAttachment(blob, 'file', element)\n } else {\n return parseAttachment(value)\n }\n break\n }\n case 'files': {\n return parseFiles(element, value)\n }\n case 'compliance': {\n return parseUnknownAsRecord(value, (record) => {\n const selectedValue = parseStringValue(record.value)\n const notes = parseStringValue(record.notes)\n if (selectedValue) {\n return {\n value: selectedValue,\n notes,\n files: parseFiles(element, record.files),\n }\n }\n })\n }\n case 'time':\n case 'datetime':\n case 'date': {\n return parseDateValue({\n dateOnly: element.type === 'date',\n daysOffset: undefined,\n value,\n })\n }\n case 'bsb': {\n const text = parseStringValue(value)\n if (text?.match(/\\d{3}-\\d{3}/)) {\n return text\n }\n return\n }\n case 'text':\n case 'barcodeScanner':\n case 'email':\n case 'telephone':\n case 'textarea':\n case 'radio':\n case 'autocomplete': {\n return parseStringValue(value)\n }\n case 'select': {\n if (element.multi) {\n return parseStringArrayValue(value)\n } else {\n return parseStringValue(value)\n }\n }\n case 'checkboxes': {\n return parseStringArrayValue(value)\n }\n case 'calculation':\n case 'number': {\n return parseNumberValue(value)\n }\n case 'boolean': {\n return typeof value === 'boolean' ? value : false\n }\n case 'abn': {\n return parseUnknownAsRecord(value, (record) => {\n const hasABN = parseUnknownAsRecord(record.ABN, (ABN) => {\n if (Array.isArray(ABN)) {\n return ABN.some((abn) => !!parseStringValue(abn.identifierValue))\n }\n if (parseStringValue(ABN.identifierValue)) {\n return true\n }\n })\n if (!hasABN) {\n return\n }\n const hasMainName = parseUnknownAsRecord(\n record.mainName,\n (mainName) => {\n if (parseStringValue(mainName.organisationName)) {\n return true\n }\n },\n )\n if (hasMainName) {\n return record\n }\n const hasLegalName = parseUnknownAsRecord(\n record.legalName,\n (legalName) => {\n if (\n parseStringValue(legalName.givenName) ||\n parseStringValue(legalName.familyName) ||\n parseStringValue(legalName.otherGivenName)\n ) {\n return true\n }\n },\n )\n if (hasLegalName) {\n return record\n }\n const hasMainTradingName = parseUnknownAsRecord(\n record.mainTradingName,\n (mainTradingName) => {\n if (parseStringValue(mainTradingName.organisationName)) {\n return true\n }\n },\n )\n if (hasMainTradingName) {\n return record\n }\n })\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n return parseUnknownAsRecord(value, (record) => {\n if (parseStringValue(record.addressId)) {\n return record\n }\n })\n }\n case 'freshdeskDependentField': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.category) &&\n parseStringValue(record.subCategory) &&\n parseStringValue(record.item)\n ) {\n return record\n }\n })\n }\n case 'civicaNameRecord': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.title) &&\n parseStringValue(record.familyName) &&\n Array.isArray(record.streetAddress)\n ) {\n return record\n }\n })\n }\n case 'civicaStreetName': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.formattedAccount) &&\n parseStringValue(record.formattedStreet)\n ) {\n return record\n }\n })\n }\n case 'form': {\n return parseFormSubmissionModel(element.elements || [], value)\n }\n case 'repeatableSet': {\n if (Array.isArray(element.elements) && Array.isArray(value)) {\n return value.reduce((entries, v) => {\n const entry = parseFormSubmissionModel(element.elements, v)\n if (entry) {\n entries.push(entry)\n }\n return entries\n }, [])\n }\n break\n }\n case 'location': {\n return parseUnknownAsRecord(value, (record) => {\n const latitude = parseNumberValue(record.latitude)\n const longitude = parseNumberValue(record.longitude)\n if (latitude !== undefined && longitude !== undefined) {\n return {\n latitude,\n longitude,\n zoom: parseNumberValue(record.zoom),\n }\n }\n })\n }\n case 'image':\n case 'html':\n case 'summary':\n case 'captcha':\n case 'heading':\n case 'infoPage':\n case 'page':\n case 'section': {\n return\n }\n default: {\n console.warn('Invalid element type used in prefill data', element)\n }\n }\n}\n\nexport default function generateDefaultData(\n elements: FormTypes.FormElement[],\n preFillData: FormSubmissionModel,\n): FormSubmissionModel {\n return elements.reduce<FormSubmissionModel>((m, el) => {\n if (el.type !== 'page' && el.type !== 'section' && el.name in m) {\n m[el.name] = parsePreFillData(el, m[el.name])\n return m\n }\n\n switch (el.type) {\n case 'checkboxes':\n case 'select':\n case 'autocomplete':\n case 'radio':\n case 'compliance': {\n const dv = getOptionsDefaultValue(el)\n if (dv) {\n if (el.type === 'compliance' && typeof dv === 'string') {\n m[el.name] = {\n value: dv,\n }\n } else {\n m[el.name] = dv\n }\n }\n break\n }\n case 'number': {\n if (typeof el.defaultValue === 'number') {\n m[el.name] = el.defaultValue\n } else if (el.isSlider) {\n m[el.name] = el.minNumber\n } else {\n m[el.name] = undefined\n }\n break\n }\n case 'section':\n case 'page': {\n if (Array.isArray(el.elements)) {\n Object.assign(m, generateDefaultData(el.elements, m))\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(el, [])\n m[el.name] = generateDefaultData(nestedElements, { ...el.defaultValue })\n break\n }\n case 'form': {\n if (Array.isArray(el.elements)) {\n m[el.name] = generateDefaultData(el.elements, {})\n }\n break\n }\n case 'repeatableSet': {\n if (\n Array.isArray(el.elements) &&\n typeof el.minSetEntries === 'number'\n ) {\n const minSetEntries = el.minSetEntries\n // add min number of entries by default\n const entries = []\n for (let index = 0; index < minSetEntries; index++) {\n const entry = generateDefaultData(el.elements, {})\n entries.push(entry)\n }\n m[el.name] = entries\n }\n break\n }\n case 'date':\n case 'datetime':\n case 'time': {\n if (el.defaultValue) {\n m[el.name] = parseDateValue({\n dateOnly: el.type === 'date',\n daysOffset: el.defaultValueDaysOffset,\n value: el.defaultValue,\n })\n }\n break\n }\n case 'freshdeskDependentField':\n case 'geoscapeAddress':\n case 'pointAddress':\n case 'civicaStreetName':\n case 'camera':\n case 'abn':\n case 'bsb':\n case 'text':\n case 'barcodeScanner':\n case 'email':\n case 'telephone':\n case 'textarea':\n case 'files':\n case 'draw':\n case 'location': {\n if (el.defaultValue) {\n m[el.name] = el.defaultValue\n }\n break\n }\n case 'boolean': {\n m[el.name] = el.defaultValue || false\n break\n }\n case 'captcha':\n case 'heading':\n case 'html':\n case 'image':\n case 'infoPage':\n case 'calculation':\n case 'summary':\n break\n default: {\n console.warn('Default value is not supported for element type', el)\n }\n }\n\n return m\n }, Object.assign({}, preFillData))\n}\n\nconst getOptionsDefaultValue = (el: FormTypes.FormElementWithOptions) => {\n if (!el.defaultValue) {\n return\n }\n // Cater for dynamic options\n if (el.optionsType === 'DYNAMIC' || el.optionsType === 'FRESHDESK_FIELD') {\n return el.defaultValue\n }\n // Cater for multi-select and checkboxes\n else if ((el.type === 'select' && el.multi) || el.type === 'checkboxes') {\n if (Array.isArray(el.defaultValue) && el.defaultValue.length) {\n return el.defaultValue.reduce((optionValues: string[], optionId) => {\n const option = (el.options || []).find(\n (option) => option.id === optionId,\n )\n if (option) {\n optionValues.push(option.value)\n }\n return optionValues\n }, [])\n }\n } else {\n const option = (el.options || []).find(\n (option) => option.id === el.defaultValue,\n )\n if (option) {\n return option.value\n }\n }\n return\n}\n"]}
1
+ {"version":3,"file":"generate-default-data.js","sourceRoot":"","sources":["../../src/services/generate-default-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { localisationService } from '@oneblink/apps'\nimport { Attachment } from '../types/attachments'\nimport { FormSubmissionModel } from '../types/form'\nimport { prepareNewAttachment } from './attachments'\nimport { dataUriToBlobSync } from './blob-utils'\nimport generateCivicaNameRecordElements from './generateCivicaNameRecordElements'\n\nfunction parseAttachment(value: unknown): Attachment | undefined {\n return parseUnknownAsRecord(value, (record) => {\n // Check for attachments that have not been uploaded yet\n if (\n record.data instanceof Blob &&\n typeof record.type === 'string' &&\n typeof record._id === 'string' &&\n typeof record.fileName === 'string' &&\n typeof record.isPrivate === 'boolean'\n ) {\n return record as Attachment\n }\n\n // Check for attachments that have been uploaded already\n if (\n typeof record.id === 'string' &&\n typeof record.fileName === 'string' &&\n typeof record.url === 'string' &&\n typeof record.contentType === 'string' &&\n typeof record.isPrivate === 'boolean' &&\n parseUnknownAsRecord(\n record.s3,\n (s3) =>\n typeof s3.bucket === 'string' &&\n typeof s3.key === 'string' &&\n typeof s3.region === 'string',\n )\n ) {\n return record as SubmissionTypes.FormSubmissionAttachment\n }\n })\n}\n\nfunction parseFile(\n element: FormTypes.FormElementBinaryStorage,\n value: unknown,\n): Attachment | undefined {\n return parseUnknownAsRecord(value, (record) => {\n if (\n record.type === undefined &&\n typeof record.fileName === 'string' &&\n typeof record.data === 'string'\n ) {\n const blob = dataUriToBlobSync(record.data)\n return prepareNewAttachment(blob, record.fileName, element)\n }\n\n return parseAttachment(record)\n })\n}\n\nfunction parseFiles(\n element: FormTypes.FormElementBinaryStorage,\n value: unknown,\n): Array<Attachment> | undefined {\n if (Array.isArray(value)) {\n const files = value.reduce<Array<Attachment>>((files, v) => {\n const file = parseFile(element, v)\n if (file) {\n files.push(file)\n }\n return files\n }, [])\n if (files.length) {\n return files\n }\n }\n}\n\nexport const generateDate = ({\n daysOffset,\n value,\n dateOnly,\n}: {\n daysOffset: number | undefined\n value: string\n dateOnly: boolean\n}): Date | undefined => {\n if (value === 'NOW') {\n const date = new Date()\n if (daysOffset === undefined) {\n return date\n } else {\n date.setDate(date.getDate() + daysOffset)\n return date\n }\n } else {\n const timestamp = Date.parse(value)\n if (!Number.isNaN(timestamp)) {\n const date = new Date(timestamp)\n if (dateOnly) {\n const offset = date.getTimezoneOffset()\n return new Date(date.getTime() + offset * 60000)\n }\n return date\n }\n }\n}\n\nexport function parseDateValue({\n dateOnly,\n daysOffset,\n value,\n}: {\n dateOnly: boolean\n daysOffset: number | undefined\n value: unknown\n}): string | undefined {\n if (typeof value !== 'string') {\n return\n }\n\n const date = generateDate({ daysOffset, value, dateOnly })\n if (!date) {\n return\n }\n\n if (dateOnly) {\n const { year, month, day } = new Intl.DateTimeFormat(\n localisationService.getLocale(),\n {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n },\n )\n .formatToParts(date)\n .reduce(\n (memo, { type, value }) => ({\n ...memo,\n [type]: value,\n }),\n {\n year: '',\n month: '',\n day: '',\n },\n )\n // This is a workaround for an iOS 15 bug where the year was being returned as 2 digits: https://bugs.webkit.org/show_bug.cgi?id=230827\n const fixedYear = year.length === 2 ? date.getFullYear() : year\n return `${fixedYear}-${month}-${day}`\n } else {\n return date.toISOString()\n }\n}\n\nfunction parseStringValue(value: unknown) {\n if (typeof value === 'string' && !!value) {\n return value\n }\n return\n}\n\nfunction parseNumberValue(value: unknown) {\n if (typeof value === 'number' && !isNaN(value)) {\n return value\n }\n return\n}\n\nfunction parseStringArrayValue(value: unknown) {\n if (Array.isArray(value)) {\n return value.filter((val) => typeof val === 'string')\n }\n return\n}\n\nfunction parseUnknownAsRecord<T>(\n value: unknown,\n validate: (value: Record<string, unknown>) => T | undefined,\n): T | undefined {\n if (typeof value === 'object' && value !== null) {\n return validate(value as Record<string, unknown>)\n }\n}\n\nfunction parseFormSubmissionModel(\n elements: FormTypes.FormElement[],\n value: unknown,\n): FormSubmissionModel | undefined {\n return parseUnknownAsRecord(value, (record) => {\n return elements.reduce<FormSubmissionModel>((model, element) => {\n switch (element.type) {\n case 'section':\n case 'page': {\n const partialModel = parseFormSubmissionModel(element.elements, model)\n Object.assign(model, partialModel)\n break\n }\n default: {\n model[element.name] = parsePreFillData(element, record[element.name])\n }\n }\n\n return model\n }, record)\n })\n}\n\nfunction parsePreFillData(\n element: FormTypes.FormElement,\n value: unknown,\n): unknown {\n switch (element.type) {\n // If a form element is pre-filled with the \"legacy\" storage type\n // format (base64), the data should be uploaded to S3 and set in the\n // submission data. This is to cater for instances of pre-fill data\n // being created before the \"legacy\" storage type was removed.\n case 'camera':\n case 'draw': {\n if (!value) {\n break\n } else if (typeof value === 'string') {\n const blob = dataUriToBlobSync(value)\n return prepareNewAttachment(blob, 'file', element)\n } else {\n return parseAttachment(value)\n }\n }\n case 'files': {\n return parseFiles(element, value)\n }\n case 'compliance': {\n return parseUnknownAsRecord(value, (record) => {\n const selectedValue = parseStringValue(record.value)\n const notes = parseStringValue(record.notes)\n if (selectedValue) {\n return {\n value: selectedValue,\n notes,\n files: parseFiles(element, record.files),\n }\n }\n })\n }\n case 'time':\n case 'datetime':\n case 'date': {\n return parseDateValue({\n dateOnly: element.type === 'date',\n daysOffset: undefined,\n value,\n })\n }\n case 'bsb': {\n const text = parseStringValue(value)\n if (text?.match(/\\d{3}-\\d{3}/)) {\n return text\n }\n return\n }\n case 'text':\n case 'barcodeScanner':\n case 'email':\n case 'telephone':\n case 'textarea':\n case 'radio':\n case 'autocomplete': {\n return parseStringValue(value)\n }\n case 'select': {\n if (element.multi) {\n return parseStringArrayValue(value)\n } else {\n return parseStringValue(value)\n }\n }\n case 'checkboxes': {\n return parseStringArrayValue(value)\n }\n case 'calculation':\n case 'number': {\n return parseNumberValue(value)\n }\n case 'boolean': {\n return typeof value === 'boolean' ? value : false\n }\n case 'abn': {\n return parseUnknownAsRecord(value, (record) => {\n const hasABN = parseUnknownAsRecord(record.ABN, (ABN) => {\n if (Array.isArray(ABN)) {\n return ABN.some((abn) => !!parseStringValue(abn.identifierValue))\n }\n if (parseStringValue(ABN.identifierValue)) {\n return true\n }\n })\n if (!hasABN) {\n return\n }\n const hasMainName = parseUnknownAsRecord(\n record.mainName,\n (mainName) => {\n if (parseStringValue(mainName.organisationName)) {\n return true\n }\n },\n )\n if (hasMainName) {\n return record\n }\n const hasLegalName = parseUnknownAsRecord(\n record.legalName,\n (legalName) => {\n if (\n parseStringValue(legalName.givenName) ||\n parseStringValue(legalName.familyName) ||\n parseStringValue(legalName.otherGivenName)\n ) {\n return true\n }\n },\n )\n if (hasLegalName) {\n return record\n }\n const hasMainTradingName = parseUnknownAsRecord(\n record.mainTradingName,\n (mainTradingName) => {\n if (parseStringValue(mainTradingName.organisationName)) {\n return true\n }\n },\n )\n if (hasMainTradingName) {\n return record\n }\n })\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n return parseUnknownAsRecord(value, (record) => {\n if (parseStringValue(record.addressId)) {\n return record\n }\n })\n }\n case 'freshdeskDependentField': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.category) &&\n parseStringValue(record.subCategory) &&\n parseStringValue(record.item)\n ) {\n return record\n }\n })\n }\n case 'civicaNameRecord': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.title) &&\n parseStringValue(record.familyName) &&\n Array.isArray(record.streetAddress)\n ) {\n return record\n }\n })\n }\n case 'civicaStreetName': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.formattedAccount) &&\n parseStringValue(record.formattedStreet)\n ) {\n return record\n }\n })\n }\n case 'form': {\n return parseFormSubmissionModel(element.elements || [], value)\n }\n case 'repeatableSet': {\n if (Array.isArray(element.elements) && Array.isArray(value)) {\n return value.reduce((entries, v) => {\n const entry = parseFormSubmissionModel(element.elements, v)\n if (entry) {\n entries.push(entry)\n }\n return entries\n }, [])\n }\n break\n }\n case 'location': {\n return parseUnknownAsRecord(value, (record) => {\n const latitude = parseNumberValue(record.latitude)\n const longitude = parseNumberValue(record.longitude)\n if (latitude !== undefined && longitude !== undefined) {\n return {\n latitude,\n longitude,\n zoom: parseNumberValue(record.zoom),\n }\n }\n })\n }\n case 'image':\n case 'html':\n case 'summary':\n case 'captcha':\n case 'heading':\n case 'infoPage':\n case 'page':\n case 'section': {\n return\n }\n default: {\n console.warn('Invalid element type used in prefill data', element)\n }\n }\n}\n\nexport default function generateDefaultData(\n elements: FormTypes.FormElement[],\n preFillData: FormSubmissionModel,\n): FormSubmissionModel {\n return elements.reduce<FormSubmissionModel>((m, el) => {\n if (el.type !== 'page' && el.type !== 'section' && el.name in m) {\n m[el.name] = parsePreFillData(el, m[el.name])\n return m\n }\n\n switch (el.type) {\n case 'checkboxes':\n case 'select':\n case 'autocomplete':\n case 'radio':\n case 'compliance': {\n const dv = getOptionsDefaultValue(el)\n if (dv) {\n if (el.type === 'compliance' && typeof dv === 'string') {\n m[el.name] = {\n value: dv,\n }\n } else {\n m[el.name] = dv\n }\n }\n break\n }\n case 'number': {\n if (typeof el.defaultValue === 'number') {\n m[el.name] = el.defaultValue\n } else if (el.isSlider) {\n m[el.name] = el.minNumber\n } else {\n m[el.name] = undefined\n }\n break\n }\n case 'section':\n case 'page': {\n if (Array.isArray(el.elements)) {\n Object.assign(m, generateDefaultData(el.elements, m))\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(el, [])\n m[el.name] = generateDefaultData(nestedElements, { ...el.defaultValue })\n break\n }\n case 'form': {\n if (Array.isArray(el.elements)) {\n m[el.name] = generateDefaultData(el.elements, {})\n }\n break\n }\n case 'repeatableSet': {\n if (\n Array.isArray(el.elements) &&\n typeof el.minSetEntries === 'number'\n ) {\n const minSetEntries = el.minSetEntries\n // add min number of entries by default\n const entries = []\n for (let index = 0; index < minSetEntries; index++) {\n const entry = generateDefaultData(el.elements, {})\n entries.push(entry)\n }\n m[el.name] = entries\n }\n break\n }\n case 'date':\n case 'datetime':\n case 'time': {\n if (el.defaultValue) {\n m[el.name] = parseDateValue({\n dateOnly: el.type === 'date',\n daysOffset: el.defaultValueDaysOffset,\n value: el.defaultValue,\n })\n }\n break\n }\n case 'camera':\n case 'draw':\n case 'files': {\n m[el.name] = parsePreFillData(el, el.defaultValue)\n break\n }\n case 'freshdeskDependentField':\n case 'geoscapeAddress':\n case 'pointAddress':\n case 'civicaStreetName':\n case 'abn':\n case 'bsb':\n case 'text':\n case 'barcodeScanner':\n case 'email':\n case 'telephone':\n case 'textarea':\n case 'location': {\n if (el.defaultValue) {\n m[el.name] = el.defaultValue\n }\n break\n }\n case 'boolean': {\n m[el.name] = el.defaultValue || false\n break\n }\n case 'captcha':\n case 'heading':\n case 'html':\n case 'image':\n case 'infoPage':\n case 'calculation':\n case 'summary':\n break\n default: {\n console.warn('Default value is not supported for element type', el)\n }\n }\n\n return m\n }, Object.assign({}, preFillData))\n}\n\nconst getOptionsDefaultValue = (el: FormTypes.FormElementWithOptions) => {\n if (!el.defaultValue) {\n return\n }\n // Cater for dynamic options\n if (el.optionsType === 'DYNAMIC' || el.optionsType === 'FRESHDESK_FIELD') {\n return el.defaultValue\n }\n // Cater for multi-select and checkboxes\n else if ((el.type === 'select' && el.multi) || el.type === 'checkboxes') {\n if (Array.isArray(el.defaultValue) && el.defaultValue.length) {\n return el.defaultValue.reduce((optionValues: string[], optionId) => {\n const option = (el.options || []).find(\n (option) => option.id === optionId,\n )\n if (option) {\n optionValues.push(option.value)\n }\n return optionValues\n }, [])\n }\n } else {\n const option = (el.options || []).find(\n (option) => option.id === el.defaultValue,\n )\n if (option) {\n return option.value\n }\n }\n return\n}\n"]}
package/package.json CHANGED
@@ -1,30 +1,30 @@
1
1
  {
2
2
  "name": "@oneblink/apps-react",
3
3
  "description": "Helper functions for OneBlink apps in ReactJS.",
4
- "version": "2.0.0-beta.1",
4
+ "version": "2.0.0-beta.2",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"
8
8
  },
9
9
  "dependencies": {
10
10
  "@blinkmobile/geolocation": "^2.0.3",
11
- "@emotion/react": "^11.9.0",
12
- "@emotion/styled": "^11.8.1",
13
- "@mui/icons-material": "^5.6.2",
14
- "@oneblink/sdk-core": "^0.4.2-beta.2",
15
- "@react-google-maps/api": "2.7.0",
11
+ "@emotion/react": "^11.10.0",
12
+ "@emotion/styled": "^11.10.0",
13
+ "@mui/icons-material": "^5.8.4",
14
+ "@oneblink/sdk-core": "^0.4.2",
15
+ "@react-google-maps/api": "2.12.1",
16
16
  "blueimp-load-image": "^5.16.0",
17
17
  "bulma": "^0.9.3",
18
18
  "bulma-slider": "2.0.4",
19
19
  "bulma-steps": "^2.2.1",
20
20
  "bulma-toast": "^2.4.1",
21
- "clsx": "^1.1.1",
22
- "color": "^3.2.1",
23
- "copy-to-clipboard": "^3.3.1",
24
- "date-fns": "^2.28.0",
21
+ "clsx": "^1.2.1",
22
+ "color": "^4.2.3",
23
+ "copy-to-clipboard": "^3.3.2",
24
+ "date-fns": "^2.29.2",
25
25
  "escape-string-regexp": "^5.0.0",
26
26
  "file-saver": "^2.0.5",
27
- "flatpickr": "^4.6.11",
27
+ "flatpickr": "^4.6.13",
28
28
  "jsqr": "^1.4.0",
29
29
  "lodash.clonedeep": "^4.5.0",
30
30
  "lodash.debounce": "^4.0.8",
@@ -34,57 +34,56 @@
34
34
  "query-string": "^7.1.1",
35
35
  "react-google-recaptcha": "^2.1.0",
36
36
  "react-input-mask": "^2.0.4",
37
- "react-signature-canvas": "^1.0.5",
38
- "react-table": "^7.7.0",
39
- "sanitize-html": "^2.7.0",
40
- "signature_pad": "^3.0.0-beta.4",
37
+ "react-signature-canvas": "^1.0.6",
38
+ "react-table": "^7.8.0",
39
+ "sanitize-html": "^2.7.1",
41
40
  "uuid": "^8.3.2",
42
41
  "validate.js": "^0.13.1",
43
42
  "xml2js": "^0.4.23"
44
43
  },
45
44
  "devDependencies": {
46
- "@babel/preset-env": "^7.16.11",
47
- "@mui/lab": "^5.0.0-alpha.79",
48
- "@mui/material": "^5.6.1",
49
- "@mui/x-date-pickers": "^5.0.0-alpha.2",
45
+ "@babel/preset-env": "^7.18.10",
46
+ "@mui/lab": "^5.0.0-alpha.95",
47
+ "@mui/material": "^5.10.1",
48
+ "@mui/x-date-pickers": "^5.0.0-beta.6",
50
49
  "@oneblink/apps": "^2.0.0-beta.1",
51
50
  "@oneblink/release-cli": "^1.0.0",
52
51
  "@oneblink/types": "github:oneblink/types",
53
- "@types/blueimp-load-image": "^5.14.4",
52
+ "@types/blueimp-load-image": "^5.16.0",
54
53
  "@types/color": "^3.0.3",
55
54
  "@types/file-saver": "^2.0.5",
56
55
  "@types/filesystem": "^0.0.32",
57
56
  "@types/jest": "^27.4.1",
58
- "@types/lodash.clonedeep": "^4.5.6",
59
- "@types/lodash.debounce": "^4.0.6",
60
- "@types/lodash.throttle": "^4.1.6",
57
+ "@types/lodash.clonedeep": "^4.5.7",
58
+ "@types/lodash.debounce": "^4.0.7",
59
+ "@types/lodash.throttle": "^4.1.7",
61
60
  "@types/react": "^17.0.43",
62
61
  "@types/react-google-recaptcha": "^2.1.5",
63
- "@types/react-input-mask": "^2.0.4",
62
+ "@types/react-input-mask": "^3.0.1",
64
63
  "@types/react-router-dom": "^5.3.3",
65
64
  "@types/react-signature-canvas": "^1.0.2",
66
- "@types/react-table": "^7.7.11",
65
+ "@types/react-table": "^7.7.12",
67
66
  "@types/sanitize-html": "^2.6.2",
68
67
  "@types/uuid": "^8.3.4",
69
- "@types/xml2js": "^0.4.9",
70
- "@typescript-eslint/eslint-plugin": "^5.19.0",
71
- "@typescript-eslint/parser": "^5.19.0",
68
+ "@types/xml2js": "^0.4.11",
69
+ "@typescript-eslint/eslint-plugin": "^5.33.1",
70
+ "@typescript-eslint/parser": "^5.33.1",
72
71
  "copyfiles": "^2.4.1",
73
- "eslint": "^8.13.0",
72
+ "eslint": "^8.22.0",
74
73
  "eslint-config-prettier": "^8.5.0",
75
- "eslint-plugin-prettier": "^4.0.0",
76
- "eslint-plugin-react": "^7.29.4",
77
- "eslint-plugin-react-hooks": "^4.4.0",
74
+ "eslint-plugin-prettier": "^4.2.1",
75
+ "eslint-plugin-react": "^7.30.1",
76
+ "eslint-plugin-react-hooks": "^4.6.0",
78
77
  "fixpack": "^4.0.0",
79
78
  "jest": "^27.5.1",
80
- "prettier": "^2.6.2",
79
+ "prettier": "^2.7.1",
81
80
  "react": "^17.0.2",
82
81
  "react-dom": "^17.0.2",
83
82
  "react-router-dom": "^5.3.0",
84
83
  "sass": "^1.50.0",
85
84
  "ts-jest": "^27.1.4",
86
85
  "tsc-watch": "^5.0.3",
87
- "typescript": "^4.6.3"
86
+ "typescript": "^4.7.4"
88
87
  },
89
88
  "engines": {
90
89
  "node": ">=16",
@@ -1,14 +0,0 @@
1
- import * as React from 'react';
2
- import { FormTypes } from '@oneblink/types';
3
- declare function Files<T>({ id, element, isDirty, attachments, validationMessage, displayValidationMessage, onAddFiles, onRenderAttachment, }: {
4
- id: string;
5
- element: FormTypes.FilesElement;
6
- isDirty: boolean;
7
- attachments: T[];
8
- displayValidationMessage: boolean;
9
- validationMessage: string | undefined;
10
- onAddFiles: (files: File[]) => void;
11
- onRenderAttachment: (attachment: T, index: number) => React.ReactNode;
12
- }): JSX.Element;
13
- declare const _default: React.MemoExoticComponent<typeof Files>;
14
- export default _default;
@@ -1,27 +0,0 @@
1
- import * as React from 'react';
2
- import FormElementLabelContainer from '../FormElementLabelContainer';
3
- function Files({ id, element, isDirty, attachments, validationMessage, displayValidationMessage, onAddFiles, onRenderAttachment, }) {
4
- const inputRef = React.useRef(null);
5
- const handleAdd = React.useCallback(() => {
6
- if (!inputRef.current)
7
- return;
8
- // RESET HTML FILE INPUT VALUE SO FILES PREVIOUSLY ADDED AND REMOVED ARE RECOGNISED
9
- inputRef.current.value = '';
10
- inputRef.current.click();
11
- }, []);
12
- return (React.createElement("div", { className: "cypress-files-element" },
13
- React.createElement(FormElementLabelContainer, { className: "ob-files", element: element, id: id, required: !!element.minEntries },
14
- React.createElement("input", { ref: inputRef, type: "file", name: element.name, id: id, className: "file-input ob-input", multiple: element.maxEntries !== 1, disabled: element.readOnly, onChange: (event) => onAddFiles(event.target.files ? Array.from(event.target.files) : []) }),
15
- React.createElement("div", { className: "control cypress-files-control" },
16
- React.createElement("div", { className: "columns is-multiline" },
17
- attachments.map(onRenderAttachment),
18
- !element.readOnly &&
19
- (!element.maxEntries ||
20
- attachments.length < element.maxEntries) && (React.createElement("div", { className: "column is-one-quarter" },
21
- React.createElement("button", { type: "button", className: "button ob-files__add-new-button", onClick: handleAdd },
22
- React.createElement("i", { className: "material-icons icon-x-large" }, "add")))))),
23
- (isDirty || displayValidationMessage) && !!validationMessage && (React.createElement("div", { role: "alert", className: "has-margin-top-8" },
24
- React.createElement("div", { className: "has-text-danger ob-error__text cypress-validation-message" }, validationMessage))))));
25
- }
26
- export default React.memo(Files);
27
- //# sourceMappingURL=Files.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Files.js","sourceRoot":"","sources":["../../../../src/components/renderer/attachments/Files.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,yBAAyB,MAAM,8BAA8B,CAAA;AAEpE,SAAS,KAAK,CAAI,EAChB,EAAE,EACF,OAAO,EACP,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,wBAAwB,EACxB,UAAU,EACV,kBAAkB,GAUnB;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAmB,IAAI,CAAC,CAAA;IAErD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACvC,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAM;QAC7B,mFAAmF;QACnF,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAA;QAC3B,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,6BAAK,SAAS,EAAC,uBAAuB;QACpC,oBAAC,yBAAyB,IACxB,SAAS,EAAC,UAAU,EACpB,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU;YAE9B,+BACE,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,MAAM,EACX,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,EAAE,EAAE,EAAE,EACN,SAAS,EAAC,qBAAqB,EAC/B,QAAQ,EAAE,OAAO,CAAC,UAAU,KAAK,CAAC,EAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAEtE;YACF,6BAAK,SAAS,EAAC,+BAA+B;gBAC5C,6BAAK,SAAS,EAAC,sBAAsB;oBAClC,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC;oBACnC,CAAC,OAAO,CAAC,QAAQ;wBAChB,CAAC,CAAC,OAAO,CAAC,UAAU;4BAClB,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAC5C,6BAAK,SAAS,EAAC,uBAAuB;wBACpC,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,iCAAiC,EAC3C,OAAO,EAAE,SAAS;4BAElB,2BAAG,SAAS,EAAC,6BAA6B,UAAQ,CAC3C,CACL,CACP,CACC,CACF;YAEL,CAAC,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAC/D,6BAAK,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,kBAAkB;gBAC5C,6BAAK,SAAS,EAAC,2DAA2D,IACvE,iBAAiB,CACd,CACF,CACP,CACyB,CACxB,CACP,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA","sourcesContent":["import * as React from 'react'\n\nimport { FormTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../FormElementLabelContainer'\n\nfunction Files<T>({\n id,\n element,\n isDirty,\n attachments,\n validationMessage,\n displayValidationMessage,\n onAddFiles,\n onRenderAttachment,\n}: {\n id: string\n element: FormTypes.FilesElement\n isDirty: boolean\n attachments: T[]\n displayValidationMessage: boolean\n validationMessage: string | undefined\n onAddFiles: (files: File[]) => void\n onRenderAttachment: (attachment: T, index: number) => React.ReactNode\n}) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const handleAdd = React.useCallback(() => {\n if (!inputRef.current) return\n // RESET HTML FILE INPUT VALUE SO FILES PREVIOUSLY ADDED AND REMOVED ARE RECOGNISED\n inputRef.current.value = ''\n inputRef.current.click()\n }, [])\n\n return (\n <div className=\"cypress-files-element\">\n <FormElementLabelContainer\n className=\"ob-files\"\n element={element}\n id={id}\n required={!!element.minEntries}\n >\n <input\n ref={inputRef}\n type=\"file\"\n name={element.name}\n id={id}\n className=\"file-input ob-input\"\n multiple={element.maxEntries !== 1}\n disabled={element.readOnly}\n onChange={(event) =>\n onAddFiles(event.target.files ? Array.from(event.target.files) : [])\n }\n />\n <div className=\"control cypress-files-control\">\n <div className=\"columns is-multiline\">\n {attachments.map(onRenderAttachment)}\n {!element.readOnly &&\n (!element.maxEntries ||\n attachments.length < element.maxEntries) && (\n <div className=\"column is-one-quarter\">\n <button\n type=\"button\"\n className=\"button ob-files__add-new-button\"\n onClick={handleAdd}\n >\n <i className=\"material-icons icon-x-large\">add</i>\n </button>\n </div>\n )}\n </div>\n </div>\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\nexport default React.memo(Files)\n"]}