@oneblink/apps-react 1.2.5 → 2.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/components/Lists.d.ts +1 -1
  2. package/dist/components/pickers/V4CompatibleDatePicker.d.ts +9 -7
  3. package/dist/components/pickers/V4CompatibleDatePicker.js +23 -10
  4. package/dist/components/pickers/V4CompatibleDatePicker.js.map +1 -1
  5. package/dist/components/pickers/V4CompatibleDateTimePicker.d.ts +10 -7
  6. package/dist/components/pickers/V4CompatibleDateTimePicker.js +23 -10
  7. package/dist/components/pickers/V4CompatibleDateTimePicker.js.map +1 -1
  8. package/dist/components/pickers/V4CompatibleTimePicker.d.ts +9 -7
  9. package/dist/components/pickers/V4CompatibleTimePicker.js +23 -10
  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/components/renderer/OneBlinkFormElements.js.map +1 -1
  14. package/dist/components/renderer/attachments/AttachmentStatus.d.ts +2 -4
  15. package/dist/components/renderer/attachments/AttachmentStatus.js +1 -5
  16. package/dist/components/renderer/attachments/AttachmentStatus.js.map +1 -1
  17. package/dist/components/renderer/attachments/FileCard.js +1 -1
  18. package/dist/components/renderer/attachments/FileCard.js.map +1 -1
  19. package/dist/form-elements/FormElementABN.js +3 -1
  20. package/dist/form-elements/FormElementABN.js.map +1 -1
  21. package/dist/form-elements/FormElementBSB.js +3 -1
  22. package/dist/form-elements/FormElementBSB.js.map +1 -1
  23. package/dist/form-elements/FormElementCamera.js +10 -38
  24. package/dist/form-elements/FormElementCamera.js.map +1 -1
  25. package/dist/form-elements/FormElementCompliance.d.ts +2 -2
  26. package/dist/form-elements/FormElementCompliance.js.map +1 -1
  27. package/dist/form-elements/{FormElementFiles/FormElementFile.d.ts → FormElementFile.d.ts} +2 -2
  28. package/dist/form-elements/{FormElementFiles/FormElementFile.js → FormElementFile.js} +3 -3
  29. package/dist/form-elements/FormElementFile.js.map +1 -0
  30. package/dist/form-elements/{FormElementFiles/FormElementFiles.d.ts → FormElementFiles.d.ts} +5 -5
  31. package/dist/{components/renderer/attachments/Files.js → form-elements/FormElementFiles.js} +22 -6
  32. package/dist/form-elements/FormElementFiles.js.map +1 -0
  33. package/dist/form-elements/FormElementSignature.js +4 -9
  34. package/dist/form-elements/FormElementSignature.js.map +1 -1
  35. package/dist/hooks/attachments/useAttachment.js +1 -1
  36. package/dist/hooks/attachments/useAttachment.js.map +1 -1
  37. package/dist/hooks/useContrastColor.d.ts +1 -1
  38. package/dist/hooks/useInfiniteScrollDataLoad.d.ts +1 -1
  39. package/dist/hooks/useLookups.d.ts +1 -1
  40. package/dist/services/attachments.d.ts +0 -1
  41. package/dist/services/attachments.js +1 -4
  42. package/dist/services/attachments.js.map +1 -1
  43. package/dist/services/blob-utils.js +0 -1
  44. package/dist/services/blob-utils.js.map +1 -1
  45. package/dist/services/checkIfAttachmentsAreUploading.js +0 -4
  46. package/dist/services/checkIfAttachmentsAreUploading.js.map +1 -1
  47. package/dist/services/checkIfAttachmentsExist.js +0 -4
  48. package/dist/services/checkIfAttachmentsExist.js.map +1 -1
  49. package/dist/services/cleanFormSubmissionModel.js +2 -5
  50. package/dist/services/cleanFormSubmissionModel.js.map +1 -1
  51. package/dist/services/form-validation.js +4 -5
  52. package/dist/services/form-validation.js.map +1 -1
  53. package/dist/services/generate-default-data.js +12 -23
  54. package/dist/services/generate-default-data.js.map +1 -1
  55. package/package.json +34 -35
  56. package/dist/components/renderer/attachments/Files.d.ts +0 -14
  57. package/dist/components/renderer/attachments/Files.js.map +0 -1
  58. package/dist/form-elements/FormElementFiles/FormElementFile.js.map +0 -1
  59. package/dist/form-elements/FormElementFiles/FormElementFiles.js +0 -17
  60. package/dist/form-elements/FormElementFiles/FormElementFiles.js.map +0 -1
  61. package/dist/form-elements/FormElementFiles/index.d.ts +0 -17
  62. package/dist/form-elements/FormElementFiles/index.js +0 -18
  63. package/dist/form-elements/FormElementFiles/index.js.map +0 -1
  64. package/dist/form-elements/FormElementFiles/legacy/FormElementFiles.d.ts +0 -18
  65. package/dist/form-elements/FormElementFiles/legacy/FormElementFiles.js +0 -61
  66. package/dist/form-elements/FormElementFiles/legacy/FormElementFiles.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/services/attachments.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport { Sentry } from '@oneblink/apps'\nimport { v4 as uuid } from 'uuid'\nimport { AttachmentNew } from '../types/attachments'\nimport { blobToCanvas, getBlobOrientation } from './blob-utils'\n\nexport function prepareNewAttachment(\n blob: Blob,\n fileName: string,\n element: FormTypes.FormElementBinaryStorage,\n): AttachmentNew {\n return {\n _id: uuid(),\n data: blob,\n fileName,\n isPrivate: element.storageType === 'private',\n type: 'NEW',\n }\n}\n\nexport function checkIfContentTypeIsImage(contentType: string) {\n return contentType.indexOf('image/') === 0\n}\n\nexport function checkIsUsingLegacyStorage(\n element: FormTypes.FormElementBinaryStorage,\n): boolean {\n return !element.storageType || element.storageType === 'legacy'\n}\n\nexport async function parseFilesAsAttachmentsLegacy(\n files: File[],\n onAnnotateCanvas?: (file: File, canvas: HTMLCanvasElement) => void,\n): Promise<Array<{ data: string; fileName: string; contentType: string }>> {\n const attachments: Array<{\n data: string\n fileName: string\n contentType: string\n }> = []\n\n for (const file of files) {\n const result = await correctFileOrientation(file, onAnnotateCanvas)\n\n if (result instanceof Blob) {\n console.log('Attempting to parse File as attachment', file)\n\n const base64data = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = function () {\n resolve(reader.result as string)\n }\n reader.onerror = function () {\n reject(new Error('Could not read file from data url'))\n }\n reader.readAsDataURL(file)\n })\n\n attachments.push({\n fileName: file.name,\n contentType: file.type,\n data: base64data,\n })\n } else {\n attachments.push({\n fileName: file.name,\n contentType: file.type,\n data: result.toDataURL(),\n })\n }\n }\n\n return attachments\n}\n\nexport async function correctFileOrientation(\n file: File,\n onAnnotateCanvas?: (file: File, canvas: HTMLCanvasElement) => void,\n): Promise<Blob | HTMLCanvasElement> {\n try {\n if (!checkIfContentTypeIsImage(file.type)) {\n return file\n }\n\n console.log('Attempting to parse File as image attachment', file)\n\n const orientation = await getBlobOrientation(file)\n if (\n (typeof orientation !== 'number' || orientation === 1) &&\n !onAnnotateCanvas\n ) {\n console.log('Skipping orientation correction for image')\n return file\n }\n\n console.log(\n 'Loading image onto canvas to correct orientation using image meta data',\n { orientation },\n )\n const canvas = await blobToCanvas(file, orientation)\n if (onAnnotateCanvas) {\n onAnnotateCanvas(file, canvas)\n }\n return canvas\n } catch (err) {\n console.warn('Failed to rotate the orientation of a file:', err)\n Sentry.captureException(err)\n return file\n }\n}\n"]}
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/services/attachments.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport { Sentry } from '@oneblink/apps'\nimport { v4 as uuid } from 'uuid'\nimport { AttachmentNew } from '../types/attachments'\nimport { blobToCanvas, getBlobOrientation } from './blob-utils'\n\nexport function prepareNewAttachment(\n blob: Blob,\n fileName: string,\n element: FormTypes.FormElementBinaryStorage,\n): AttachmentNew {\n return {\n _id: uuid(),\n data: blob,\n fileName,\n isPrivate: element.storageType !== 'public',\n type: 'NEW',\n }\n}\n\nexport function checkIfContentTypeIsImage(contentType: string) {\n return contentType.indexOf('image/') === 0\n}\n\nexport async function parseFilesAsAttachmentsLegacy(\n files: File[],\n onAnnotateCanvas?: (file: File, canvas: HTMLCanvasElement) => void,\n): Promise<Array<{ data: string; fileName: string; contentType: string }>> {\n const attachments: Array<{\n data: string\n fileName: string\n contentType: string\n }> = []\n\n for (const file of files) {\n const result = await correctFileOrientation(file, onAnnotateCanvas)\n\n if (result instanceof Blob) {\n console.log('Attempting to parse File as attachment', file)\n\n const base64data = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = function () {\n resolve(reader.result as string)\n }\n reader.onerror = function () {\n reject(new Error('Could not read file from data url'))\n }\n reader.readAsDataURL(file)\n })\n\n attachments.push({\n fileName: file.name,\n contentType: file.type,\n data: base64data,\n })\n } else {\n attachments.push({\n fileName: file.name,\n contentType: file.type,\n data: result.toDataURL(),\n })\n }\n }\n\n return attachments\n}\n\nexport async function correctFileOrientation(\n file: File,\n onAnnotateCanvas?: (file: File, canvas: HTMLCanvasElement) => void,\n): Promise<Blob | HTMLCanvasElement> {\n try {\n if (!checkIfContentTypeIsImage(file.type)) {\n return file\n }\n\n console.log('Attempting to parse File as image attachment', file)\n\n const orientation = await getBlobOrientation(file)\n if (\n (typeof orientation !== 'number' || orientation === 1) &&\n !onAnnotateCanvas\n ) {\n console.log('Skipping orientation correction for image')\n return file\n }\n\n console.log(\n 'Loading image onto canvas to correct orientation using image meta data',\n { orientation },\n )\n const canvas = await blobToCanvas(file, orientation)\n if (onAnnotateCanvas) {\n onAnnotateCanvas(file, canvas)\n }\n return canvas\n } catch (err) {\n console.warn('Failed to rotate the orientation of a file:', err)\n Sentry.captureException(err)\n return file\n }\n}\n"]}
@@ -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"]}
@@ -1,4 +1,3 @@
1
- import { checkIsUsingLegacyStorage } from './attachments';
2
1
  function checkIfAttachmentsAreUploadingForFormElements(formElements, submission) {
3
2
  return formElements.some((formElement) => {
4
3
  var _a;
@@ -28,9 +27,6 @@ function checkIfAttachmentsAreUploadingForFormElements(formElements, submission)
28
27
  case 'draw':
29
28
  case 'compliance':
30
29
  case 'files': {
31
- if (checkIsUsingLegacyStorage(formElement)) {
32
- break;
33
- }
34
30
  const value = submission[formElement.name];
35
31
  if (!value) {
36
32
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"checkIfAttachmentsAreUploading.js","sourceRoot":"","sources":["../../src/services/checkIfAttachmentsAreUploading.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAGzD,SAAS,6CAA6C,CACpD,YAAqC,EACrC,UAA+B;IAE/B,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;;QACvC,QAAQ,WAAW,CAAC,IAAI,EAAE;YACxB,KAAK,SAAS,CAAC;YACf,KAAK,MAAM,CAAC,CAAC;gBACX,OAAO,6CAA6C,CAClD,WAAW,CAAC,QAAQ,EACpB,UAAU,CACX,CAAA;aACF;YACD,KAAK,MAAM,CAAC,CAAC;gBACX,MAAM,gBAAgB,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBACrD,IAAI,CAAC,gBAAgB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE;oBAC7D,MAAK;iBACN;gBACD,OAAO,6CAA6C,CAClD,WAAW,CAAC,QAAQ,IAAI,EAAE,EAC1B,gBAAuC,CACxC,CAAA;aACF;YACD,KAAK,eAAe,CAAC,CAAC;gBACpB,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBAC3B,MAAK;iBACN;gBACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC5B,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;wBACzB,6CAA6C,CAC3C,WAAW,CAAC,QAAQ,EACpB,KAAK,CACN,CACF,CAAA;gBACH,CAAC,CAAC,CAAA;aACH;YACD,KAAK,QAAQ,CAAC;YACd,KAAK,MAAM,CAAC;YACZ,KAAK,YAAY,CAAC;YAClB,KAAK,OAAO,CAAC,CAAC;gBACZ,IAAI,yBAAyB,CAAC,WAAW,CAAC,EAAE;oBAC1C,MAAK;iBACN;gBAED,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBAC1C,IAAI,CAAC,KAAK,EAAE;oBACV,MAAK;iBACN;gBAED,8DAA8D;gBAC9D,QAAQ,WAAW,CAAC,IAAI,EAAE;oBACxB,KAAK,QAAQ,CAAC;oBACd,KAAK,MAAM,CAAC,CAAC;wBACX,OAAO,CAAC,CAAC,CAAC,KAAoB,aAApB,KAAK,uBAAL,KAAK,CAAiB,IAAI,CAAA,CAAA;qBACrC;oBACD,KAAK,YAAY,CAAC,CAAC;wBACjB,OAAO,MAAC,KAAoC,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;4BAChE,OAAO,CAAC,CAAC,CAAC,IAAmB,aAAnB,IAAI,uBAAJ,IAAI,CAAiB,IAAI,CAAA,CAAA;wBACrC,CAAC,CAAC,CAAA;qBACH;oBACD,KAAK,OAAO,CAAC,CAAC;wBACZ,OAAQ,KAAsB,aAAtB,KAAK,uBAAL,KAAK,CAAmB,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;4BAClD,OAAO,CAAC,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAA,CAAA;wBAC3B,CAAC,CAAC,CAAA;qBACH;iBACF;aACF;SACF;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,8BAA8B,CACpD,IAAoB,EACpB,UAA+B;IAE/B,OAAO,6CAA6C,CAClD,IAAI,CAAC,QAAQ,EACb,UAAU,CACX,CAAA;AACH,CAAC","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport { Attachment } from '../types/attachments'\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\nimport { checkIsUsingLegacyStorage } from './attachments'\nimport { FormSubmissionModel } from '../types/form'\n\nfunction checkIfAttachmentsAreUploadingForFormElements(\n formElements: FormTypes.FormElement[],\n submission: FormSubmissionModel,\n): boolean {\n return formElements.some((formElement) => {\n switch (formElement.type) {\n case 'section':\n case 'page': {\n return checkIfAttachmentsAreUploadingForFormElements(\n formElement.elements,\n submission,\n )\n }\n case 'form': {\n const nestedSubmission = submission[formElement.name]\n if (!nestedSubmission || typeof nestedSubmission !== 'object') {\n break\n }\n return checkIfAttachmentsAreUploadingForFormElements(\n formElement.elements || [],\n nestedSubmission as FormSubmissionModel,\n )\n }\n case 'repeatableSet': {\n const entries = submission[formElement.name]\n if (!Array.isArray(entries)) {\n break\n }\n return entries.some((entry) => {\n return (\n typeof entry === 'object' &&\n checkIfAttachmentsAreUploadingForFormElements(\n formElement.elements,\n entry,\n )\n )\n })\n }\n case 'camera':\n case 'draw':\n case 'compliance':\n case 'files': {\n if (checkIsUsingLegacyStorage(formElement)) {\n break\n }\n\n const value = submission[formElement.name]\n if (!value) {\n break\n }\n\n // If the attachment has a type, it has not finished uploading\n switch (formElement.type) {\n case 'camera':\n case 'draw': {\n return !!(value as Attachment)?.type\n }\n case 'compliance': {\n return (value as FormElementComplianceValue).files?.some((file) => {\n return !!(file as Attachment)?.type\n })\n }\n case 'files': {\n return (value as Attachment[])?.some((attachment) => {\n return !!attachment?.type\n })\n }\n }\n }\n }\n })\n}\n\nexport default function checkIfAttachmentsAreUploading(\n form: FormTypes.Form,\n submission: FormSubmissionModel,\n): boolean {\n return checkIfAttachmentsAreUploadingForFormElements(\n form.elements,\n submission,\n )\n}\n"]}
1
+ {"version":3,"file":"checkIfAttachmentsAreUploading.js","sourceRoot":"","sources":["../../src/services/checkIfAttachmentsAreUploading.ts"],"names":[],"mappings":"AAKA,SAAS,6CAA6C,CACpD,YAAqC,EACrC,UAA+B;IAE/B,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;;QACvC,QAAQ,WAAW,CAAC,IAAI,EAAE;YACxB,KAAK,SAAS,CAAC;YACf,KAAK,MAAM,CAAC,CAAC;gBACX,OAAO,6CAA6C,CAClD,WAAW,CAAC,QAAQ,EACpB,UAAU,CACX,CAAA;aACF;YACD,KAAK,MAAM,CAAC,CAAC;gBACX,MAAM,gBAAgB,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBACrD,IAAI,CAAC,gBAAgB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE;oBAC7D,MAAK;iBACN;gBACD,OAAO,6CAA6C,CAClD,WAAW,CAAC,QAAQ,IAAI,EAAE,EAC1B,gBAAuC,CACxC,CAAA;aACF;YACD,KAAK,eAAe,CAAC,CAAC;gBACpB,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBAC3B,MAAK;iBACN;gBACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC5B,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;wBACzB,6CAA6C,CAC3C,WAAW,CAAC,QAAQ,EACpB,KAAK,CACN,CACF,CAAA;gBACH,CAAC,CAAC,CAAA;aACH;YACD,KAAK,QAAQ,CAAC;YACd,KAAK,MAAM,CAAC;YACZ,KAAK,YAAY,CAAC;YAClB,KAAK,OAAO,CAAC,CAAC;gBACZ,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBAC1C,IAAI,CAAC,KAAK,EAAE;oBACV,MAAK;iBACN;gBAED,8DAA8D;gBAC9D,QAAQ,WAAW,CAAC,IAAI,EAAE;oBACxB,KAAK,QAAQ,CAAC;oBACd,KAAK,MAAM,CAAC,CAAC;wBACX,OAAO,CAAC,CAAC,CAAC,KAAoB,aAApB,KAAK,uBAAL,KAAK,CAAiB,IAAI,CAAA,CAAA;qBACrC;oBACD,KAAK,YAAY,CAAC,CAAC;wBACjB,OAAO,MAAC,KAAoC,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;4BAChE,OAAO,CAAC,CAAC,CAAC,IAAmB,aAAnB,IAAI,uBAAJ,IAAI,CAAiB,IAAI,CAAA,CAAA;wBACrC,CAAC,CAAC,CAAA;qBACH;oBACD,KAAK,OAAO,CAAC,CAAC;wBACZ,OAAQ,KAAsB,aAAtB,KAAK,uBAAL,KAAK,CAAmB,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;4BAClD,OAAO,CAAC,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAA,CAAA;wBAC3B,CAAC,CAAC,CAAA;qBACH;iBACF;aACF;SACF;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,8BAA8B,CACpD,IAAoB,EACpB,UAA+B;IAE/B,OAAO,6CAA6C,CAClD,IAAI,CAAC,QAAQ,EACb,UAAU,CACX,CAAA;AACH,CAAC","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport { Attachment } from '../types/attachments'\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\nimport { FormSubmissionModel } from '../types/form'\n\nfunction checkIfAttachmentsAreUploadingForFormElements(\n formElements: FormTypes.FormElement[],\n submission: FormSubmissionModel,\n): boolean {\n return formElements.some((formElement) => {\n switch (formElement.type) {\n case 'section':\n case 'page': {\n return checkIfAttachmentsAreUploadingForFormElements(\n formElement.elements,\n submission,\n )\n }\n case 'form': {\n const nestedSubmission = submission[formElement.name]\n if (!nestedSubmission || typeof nestedSubmission !== 'object') {\n break\n }\n return checkIfAttachmentsAreUploadingForFormElements(\n formElement.elements || [],\n nestedSubmission as FormSubmissionModel,\n )\n }\n case 'repeatableSet': {\n const entries = submission[formElement.name]\n if (!Array.isArray(entries)) {\n break\n }\n return entries.some((entry) => {\n return (\n typeof entry === 'object' &&\n checkIfAttachmentsAreUploadingForFormElements(\n formElement.elements,\n entry,\n )\n )\n })\n }\n case 'camera':\n case 'draw':\n case 'compliance':\n case 'files': {\n const value = submission[formElement.name]\n if (!value) {\n break\n }\n\n // If the attachment has a type, it has not finished uploading\n switch (formElement.type) {\n case 'camera':\n case 'draw': {\n return !!(value as Attachment)?.type\n }\n case 'compliance': {\n return (value as FormElementComplianceValue).files?.some((file) => {\n return !!(file as Attachment)?.type\n })\n }\n case 'files': {\n return (value as Attachment[])?.some((attachment) => {\n return !!attachment?.type\n })\n }\n }\n }\n }\n })\n}\n\nexport default function checkIfAttachmentsAreUploading(\n form: FormTypes.Form,\n submission: FormSubmissionModel,\n): boolean {\n return checkIfAttachmentsAreUploadingForFormElements(\n form.elements,\n submission,\n )\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  import { v4 as uuid } from 'uuid';
2
- import { checkIsUsingLegacyStorage } from './attachments';
3
2
  export function validateAttachmentExists(attachment, attachmentRetentionInDays) {
4
3
  if (attachment.type || !attachment.uploadedAt || !attachmentRetentionInDays) {
5
4
  return;
@@ -98,9 +97,6 @@ function checkIfAttachmentsExistForFormElements(formElements, submission, attach
98
97
  case 'draw':
99
98
  case 'compliance':
100
99
  case 'files': {
101
- if (checkIsUsingLegacyStorage(formElement)) {
102
- break;
103
- }
104
100
  const value = submission[formElement.name];
105
101
  if (!value) {
106
102
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"checkIfAttachmentsExist.js","sourceRoot":"","sources":["../../src/services/checkIfAttachmentsExist.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport { v4 as uuid } from 'uuid'\nimport { Attachment, AttachmentError } from '../types/attachments'\n\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\nimport { checkIsUsingLegacyStorage } from './attachments'\nimport { FormSubmissionModel } from '../types/form'\n\nexport function validateAttachmentExists(\n attachment: Attachment,\n attachmentRetentionInDays: number | undefined,\n): AttachmentError | void {\n if (attachment.type || !attachment.uploadedAt || !attachmentRetentionInDays) {\n return\n }\n\n const uploadedAt = new Date(attachment.uploadedAt)\n const expiresAt = new Date(attachment.uploadedAt)\n expiresAt.setDate(uploadedAt.getDate() + attachmentRetentionInDays)\n const now = new Date()\n console.log('Checking if attachment still exists', {\n uploadedAt,\n expiresAt,\n attachment,\n })\n // check if attachment exists\n if (expiresAt > now) {\n return\n }\n\n const attachmentError: AttachmentError = {\n type: 'ERROR',\n errorMessage:\n \"This attachment has been removed based on your administrator's data retention policy, please remove it and upload it again.\",\n _id: uuid(),\n fileName: attachment.fileName,\n isPrivate: attachment.isPrivate,\n }\n return attachmentError\n}\n\nfunction validateAttachmentsExists(\n attachments: unknown,\n attachmentRetentionInDays: number | undefined,\n): Attachment[] | void {\n if (!Array.isArray(attachments)) {\n return\n }\n const newAttachments = [...attachments]\n let hasChanges = false\n for (let index = 0; index < newAttachments.length; index++) {\n const attachmentError = validateAttachmentExists(\n newAttachments[index] as Attachment,\n attachmentRetentionInDays,\n )\n if (attachmentError) {\n hasChanges = true\n newAttachments[index] = attachmentError\n }\n }\n if (hasChanges) {\n return newAttachments\n }\n}\n\nfunction checkIfAttachmentsExistForFormElements(\n formElements: FormTypes.FormElement[],\n submission: FormSubmissionModel,\n attachmentRetentionInDays: number | undefined,\n): FormSubmissionModel | void {\n const result: FormSubmissionModel = {\n ...submission,\n }\n let hasChanges = false\n for (const formElement of formElements) {\n switch (formElement.type) {\n case 'section':\n case 'page': {\n const newSubmission = checkIfAttachmentsExistForFormElements(\n formElement.elements,\n result,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n hasChanges = true\n Object.assign(result, newSubmission)\n }\n break\n }\n case 'form': {\n const nestedSubmission = submission[formElement.name]\n if (!nestedSubmission || typeof nestedSubmission !== 'object') {\n break\n }\n const newSubmission = checkIfAttachmentsExistForFormElements(\n formElement.elements || [],\n nestedSubmission as FormSubmissionModel,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n hasChanges = true\n result[formElement.name] = newSubmission\n }\n break\n }\n case 'repeatableSet': {\n const entries = submission[formElement.name]\n if (!Array.isArray(entries)) {\n break\n }\n const newEntries = [...entries]\n let hasEntryChanges = false\n for (let index = 0; index < entries.length; index++) {\n const entry = entries[index]\n if (typeof entry === 'object') {\n const newEntry = checkIfAttachmentsExistForFormElements(\n formElement.elements,\n entry,\n attachmentRetentionInDays,\n )\n if (newEntry) {\n hasEntryChanges = true\n newEntries[index] = newEntry\n }\n }\n }\n if (hasEntryChanges) {\n hasChanges = true\n result[formElement.name] = newEntries\n }\n break\n }\n case 'camera':\n case 'draw':\n case 'compliance':\n case 'files': {\n if (checkIsUsingLegacyStorage(formElement)) {\n break\n }\n\n const value = submission[formElement.name]\n if (!value) {\n break\n }\n\n // If the attachment has a type, it has not finished uploading\n switch (formElement.type) {\n case 'camera':\n case 'draw': {\n const attachmentError = validateAttachmentExists(\n value as Attachment,\n attachmentRetentionInDays,\n )\n if (attachmentError) {\n hasChanges = true\n result[formElement.name] = attachmentError\n }\n break\n }\n case 'compliance': {\n const newAttachments = validateAttachmentsExists(\n (value as FormElementComplianceValue).files,\n attachmentRetentionInDays,\n )\n if (newAttachments) {\n hasChanges = true\n result[formElement.name] = {\n ...(value as FormElementComplianceValue),\n files: newAttachments,\n }\n }\n break\n }\n case 'files': {\n const newAttachments = validateAttachmentsExists(\n value,\n attachmentRetentionInDays,\n )\n if (newAttachments) {\n hasChanges = true\n result[formElement.name] = newAttachments\n }\n break\n }\n }\n }\n }\n }\n if (hasChanges) {\n return result\n }\n}\n\nexport default function checkIfAttachmentsExist(\n form: FormTypes.Form,\n submission: FormSubmissionModel,\n attachmentRetentionInDays: number | undefined,\n): FormSubmissionModel | void {\n return checkIfAttachmentsExistForFormElements(\n form.elements,\n submission,\n attachmentRetentionInDays,\n )\n}\n"]}
1
+ {"version":3,"file":"checkIfAttachmentsExist.js","sourceRoot":"","sources":["../../src/services/checkIfAttachmentsExist.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport { v4 as uuid } from 'uuid'\nimport { Attachment, AttachmentError } from '../types/attachments'\n\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\nimport { FormSubmissionModel } from '../types/form'\n\nexport function validateAttachmentExists(\n attachment: Attachment,\n attachmentRetentionInDays: number | undefined,\n): AttachmentError | void {\n if (attachment.type || !attachment.uploadedAt || !attachmentRetentionInDays) {\n return\n }\n\n const uploadedAt = new Date(attachment.uploadedAt)\n const expiresAt = new Date(attachment.uploadedAt)\n expiresAt.setDate(uploadedAt.getDate() + attachmentRetentionInDays)\n const now = new Date()\n console.log('Checking if attachment still exists', {\n uploadedAt,\n expiresAt,\n attachment,\n })\n // check if attachment exists\n if (expiresAt > now) {\n return\n }\n\n const attachmentError: AttachmentError = {\n type: 'ERROR',\n errorMessage:\n \"This attachment has been removed based on your administrator's data retention policy, please remove it and upload it again.\",\n _id: uuid(),\n fileName: attachment.fileName,\n isPrivate: attachment.isPrivate,\n }\n return attachmentError\n}\n\nfunction validateAttachmentsExists(\n attachments: unknown,\n attachmentRetentionInDays: number | undefined,\n): Attachment[] | void {\n if (!Array.isArray(attachments)) {\n return\n }\n const newAttachments = [...attachments]\n let hasChanges = false\n for (let index = 0; index < newAttachments.length; index++) {\n const attachmentError = validateAttachmentExists(\n newAttachments[index] as Attachment,\n attachmentRetentionInDays,\n )\n if (attachmentError) {\n hasChanges = true\n newAttachments[index] = attachmentError\n }\n }\n if (hasChanges) {\n return newAttachments\n }\n}\n\nfunction checkIfAttachmentsExistForFormElements(\n formElements: FormTypes.FormElement[],\n submission: FormSubmissionModel,\n attachmentRetentionInDays: number | undefined,\n): FormSubmissionModel | void {\n const result: FormSubmissionModel = {\n ...submission,\n }\n let hasChanges = false\n for (const formElement of formElements) {\n switch (formElement.type) {\n case 'section':\n case 'page': {\n const newSubmission = checkIfAttachmentsExistForFormElements(\n formElement.elements,\n result,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n hasChanges = true\n Object.assign(result, newSubmission)\n }\n break\n }\n case 'form': {\n const nestedSubmission = submission[formElement.name]\n if (!nestedSubmission || typeof nestedSubmission !== 'object') {\n break\n }\n const newSubmission = checkIfAttachmentsExistForFormElements(\n formElement.elements || [],\n nestedSubmission as FormSubmissionModel,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n hasChanges = true\n result[formElement.name] = newSubmission\n }\n break\n }\n case 'repeatableSet': {\n const entries = submission[formElement.name]\n if (!Array.isArray(entries)) {\n break\n }\n const newEntries = [...entries]\n let hasEntryChanges = false\n for (let index = 0; index < entries.length; index++) {\n const entry = entries[index]\n if (typeof entry === 'object') {\n const newEntry = checkIfAttachmentsExistForFormElements(\n formElement.elements,\n entry,\n attachmentRetentionInDays,\n )\n if (newEntry) {\n hasEntryChanges = true\n newEntries[index] = newEntry\n }\n }\n }\n if (hasEntryChanges) {\n hasChanges = true\n result[formElement.name] = newEntries\n }\n break\n }\n case 'camera':\n case 'draw':\n case 'compliance':\n case 'files': {\n const value = submission[formElement.name]\n if (!value) {\n break\n }\n\n // If the attachment has a type, it has not finished uploading\n switch (formElement.type) {\n case 'camera':\n case 'draw': {\n const attachmentError = validateAttachmentExists(\n value as Attachment,\n attachmentRetentionInDays,\n )\n if (attachmentError) {\n hasChanges = true\n result[formElement.name] = attachmentError\n }\n break\n }\n case 'compliance': {\n const newAttachments = validateAttachmentsExists(\n (value as FormElementComplianceValue).files,\n attachmentRetentionInDays,\n )\n if (newAttachments) {\n hasChanges = true\n result[formElement.name] = {\n ...(value as FormElementComplianceValue),\n files: newAttachments,\n }\n }\n break\n }\n case 'files': {\n const newAttachments = validateAttachmentsExists(\n value,\n attachmentRetentionInDays,\n )\n if (newAttachments) {\n hasChanges = true\n result[formElement.name] = newAttachments\n }\n break\n }\n }\n }\n }\n }\n if (hasChanges) {\n return result\n }\n}\n\nexport default function checkIfAttachmentsExist(\n form: FormTypes.Form,\n submission: FormSubmissionModel,\n attachmentRetentionInDays: number | undefined,\n): FormSubmissionModel | void {\n return checkIfAttachmentsExistForFormElements(\n form.elements,\n submission,\n attachmentRetentionInDays,\n )\n}\n"]}
@@ -1,4 +1,3 @@
1
- import { checkIsUsingLegacyStorage } from './attachments';
2
1
  function cleanElementValue(submission, elements, formElementsConditionallyShown, stripBinaryData, captchaTokens) {
3
2
  // Clear data from submission on fields that are hidden on visible pages
4
3
  return elements.reduce((model, element) => {
@@ -26,9 +25,7 @@ function cleanElementValue(submission, elements, formElementsConditionallyShown,
26
25
  }
27
26
  case 'files': {
28
27
  const value = submission[element.name];
29
- const hasBinaryData = checkIsUsingLegacyStorage(element) ||
30
- (Array.isArray(value) &&
31
- value.some((attachment) => !!attachment.data));
28
+ const hasBinaryData = Array.isArray(value) && value.some((attachment) => !!attachment.data);
32
29
  if ((!stripBinaryData || !hasBinaryData) &&
33
30
  !((_b = formElementsConditionallyShown === null || formElementsConditionallyShown === void 0 ? void 0 : formElementsConditionallyShown[element.name]) === null || _b === void 0 ? void 0 : _b.isHidden)) {
34
31
  model[element.name] = submission[element.name];
@@ -38,7 +35,7 @@ function cleanElementValue(submission, elements, formElementsConditionallyShown,
38
35
  case 'camera':
39
36
  case 'draw': {
40
37
  const value = submission[element.name];
41
- const hasBinaryData = checkIsUsingLegacyStorage(element) || !!(value === null || value === void 0 ? void 0 : value.data);
38
+ const hasBinaryData = !!(value === null || value === void 0 ? void 0 : value.data);
42
39
  if ((!stripBinaryData || !hasBinaryData) &&
43
40
  !((_c = formElementsConditionallyShown === null || formElementsConditionallyShown === void 0 ? void 0 : formElementsConditionallyShown[element.name]) === null || _c === void 0 ? void 0 : _c.isHidden)) {
44
41
  model[element.name] = submission[element.name];
@@ -1 +1 @@
1
- {"version":3,"file":"cleanFormSubmissionModel.js","sourceRoot":"","sources":["../../src/services/cleanFormSubmissionModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { CivicaTypes, FormTypes, GeoscapeTypes } from '@oneblink/types'\nimport { Value as ComplianceValue } from '../form-elements/FormElementCompliance'\nimport {\n FormElementsConditionallyShown,\n FormSubmissionModel,\n} from '../types/form'\nimport { checkIsUsingLegacyStorage } from './attachments'\n\nfunction cleanElementValue(\n submission: FormSubmissionModel,\n elements: FormTypes.FormElement[],\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined,\n stripBinaryData: boolean,\n captchaTokens: string[],\n): FormSubmissionModel {\n // Clear data from submission on fields that are hidden on visible pages\n return elements.reduce<FormSubmissionModel>((model, element) => {\n switch (element.type) {\n // For content element types, we just need to set true for shown and false for hidden.\n // This is to allow renderers of the data to know when to show/hide the content\n case 'image':\n case 'heading':\n case 'html': {\n if (\n !stripBinaryData &&\n !formElementsConditionallyShown?.[element.name]?.isHidden\n ) {\n model[element.name] = true\n }\n break\n }\n // Need to remove captcha tokens and save\n // them to POST them to the server for validation\n case 'captcha': {\n const token = submission[element.name]\n if (typeof token === 'string') {\n captchaTokens.push(token)\n }\n break\n }\n case 'files': {\n const value = submission[element.name] as\n | Array<Record<string, unknown>>\n | undefined\n const hasBinaryData =\n checkIsUsingLegacyStorage(element) ||\n (Array.isArray(value) &&\n value.some((attachment) => !!attachment.data))\n if (\n (!stripBinaryData || !hasBinaryData) &&\n !formElementsConditionallyShown?.[element.name]?.isHidden\n ) {\n model[element.name] = submission[element.name]\n }\n break\n }\n case 'camera':\n case 'draw': {\n const value = submission[element.name] as\n | Record<string, unknown>\n | undefined\n const hasBinaryData =\n checkIsUsingLegacyStorage(element) || !!value?.data\n if (\n (!stripBinaryData || !hasBinaryData) &&\n !formElementsConditionallyShown?.[element.name]?.isHidden\n ) {\n model[element.name] = submission[element.name]\n }\n break\n }\n case 'infoPage':\n case 'form': {\n // Here we will check to make sure that each embedded form\n // also has its values wiped if the element is hidden based on conditional logic\n const nestedElements = element.elements\n const nestedModel = submission[element.name] as\n | FormSubmissionModel\n | undefined\n const nestedFormElementConditionallyShown =\n formElementsConditionallyShown?.[element.name]\n if (\n !formElementsConditionallyShown?.[element.name]?.isHidden &&\n Array.isArray(nestedElements)\n ) {\n model[element.name] = cleanElementValue(\n nestedModel || {},\n nestedElements,\n nestedFormElementConditionallyShown?.type === 'formElements'\n ? nestedFormElementConditionallyShown.formElements\n : undefined,\n stripBinaryData,\n captchaTokens,\n )\n }\n break\n }\n case 'repeatableSet': {\n // Here we will check to make sure that each repeatable set entry\n // also has its values wiped if the element is hidden based on conditional logic\n const nestedElements = element.elements\n const entries = submission[element.name] as\n | Array<FormSubmissionModel>\n | undefined\n const formElementConditionallyShown =\n formElementsConditionallyShown?.[element.name]\n if (\n !formElementConditionallyShown?.isHidden &&\n Array.isArray(nestedElements) &&\n Array.isArray(entries) &&\n entries.length\n ) {\n model[element.name] = entries.map((entry, index) => {\n return cleanElementValue(\n entry || {},\n nestedElements,\n formElementConditionallyShown?.type === 'repeatableSet'\n ? formElementConditionallyShown.entries?.[index.toString()]\n : undefined,\n stripBinaryData,\n captchaTokens,\n )\n })\n }\n break\n }\n case 'civicaNameRecord': {\n const civicaNameRecord = submission[element.name] as\n | CivicaTypes.CivicaNameRecord\n | undefined\n if (\n formElementsConditionallyShown?.[element.name]?.isHidden ||\n !civicaNameRecord\n ) {\n break\n }\n\n for (const key in civicaNameRecord) {\n if (\n civicaNameRecord[key as keyof CivicaTypes.CivicaNameRecord] ===\n undefined\n ) {\n continue\n }\n\n if (\n !element.useGeoscapeAddressing ||\n !Array.isArray(civicaNameRecord.streetAddress)\n ) {\n model[element.name] = civicaNameRecord\n break\n }\n\n const streetAddresses = civicaNameRecord.streetAddress.map(\n (streetAddress) => {\n if (typeof streetAddress.address1 === 'object') {\n const geoscapeAddress = streetAddress.address1 as\n | GeoscapeTypes.GeoscapeAddress\n | undefined\n return {\n address1: [\n geoscapeAddress?.addressDetails?.streetNumber1,\n geoscapeAddress?.addressDetails?.streetName,\n geoscapeAddress?.addressDetails?.streetType,\n ]\n .filter((str) => !!str)\n .join(' '),\n address2: geoscapeAddress?.addressDetails?.localityName,\n postcode: geoscapeAddress?.addressDetails?.postcode,\n }\n }\n return streetAddress\n },\n )\n model[element.name] = {\n ...civicaNameRecord,\n streetAddress: streetAddresses,\n }\n }\n break\n }\n case 'freshdeskDependentField': {\n if (\n formElementsConditionallyShown?.[element.name]?.isHidden ||\n !submission[element.name]\n ) {\n break\n }\n const value = submission[\n element.name\n ] as FormTypes.FreshdeskDependentFieldElementValue\n if (value?.category) {\n const newValue: FormTypes.FreshdeskDependentFieldElementValue = {\n category: value.category,\n }\n if (value?.subCategory) {\n newValue.subCategory = value?.subCategory\n if (value?.item) {\n newValue.item = value?.item\n }\n }\n model[element.name] = newValue\n }\n break\n }\n case 'compliance': {\n if (\n formElementsConditionallyShown?.[element.name]?.isHidden ||\n !submission[element.name]\n ) {\n break\n }\n const checklistObject = submission[element.name] as ComplianceValue\n const notes = checklistObject?.notes?.trim()\n if (stripBinaryData) {\n model[element.name] = {\n ...checklistObject,\n notes: notes,\n files: undefined,\n }\n } else {\n model[element.name] = {\n ...checklistObject,\n notes: notes,\n }\n }\n break\n }\n case 'page':\n case 'section': {\n if (!formElementsConditionallyShown?.[element.id]?.isHidden) {\n const nestedModel = cleanElementValue(\n submission,\n element.elements,\n formElementsConditionallyShown,\n stripBinaryData,\n captchaTokens,\n )\n Object.assign(model, nestedModel)\n }\n break\n }\n default: {\n if (!formElementsConditionallyShown?.[element.name]?.isHidden) {\n const value = submission[element.name]\n switch (element.type) {\n case 'text':\n case 'textarea':\n case 'email':\n case 'barcodeScanner':\n case 'telephone': {\n model[element.name] =\n typeof value === 'string'\n ? value.trim()\n : submission[element.name]\n break\n }\n default: {\n model[element.name] = value\n }\n }\n }\n }\n }\n\n return model\n }, {})\n}\n\nexport default function cleanFormSubmissionModel(\n submission: FormSubmissionModel,\n elements: FormTypes.FormElement[],\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined,\n stripBinaryData: boolean,\n): {\n model: FormSubmissionModel\n captchaTokens: string[]\n} {\n // Clear data from submission on fields that are hidden on visible pages\n const captchaTokens: string[] = []\n const model = cleanElementValue(\n submission,\n elements,\n formElementsConditionallyShown,\n stripBinaryData,\n captchaTokens,\n )\n return {\n model,\n captchaTokens,\n }\n}\n"]}
1
+ {"version":3,"file":"cleanFormSubmissionModel.js","sourceRoot":"","sources":["../../src/services/cleanFormSubmissionModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { CivicaTypes, FormTypes, GeoscapeTypes } from '@oneblink/types'\nimport { Value as ComplianceValue } from '../form-elements/FormElementCompliance'\nimport {\n FormElementsConditionallyShown,\n FormSubmissionModel,\n} from '../types/form'\n\nfunction cleanElementValue(\n submission: FormSubmissionModel,\n elements: FormTypes.FormElement[],\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined,\n stripBinaryData: boolean,\n captchaTokens: string[],\n): FormSubmissionModel {\n // Clear data from submission on fields that are hidden on visible pages\n return elements.reduce<FormSubmissionModel>((model, element) => {\n switch (element.type) {\n // For content element types, we just need to set true for shown and false for hidden.\n // This is to allow renderers of the data to know when to show/hide the content\n case 'image':\n case 'heading':\n case 'html': {\n if (\n !stripBinaryData &&\n !formElementsConditionallyShown?.[element.name]?.isHidden\n ) {\n model[element.name] = true\n }\n break\n }\n // Need to remove captcha tokens and save\n // them to POST them to the server for validation\n case 'captcha': {\n const token = submission[element.name]\n if (typeof token === 'string') {\n captchaTokens.push(token)\n }\n break\n }\n case 'files': {\n const value = submission[element.name] as\n | Array<Record<string, unknown>>\n | undefined\n const hasBinaryData =\n Array.isArray(value) && value.some((attachment) => !!attachment.data)\n if (\n (!stripBinaryData || !hasBinaryData) &&\n !formElementsConditionallyShown?.[element.name]?.isHidden\n ) {\n model[element.name] = submission[element.name]\n }\n break\n }\n case 'camera':\n case 'draw': {\n const value = submission[element.name] as\n | Record<string, unknown>\n | undefined\n const hasBinaryData = !!value?.data\n if (\n (!stripBinaryData || !hasBinaryData) &&\n !formElementsConditionallyShown?.[element.name]?.isHidden\n ) {\n model[element.name] = submission[element.name]\n }\n break\n }\n case 'infoPage':\n case 'form': {\n // Here we will check to make sure that each embedded form\n // also has its values wiped if the element is hidden based on conditional logic\n const nestedElements = element.elements\n const nestedModel = submission[element.name] as\n | FormSubmissionModel\n | undefined\n const nestedFormElementConditionallyShown =\n formElementsConditionallyShown?.[element.name]\n if (\n !formElementsConditionallyShown?.[element.name]?.isHidden &&\n Array.isArray(nestedElements)\n ) {\n model[element.name] = cleanElementValue(\n nestedModel || {},\n nestedElements,\n nestedFormElementConditionallyShown?.type === 'formElements'\n ? nestedFormElementConditionallyShown.formElements\n : undefined,\n stripBinaryData,\n captchaTokens,\n )\n }\n break\n }\n case 'repeatableSet': {\n // Here we will check to make sure that each repeatable set entry\n // also has its values wiped if the element is hidden based on conditional logic\n const nestedElements = element.elements\n const entries = submission[element.name] as\n | Array<FormSubmissionModel>\n | undefined\n const formElementConditionallyShown =\n formElementsConditionallyShown?.[element.name]\n if (\n !formElementConditionallyShown?.isHidden &&\n Array.isArray(nestedElements) &&\n Array.isArray(entries) &&\n entries.length\n ) {\n model[element.name] = entries.map((entry, index) => {\n return cleanElementValue(\n entry || {},\n nestedElements,\n formElementConditionallyShown?.type === 'repeatableSet'\n ? formElementConditionallyShown.entries?.[index.toString()]\n : undefined,\n stripBinaryData,\n captchaTokens,\n )\n })\n }\n break\n }\n case 'civicaNameRecord': {\n const civicaNameRecord = submission[element.name] as\n | CivicaTypes.CivicaNameRecord\n | undefined\n if (\n formElementsConditionallyShown?.[element.name]?.isHidden ||\n !civicaNameRecord\n ) {\n break\n }\n\n for (const key in civicaNameRecord) {\n if (\n civicaNameRecord[key as keyof CivicaTypes.CivicaNameRecord] ===\n undefined\n ) {\n continue\n }\n\n if (\n !element.useGeoscapeAddressing ||\n !Array.isArray(civicaNameRecord.streetAddress)\n ) {\n model[element.name] = civicaNameRecord\n break\n }\n\n const streetAddresses = civicaNameRecord.streetAddress.map(\n (streetAddress) => {\n if (typeof streetAddress.address1 === 'object') {\n const geoscapeAddress = streetAddress.address1 as\n | GeoscapeTypes.GeoscapeAddress\n | undefined\n return {\n address1: [\n geoscapeAddress?.addressDetails?.streetNumber1,\n geoscapeAddress?.addressDetails?.streetName,\n geoscapeAddress?.addressDetails?.streetType,\n ]\n .filter((str) => !!str)\n .join(' '),\n address2: geoscapeAddress?.addressDetails?.localityName,\n postcode: geoscapeAddress?.addressDetails?.postcode,\n }\n }\n return streetAddress\n },\n )\n model[element.name] = {\n ...civicaNameRecord,\n streetAddress: streetAddresses,\n }\n }\n break\n }\n case 'freshdeskDependentField': {\n if (\n formElementsConditionallyShown?.[element.name]?.isHidden ||\n !submission[element.name]\n ) {\n break\n }\n const value = submission[\n element.name\n ] as FormTypes.FreshdeskDependentFieldElementValue\n if (value?.category) {\n const newValue: FormTypes.FreshdeskDependentFieldElementValue = {\n category: value.category,\n }\n if (value?.subCategory) {\n newValue.subCategory = value?.subCategory\n if (value?.item) {\n newValue.item = value?.item\n }\n }\n model[element.name] = newValue\n }\n break\n }\n case 'compliance': {\n if (\n formElementsConditionallyShown?.[element.name]?.isHidden ||\n !submission[element.name]\n ) {\n break\n }\n const checklistObject = submission[element.name] as ComplianceValue\n const notes = checklistObject?.notes?.trim()\n if (stripBinaryData) {\n model[element.name] = {\n ...checklistObject,\n notes: notes,\n files: undefined,\n }\n } else {\n model[element.name] = {\n ...checklistObject,\n notes: notes,\n }\n }\n break\n }\n case 'page':\n case 'section': {\n if (!formElementsConditionallyShown?.[element.id]?.isHidden) {\n const nestedModel = cleanElementValue(\n submission,\n element.elements,\n formElementsConditionallyShown,\n stripBinaryData,\n captchaTokens,\n )\n Object.assign(model, nestedModel)\n }\n break\n }\n default: {\n if (!formElementsConditionallyShown?.[element.name]?.isHidden) {\n const value = submission[element.name]\n switch (element.type) {\n case 'text':\n case 'textarea':\n case 'email':\n case 'barcodeScanner':\n case 'telephone': {\n model[element.name] =\n typeof value === 'string'\n ? value.trim()\n : submission[element.name]\n break\n }\n default: {\n model[element.name] = value\n }\n }\n }\n }\n }\n\n return model\n }, {})\n}\n\nexport default function cleanFormSubmissionModel(\n submission: FormSubmissionModel,\n elements: FormTypes.FormElement[],\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined,\n stripBinaryData: boolean,\n): {\n model: FormSubmissionModel\n captchaTokens: string[]\n} {\n // Clear data from submission on fields that are hidden on visible pages\n const captchaTokens: string[] = []\n const model = cleanElementValue(\n submission,\n elements,\n formElementsConditionallyShown,\n stripBinaryData,\n captchaTokens,\n )\n return {\n model,\n captchaTokens,\n }\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  import validate from 'validate.js';
2
2
  import { localisationService } from '@oneblink/apps';
3
- import { checkIsUsingLegacyStorage } from './attachments';
4
3
  import { parseDateValue } from './generate-default-data';
5
4
  import generateCivicaNameRecordElements from './generateCivicaNameRecordElements';
6
5
  import generateFreshdeskDependentFieldElements from './generateFreshdeskDependentFieldElements';
@@ -214,14 +213,14 @@ export function generateValidationSchema(elements, elementIdsWithLookupsExecuted
214
213
  }
215
214
  case 'draw': {
216
215
  partialSchema[escapeElementName(formElement.name)] = {
217
- attachment: !checkIsUsingLegacyStorage(formElement),
216
+ attachment: true,
218
217
  presence: presence(formElement, 'A signature is required'),
219
218
  };
220
219
  break;
221
220
  }
222
221
  case 'camera': {
223
222
  partialSchema[escapeElementName(formElement.name)] = {
224
- attachment: !checkIsUsingLegacyStorage(formElement),
223
+ attachment: true,
225
224
  presence: presence(formElement, 'A photo is required'),
226
225
  };
227
226
  break;
@@ -249,7 +248,7 @@ export function generateValidationSchema(elements, elementIdsWithLookupsExecuted
249
248
  formElement,
250
249
  elementIdsWithLookupsExecuted,
251
250
  },
252
- attachments: !checkIsUsingLegacyStorage(formElement),
251
+ attachments: true,
253
252
  };
254
253
  break;
255
254
  }
@@ -460,7 +459,7 @@ export function generateValidationSchema(elements, elementIdsWithLookupsExecuted
460
459
  message: `Only the following file types are accepted: ${(formElement.restrictedFileTypes || []).join(', ')}`,
461
460
  },
462
461
  needsExtension: formElement,
463
- attachments: !checkIsUsingLegacyStorage(formElement),
462
+ attachments: true,
464
463
  };
465
464
  break;
466
465
  }
@@ -1 +1 @@
1
- {"version":3,"file":"form-validation.js","sourceRoot":"","sources":["../../src/services/form-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import validate from 'validate.js'\nimport { localisationService } from '@oneblink/apps'\nimport { FormTypes } from '@oneblink/types'\nimport { FormElementBinaryStorageValue } from '../types/attachments'\nimport { PossibleFileConfiguration } from '../form-elements/FormElementFiles'\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\nimport { checkIsUsingLegacyStorage } from './attachments'\nimport { parseDateValue } from './generate-default-data'\nimport generateCivicaNameRecordElements from './generateCivicaNameRecordElements'\nimport {\n FormElementsConditionallyShown,\n FormElementsValidation,\n FormSubmissionModel,\n} from '../types/form'\nimport generateFreshdeskDependentFieldElements from './generateFreshdeskDependentFieldElements'\n\nexport const lookupValidationMessage = 'Lookup is required'\n// https://validatejs.org/#validators-datetime\n// Before using it we must add the parse and format functions\n// Here is a sample implementation using moment.js\nvalidate.extend(validate.validators.datetime, {\n // The value is guaranteed not to be null or undefined but otherwise it\n // could be anything.\n parse: function (value: string) {\n return Date.parse(value)\n },\n // Input is a unix timestamp\n format: function (\n value: string,\n options: { format: (date: Date) => string },\n ) {\n const dateValue = new Date(value)\n return options.format(dateValue)\n },\n})\n\nvalidate.validators.entries = function (\n value: unknown,\n {\n setSchema,\n entrySchema,\n }: { setSchema: ValidateJSSchema; entrySchema: ValidateJSSchema },\n) {\n const entries = Array.isArray(value) ? value : []\n\n const entryErrors = entries.reduce((errorsByIndex, entry, index) => {\n const entryValidation = validateSingleMessageError(entry, entrySchema)\n if (entryValidation) {\n errorsByIndex[index] = entryValidation\n }\n return errorsByIndex\n }, {})\n\n const setErrorMessages = validate.single(value, setSchema)\n\n if (!setErrorMessages && validate.isEmpty(entryErrors)) {\n return\n }\n\n return {\n type: 'repeatableSet',\n set: setErrorMessages && setErrorMessages[0],\n entries: entryErrors,\n }\n}\n\nvalidate.validators.nestedElements = function (\n value: FormSubmissionModel | undefined,\n schema: ValidateJSSchema,\n) {\n const errors = validateSingleMessageError(value || {}, schema)\n if (!errors) {\n return\n }\n return {\n type: 'formElements',\n formElements: errors,\n }\n}\n\nfunction getInvalidAttachment(value: FormElementBinaryStorageValue) {\n if (\n value &&\n typeof value === 'object' &&\n value.type &&\n value.type === 'ERROR'\n ) {\n return value\n }\n}\nfunction validateAttachments(\n value: FormElementBinaryStorageValue[] | undefined,\n) {\n const invalidAttachmentNames = value?.reduce(\n (invalidAttachmentNames: string[], att) => {\n const attachmentName = getInvalidAttachment(att)?.fileName\n if (attachmentName) {\n invalidAttachmentNames.push(attachmentName)\n }\n return invalidAttachmentNames\n },\n [],\n )\n if (invalidAttachmentNames?.length) {\n return `${invalidAttachmentNames.join(', ')} could not be uploaded.`\n }\n}\nvalidate.validators.attachment = function (\n value: FormElementBinaryStorageValue,\n) {\n return getInvalidAttachment(value)?.errorMessage\n}\nvalidate.validators.attachments = function (\n value:\n | FormElementBinaryStorageValue[]\n | FormElementComplianceValue\n | undefined,\n) {\n if (Array.isArray(value)) {\n return validateAttachments(value)\n }\n return validateAttachments(\n value?.files as FormElementBinaryStorageValue[] | undefined,\n )\n}\n\n// Extend validator for lookups\nvalidate.validators.lookups = function (\n value: unknown,\n {\n elementIdsWithLookupsExecuted,\n formElement,\n }: {\n formElement: FormTypes.LookupFormElement & FormTypes.FormElementRequired\n elementIdsWithLookupsExecuted: string[]\n },\n) {\n if (!formElement.isDataLookup && !formElement.isElementLookup) {\n return\n }\n\n // Lookups must only be executed on required form elements\n if (formElement && !formElement.required) {\n return\n }\n\n if (elementIdsWithLookupsExecuted.includes(formElement.id)) {\n return\n }\n\n return lookupValidationMessage\n}\n\nvalidate.validators.numberRegex = function (value: unknown, format: unknown) {\n if (!format) {\n return\n }\n if (typeof value === 'number' && !Number.isNaN(value)) {\n value = value.toString()\n }\n const errorMessages = validate.single(value, { format })\n return errorMessages && errorMessages[0]\n}\n\nvalidate.validators.isTrue = function (value: unknown, message?: string) {\n if (!value) {\n return message || 'Must be set to true'\n }\n}\n\nvalidate.validators.needsExtension = function (\n value: PossibleFileConfiguration[] | undefined,\n formElement: FormTypes.FilesElement,\n) {\n const isValid =\n !Array.isArray(value) ||\n value.every((file) => {\n return checkFileNameExtensionIsValid(formElement, file.fileName)\n })\n if (!isValid) return 'All files must have extensions'\n}\n\nfunction getCustomRegexFormatConfig<DefaultValue>(\n formElement: FormTypes.FormElementWithInput<DefaultValue>,\n) {\n return formElement.regexPattern\n ? {\n pattern: formElement.regexPattern,\n flags: formElement.regexFlags,\n message: formElement.regexMessage,\n }\n : undefined\n}\n\ntype ValidateJSSchema = Record<string, unknown>\n\nexport function validateSubmission(\n schema: ValidateJSSchema,\n submission: FormSubmissionModel,\n formElementsConditionallyShown: FormElementsConditionallyShown,\n): FormElementsValidation | undefined {\n const formElementsValidation = validateSingleMessageError(submission, schema)\n if (formElementsValidation) {\n clearValidationMessagesForHiddenElements(\n formElementsValidation,\n formElementsConditionallyShown,\n )\n if (!validate.isEmpty(formElementsValidation)) {\n return formElementsValidation\n }\n }\n}\n\nconst clearValidationMessagesForHiddenElements = (\n formElementsValidation?: FormElementsValidation,\n formElementsConditionallyShown?: FormElementsConditionallyShown,\n) => {\n // If there is no validation to check, there are no invalid elements\n // If there is no conditionally shown elements, all invalid elements should display validation messages,\n if (!formElementsValidation || !formElementsConditionallyShown) {\n return\n }\n\n for (const key in formElementsValidation) {\n const formElementValidation = formElementsValidation[key]\n if (!formElementValidation) {\n continue\n }\n\n const formElementConditionallyShown = formElementsConditionallyShown[key]\n\n // If the validation is for an element that is being hidden,\n // we can remove the validation message and move to the next validation\n if (formElementConditionallyShown?.isHidden) {\n delete formElementsValidation[key]\n continue\n }\n\n // If the validation is for a single element (not nested elements),\n // we will always show the validation message\n if (typeof formElementValidation === 'string') {\n continue\n }\n\n // Here we will check to see if the nested elements that are\n // invalid are being shown, if not, remove validation messages\n switch (formElementValidation.type) {\n case 'repeatableSet': {\n for (const index in formElementValidation.entries) {\n clearValidationMessagesForHiddenElements(\n formElementValidation.entries[index],\n formElementConditionallyShown &&\n formElementConditionallyShown.type === 'repeatableSet'\n ? formElementConditionallyShown.entries[index]\n : undefined,\n )\n if (validate.isEmpty(formElementValidation.entries[index])) {\n delete formElementValidation.entries[index]\n }\n }\n // Remove the validation if all entries are valid and the set is also valid\n if (\n validate.isEmpty(formElementValidation.entries) &&\n !formElementValidation.set\n ) {\n delete formElementsValidation[key]\n }\n break\n }\n case 'formElements': {\n clearValidationMessagesForHiddenElements(\n formElementValidation.formElements,\n formElementConditionallyShown?.type === 'formElements'\n ? formElementConditionallyShown?.formElements\n : undefined,\n )\n if (validate.isEmpty(formElementValidation.formElements)) {\n delete formElementsValidation[key]\n }\n break\n }\n }\n }\n}\n\nconst presence = (\n { required, requiredMessage }: FormTypes.FormElementRequired,\n message: string,\n) => (required ? { message: requiredMessage || message } : false)\n\nconst escapeElementName = (elementName: string) => {\n const escapedName = elementName.replace(/\\./g, '\\\\.')\n return escapedName\n}\n\nexport function generateValidationSchema(\n elements: FormTypes.FormElement[],\n elementIdsWithLookupsExecuted: string[],\n): ValidateJSSchema {\n return elements.reduce<ValidateJSSchema>((partialSchema, formElement) => {\n switch (formElement.type) {\n case 'summary':\n case 'calculation':\n case 'image':\n case 'html':\n case 'infoPage':\n case 'heading': {\n break\n }\n case 'section':\n case 'page': {\n const nestedSchema = generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n )\n Object.assign(partialSchema, nestedSchema)\n break\n }\n case 'draw': {\n partialSchema[escapeElementName(formElement.name)] = {\n attachment: !checkIsUsingLegacyStorage(formElement),\n presence: presence(formElement, 'A signature is required'),\n }\n break\n }\n case 'camera': {\n partialSchema[escapeElementName(formElement.name)] = {\n attachment: !checkIsUsingLegacyStorage(formElement),\n presence: presence(formElement, 'A photo is required'),\n }\n break\n }\n case 'captcha': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n { ...formElement, required: true },\n 'Please complete the CAPTCHA successfully',\n ),\n }\n break\n }\n case 'location': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please select a location'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'compliance': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Required'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n attachments: !checkIsUsingLegacyStorage(formElement),\n }\n break\n }\n case 'abn':\n case 'geoscapeAddress':\n case 'pointAddress':\n case 'civicaStreetName':\n case 'autocomplete':\n case 'checkboxes':\n case 'radio':\n case 'select': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Required'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'boolean': {\n partialSchema[escapeElementName(formElement.name)] = {\n isTrue: formElement.required && 'Required',\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'bsb': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please enter a BSB number'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: {\n pattern: /\\d{3}-\\d{3}/,\n message: 'Please enter a valid BSB number',\n },\n }\n break\n }\n case 'barcodeScanner': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement,\n 'Please scan a barcode or enter a value',\n ),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'text':\n case 'textarea': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please enter a value'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n length: {\n minimum: formElement.minLength,\n tooShort:\n 'Please enter a value with at least %{count} character(s)',\n maximum: formElement.maxLength,\n tooLong: 'Please enter a value with %{count} character(s) or less',\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'telephone': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please enter a phone number'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'email': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please enter an email address'),\n email: {\n message: 'Please enter a valid email for this field',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'time': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please select a time'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'date': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please select a date'),\n date: {\n format: (v: Date) => localisationService.formatDate(v),\n earliest: parseDateValue({\n dateOnly: true,\n daysOffset: formElement.fromDateDaysOffset,\n value: formElement.fromDate,\n }),\n latest: parseDateValue({\n dateOnly: true,\n daysOffset: formElement.toDateDaysOffset,\n value: formElement.toDate,\n }),\n notValid: 'Please select a valid date',\n tooEarly: 'Date cannot be before %{date}',\n tooLate: 'Date cannot be after %{date}',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'datetime': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please select a date and time'),\n datetime: {\n format: (v: Date) => localisationService.formatDatetime(v),\n earliest: parseDateValue({\n dateOnly: false,\n daysOffset: formElement.fromDateDaysOffset,\n value: formElement.fromDate,\n }),\n latest: parseDateValue({\n dateOnly: false,\n daysOffset: formElement.toDateDaysOffset,\n value: formElement.toDate,\n }),\n notValid: 'Please select a valid date and time',\n tooEarly: 'Date and time cannot be before %{date}',\n tooLate: 'Date and time cannot be after %{date}',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'number': {\n let minErrorMessage =\n 'Please enter a number greater than or equal to %{count}'\n let maxErrorMessage =\n 'Please enter a number less than or equal to %{count}'\n if (\n typeof formElement.minNumber === 'number' &&\n typeof formElement.maxNumber === 'number'\n ) {\n minErrorMessage =\n maxErrorMessage = `Please enter a number between ${formElement.minNumber} and ${formElement.maxNumber}`\n }\n\n partialSchema[escapeElementName(formElement.name)] = {\n type: 'number',\n presence: presence(formElement, 'Please enter a number'),\n numericality: {\n greaterThanOrEqualTo: formElement.minNumber,\n notGreaterThanOrEqualTo: minErrorMessage,\n lessThanOrEqualTo: formElement.maxNumber,\n notLessThanOrEqualTo: maxErrorMessage,\n onlyInteger: formElement.isInteger,\n notInteger: 'Please enter a whole number',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n numberRegex: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'files': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: formElement.minEntries\n ? {\n message: `Please upload at least ${\n formElement.minEntries\n } file${formElement.minEntries === 1 ? '' : 's'}`,\n }\n : false,\n length: {\n minimum: formElement.minEntries,\n maximum: formElement.maxEntries,\n tooLong: 'Cannot upload more than %{count} file(s)',\n tooShort: 'Please upload at least %{count} file(s)',\n },\n type: {\n type: (files: PossibleFileConfiguration[] | undefined) => {\n return (\n !Array.isArray(files) ||\n files.every((file) => {\n return checkFileNameIsValid(formElement, file.fileName)\n })\n )\n },\n message: `Only the following file types are accepted: ${(\n formElement.restrictedFileTypes || []\n ).join(', ')}`,\n },\n needsExtension: formElement,\n attachments: !checkIsUsingLegacyStorage(formElement),\n }\n break\n }\n case 'repeatableSet': {\n partialSchema[escapeElementName(formElement.name)] = {\n entries: {\n setSchema: {\n presence: formElement.minSetEntries\n ? {\n message: `Must have at least ${formElement.minSetEntries} ${\n formElement.minSetEntries === 1 ? 'entry' : 'entries'\n }`,\n }\n : false,\n length: {\n minimum: formElement.minSetEntries,\n maximum: formElement.maxSetEntries,\n tooLong: 'Cannot have more than %{count} entry/entries',\n tooShort: 'Must have at least %{count} entry/entries',\n },\n },\n entrySchema: generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n ),\n },\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(formElement, [])\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n nestedElements,\n elementIdsWithLookupsExecuted,\n ),\n }\n break\n }\n case 'form': {\n if (formElement.elements) {\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n ),\n }\n }\n break\n }\n case 'freshdeskDependentField': {\n const nestedElements = generateFreshdeskDependentFieldElements(\n formElement,\n undefined,\n )\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n nestedElements,\n elementIdsWithLookupsExecuted,\n ),\n }\n break\n }\n default: {\n console.info('Unsupported form element with validation', formElement)\n }\n }\n return partialSchema\n }, {})\n}\n\nconst validateSingleMessageError = (\n submission: FormSubmissionModel,\n schema: ValidateJSSchema,\n): FormElementsValidation | undefined => {\n const errorsAsArray = validate(submission, schema, {\n format: 'grouped',\n fullMessages: false,\n })\n if (!errorsAsArray || validate.isEmpty(errorsAsArray)) {\n return\n }\n\n const errors = Object.keys(errorsAsArray || {}).reduce(\n (messagesByFormElementName: FormElementsValidation, key) => {\n const validationMessage = errorsAsArray[key][0]\n if (validationMessage) {\n messagesByFormElementName[key.replace(/\\\\./g, '.')] = validationMessage\n }\n return messagesByFormElementName\n },\n {},\n )\n if (validate.isEmpty(errors)) {\n return\n }\n\n return errors\n}\n\nexport function checkFileNameIsValid(\n formElement: FormTypes.FilesElement,\n fileName: string,\n) {\n const extension = fileName.split('.').pop()\n return (\n !formElement.restrictedFileTypes ||\n formElement.restrictedFileTypes.some(\n (fileType) => fileType.toLowerCase() === extension?.toLowerCase(),\n )\n )\n}\n\nexport function checkFileNameExtensionIsValid(\n formElement: FormTypes.FilesElement,\n fileName: string,\n) {\n return (\n formElement.allowExtensionlessAttachments || fileName.split('.').length >= 2\n )\n}\n\nexport function checkSectionValidity(\n element: FormTypes.PageElement | FormTypes.SectionElement,\n formElementsValidation: FormElementsValidation | undefined,\n): boolean {\n // If everything is valid, no need to check elements\n if (!formElementsValidation) {\n return false\n }\n\n // If there is no elements on the page that are invalid, we will treat as valid\n return element.elements.some((formElement) => {\n switch (formElement.type) {\n case 'page':\n case 'section': {\n return checkSectionValidity(formElement, formElementsValidation)\n }\n default: {\n return formElementsValidation[formElement.name]\n }\n }\n })\n}\n"]}
1
+ {"version":3,"file":"form-validation.js","sourceRoot":"","sources":["../../src/services/form-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import validate from 'validate.js'\nimport { localisationService } from '@oneblink/apps'\nimport { FormTypes } from '@oneblink/types'\nimport { Attachment, FormElementBinaryStorageValue } from '../types/attachments'\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\nimport { parseDateValue } from './generate-default-data'\nimport generateCivicaNameRecordElements from './generateCivicaNameRecordElements'\nimport {\n FormElementsConditionallyShown,\n FormElementsValidation,\n FormSubmissionModel,\n} from '../types/form'\nimport generateFreshdeskDependentFieldElements from './generateFreshdeskDependentFieldElements'\n\nexport const lookupValidationMessage = 'Lookup is required'\n// https://validatejs.org/#validators-datetime\n// Before using it we must add the parse and format functions\n// Here is a sample implementation using moment.js\nvalidate.extend(validate.validators.datetime, {\n // The value is guaranteed not to be null or undefined but otherwise it\n // could be anything.\n parse: function (value: string) {\n return Date.parse(value)\n },\n // Input is a unix timestamp\n format: function (\n value: string,\n options: { format: (date: Date) => string },\n ) {\n const dateValue = new Date(value)\n return options.format(dateValue)\n },\n})\n\nvalidate.validators.entries = function (\n value: unknown,\n {\n setSchema,\n entrySchema,\n }: { setSchema: ValidateJSSchema; entrySchema: ValidateJSSchema },\n) {\n const entries = Array.isArray(value) ? value : []\n\n const entryErrors = entries.reduce((errorsByIndex, entry, index) => {\n const entryValidation = validateSingleMessageError(entry, entrySchema)\n if (entryValidation) {\n errorsByIndex[index] = entryValidation\n }\n return errorsByIndex\n }, {})\n\n const setErrorMessages = validate.single(value, setSchema)\n\n if (!setErrorMessages && validate.isEmpty(entryErrors)) {\n return\n }\n\n return {\n type: 'repeatableSet',\n set: setErrorMessages && setErrorMessages[0],\n entries: entryErrors,\n }\n}\n\nvalidate.validators.nestedElements = function (\n value: FormSubmissionModel | undefined,\n schema: ValidateJSSchema,\n) {\n const errors = validateSingleMessageError(value || {}, schema)\n if (!errors) {\n return\n }\n return {\n type: 'formElements',\n formElements: errors,\n }\n}\n\nfunction getInvalidAttachment(value: FormElementBinaryStorageValue) {\n if (\n value &&\n typeof value === 'object' &&\n value.type &&\n value.type === 'ERROR'\n ) {\n return value\n }\n}\nfunction validateAttachments(\n value: FormElementBinaryStorageValue[] | undefined,\n) {\n const invalidAttachmentNames = value?.reduce(\n (invalidAttachmentNames: string[], att) => {\n const attachmentName = getInvalidAttachment(att)?.fileName\n if (attachmentName) {\n invalidAttachmentNames.push(attachmentName)\n }\n return invalidAttachmentNames\n },\n [],\n )\n if (invalidAttachmentNames?.length) {\n return `${invalidAttachmentNames.join(', ')} could not be uploaded.`\n }\n}\nvalidate.validators.attachment = function (\n value: FormElementBinaryStorageValue,\n) {\n return getInvalidAttachment(value)?.errorMessage\n}\nvalidate.validators.attachments = function (\n value:\n | FormElementBinaryStorageValue[]\n | FormElementComplianceValue\n | undefined,\n) {\n if (Array.isArray(value)) {\n return validateAttachments(value)\n }\n return validateAttachments(\n value?.files as FormElementBinaryStorageValue[] | undefined,\n )\n}\n\n// Extend validator for lookups\nvalidate.validators.lookups = function (\n value: unknown,\n {\n elementIdsWithLookupsExecuted,\n formElement,\n }: {\n formElement: FormTypes.LookupFormElement & FormTypes.FormElementRequired\n elementIdsWithLookupsExecuted: string[]\n },\n) {\n if (!formElement.isDataLookup && !formElement.isElementLookup) {\n return\n }\n\n // Lookups must only be executed on required form elements\n if (formElement && !formElement.required) {\n return\n }\n\n if (elementIdsWithLookupsExecuted.includes(formElement.id)) {\n return\n }\n\n return lookupValidationMessage\n}\n\nvalidate.validators.numberRegex = function (value: unknown, format: unknown) {\n if (!format) {\n return\n }\n if (typeof value === 'number' && !Number.isNaN(value)) {\n value = value.toString()\n }\n const errorMessages = validate.single(value, { format })\n return errorMessages && errorMessages[0]\n}\n\nvalidate.validators.isTrue = function (value: unknown, message?: string) {\n if (!value) {\n return message || 'Must be set to true'\n }\n}\n\nvalidate.validators.needsExtension = function (\n value: Attachment[] | undefined,\n formElement: FormTypes.FilesElement,\n) {\n const isValid =\n !Array.isArray(value) ||\n value.every((file) => {\n return checkFileNameExtensionIsValid(formElement, file.fileName)\n })\n if (!isValid) return 'All files must have extensions'\n}\n\nfunction getCustomRegexFormatConfig<DefaultValue>(\n formElement: FormTypes.FormElementWithInput<DefaultValue>,\n) {\n return formElement.regexPattern\n ? {\n pattern: formElement.regexPattern,\n flags: formElement.regexFlags,\n message: formElement.regexMessage,\n }\n : undefined\n}\n\ntype ValidateJSSchema = Record<string, unknown>\n\nexport function validateSubmission(\n schema: ValidateJSSchema,\n submission: FormSubmissionModel,\n formElementsConditionallyShown: FormElementsConditionallyShown,\n): FormElementsValidation | undefined {\n const formElementsValidation = validateSingleMessageError(submission, schema)\n if (formElementsValidation) {\n clearValidationMessagesForHiddenElements(\n formElementsValidation,\n formElementsConditionallyShown,\n )\n if (!validate.isEmpty(formElementsValidation)) {\n return formElementsValidation\n }\n }\n}\n\nconst clearValidationMessagesForHiddenElements = (\n formElementsValidation?: FormElementsValidation,\n formElementsConditionallyShown?: FormElementsConditionallyShown,\n) => {\n // If there is no validation to check, there are no invalid elements\n // If there is no conditionally shown elements, all invalid elements should display validation messages,\n if (!formElementsValidation || !formElementsConditionallyShown) {\n return\n }\n\n for (const key in formElementsValidation) {\n const formElementValidation = formElementsValidation[key]\n if (!formElementValidation) {\n continue\n }\n\n const formElementConditionallyShown = formElementsConditionallyShown[key]\n\n // If the validation is for an element that is being hidden,\n // we can remove the validation message and move to the next validation\n if (formElementConditionallyShown?.isHidden) {\n delete formElementsValidation[key]\n continue\n }\n\n // If the validation is for a single element (not nested elements),\n // we will always show the validation message\n if (typeof formElementValidation === 'string') {\n continue\n }\n\n // Here we will check to see if the nested elements that are\n // invalid are being shown, if not, remove validation messages\n switch (formElementValidation.type) {\n case 'repeatableSet': {\n for (const index in formElementValidation.entries) {\n clearValidationMessagesForHiddenElements(\n formElementValidation.entries[index],\n formElementConditionallyShown &&\n formElementConditionallyShown.type === 'repeatableSet'\n ? formElementConditionallyShown.entries[index]\n : undefined,\n )\n if (validate.isEmpty(formElementValidation.entries[index])) {\n delete formElementValidation.entries[index]\n }\n }\n // Remove the validation if all entries are valid and the set is also valid\n if (\n validate.isEmpty(formElementValidation.entries) &&\n !formElementValidation.set\n ) {\n delete formElementsValidation[key]\n }\n break\n }\n case 'formElements': {\n clearValidationMessagesForHiddenElements(\n formElementValidation.formElements,\n formElementConditionallyShown?.type === 'formElements'\n ? formElementConditionallyShown?.formElements\n : undefined,\n )\n if (validate.isEmpty(formElementValidation.formElements)) {\n delete formElementsValidation[key]\n }\n break\n }\n }\n }\n}\n\nconst presence = (\n { required, requiredMessage }: FormTypes.FormElementRequired,\n message: string,\n) => (required ? { message: requiredMessage || message } : false)\n\nconst escapeElementName = (elementName: string) => {\n const escapedName = elementName.replace(/\\./g, '\\\\.')\n return escapedName\n}\n\nexport function generateValidationSchema(\n elements: FormTypes.FormElement[],\n elementIdsWithLookupsExecuted: string[],\n): ValidateJSSchema {\n return elements.reduce<ValidateJSSchema>((partialSchema, formElement) => {\n switch (formElement.type) {\n case 'summary':\n case 'calculation':\n case 'image':\n case 'html':\n case 'infoPage':\n case 'heading': {\n break\n }\n case 'section':\n case 'page': {\n const nestedSchema = generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n )\n Object.assign(partialSchema, nestedSchema)\n break\n }\n case 'draw': {\n partialSchema[escapeElementName(formElement.name)] = {\n attachment: true,\n presence: presence(formElement, 'A signature is required'),\n }\n break\n }\n case 'camera': {\n partialSchema[escapeElementName(formElement.name)] = {\n attachment: true,\n presence: presence(formElement, 'A photo is required'),\n }\n break\n }\n case 'captcha': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n { ...formElement, required: true },\n 'Please complete the CAPTCHA successfully',\n ),\n }\n break\n }\n case 'location': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please select a location'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'compliance': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Required'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n attachments: true,\n }\n break\n }\n case 'abn':\n case 'geoscapeAddress':\n case 'pointAddress':\n case 'civicaStreetName':\n case 'autocomplete':\n case 'checkboxes':\n case 'radio':\n case 'select': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Required'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'boolean': {\n partialSchema[escapeElementName(formElement.name)] = {\n isTrue: formElement.required && 'Required',\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'bsb': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please enter a BSB number'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: {\n pattern: /\\d{3}-\\d{3}/,\n message: 'Please enter a valid BSB number',\n },\n }\n break\n }\n case 'barcodeScanner': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(\n formElement,\n 'Please scan a barcode or enter a value',\n ),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'text':\n case 'textarea': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please enter a value'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n length: {\n minimum: formElement.minLength,\n tooShort:\n 'Please enter a value with at least %{count} character(s)',\n maximum: formElement.maxLength,\n tooLong: 'Please enter a value with %{count} character(s) or less',\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'telephone': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please enter a phone number'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'email': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please enter an email address'),\n email: {\n message: 'Please enter a valid email for this field',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n format: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'time': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please select a time'),\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'date': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please select a date'),\n date: {\n format: (v: Date) => localisationService.formatDate(v),\n earliest: parseDateValue({\n dateOnly: true,\n daysOffset: formElement.fromDateDaysOffset,\n value: formElement.fromDate,\n }),\n latest: parseDateValue({\n dateOnly: true,\n daysOffset: formElement.toDateDaysOffset,\n value: formElement.toDate,\n }),\n notValid: 'Please select a valid date',\n tooEarly: 'Date cannot be before %{date}',\n tooLate: 'Date cannot be after %{date}',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'datetime': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: presence(formElement, 'Please select a date and time'),\n datetime: {\n format: (v: Date) => localisationService.formatDatetime(v),\n earliest: parseDateValue({\n dateOnly: false,\n daysOffset: formElement.fromDateDaysOffset,\n value: formElement.fromDate,\n }),\n latest: parseDateValue({\n dateOnly: false,\n daysOffset: formElement.toDateDaysOffset,\n value: formElement.toDate,\n }),\n notValid: 'Please select a valid date and time',\n tooEarly: 'Date and time cannot be before %{date}',\n tooLate: 'Date and time cannot be after %{date}',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n }\n break\n }\n case 'number': {\n let minErrorMessage =\n 'Please enter a number greater than or equal to %{count}'\n let maxErrorMessage =\n 'Please enter a number less than or equal to %{count}'\n if (\n typeof formElement.minNumber === 'number' &&\n typeof formElement.maxNumber === 'number'\n ) {\n minErrorMessage =\n maxErrorMessage = `Please enter a number between ${formElement.minNumber} and ${formElement.maxNumber}`\n }\n\n partialSchema[escapeElementName(formElement.name)] = {\n type: 'number',\n presence: presence(formElement, 'Please enter a number'),\n numericality: {\n greaterThanOrEqualTo: formElement.minNumber,\n notGreaterThanOrEqualTo: minErrorMessage,\n lessThanOrEqualTo: formElement.maxNumber,\n notLessThanOrEqualTo: maxErrorMessage,\n onlyInteger: formElement.isInteger,\n notInteger: 'Please enter a whole number',\n },\n lookups: {\n formElement,\n elementIdsWithLookupsExecuted,\n },\n numberRegex: getCustomRegexFormatConfig(formElement),\n }\n break\n }\n case 'files': {\n partialSchema[escapeElementName(formElement.name)] = {\n presence: formElement.minEntries\n ? {\n message: `Please upload at least ${\n formElement.minEntries\n } file${formElement.minEntries === 1 ? '' : 's'}`,\n }\n : false,\n length: {\n minimum: formElement.minEntries,\n maximum: formElement.maxEntries,\n tooLong: 'Cannot upload more than %{count} file(s)',\n tooShort: 'Please upload at least %{count} file(s)',\n },\n type: {\n type: (files: Attachment[] | undefined) => {\n return (\n !Array.isArray(files) ||\n files.every((file) => {\n return checkFileNameIsValid(formElement, file.fileName)\n })\n )\n },\n message: `Only the following file types are accepted: ${(\n formElement.restrictedFileTypes || []\n ).join(', ')}`,\n },\n needsExtension: formElement,\n attachments: true,\n }\n break\n }\n case 'repeatableSet': {\n partialSchema[escapeElementName(formElement.name)] = {\n entries: {\n setSchema: {\n presence: formElement.minSetEntries\n ? {\n message: `Must have at least ${formElement.minSetEntries} ${\n formElement.minSetEntries === 1 ? 'entry' : 'entries'\n }`,\n }\n : false,\n length: {\n minimum: formElement.minSetEntries,\n maximum: formElement.maxSetEntries,\n tooLong: 'Cannot have more than %{count} entry/entries',\n tooShort: 'Must have at least %{count} entry/entries',\n },\n },\n entrySchema: generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n ),\n },\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(formElement, [])\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n nestedElements,\n elementIdsWithLookupsExecuted,\n ),\n }\n break\n }\n case 'form': {\n if (formElement.elements) {\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n formElement.elements,\n elementIdsWithLookupsExecuted,\n ),\n }\n }\n break\n }\n case 'freshdeskDependentField': {\n const nestedElements = generateFreshdeskDependentFieldElements(\n formElement,\n undefined,\n )\n partialSchema[escapeElementName(formElement.name)] = {\n nestedElements: generateValidationSchema(\n nestedElements,\n elementIdsWithLookupsExecuted,\n ),\n }\n break\n }\n default: {\n console.info('Unsupported form element with validation', formElement)\n }\n }\n return partialSchema\n }, {})\n}\n\nconst validateSingleMessageError = (\n submission: FormSubmissionModel,\n schema: ValidateJSSchema,\n): FormElementsValidation | undefined => {\n const errorsAsArray = validate(submission, schema, {\n format: 'grouped',\n fullMessages: false,\n })\n if (!errorsAsArray || validate.isEmpty(errorsAsArray)) {\n return\n }\n\n const errors = Object.keys(errorsAsArray || {}).reduce(\n (messagesByFormElementName: FormElementsValidation, key) => {\n const validationMessage = errorsAsArray[key][0]\n if (validationMessage) {\n messagesByFormElementName[key.replace(/\\\\./g, '.')] = validationMessage\n }\n return messagesByFormElementName\n },\n {},\n )\n if (validate.isEmpty(errors)) {\n return\n }\n\n return errors\n}\n\nexport function checkFileNameIsValid(\n formElement: FormTypes.FilesElement,\n fileName: string,\n) {\n const extension = fileName.split('.').pop()\n return (\n !formElement.restrictedFileTypes ||\n formElement.restrictedFileTypes.some(\n (fileType) => fileType.toLowerCase() === extension?.toLowerCase(),\n )\n )\n}\n\nexport function checkFileNameExtensionIsValid(\n formElement: FormTypes.FilesElement,\n fileName: string,\n) {\n return (\n formElement.allowExtensionlessAttachments || fileName.split('.').length >= 2\n )\n}\n\nexport function checkSectionValidity(\n element: FormTypes.PageElement | FormTypes.SectionElement,\n formElementsValidation: FormElementsValidation | undefined,\n): boolean {\n // If everything is valid, no need to check elements\n if (!formElementsValidation) {\n return false\n }\n\n // If there is no elements on the page that are invalid, we will treat as valid\n return element.elements.some((formElement) => {\n switch (formElement.type) {\n case 'page':\n case 'section': {\n return checkSectionValidity(formElement, formElementsValidation)\n }\n default: {\n return formElementsValidation[formElement.name]\n }\n }\n })\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { localisationService } from '@oneblink/apps';
2
- import { checkIsUsingLegacyStorage, prepareNewAttachment } from './attachments';
2
+ import { prepareNewAttachment } from './attachments';
3
3
  import { dataUriToBlobSync } from './blob-utils';
4
4
  import generateCivicaNameRecordElements from './generateCivicaNameRecordElements';
5
5
  function parseAttachment(value) {
@@ -27,19 +27,13 @@ function parseAttachment(value) {
27
27
  }
28
28
  function parseFile(element, value) {
29
29
  return parseUnknownAsRecord(value, (record) => {
30
- const isUsingLegacyStorage = checkIsUsingLegacyStorage(element);
31
30
  if (record.type === undefined &&
32
31
  typeof record.fileName === 'string' &&
33
32
  typeof record.data === 'string') {
34
- if (isUsingLegacyStorage) {
35
- return record;
36
- }
37
33
  const blob = dataUriToBlobSync(record.data);
38
34
  return prepareNewAttachment(blob, record.fileName, element);
39
35
  }
40
- if (!isUsingLegacyStorage) {
41
- return parseAttachment(record);
42
- }
36
+ return parseAttachment(record);
43
37
  });
44
38
  }
45
39
  function parseFiles(element, value) {
@@ -153,22 +147,15 @@ function parseFormSubmissionModel(elements, value) {
153
147
  }
154
148
  function parsePreFillData(element, value) {
155
149
  switch (element.type) {
156
- // If a form element is pre-filled and the storage type is not "legacy"
157
- // but the pre-fill data is in the format for the “legacy” storage type
158
- // (base64), the data should be uploaded to S3 and set in the submission
159
- // data. The base64 data should not be uploaded with the submission.
160
- // This is to cater for instances of pre-fill data being created before
161
- // a form element is updated to “public” or “private”.
150
+ // If a form element is pre-filled with the "legacy" storage type
151
+ // format (base64), the data should be uploaded to S3 and set in the
152
+ // submission data. This is to cater for instances of pre-fill data
153
+ // being created before the "legacy" storage type was removed.
162
154
  case 'camera':
163
155
  case 'draw': {
164
156
  if (!value) {
165
157
  break;
166
158
  }
167
- if (checkIsUsingLegacyStorage(element)) {
168
- if (typeof value === 'string') {
169
- return value;
170
- }
171
- }
172
159
  else if (typeof value === 'string') {
173
160
  const blob = dataUriToBlobSync(value);
174
161
  return prepareNewAttachment(blob, 'file', element);
@@ -176,7 +163,6 @@ function parsePreFillData(element, value) {
176
163
  else {
177
164
  return parseAttachment(value);
178
165
  }
179
- break;
180
166
  }
181
167
  case 'files': {
182
168
  return parseFiles(element, value);
@@ -436,11 +422,16 @@ export default function generateDefaultData(elements, preFillData) {
436
422
  }
437
423
  break;
438
424
  }
425
+ case 'camera':
426
+ case 'draw':
427
+ case 'files': {
428
+ m[el.name] = parsePreFillData(el, el.defaultValue);
429
+ break;
430
+ }
439
431
  case 'freshdeskDependentField':
440
432
  case 'geoscapeAddress':
441
433
  case 'pointAddress':
442
434
  case 'civicaStreetName':
443
- case 'camera':
444
435
  case 'abn':
445
436
  case 'bsb':
446
437
  case 'text':
@@ -448,8 +439,6 @@ export default function generateDefaultData(elements, preFillData) {
448
439
  case 'email':
449
440
  case 'telephone':
450
441
  case 'textarea':
451
- case 'files':
452
- case 'draw':
453
442
  case 'location': {
454
443
  if (el.defaultValue) {
455
444
  m[el.name] = el.defaultValue;