@oneblink/apps-react 13.0.0-beta.1 → 13.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/OneBlinkFormBase.d.ts +23 -3
- package/dist/OneBlinkFormBase.js +350 -193
- package/dist/OneBlinkFormBase.js.map +1 -1
- package/dist/OneBlinkReadOnlyForm.d.ts +17 -7
- package/dist/OneBlinkReadOnlyForm.js +24 -8
- package/dist/OneBlinkReadOnlyForm.js.map +1 -1
- package/dist/apps/approvals-service.d.ts +1 -0
- package/dist/apps/approvals-service.js.map +1 -1
- package/dist/apps/services/api/submissions.d.ts +3 -2
- package/dist/apps/services/api/submissions.js +3 -6
- package/dist/apps/services/api/submissions.js.map +1 -1
- package/dist/apps/submission-service.d.ts +11 -5
- package/dist/apps/submission-service.js +9 -4
- package/dist/apps/submission-service.js.map +1 -1
- package/dist/components/renderer/LookupButton.d.ts +1 -2
- package/dist/components/renderer/LookupButton.js +7 -6
- package/dist/components/renderer/LookupButton.js.map +1 -1
- package/dist/components/renderer/LookupNotification.js +31 -24
- package/dist/components/renderer/LookupNotification.js.map +1 -1
- package/dist/components/renderer/OneBlinkFormElements.d.ts +5 -7
- package/dist/components/renderer/OneBlinkFormElements.js +10 -35
- package/dist/components/renderer/OneBlinkFormElements.js.map +1 -1
- package/dist/components/renderer/PageFormElements.js +8 -3
- package/dist/components/renderer/PageFormElements.js.map +1 -1
- package/dist/components/renderer/ReverseGeocode.js +6 -11
- package/dist/components/renderer/ReverseGeocode.js.map +1 -1
- package/dist/form-elements/FormElementABN.js +1 -1
- package/dist/form-elements/FormElementABN.js.map +1 -1
- package/dist/form-elements/FormElementBSB.js +1 -1
- package/dist/form-elements/FormElementBSB.js.map +1 -1
- package/dist/form-elements/FormElementBarcodeScanner.js +1 -1
- package/dist/form-elements/FormElementBarcodeScanner.js.map +1 -1
- package/dist/form-elements/FormElementCalculation.js +1 -0
- package/dist/form-elements/FormElementCalculation.js.map +1 -1
- package/dist/form-elements/FormElementCheckBoxes.js +1 -1
- package/dist/form-elements/FormElementCheckBoxes.js.map +1 -1
- package/dist/form-elements/FormElementDate.js +1 -1
- package/dist/form-elements/FormElementDate.js.map +1 -1
- package/dist/form-elements/FormElementDateTime.js +1 -1
- package/dist/form-elements/FormElementDateTime.js.map +1 -1
- package/dist/form-elements/FormElementEmail.js +1 -1
- package/dist/form-elements/FormElementEmail.js.map +1 -1
- package/dist/form-elements/FormElementForm.d.ts +8 -9
- package/dist/form-elements/FormElementForm.js +4 -3
- package/dist/form-elements/FormElementForm.js.map +1 -1
- package/dist/form-elements/FormElementLookupButton.js +4 -3
- package/dist/form-elements/FormElementLookupButton.js.map +1 -1
- package/dist/form-elements/FormElementNumber.js +1 -1
- package/dist/form-elements/FormElementNumber.js.map +1 -1
- package/dist/form-elements/FormElementRepeatableSet.d.ts +4 -4
- package/dist/form-elements/FormElementRepeatableSet.js +6 -4
- package/dist/form-elements/FormElementRepeatableSet.js.map +1 -1
- package/dist/form-elements/FormElementSection.d.ts +3 -3
- package/dist/form-elements/FormElementSection.js +2 -2
- package/dist/form-elements/FormElementSection.js.map +1 -1
- package/dist/form-elements/FormElementSelect.js +1 -1
- package/dist/form-elements/FormElementSelect.js.map +1 -1
- package/dist/form-elements/FormElementSummary.js +2 -0
- package/dist/form-elements/FormElementSummary.js.map +1 -1
- package/dist/form-elements/FormElementTelephone.js +1 -1
- package/dist/form-elements/FormElementTelephone.js.map +1 -1
- package/dist/form-elements/FormElementText.js +1 -1
- package/dist/form-elements/FormElementText.js.map +1 -1
- package/dist/form-elements/FormElementTextarea.js +1 -1
- package/dist/form-elements/FormElementTextarea.js.map +1 -1
- package/dist/form-elements/FormElementTime.js +1 -1
- package/dist/form-elements/FormElementTime.js.map +1 -1
- package/dist/hooks/useAreLookupsDisallowed.d.ts +2 -0
- package/dist/hooks/useAreLookupsDisallowed.js +12 -0
- package/dist/hooks/useAreLookupsDisallowed.js.map +1 -0
- package/dist/hooks/useEditableFormElementIds.d.ts +3 -0
- package/dist/hooks/useEditableFormElementIds.js +6 -0
- package/dist/hooks/useEditableFormElementIds.js.map +1 -0
- package/dist/hooks/useFormElementOptions.js +2 -0
- package/dist/hooks/useFormElementOptions.js.map +1 -1
- package/dist/hooks/useFormIsDirty.d.ts +38 -0
- package/dist/hooks/useFormIsDirty.js +78 -0
- package/dist/hooks/useFormIsDirty.js.map +1 -0
- package/dist/hooks/useFormSubmissionAttempt.d.ts +88 -0
- package/dist/hooks/useFormSubmissionAttempt.js +103 -0
- package/dist/hooks/useFormSubmissionAttempt.js.map +1 -0
- package/dist/hooks/useFormSubmissionAutoSaveState.d.ts +2 -9
- package/dist/hooks/useFormSubmissionAutoSaveState.js +4 -2
- package/dist/hooks/useFormSubmissionAutoSaveState.js.map +1 -1
- package/dist/hooks/useFormValidation.d.ts +1 -1
- package/dist/hooks/useFormValidation.js +2 -1
- package/dist/hooks/useFormValidation.js.map +1 -1
- package/dist/hooks/useInjectPages.d.ts +2 -1
- package/dist/hooks/useInjectPages.js.map +1 -1
- package/dist/hooks/useIsFormElementReadOnly.d.ts +2 -0
- package/dist/hooks/useIsFormElementReadOnly.js +13 -0
- package/dist/hooks/useIsFormElementReadOnly.js.map +1 -0
- package/dist/hooks/useLookupNotification.d.ts +23 -2
- package/dist/hooks/useLookupNotification.js +2 -1
- package/dist/hooks/useLookupNotification.js.map +1 -1
- package/dist/hooks/useLookups.d.ts +3 -3
- package/dist/hooks/useLookups.js +7 -4
- package/dist/hooks/useLookups.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/form-validation/extensions.d.ts +2 -1
- package/dist/services/form-validation/extensions.js +2 -1
- package/dist/services/form-validation/extensions.js.map +1 -1
- package/dist/services/form-validation/validateSubmission.d.ts +2 -1
- package/dist/services/form-validation/validateSubmission.js +14 -9
- package/dist/services/form-validation/validateSubmission.js.map +1 -1
- package/dist/types/form.d.ts +17 -3
- package/dist/types/form.js.map +1 -1
- package/dist/utils/read-only-form-elements.d.ts +37 -0
- package/dist/utils/read-only-form-elements.js +63 -0
- package/dist/utils/read-only-form-elements.js.map +1 -0
- package/package.json +4 -3
- package/dist/services/isElementReadOnlyForAudience.d.ts +0 -20
- package/dist/services/isElementReadOnlyForAudience.js +0 -46
- package/dist/services/isElementReadOnlyForAudience.js.map +0 -1
- package/dist/services/resolveFormElementReadOnly.d.ts +0 -10
- package/dist/services/resolveFormElementReadOnly.js +0 -17
- package/dist/services/resolveFormElementReadOnly.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateSubmission.js","sourceRoot":"","sources":["../../../src/services/form-validation/validateSubmission.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport {\n CaptchaType,\n ExecutedLookups,\n FormElementsConditionallyShown,\n FormElementsValidation,\n} from '../../types/form'\n\nimport { isEmpty, validators } from './validate-dot-js'\nimport validationExtensions from './extensions'\nimport {\n checkFileNameExtensionIsValid,\n checkFileNameIsValid,\n getCleanRepeatableSetConfiguration,\n getCleanDateRangeConfiguration,\n validateAttachments,\n} from './validators'\nimport generateCivicaNameRecordElements from '../generateCivicaNameRecordElements'\nimport generateFreshdeskDependentFieldElements from '../generateFreshdeskDependentFieldElements'\nimport { parseDateValue } from '../generate-default-data'\nimport { localisationService } from '../../apps'\nimport { ArcGISWebMapElementValue } from '@oneblink/types/typescript/arcgis'\nimport { generateConfirmationFormElementName } from '../dynamic-elements'\nimport { determineLookupButtonIsRequired } from './determineLookupButtonIsRequired'\nimport { Value as FormElementComplianceValue } from '../../form-elements/FormElementCompliance'\nimport {\n defaultAutoSnapshotButtonLabel,\n generateArcGISAutomatedSnapshotFileName,\n} from '../../form-elements/FormElementArcGISWebMap'\nimport { fileUploadService } from '@oneblink/sdk-core'\nimport isElementReadOnlyForAudience, {\n isElementEditableForAudience,\n} from '../isElementReadOnlyForAudience'\n\nexport const RECAPTCHA_OFFLINE_MESSAGE =\n 'We could not verify you are human while you are offline.'\n\nexport default function validateSubmission({\n elements,\n submission,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n audience,\n}: {\n elements: FormTypes.FormElementWithName[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined\n executedLookups: ExecutedLookups\n captchaType: CaptchaType\n isOffline: boolean\n audience: FormTypes.FormElementHiddenFromAudience\n}): FormElementsValidation | undefined {\n const formElementsValidation = elements.reduce<FormElementsValidation>(\n (partialFormElementsValidation, formElement) => {\n switch (formElement.type) {\n // Elements that do not need to be validated\n case 'summary':\n case 'calculation':\n case 'image':\n case 'html':\n case 'heading': {\n return partialFormElementsValidation\n }\n }\n\n // If the element is current hidden, we do not need to apply validation\n const formElementConditionallyShown =\n formElementsConditionallyShown?.[formElement.name]\n if (formElementConditionallyShown?.isHidden) {\n return partialFormElementsValidation\n }\n\n // An audience that cannot change this element, or anything nested inside\n // it, has no way to resolve an error on it. Approvers still see the page\n // navigation buttons and can submit the form by pressing Enter, either of\n // which would otherwise reveal errors on fields locked to them.\n if (!isElementEditableForAudience(formElement, audience)) {\n return partialFormElementsValidation\n }\n\n const value = submission?.[formElement.name]\n\n switch (formElement.type) {\n case 'draw': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'A saved signature is required',\n ),\n ...validationExtensions.attachment(value),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'camera': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'A photo is required',\n ),\n ...validationExtensions.attachment(value),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'captcha': {\n // An approver edit is not a new submission, so the renderer never\n // shows a captcha to an approver, regardless of `approverEditability`.\n // Mirror that unconditionally rather than relying on the editability\n // check above.\n if (audience === 'APPROVER') {\n break\n }\n switch (captchaType) {\n case 'INVISIBLE':\n break\n case 'CHECKBOX':\n default: {\n const errorMessages = [\n ...validationExtensions.offline(\n isOffline,\n RECAPTCHA_OFFLINE_MESSAGE,\n ),\n ...validationExtensions.presence(\n value,\n { ...formElement, required: true },\n 'Please complete the CAPTCHA successfully',\n ),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] =\n errorMessages[0]\n }\n }\n }\n break\n }\n case 'location': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a location',\n ),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'compliance': {\n const errorMessages = [\n ...validationExtensions.presence(value, formElement, 'Required'),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ...validateAttachments(\n (value as FormElementComplianceValue | undefined)?.files,\n ),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'checkboxes': {\n const optionsLength =\n formElementConditionallyShown?.type === 'formElement' &&\n formElementConditionallyShown?.options\n ? formElementConditionallyShown?.options?.length\n : formElement.options?.length\n const requiredAllDefaultMessage = 'All options are required'\n const errorMessages = validationExtensions.presence(\n value,\n {\n ...formElement,\n required:\n !!optionsLength &&\n (formElement.required || !!formElement.requiredAll),\n },\n formElement.requiredAll ? requiredAllDefaultMessage : 'Required',\n )\n if (formElement.requiredAll) {\n errorMessages.push(\n ...validators.length(value, {\n is: optionsLength,\n message:\n formElement.requiredMessage || requiredAllDefaultMessage,\n }),\n )\n }\n errorMessages.push(\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n )\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'abn':\n case 'geoscapeAddress':\n case 'pointCadastralParcel':\n case 'pointAddress':\n case 'pointAddressV3':\n case 'googleAddress':\n case 'civicaStreetName':\n case 'autocomplete':\n case 'radio':\n case 'select':\n case 'apiNSWLiquorLicence': {\n const errorMessages = [\n ...validationExtensions.presence(value, formElement, 'Required'),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'boolean': {\n const errorMessages = []\n if (value !== true && formElement.required) {\n errorMessages.push(formElement.requiredMessage || 'Required')\n }\n errorMessages.push(\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n )\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'bsb': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a BSB number',\n ),\n ...validators.regexValidation(value, {\n pattern: /\\d{3}-\\d{3}/,\n message: 'Please enter a valid BSB number',\n }),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'barcodeScanner': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please scan a barcode or enter a value',\n ),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'text':\n case 'textarea': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a value',\n ),\n ...validators.length(value, {\n minimum: formElement.minLength,\n tooShort:\n 'Please enter a value with at least %{count} character(s)',\n maximum: formElement.maxLength,\n tooLong:\n 'Please enter a value with %{count} character(s) or less',\n }),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'telephone': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a phone number',\n ),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'email': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter an email address',\n ),\n ...validators.email(value, {\n message: 'Please enter a valid email for this field',\n }),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n\n if (formElement.requiresConfirmation && !!value) {\n const confirmationFormElementName =\n generateConfirmationFormElementName(formElement)\n if (value !== submission?.[confirmationFormElementName]) {\n partialFormElementsValidation[confirmationFormElementName] =\n 'Email addresses do not match'\n }\n }\n break\n }\n case 'time': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a time',\n ),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'date': {\n const [fromDate, fromDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.fromDate,\n daysOffset: formElement.fromDateDaysOffset,\n referenceFormElementId: formElement.fromDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const [toDate, toDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.toDate,\n daysOffset: formElement.toDateDaysOffset,\n referenceFormElementId: formElement.toDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a date',\n ),\n ...validators.datetime(value, {\n dateOnly: true,\n format: (date: Date) => localisationService.formatDate(date),\n earliest: parseDateValue({\n dateOnly: true,\n daysOffset: fromDateDaysOffset,\n value: fromDate,\n }),\n latest: parseDateValue({\n dateOnly: true,\n daysOffset: toDateDaysOffset,\n value: toDate,\n }),\n notValid: 'Please select a valid date',\n tooEarly: 'Date cannot be before %{date}',\n tooLate: 'Date cannot be after %{date}',\n }),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'datetime': {\n const [fromDate, fromDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.fromDate,\n daysOffset: formElement.fromDateDaysOffset,\n referenceFormElementId: formElement.fromDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const [toDate, toDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.toDate,\n daysOffset: formElement.toDateDaysOffset,\n referenceFormElementId: formElement.toDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a date and time',\n ),\n ...validators.datetime(value, {\n format: (v: Date) => localisationService.formatDatetime(v),\n earliest: parseDateValue({\n dateOnly: false,\n daysOffset: fromDateDaysOffset,\n value: fromDate,\n }),\n latest: parseDateValue({\n dateOnly: false,\n daysOffset: toDateDaysOffset,\n value: toDate,\n }),\n notValid: 'Please select a valid date and time',\n tooEarly: 'Date and time cannot be before %{date}',\n tooLate: 'Date and time cannot be after %{date}',\n }),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'number': {\n let minErrorMessage =\n 'Please enter a number greater than or equal to %{count}'\n let maxErrorMessage =\n 'Please enter a number less than or equal to %{count}'\n if (\n typeof formElement.minNumber === 'number' &&\n typeof formElement.maxNumber === 'number'\n ) {\n minErrorMessage =\n maxErrorMessage = `Please enter a number between ${formElement.minNumber} and ${formElement.maxNumber}`\n }\n\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a number',\n ),\n ...validators.numericality(value, {\n greaterThanOrEqualTo: formElement.minNumber,\n notGreaterThanOrEqualTo: minErrorMessage,\n lessThanOrEqualTo: formElement.maxNumber,\n notLessThanOrEqualTo: maxErrorMessage,\n onlyInteger: formElement.isInteger,\n notInteger: 'Please enter a whole number',\n notValid: 'Enter enter a valid number',\n }),\n ]\n if (\n formElement.regexPattern &&\n typeof value === 'number' &&\n !Number.isNaN(value)\n ) {\n errorMessages.push(\n ...validationExtensions.regex(value.toString(), formElement),\n )\n }\n errorMessages.push(\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n )\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'files': {\n const errorMessages = []\n if (formElement.minEntries) {\n errorMessages.push(\n ...validators.presence(value, {\n message: `Please upload at least ${\n formElement.minEntries\n } file${formElement.minEntries === 1 ? '' : 's'}`,\n }),\n )\n }\n errorMessages.push(\n ...validators.length(value, {\n minimum: formElement.minEntries,\n maximum: formElement.maxEntries,\n tooLong: 'Cannot upload more than %{count} file(s)',\n tooShort: 'Please upload at least %{count} file(s)',\n }),\n )\n\n if (\n Array.isArray(value) &&\n value.some((file) => {\n return !checkFileNameIsValid(formElement, file.fileName)\n })\n ) {\n errorMessages.push(\n `Only the following file types are accepted: ${(\n formElement.restrictedFileTypes ||\n fileUploadService.restrictedFileTypes\n ).join(', ')}`,\n )\n }\n\n errorMessages.push(...validateAttachments(value as undefined))\n\n const isValid =\n !Array.isArray(value) ||\n value.every((file) => {\n return checkFileNameExtensionIsValid(formElement, file.fileName)\n })\n if (!isValid) errorMessages.push('All files must have extensions')\n\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'repeatableSet': {\n const setErrorMessages: string[] = []\n // The entry count can only be corrected by adding or removing\n // entries, which requires the set itself to be editable. Its entries\n // are still validated below, as they may contain elements this\n // audience can edit even while the set is locked.\n if (!isElementReadOnlyForAudience(formElement, audience)) {\n const minSetEntries = getCleanRepeatableSetConfiguration(\n formElement.minSetEntries,\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const maxSetEntries = getCleanRepeatableSetConfiguration(\n formElement.maxSetEntries,\n elements,\n submission,\n formElementsConditionallyShown,\n )\n setErrorMessages.push(\n ...validators.length(value, {\n minimum: minSetEntries,\n maximum: maxSetEntries,\n tooLong: 'Cannot have more than %{count} entry/entries',\n tooShort: 'Must have at least %{count} entry/entries',\n }),\n )\n if (minSetEntries) {\n setErrorMessages.push(\n ...validators.presence(value, {\n message: `Must have at least ${minSetEntries} ${\n minSetEntries === 1 ? 'entry' : 'entries'\n }`,\n }),\n )\n }\n }\n\n const entries = Array.isArray(value) ? value : []\n\n const repeatableSetExecutedLookups =\n executedLookups !== undefined &&\n typeof executedLookups !== 'boolean' &&\n !Array.isArray(executedLookups) &&\n Array.isArray(executedLookups[formElement.name])\n ? executedLookups[formElement.name]\n : []\n\n const entryErrors = entries.reduce((errorsByIndex, entry, index) => {\n const entryValidation = validateSubmission({\n submission: entry,\n elements: formElement.elements as FormTypes.FormElementWithName[],\n executedLookups: Array.isArray(repeatableSetExecutedLookups)\n ? repeatableSetExecutedLookups[index]\n : {},\n formElementsConditionallyShown:\n formElementConditionallyShown?.type === 'repeatableSet'\n ? formElementConditionallyShown.entries[index.toString()]\n : undefined,\n captchaType,\n isOffline,\n audience,\n })\n\n if (entryValidation) {\n errorsByIndex[index] = entryValidation\n }\n return errorsByIndex\n }, {})\n\n if (setErrorMessages.length || !isEmpty(entryErrors)) {\n partialFormElementsValidation[formElement.name] = {\n type: 'repeatableSet',\n set: setErrorMessages[0],\n entries: entryErrors,\n }\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(\n formElement,\n [],\n )\n const nestedFormValidation = validationExtensions.nestedElements(\n value,\n {\n formElement,\n formElements: nestedElements,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n audience,\n },\n )\n if (nestedFormValidation) {\n partialFormElementsValidation[formElement.name] =\n nestedFormValidation\n }\n break\n }\n case 'infoPage':\n case 'form': {\n const nestedFormValidation = validationExtensions.nestedElements(\n value,\n {\n formElement,\n formElements:\n formElement.elements as FormTypes.FormElementWithName[],\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n audience,\n },\n )\n if (nestedFormValidation) {\n partialFormElementsValidation[formElement.name] =\n nestedFormValidation\n }\n break\n }\n case 'freshdeskDependentField': {\n const nestedElements =\n generateFreshdeskDependentFieldElements(formElement)\n const nestedFormValidation = validationExtensions.nestedElements(\n value,\n {\n formElement,\n formElements: nestedElements,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n audience,\n },\n )\n if (nestedFormValidation) {\n partialFormElementsValidation[formElement.name] =\n nestedFormValidation\n }\n break\n }\n case 'arcGISWebMap': {\n const arcGISWebMapElementValue = value as\n | ArcGISWebMapElementValue\n | undefined\n const errorMessages = validationExtensions.presence(\n arcGISWebMapElementValue?.userInput,\n formElement,\n 'Required',\n )\n const automatedSnapshotFileName =\n generateArcGISAutomatedSnapshotFileName(formElement)\n\n if (formElement.manualSnapshotsEnabled) {\n errorMessages.push(\n ...validators.length(\n (arcGISWebMapElementValue?.snapshotImages || []).filter(\n (snapshotImage) =>\n snapshotImage.fileName !== automatedSnapshotFileName,\n ),\n {\n minimum: formElement.minManualSnapshots,\n maximum: formElement.maxManualSnapshots,\n tooLong: 'Cannot capture more than %{count} image(s)',\n tooShort: 'Must capture at least %{count} image(s)',\n },\n ),\n )\n }\n\n errorMessages.push(\n ...validateAttachments(arcGISWebMapElementValue?.snapshotImages),\n )\n\n if (\n formElement.autoSnapshotViews?.length &&\n arcGISWebMapElementValue?.snapshotImages?.filter(\n (snapshotImage) =>\n snapshotImage.fileName == automatedSnapshotFileName,\n ).length !== formElement.autoSnapshotViews.length\n ) {\n errorMessages.push(\n `Please press the \"${formElement.autoSnapshotButton?.label || defaultAutoSnapshotButtonLabel}\" button`,\n )\n }\n\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'lookupButton': {\n const errorMessages = validationExtensions.lookups({\n formElement: {\n ...formElement,\n required:\n typeof formElement.required === 'boolean'\n ? formElement.required\n : determineLookupButtonIsRequired(\n formElement.elementDependencies,\n elements,\n submission ? [submission] : [],\n ),\n },\n executedLookups,\n })\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n default: {\n const never: never = formElement\n console.info('Unsupported form element with validation', never)\n }\n }\n\n return partialFormElementsValidation\n },\n {},\n )\n\n if (isEmpty(formElementsValidation)) {\n return\n }\n\n return formElementsValidation\n}\n"]}
|
|
1
|
+
{"version":3,"file":"validateSubmission.js","sourceRoot":"","sources":["../../../src/services/form-validation/validateSubmission.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport {\n CaptchaType,\n ExecutedLookups,\n FormElementsConditionallyShown,\n FormElementsValidation,\n} from '../../types/form'\n\nimport { isEmpty, validators } from './validate-dot-js'\nimport validationExtensions from './extensions'\nimport {\n checkFileNameExtensionIsValid,\n checkFileNameIsValid,\n getCleanRepeatableSetConfiguration,\n getCleanDateRangeConfiguration,\n validateAttachments,\n} from './validators'\nimport generateCivicaNameRecordElements from '../generateCivicaNameRecordElements'\nimport generateFreshdeskDependentFieldElements from '../generateFreshdeskDependentFieldElements'\nimport { parseDateValue } from '../generate-default-data'\nimport { localisationService } from '../../apps'\nimport { ArcGISWebMapElementValue } from '@oneblink/types/typescript/arcgis'\nimport { generateConfirmationFormElementName } from '../dynamic-elements'\nimport { determineLookupButtonIsRequired } from './determineLookupButtonIsRequired'\nimport { Value as FormElementComplianceValue } from '../../form-elements/FormElementCompliance'\nimport {\n defaultAutoSnapshotButtonLabel,\n generateArcGISAutomatedSnapshotFileName,\n} from '../../form-elements/FormElementArcGISWebMap'\nimport { fileUploadService } from '@oneblink/sdk-core'\nimport {\n checkIsFormElementEditable,\n checkIsFormElementIdEditable,\n} from '../../utils/read-only-form-elements'\n\nexport const RECAPTCHA_OFFLINE_MESSAGE =\n 'We could not verify you are human while you are offline.'\n\nexport default function validateSubmission({\n elements,\n submission,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n audience,\n editableFormElementIds,\n}: {\n elements: FormTypes.FormElementWithName[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined\n executedLookups: ExecutedLookups\n captchaType: CaptchaType\n isOffline: boolean\n audience: FormTypes.FormElementHiddenFromAudience\n editableFormElementIds?: string[]\n}): FormElementsValidation | undefined {\n const formElementsValidation = elements.reduce<FormElementsValidation>(\n (partialFormElementsValidation, formElement) => {\n switch (formElement.type) {\n // Elements that do not need to be validated\n case 'summary':\n case 'calculation':\n case 'image':\n case 'html':\n case 'heading': {\n return partialFormElementsValidation\n }\n }\n\n // If the element is current hidden, we do not need to apply validation\n const formElementConditionallyShown =\n formElementsConditionallyShown?.[formElement.name]\n if (formElementConditionallyShown?.isHidden) {\n return partialFormElementsValidation\n }\n\n // A user that cannot change this element, or anything nested inside it,\n // has no way to resolve an error on it. Reviewers still see the page\n // navigation buttons and can submit the form by pressing Enter, either of\n // which would otherwise reveal errors on fields locked to them.\n if (!checkIsFormElementEditable(formElement, editableFormElementIds)) {\n return partialFormElementsValidation\n }\n\n const value = submission?.[formElement.name]\n\n switch (formElement.type) {\n case 'draw': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'A saved signature is required',\n ),\n ...validationExtensions.attachment(value),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'camera': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'A photo is required',\n ),\n ...validationExtensions.attachment(value),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'captcha': {\n // An approver edit is not a new submission, so the renderer never\n // shows a captcha to an approver, regardless of editable element ids.\n // Mirror that unconditionally rather than relying on the editability\n // check above.\n if (audience === 'APPROVER') {\n break\n }\n switch (captchaType) {\n case 'INVISIBLE':\n break\n case 'CHECKBOX':\n default: {\n const errorMessages = [\n ...validationExtensions.offline(\n isOffline,\n RECAPTCHA_OFFLINE_MESSAGE,\n ),\n ...validationExtensions.presence(\n value,\n { ...formElement, required: true },\n 'Please complete the CAPTCHA successfully',\n ),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] =\n errorMessages[0]\n }\n }\n }\n break\n }\n case 'location': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a location',\n ),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'compliance': {\n const errorMessages = [\n ...validationExtensions.presence(value, formElement, 'Required'),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ...validateAttachments(\n (value as FormElementComplianceValue | undefined)?.files,\n ),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'checkboxes': {\n const optionsLength =\n formElementConditionallyShown?.type === 'formElement' &&\n formElementConditionallyShown?.options\n ? formElementConditionallyShown?.options?.length\n : formElement.options?.length\n const requiredAllDefaultMessage = 'All options are required'\n const errorMessages = validationExtensions.presence(\n value,\n {\n ...formElement,\n required:\n !!optionsLength &&\n (formElement.required || !!formElement.requiredAll),\n },\n formElement.requiredAll ? requiredAllDefaultMessage : 'Required',\n )\n if (formElement.requiredAll) {\n errorMessages.push(\n ...validators.length(value, {\n is: optionsLength,\n message:\n formElement.requiredMessage || requiredAllDefaultMessage,\n }),\n )\n }\n errorMessages.push(\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n )\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'abn':\n case 'geoscapeAddress':\n case 'pointCadastralParcel':\n case 'pointAddress':\n case 'pointAddressV3':\n case 'googleAddress':\n case 'civicaStreetName':\n case 'autocomplete':\n case 'radio':\n case 'select':\n case 'apiNSWLiquorLicence': {\n const errorMessages = [\n ...validationExtensions.presence(value, formElement, 'Required'),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'boolean': {\n const errorMessages = []\n if (value !== true && formElement.required) {\n errorMessages.push(formElement.requiredMessage || 'Required')\n }\n errorMessages.push(\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n )\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'bsb': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a BSB number',\n ),\n ...validators.regexValidation(value, {\n pattern: /\\d{3}-\\d{3}/,\n message: 'Please enter a valid BSB number',\n }),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'barcodeScanner': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please scan a barcode or enter a value',\n ),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'text':\n case 'textarea': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a value',\n ),\n ...validators.length(value, {\n minimum: formElement.minLength,\n tooShort:\n 'Please enter a value with at least %{count} character(s)',\n maximum: formElement.maxLength,\n tooLong:\n 'Please enter a value with %{count} character(s) or less',\n }),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'telephone': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a phone number',\n ),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'email': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter an email address',\n ),\n ...validators.email(value, {\n message: 'Please enter a valid email for this field',\n }),\n ...validationExtensions.regex(value, formElement),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n\n if (formElement.requiresConfirmation && !!value) {\n const confirmationFormElementName =\n generateConfirmationFormElementName(formElement)\n if (value !== submission?.[confirmationFormElementName]) {\n partialFormElementsValidation[confirmationFormElementName] =\n 'Email addresses do not match'\n }\n }\n break\n }\n case 'time': {\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a time',\n ),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'date': {\n const [fromDate, fromDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.fromDate,\n daysOffset: formElement.fromDateDaysOffset,\n referenceFormElementId: formElement.fromDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const [toDate, toDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.toDate,\n daysOffset: formElement.toDateDaysOffset,\n referenceFormElementId: formElement.toDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a date',\n ),\n ...validators.datetime(value, {\n dateOnly: true,\n format: (date: Date) => localisationService.formatDate(date),\n earliest: parseDateValue({\n dateOnly: true,\n daysOffset: fromDateDaysOffset,\n value: fromDate,\n }),\n latest: parseDateValue({\n dateOnly: true,\n daysOffset: toDateDaysOffset,\n value: toDate,\n }),\n notValid: 'Please select a valid date',\n tooEarly: 'Date cannot be before %{date}',\n tooLate: 'Date cannot be after %{date}',\n }),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'datetime': {\n const [fromDate, fromDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.fromDate,\n daysOffset: formElement.fromDateDaysOffset,\n referenceFormElementId: formElement.fromDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const [toDate, toDateDaysOffset] = getCleanDateRangeConfiguration(\n {\n date: formElement.toDate,\n daysOffset: formElement.toDateDaysOffset,\n referenceFormElementId: formElement.toDateElementId,\n },\n elements,\n submission,\n formElementsConditionallyShown,\n )\n\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please select a date and time',\n ),\n ...validators.datetime(value, {\n format: (v: Date) => localisationService.formatDatetime(v),\n earliest: parseDateValue({\n dateOnly: false,\n daysOffset: fromDateDaysOffset,\n value: fromDate,\n }),\n latest: parseDateValue({\n dateOnly: false,\n daysOffset: toDateDaysOffset,\n value: toDate,\n }),\n notValid: 'Please select a valid date and time',\n tooEarly: 'Date and time cannot be before %{date}',\n tooLate: 'Date and time cannot be after %{date}',\n }),\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n ]\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'number': {\n let minErrorMessage =\n 'Please enter a number greater than or equal to %{count}'\n let maxErrorMessage =\n 'Please enter a number less than or equal to %{count}'\n if (\n typeof formElement.minNumber === 'number' &&\n typeof formElement.maxNumber === 'number'\n ) {\n minErrorMessage =\n maxErrorMessage = `Please enter a number between ${formElement.minNumber} and ${formElement.maxNumber}`\n }\n\n const errorMessages = [\n ...validationExtensions.presence(\n value,\n formElement,\n 'Please enter a number',\n ),\n ...validators.numericality(value, {\n greaterThanOrEqualTo: formElement.minNumber,\n notGreaterThanOrEqualTo: minErrorMessage,\n lessThanOrEqualTo: formElement.maxNumber,\n notLessThanOrEqualTo: maxErrorMessage,\n onlyInteger: formElement.isInteger,\n notInteger: 'Please enter a whole number',\n notValid: 'Enter enter a valid number',\n }),\n ]\n if (\n formElement.regexPattern &&\n typeof value === 'number' &&\n !Number.isNaN(value)\n ) {\n errorMessages.push(\n ...validationExtensions.regex(value.toString(), formElement),\n )\n }\n errorMessages.push(\n ...validationExtensions.lookups({\n formElement,\n executedLookups,\n }),\n )\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'files': {\n const errorMessages = []\n if (formElement.minEntries) {\n errorMessages.push(\n ...validators.presence(value, {\n message: `Please upload at least ${\n formElement.minEntries\n } file${formElement.minEntries === 1 ? '' : 's'}`,\n }),\n )\n }\n errorMessages.push(\n ...validators.length(value, {\n minimum: formElement.minEntries,\n maximum: formElement.maxEntries,\n tooLong: 'Cannot upload more than %{count} file(s)',\n tooShort: 'Please upload at least %{count} file(s)',\n }),\n )\n\n if (\n Array.isArray(value) &&\n value.some((file) => {\n return !checkFileNameIsValid(formElement, file.fileName)\n })\n ) {\n errorMessages.push(\n `Only the following file types are accepted: ${(\n formElement.restrictedFileTypes ||\n fileUploadService.restrictedFileTypes\n ).join(', ')}`,\n )\n }\n\n errorMessages.push(...validateAttachments(value as undefined))\n\n const isValid =\n !Array.isArray(value) ||\n value.every((file) => {\n return checkFileNameExtensionIsValid(formElement, file.fileName)\n })\n if (!isValid) errorMessages.push('All files must have extensions')\n\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'repeatableSet': {\n const setErrorMessages: string[] = []\n // The entry count can only be corrected by adding or removing\n // entries, which requires the set itself to be editable. Its entries\n // are still validated below, as they may contain elements that are\n // listed even while the set is locked.\n if (\n editableFormElementIds === undefined ||\n checkIsFormElementIdEditable(\n formElement,\n editableFormElementIds,\n )\n ) {\n const minSetEntries = getCleanRepeatableSetConfiguration(\n formElement.minSetEntries,\n elements,\n submission,\n formElementsConditionallyShown,\n )\n const maxSetEntries = getCleanRepeatableSetConfiguration(\n formElement.maxSetEntries,\n elements,\n submission,\n formElementsConditionallyShown,\n )\n setErrorMessages.push(\n ...validators.length(value, {\n minimum: minSetEntries,\n maximum: maxSetEntries,\n tooLong: 'Cannot have more than %{count} entry/entries',\n tooShort: 'Must have at least %{count} entry/entries',\n }),\n )\n if (minSetEntries) {\n setErrorMessages.push(\n ...validators.presence(value, {\n message: `Must have at least ${minSetEntries} ${\n minSetEntries === 1 ? 'entry' : 'entries'\n }`,\n }),\n )\n }\n }\n\n const entries = Array.isArray(value) ? value : []\n\n const repeatableSetExecutedLookups =\n executedLookups !== undefined &&\n typeof executedLookups !== 'boolean' &&\n !Array.isArray(executedLookups) &&\n Array.isArray(executedLookups[formElement.name])\n ? executedLookups[formElement.name]\n : []\n\n const entryErrors = entries.reduce((errorsByIndex, entry, index) => {\n const entryValidation = validateSubmission({\n submission: entry,\n elements: formElement.elements as FormTypes.FormElementWithName[],\n executedLookups: Array.isArray(repeatableSetExecutedLookups)\n ? repeatableSetExecutedLookups[index]\n : {},\n formElementsConditionallyShown:\n formElementConditionallyShown?.type === 'repeatableSet'\n ? formElementConditionallyShown.entries[index.toString()]\n : undefined,\n captchaType,\n isOffline,\n audience,\n editableFormElementIds,\n })\n\n if (entryValidation) {\n errorsByIndex[index] = entryValidation\n }\n return errorsByIndex\n }, {})\n\n if (setErrorMessages.length || !isEmpty(entryErrors)) {\n partialFormElementsValidation[formElement.name] = {\n type: 'repeatableSet',\n set: setErrorMessages[0],\n entries: entryErrors,\n }\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(\n formElement,\n [],\n )\n const nestedFormValidation = validationExtensions.nestedElements(\n value,\n {\n formElement,\n formElements: nestedElements,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n audience,\n editableFormElementIds,\n },\n )\n if (nestedFormValidation) {\n partialFormElementsValidation[formElement.name] =\n nestedFormValidation\n }\n break\n }\n case 'infoPage':\n case 'form': {\n const nestedFormValidation = validationExtensions.nestedElements(\n value,\n {\n formElement,\n formElements:\n formElement.elements as FormTypes.FormElementWithName[],\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n audience,\n editableFormElementIds,\n },\n )\n if (nestedFormValidation) {\n partialFormElementsValidation[formElement.name] =\n nestedFormValidation\n }\n break\n }\n case 'freshdeskDependentField': {\n const nestedElements =\n generateFreshdeskDependentFieldElements(formElement)\n const nestedFormValidation = validationExtensions.nestedElements(\n value,\n {\n formElement,\n formElements: nestedElements,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n audience,\n editableFormElementIds,\n },\n )\n if (nestedFormValidation) {\n partialFormElementsValidation[formElement.name] =\n nestedFormValidation\n }\n break\n }\n case 'arcGISWebMap': {\n const arcGISWebMapElementValue = value as\n | ArcGISWebMapElementValue\n | undefined\n const errorMessages = validationExtensions.presence(\n arcGISWebMapElementValue?.userInput,\n formElement,\n 'Required',\n )\n const automatedSnapshotFileName =\n generateArcGISAutomatedSnapshotFileName(formElement)\n\n if (formElement.manualSnapshotsEnabled) {\n errorMessages.push(\n ...validators.length(\n (arcGISWebMapElementValue?.snapshotImages || []).filter(\n (snapshotImage) =>\n snapshotImage.fileName !== automatedSnapshotFileName,\n ),\n {\n minimum: formElement.minManualSnapshots,\n maximum: formElement.maxManualSnapshots,\n tooLong: 'Cannot capture more than %{count} image(s)',\n tooShort: 'Must capture at least %{count} image(s)',\n },\n ),\n )\n }\n\n errorMessages.push(\n ...validateAttachments(arcGISWebMapElementValue?.snapshotImages),\n )\n\n if (\n formElement.autoSnapshotViews?.length &&\n arcGISWebMapElementValue?.snapshotImages?.filter(\n (snapshotImage) =>\n snapshotImage.fileName == automatedSnapshotFileName,\n ).length !== formElement.autoSnapshotViews.length\n ) {\n errorMessages.push(\n `Please press the \"${formElement.autoSnapshotButton?.label || defaultAutoSnapshotButtonLabel}\" button`,\n )\n }\n\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n case 'lookupButton': {\n const errorMessages = validationExtensions.lookups({\n formElement: {\n ...formElement,\n required:\n typeof formElement.required === 'boolean'\n ? formElement.required\n : determineLookupButtonIsRequired(\n formElement.elementDependencies,\n elements,\n submission ? [submission] : [],\n ),\n },\n executedLookups,\n })\n if (errorMessages.length) {\n partialFormElementsValidation[formElement.name] = errorMessages[0]\n }\n break\n }\n default: {\n const never: never = formElement\n console.info('Unsupported form element with validation', never)\n }\n }\n\n return partialFormElementsValidation\n },\n {},\n )\n\n if (isEmpty(formElementsValidation)) {\n return\n }\n\n return formElementsValidation\n}\n"]}
|
package/dist/types/form.d.ts
CHANGED
|
@@ -19,6 +19,11 @@ export type ExecutedLookupValue = NonNullable<ExecutedLookups>[string];
|
|
|
19
19
|
type ValueChangeHandler<U extends Record<string, unknown>> = (element: FormTypes.FormElement, opts: U, idPrefix?: string) => void;
|
|
20
20
|
export type FormElementValueChangeHandler<T = unknown> = ValueChangeHandler<{
|
|
21
21
|
value?: T | ((existingValue?: T) => T | undefined);
|
|
22
|
+
/**
|
|
23
|
+
* When true, the value is written without treating it as a user edit (no
|
|
24
|
+
* unsaved-changes flag, last-element tracking, or auto-save).
|
|
25
|
+
*/
|
|
26
|
+
isDerivedChange?: boolean;
|
|
22
27
|
}>;
|
|
23
28
|
export type SectionState = NewS3SubmissionData['sectionState'];
|
|
24
29
|
export type NestedFormElementValueChangeHandler<T = unknown> = ValueChangeHandler<{
|
|
@@ -34,7 +39,15 @@ export type NestedFormElementValueChangeHandler<T = unknown> = ValueChangeHandle
|
|
|
34
39
|
* to undefined will not update the section state
|
|
35
40
|
*/
|
|
36
41
|
sectionState: SectionState | ((currentSectionState: SectionState) => SectionState);
|
|
42
|
+
/**
|
|
43
|
+
* When true, the value is written without treating it as a user edit (no
|
|
44
|
+
* unsaved-changes flag, last-element tracking, or auto-save).
|
|
45
|
+
*/
|
|
46
|
+
isDerivedChange?: boolean;
|
|
37
47
|
}>;
|
|
48
|
+
export type SetFormSubmissionOptions = {
|
|
49
|
+
isDerivedChange?: boolean;
|
|
50
|
+
};
|
|
38
51
|
export type FormElementLookupHandler = (setter: (data: {
|
|
39
52
|
submission: SubmissionTypes.S3SubmissionData['submission'];
|
|
40
53
|
elements: FormTypes.FormElement[];
|
|
@@ -45,15 +58,16 @@ export type FormElementLookupHandler = (setter: (data: {
|
|
|
45
58
|
submission: SubmissionTypes.S3SubmissionData['submission'];
|
|
46
59
|
elements: FormTypes.FormElement[];
|
|
47
60
|
executedLookups: ExecutedLookups;
|
|
48
|
-
}) => void;
|
|
61
|
+
}, options?: SetFormSubmissionOptions) => void;
|
|
49
62
|
export type UpdateFormElementsHandler = (setter: (element: FormTypes.FormElement[]) => FormTypes.FormElement[]) => void;
|
|
50
|
-
export type
|
|
63
|
+
export type FormSubmissionState = {
|
|
51
64
|
definition: FormTypes.Form;
|
|
52
65
|
submission: SubmissionTypes.S3SubmissionData['submission'];
|
|
53
66
|
lastElementUpdated: FormTypes.FormElement | undefined;
|
|
54
67
|
executedLookups: ExecutedLookups;
|
|
55
68
|
sectionState: SectionState | undefined;
|
|
56
|
-
}
|
|
69
|
+
};
|
|
70
|
+
export type SetFormSubmission = (value: React.SetStateAction<FormSubmissionState>, options?: SetFormSubmissionOptions) => void;
|
|
57
71
|
export type IsDirtyProps = {
|
|
58
72
|
isDirty: boolean;
|
|
59
73
|
setIsDirty: () => void;
|
package/dist/types/form.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/types/form.ts"],"names":[],"mappings":"","sourcesContent":["import { FormTypes, SubmissionTypes, IntegrationTypes } from '@oneblink/types'\nimport { NewS3SubmissionData } from '@oneblink/types/typescript/submissions'\n\nexport {\n FormElementConditionallyShownElement,\n FormElementConditionallyShown,\n FormElementsConditionallyShown,\n} from '@oneblink/sdk-core/dist/conditionalLogicService'\n\nexport type FormElementKey = string\nexport type RepeatableSetEntryIndex = string\n\nexport type FormElementsValidation = Record<\n FormElementKey,\n FormElementValidation\n>\n\nexport type FormElementValidation =\n | undefined\n | string\n | {\n type: 'formElements'\n formElements: FormElementsValidation | undefined\n }\n | {\n type: 'repeatableSet'\n set: string | undefined\n entries: Record<\n RepeatableSetEntryIndex,\n FormElementsValidation | undefined\n >\n }\n\nexport type ExecutedLookups =\n | {\n [elementName: string]:\n | boolean\n | ExecutedLookups\n | ExecutedLookups[]\n | undefined\n }\n | undefined\n\nexport type ExecutedLookupValue = NonNullable<ExecutedLookups>[string]\n\ntype ValueChangeHandler<U extends Record<string, unknown>> = (\n element: FormTypes.FormElement,\n opts: U,\n idPrefix?: string,\n) => void\n\nexport type FormElementValueChangeHandler<T = unknown> = ValueChangeHandler<{\n value?: T | ((existingValue?: T) => T | undefined)\n}>\n\nexport type SectionState = NewS3SubmissionData['sectionState']\n\nexport type NestedFormElementValueChangeHandler<T = unknown> =\n ValueChangeHandler<{\n value?: T | ((existingValue?: T) => T | undefined)\n /**\n * The executed lookups to preserve when the nested element is changed,\n * setting to undefined indicate the lookup has not been executed.\n */\n executedLookups:\n | ExecutedLookupValue\n | ((currentExecutedLookups: ExecutedLookupValue) => ExecutedLookupValue)\n deleteSection?: boolean\n /**\n * The section state to preserve when the nested element is changed, setting\n * to undefined will not update the section state\n */\n sectionState:\n | SectionState\n | ((currentSectionState: SectionState) => SectionState)\n }>\n\nexport type FormElementLookupHandler = (\n setter: (data: {\n submission: SubmissionTypes.S3SubmissionData['submission']\n elements: FormTypes.FormElement[]\n lastElementUpdated: FormTypes.FormElement | undefined\n executedLookups: ExecutedLookups\n sectionState: SectionState | undefined\n }) => {\n submission: SubmissionTypes.S3SubmissionData['submission']\n elements: FormTypes.FormElement[]\n executedLookups: ExecutedLookups\n },\n) => void\n\nexport type UpdateFormElementsHandler = (\n setter: (element: FormTypes.FormElement[]) => FormTypes.FormElement[],\n) => void\n\nexport type
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/types/form.ts"],"names":[],"mappings":"","sourcesContent":["import { FormTypes, SubmissionTypes, IntegrationTypes } from '@oneblink/types'\nimport { NewS3SubmissionData } from '@oneblink/types/typescript/submissions'\n\nexport {\n FormElementConditionallyShownElement,\n FormElementConditionallyShown,\n FormElementsConditionallyShown,\n} from '@oneblink/sdk-core/dist/conditionalLogicService'\n\nexport type FormElementKey = string\nexport type RepeatableSetEntryIndex = string\n\nexport type FormElementsValidation = Record<\n FormElementKey,\n FormElementValidation\n>\n\nexport type FormElementValidation =\n | undefined\n | string\n | {\n type: 'formElements'\n formElements: FormElementsValidation | undefined\n }\n | {\n type: 'repeatableSet'\n set: string | undefined\n entries: Record<\n RepeatableSetEntryIndex,\n FormElementsValidation | undefined\n >\n }\n\nexport type ExecutedLookups =\n | {\n [elementName: string]:\n | boolean\n | ExecutedLookups\n | ExecutedLookups[]\n | undefined\n }\n | undefined\n\nexport type ExecutedLookupValue = NonNullable<ExecutedLookups>[string]\n\ntype ValueChangeHandler<U extends Record<string, unknown>> = (\n element: FormTypes.FormElement,\n opts: U,\n idPrefix?: string,\n) => void\n\nexport type FormElementValueChangeHandler<T = unknown> = ValueChangeHandler<{\n value?: T | ((existingValue?: T) => T | undefined)\n /**\n * When true, the value is written without treating it as a user edit (no\n * unsaved-changes flag, last-element tracking, or auto-save).\n */\n isDerivedChange?: boolean\n}>\n\nexport type SectionState = NewS3SubmissionData['sectionState']\n\nexport type NestedFormElementValueChangeHandler<T = unknown> =\n ValueChangeHandler<{\n value?: T | ((existingValue?: T) => T | undefined)\n /**\n * The executed lookups to preserve when the nested element is changed,\n * setting to undefined indicate the lookup has not been executed.\n */\n executedLookups:\n | ExecutedLookupValue\n | ((currentExecutedLookups: ExecutedLookupValue) => ExecutedLookupValue)\n deleteSection?: boolean\n /**\n * The section state to preserve when the nested element is changed, setting\n * to undefined will not update the section state\n */\n sectionState:\n | SectionState\n | ((currentSectionState: SectionState) => SectionState)\n /**\n * When true, the value is written without treating it as a user edit (no\n * unsaved-changes flag, last-element tracking, or auto-save).\n */\n isDerivedChange?: boolean\n }>\n\nexport type SetFormSubmissionOptions = {\n isDerivedChange?: boolean\n}\n\nexport type FormElementLookupHandler = (\n setter: (data: {\n submission: SubmissionTypes.S3SubmissionData['submission']\n elements: FormTypes.FormElement[]\n lastElementUpdated: FormTypes.FormElement | undefined\n executedLookups: ExecutedLookups\n sectionState: SectionState | undefined\n }) => {\n submission: SubmissionTypes.S3SubmissionData['submission']\n elements: FormTypes.FormElement[]\n executedLookups: ExecutedLookups\n },\n options?: SetFormSubmissionOptions,\n) => void\n\nexport type UpdateFormElementsHandler = (\n setter: (element: FormTypes.FormElement[]) => FormTypes.FormElement[],\n) => void\n\nexport type FormSubmissionState = {\n definition: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n lastElementUpdated: FormTypes.FormElement | undefined\n executedLookups: ExecutedLookups\n sectionState: SectionState | undefined\n}\n\nexport type SetFormSubmission = (\n value: React.SetStateAction<FormSubmissionState>,\n options?: SetFormSubmissionOptions,\n) => void\n\nexport type IsDirtyProps = {\n isDirty: boolean\n setIsDirty: () => void\n}\n\nexport type CaptchaType = NonNullable<\n IntegrationTypes.IntegrationRecaptcha['configuration']['domains'][number]['type']\n>\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { FormTypes } from '@oneblink/types';
|
|
2
|
+
type FormElementWithEditability = FormTypes.FormElement | FormTypes.LookupFormElement;
|
|
3
|
+
export declare function checkIsFormElementIdEditable(element: FormElementWithEditability, editableFormElementIds?: string[]): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Whether this element, or anything nested inside it, can be changed.
|
|
6
|
+
*
|
|
7
|
+
* When `editableFormElementIds` is omitted, every element is treated as
|
|
8
|
+
* editable. When it is provided, only listed ids and containers that wrap them
|
|
9
|
+
* are editable. Used to skip validating what the user has no way to correct.
|
|
10
|
+
*/
|
|
11
|
+
export declare function checkIsFormElementEditable(element: FormElementWithEditability, editableFormElementIds?: string[]): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Whether a form element’s own controls should be locked.
|
|
14
|
+
*
|
|
15
|
+
* An id in `editableFormElementIds` always wins. When that list is provided,
|
|
16
|
+
* every other element is locked (whitelist). Otherwise the whole-form read-only
|
|
17
|
+
* flag and the element’s own `readOnly` apply.
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkIsFormElementReadOnly(element: FormElementWithEditability, { isFormReadOnly, isInheritedReadOnly, editableFormElementIds, }?: {
|
|
20
|
+
isFormReadOnly?: boolean;
|
|
21
|
+
isInheritedReadOnly?: boolean;
|
|
22
|
+
editableFormElementIds?: string[];
|
|
23
|
+
}): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Whether lookups (and reverse geocode) must not run for this element.
|
|
26
|
+
*
|
|
27
|
+
* Definition `readOnly` and inherited container locks still allow submitter
|
|
28
|
+
* lookups from prefills, defaults, and chained lookup buttons. Lookups are
|
|
29
|
+
* blocked on a read-only form, or when a whitelist is provided and this id is
|
|
30
|
+
* not on it (an approver must not re-run a lookup that could overwrite
|
|
31
|
+
* persisted answers). An id in the whitelist always wins.
|
|
32
|
+
*/
|
|
33
|
+
export declare function checkAreLookupsDisallowed(element: FormElementWithEditability, { isFormReadOnly, editableFormElementIds, }?: {
|
|
34
|
+
isFormReadOnly?: boolean;
|
|
35
|
+
editableFormElementIds?: string[];
|
|
36
|
+
}): boolean;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export function checkIsFormElementIdEditable(element, editableFormElementIds) {
|
|
2
|
+
return (editableFormElementIds === null || editableFormElementIds === void 0 ? void 0 : editableFormElementIds.includes(element.id)) === true;
|
|
3
|
+
}
|
|
4
|
+
function checkHasEditableFormElement(elements, editableFormElementIds) {
|
|
5
|
+
return elements.some((element) => checkIsFormElementIdEditable(element, editableFormElementIds) ||
|
|
6
|
+
('elements' in element &&
|
|
7
|
+
Array.isArray(element.elements) &&
|
|
8
|
+
checkHasEditableFormElement(element.elements, editableFormElementIds)));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Whether this element, or anything nested inside it, can be changed.
|
|
12
|
+
*
|
|
13
|
+
* When `editableFormElementIds` is omitted, every element is treated as
|
|
14
|
+
* editable. When it is provided, only listed ids and containers that wrap them
|
|
15
|
+
* are editable. Used to skip validating what the user has no way to correct.
|
|
16
|
+
*/
|
|
17
|
+
export function checkIsFormElementEditable(element, editableFormElementIds) {
|
|
18
|
+
if (editableFormElementIds === undefined) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
return (checkIsFormElementIdEditable(element, editableFormElementIds) ||
|
|
22
|
+
('elements' in element &&
|
|
23
|
+
Array.isArray(element.elements) &&
|
|
24
|
+
checkHasEditableFormElement(element.elements, editableFormElementIds)));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Whether a form element’s own controls should be locked.
|
|
28
|
+
*
|
|
29
|
+
* An id in `editableFormElementIds` always wins. When that list is provided,
|
|
30
|
+
* every other element is locked (whitelist). Otherwise the whole-form read-only
|
|
31
|
+
* flag and the element’s own `readOnly` apply.
|
|
32
|
+
*/
|
|
33
|
+
export function checkIsFormElementReadOnly(element, { isFormReadOnly, isInheritedReadOnly, editableFormElementIds, } = {}) {
|
|
34
|
+
if (checkIsFormElementIdEditable(element, editableFormElementIds)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (editableFormElementIds !== undefined) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (isFormReadOnly || isInheritedReadOnly) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return 'readOnly' in element && element.readOnly === true;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Whether lookups (and reverse geocode) must not run for this element.
|
|
47
|
+
*
|
|
48
|
+
* Definition `readOnly` and inherited container locks still allow submitter
|
|
49
|
+
* lookups from prefills, defaults, and chained lookup buttons. Lookups are
|
|
50
|
+
* blocked on a read-only form, or when a whitelist is provided and this id is
|
|
51
|
+
* not on it (an approver must not re-run a lookup that could overwrite
|
|
52
|
+
* persisted answers). An id in the whitelist always wins.
|
|
53
|
+
*/
|
|
54
|
+
export function checkAreLookupsDisallowed(element, { isFormReadOnly, editableFormElementIds, } = {}) {
|
|
55
|
+
if (checkIsFormElementIdEditable(element, editableFormElementIds)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (editableFormElementIds !== undefined) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return isFormReadOnly === true;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=read-only-form-elements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-only-form-elements.js","sourceRoot":"","sources":["../../src/utils/read-only-form-elements.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,4BAA4B,CAC1C,OAAmC,EACnC,sBAAiC;IAEjC,OAAO,CAAA,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,MAAK,IAAI,CAAA;AAC9D,CAAC;AAED,SAAS,2BAA2B,CAClC,QAAiC,EACjC,sBAAiC;IAEjC,OAAO,QAAQ,CAAC,IAAI,CAClB,CAAC,OAAO,EAAE,EAAE,CACV,4BAA4B,CAAC,OAAO,EAAE,sBAAsB,CAAC;QAC7D,CAAC,UAAU,IAAI,OAAO;YACpB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC/B,2BAA2B,CACzB,OAAO,CAAC,QAAQ,EAChB,sBAAsB,CACvB,CAAC,CACP,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAmC,EACnC,sBAAiC;IAEjC,IAAI,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CACL,4BAA4B,CAAC,OAAO,EAAE,sBAAsB,CAAC;QAC7D,CAAC,UAAU,IAAI,OAAO;YACpB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC/B,2BAA2B,CAAC,OAAO,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CACzE,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAmC,EACnC,EACE,cAAc,EACd,mBAAmB,EACnB,sBAAsB,MAKpB,EAAE;IAEN,IAAI,4BAA4B,CAAC,OAAO,EAAE,sBAAsB,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,cAAc,IAAI,mBAAmB,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,UAAU,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAA;AAC3D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAmC,EACnC,EACE,cAAc,EACd,sBAAsB,MAIpB,EAAE;IAEN,IAAI,4BAA4B,CAAC,OAAO,EAAE,sBAAsB,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,cAAc,KAAK,IAAI,CAAA;AAChC,CAAC","sourcesContent":["import { FormTypes } from '@oneblink/types'\r\n\r\ntype FormElementWithEditability =\r\n | FormTypes.FormElement\r\n | FormTypes.LookupFormElement\r\n\r\nexport function checkIsFormElementIdEditable(\r\n element: FormElementWithEditability,\r\n editableFormElementIds?: string[],\r\n): boolean {\r\n return editableFormElementIds?.includes(element.id) === true\r\n}\r\n\r\nfunction checkHasEditableFormElement(\r\n elements: FormTypes.FormElement[],\r\n editableFormElementIds?: string[],\r\n): boolean {\r\n return elements.some(\r\n (element) =>\r\n checkIsFormElementIdEditable(element, editableFormElementIds) ||\r\n ('elements' in element &&\r\n Array.isArray(element.elements) &&\r\n checkHasEditableFormElement(\r\n element.elements,\r\n editableFormElementIds,\r\n )),\r\n )\r\n}\r\n\r\n/**\r\n * Whether this element, or anything nested inside it, can be changed.\r\n *\r\n * When `editableFormElementIds` is omitted, every element is treated as\r\n * editable. When it is provided, only listed ids and containers that wrap them\r\n * are editable. Used to skip validating what the user has no way to correct.\r\n */\r\nexport function checkIsFormElementEditable(\r\n element: FormElementWithEditability,\r\n editableFormElementIds?: string[],\r\n): boolean {\r\n if (editableFormElementIds === undefined) {\r\n return true\r\n }\r\n\r\n return (\r\n checkIsFormElementIdEditable(element, editableFormElementIds) ||\r\n ('elements' in element &&\r\n Array.isArray(element.elements) &&\r\n checkHasEditableFormElement(element.elements, editableFormElementIds))\r\n )\r\n}\r\n\r\n/**\r\n * Whether a form element’s own controls should be locked.\r\n *\r\n * An id in `editableFormElementIds` always wins. When that list is provided,\r\n * every other element is locked (whitelist). Otherwise the whole-form read-only\r\n * flag and the element’s own `readOnly` apply.\r\n */\r\nexport function checkIsFormElementReadOnly(\r\n element: FormElementWithEditability,\r\n {\r\n isFormReadOnly,\r\n isInheritedReadOnly,\r\n editableFormElementIds,\r\n }: {\r\n isFormReadOnly?: boolean\r\n isInheritedReadOnly?: boolean\r\n editableFormElementIds?: string[]\r\n } = {},\r\n): boolean {\r\n if (checkIsFormElementIdEditable(element, editableFormElementIds)) {\r\n return false\r\n }\r\n\r\n if (editableFormElementIds !== undefined) {\r\n return true\r\n }\r\n\r\n if (isFormReadOnly || isInheritedReadOnly) {\r\n return true\r\n }\r\n\r\n return 'readOnly' in element && element.readOnly === true\r\n}\r\n\r\n/**\r\n * Whether lookups (and reverse geocode) must not run for this element.\r\n *\r\n * Definition `readOnly` and inherited container locks still allow submitter\r\n * lookups from prefills, defaults, and chained lookup buttons. Lookups are\r\n * blocked on a read-only form, or when a whitelist is provided and this id is\r\n * not on it (an approver must not re-run a lookup that could overwrite\r\n * persisted answers). An id in the whitelist always wins.\r\n */\r\nexport function checkAreLookupsDisallowed(\r\n element: FormElementWithEditability,\r\n {\r\n isFormReadOnly,\r\n editableFormElementIds,\r\n }: {\r\n isFormReadOnly?: boolean\r\n editableFormElementIds?: string[]\r\n } = {},\r\n): boolean {\r\n if (checkIsFormElementIdEditable(element, editableFormElementIds)) {\r\n return false\r\n }\r\n\r\n if (editableFormElementIds !== undefined) {\r\n return true\r\n }\r\n\r\n return isFormReadOnly === true\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oneblink/apps-react",
|
|
3
3
|
"description": "Helper functions for OneBlink apps in ReactJS.",
|
|
4
|
-
"version": "13.0.0-beta.
|
|
4
|
+
"version": "13.0.0-beta.10",
|
|
5
5
|
"author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/oneblink/apps-react/issues"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"@emotion/styled": "^11.14.1",
|
|
14
14
|
"@nylas/react": "^3.1.2",
|
|
15
15
|
"@oneblink/sdk-core": "^10.1.0-beta.9",
|
|
16
|
-
"@oneblink/storage": "^9.0.0-beta.
|
|
16
|
+
"@oneblink/storage": "^9.0.0-beta.4",
|
|
17
17
|
"@react-google-maps/api": "^2.20.8",
|
|
18
18
|
"@react-input/mask": "^2.0.4",
|
|
19
19
|
"@sentry/browser": "^10.38.0",
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"@types/lodash.orderby": "^4.6.9",
|
|
69
69
|
"@types/lodash.throttle": "^4.1.9",
|
|
70
70
|
"@types/react": "^19.2.13",
|
|
71
|
+
"@types/react-dom": "^19.2.5",
|
|
71
72
|
"@types/react-google-recaptcha": "^2.1.9",
|
|
72
73
|
"@types/react-router-dom": "^5.3.3",
|
|
73
74
|
"@types/react-signature-canvas": "^1.0.7",
|
|
@@ -140,6 +141,6 @@
|
|
|
140
141
|
"test": "vitest",
|
|
141
142
|
"types": "npm i -D github:oneblink/types",
|
|
142
143
|
"typescript": "tsc --noEmit",
|
|
143
|
-
"update-dependents": "oneblink-release update-dependents --force"
|
|
144
|
+
"update-dependents": "oneblink-release update-dependents --force-update-dependency"
|
|
144
145
|
}
|
|
145
146
|
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { FormTypes } from '@oneblink/types';
|
|
2
|
-
type ElementWithEditability = FormTypes.FormElement | FormTypes.LookupFormElement;
|
|
3
|
-
export declare function isApproverEditable(element: ElementWithEditability): boolean;
|
|
4
|
-
/**
|
|
5
|
-
* Whether an audience can change this element or anything nested inside it.
|
|
6
|
-
*
|
|
7
|
-
* Approvers may only edit elements configured for approver editing, so a
|
|
8
|
-
* subtree containing none of them is entirely locked for them. Used to skip
|
|
9
|
-
* validating what an audience has no way to correct.
|
|
10
|
-
*/
|
|
11
|
-
export declare function isElementEditableForAudience(element: ElementWithEditability, audience: FormTypes.FormElementHiddenFromAudience): boolean;
|
|
12
|
-
/**
|
|
13
|
-
* Determine whether a form element should be read only for a given audience.
|
|
14
|
-
*
|
|
15
|
-
* Approvers may only edit elements explicitly configured for approver editing,
|
|
16
|
-
* so every other input is locked. Nested form and info page elements stay
|
|
17
|
-
* interactive while they contain an approver editable element.
|
|
18
|
-
*/
|
|
19
|
-
export default function isElementReadOnlyForAudience(element: ElementWithEditability, audience: FormTypes.FormElementHiddenFromAudience): boolean;
|
|
20
|
-
export {};
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
export function isApproverEditable(element) {
|
|
2
|
-
var _a;
|
|
3
|
-
return ('approverEditability' in element &&
|
|
4
|
-
((_a = element.approverEditability) === null || _a === void 0 ? void 0 : _a.type) === 'ALL_STEPS');
|
|
5
|
-
}
|
|
6
|
-
function hasApproverEditableElement(elements) {
|
|
7
|
-
return elements.some((element) => isApproverEditable(element) ||
|
|
8
|
-
('elements' in element &&
|
|
9
|
-
Array.isArray(element.elements) &&
|
|
10
|
-
hasApproverEditableElement(element.elements)));
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Whether an audience can change this element or anything nested inside it.
|
|
14
|
-
*
|
|
15
|
-
* Approvers may only edit elements configured for approver editing, so a
|
|
16
|
-
* subtree containing none of them is entirely locked for them. Used to skip
|
|
17
|
-
* validating what an audience has no way to correct.
|
|
18
|
-
*/
|
|
19
|
-
export function isElementEditableForAudience(element, audience) {
|
|
20
|
-
if (audience !== 'APPROVER') {
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
return (isApproverEditable(element) ||
|
|
24
|
-
('elements' in element &&
|
|
25
|
-
Array.isArray(element.elements) &&
|
|
26
|
-
hasApproverEditableElement(element.elements)));
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Determine whether a form element should be read only for a given audience.
|
|
30
|
-
*
|
|
31
|
-
* Approvers may only edit elements explicitly configured for approver editing,
|
|
32
|
-
* so every other input is locked. Nested form and info page elements stay
|
|
33
|
-
* interactive while they contain an approver editable element.
|
|
34
|
-
*/
|
|
35
|
-
export default function isElementReadOnlyForAudience(element, audience) {
|
|
36
|
-
if (audience !== 'APPROVER') {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
if ('type' in element &&
|
|
40
|
-
(element.type === 'form' || element.type === 'infoPage')) {
|
|
41
|
-
return (!isApproverEditable(element) &&
|
|
42
|
-
!hasApproverEditableElement(element.elements || []));
|
|
43
|
-
}
|
|
44
|
-
return !isApproverEditable(element);
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=isElementReadOnlyForAudience.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"isElementReadOnlyForAudience.js","sourceRoot":"","sources":["../../src/services/isElementReadOnlyForAudience.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,kBAAkB,CAAC,OAA+B;;IAChE,OAAO,CACL,qBAAqB,IAAI,OAAO;QAChC,CAAA,MAAA,OAAO,CAAC,mBAAmB,0CAAE,IAAI,MAAK,WAAW,CAClD,CAAA;AACH,CAAC;AAED,SAAS,0BAA0B,CACjC,QAAiC;IAEjC,OAAO,QAAQ,CAAC,IAAI,CAClB,CAAC,OAAO,EAAE,EAAE,CACV,kBAAkB,CAAC,OAAO,CAAC;QAC3B,CAAC,UAAU,IAAI,OAAO;YACpB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC/B,0BAA0B,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAClD,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAA+B,EAC/B,QAAiD;IAEjD,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CACL,kBAAkB,CAAC,OAAO,CAAC;QAC3B,CAAC,UAAU,IAAI,OAAO;YACpB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC/B,0BAA0B,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAChD,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAClD,OAA+B,EAC/B,QAAiD;IAEjD,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IACE,MAAM,IAAI,OAAO;QACjB,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,EACxD,CAAC;QACD,OAAO,CACL,CAAC,kBAAkB,CAAC,OAAO,CAAC;YAC5B,CAAC,0BAA0B,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CACpD,CAAA;IACH,CAAC;IAED,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC","sourcesContent":["import { FormTypes } from '@oneblink/types'\r\n\r\ntype ElementWithEditability =\r\n | FormTypes.FormElement\r\n | FormTypes.LookupFormElement\r\n\r\nexport function isApproverEditable(element: ElementWithEditability): boolean {\r\n return (\r\n 'approverEditability' in element &&\r\n element.approverEditability?.type === 'ALL_STEPS'\r\n )\r\n}\r\n\r\nfunction hasApproverEditableElement(\r\n elements: FormTypes.FormElement[],\r\n): boolean {\r\n return elements.some(\r\n (element) =>\r\n isApproverEditable(element) ||\r\n ('elements' in element &&\r\n Array.isArray(element.elements) &&\r\n hasApproverEditableElement(element.elements)),\r\n )\r\n}\r\n\r\n/**\r\n * Whether an audience can change this element or anything nested inside it.\r\n *\r\n * Approvers may only edit elements configured for approver editing, so a\r\n * subtree containing none of them is entirely locked for them. Used to skip\r\n * validating what an audience has no way to correct.\r\n */\r\nexport function isElementEditableForAudience(\r\n element: ElementWithEditability,\r\n audience: FormTypes.FormElementHiddenFromAudience,\r\n): boolean {\r\n if (audience !== 'APPROVER') {\r\n return true\r\n }\r\n\r\n return (\r\n isApproverEditable(element) ||\r\n ('elements' in element &&\r\n Array.isArray(element.elements) &&\r\n hasApproverEditableElement(element.elements))\r\n )\r\n}\r\n\r\n/**\r\n * Determine whether a form element should be read only for a given audience.\r\n *\r\n * Approvers may only edit elements explicitly configured for approver editing,\r\n * so every other input is locked. Nested form and info page elements stay\r\n * interactive while they contain an approver editable element.\r\n */\r\nexport default function isElementReadOnlyForAudience(\r\n element: ElementWithEditability,\r\n audience: FormTypes.FormElementHiddenFromAudience,\r\n): boolean {\r\n if (audience !== 'APPROVER') {\r\n return false\r\n }\r\n\r\n if (\r\n 'type' in element &&\r\n (element.type === 'form' || element.type === 'infoPage')\r\n ) {\r\n return (\r\n !isApproverEditable(element) &&\r\n !hasApproverEditableElement(element.elements || [])\r\n )\r\n }\r\n\r\n return !isApproverEditable(element)\r\n}\r\n"]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { FormTypes } from '@oneblink/types';
|
|
2
|
-
/**
|
|
3
|
-
* Whether a form element’s own controls should be locked for a given audience.
|
|
4
|
-
*
|
|
5
|
-
* `approverEditability` wins over the element’s `readOnly` flag for approvers,
|
|
6
|
-
* so a field can be locked for submitters and still editable during review.
|
|
7
|
-
* Whole-form read-only (`useFormIsReadOnly`) is applied by the renderer, not
|
|
8
|
-
* here.
|
|
9
|
-
*/
|
|
10
|
-
export default function resolveFormElementReadOnly(element: FormTypes.FormElement, audience: FormTypes.FormElementHiddenFromAudience): boolean;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import isElementReadOnlyForAudience, { isApproverEditable, } from './isElementReadOnlyForAudience';
|
|
2
|
-
/**
|
|
3
|
-
* Whether a form element’s own controls should be locked for a given audience.
|
|
4
|
-
*
|
|
5
|
-
* `approverEditability` wins over the element’s `readOnly` flag for approvers,
|
|
6
|
-
* so a field can be locked for submitters and still editable during review.
|
|
7
|
-
* Whole-form read-only (`useFormIsReadOnly`) is applied by the renderer, not
|
|
8
|
-
* here.
|
|
9
|
-
*/
|
|
10
|
-
export default function resolveFormElementReadOnly(element, audience) {
|
|
11
|
-
if (audience === 'APPROVER' && isApproverEditable(element)) {
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
return (('readOnly' in element && element.readOnly === true) ||
|
|
15
|
-
isElementReadOnlyForAudience(element, audience));
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=resolveFormElementReadOnly.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolveFormElementReadOnly.js","sourceRoot":"","sources":["../../src/services/resolveFormElementReadOnly.ts"],"names":[],"mappings":"AACA,OAAO,4BAA4B,EAAE,EACnC,kBAAkB,GACnB,MAAM,gCAAgC,CAAA;AAEvC;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAChD,OAA8B,EAC9B,QAAiD;IAEjD,IAAI,QAAQ,KAAK,UAAU,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,CACL,CAAC,UAAU,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC;QACpD,4BAA4B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAChD,CAAA;AACH,CAAC","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport isElementReadOnlyForAudience, {\n isApproverEditable,\n} from './isElementReadOnlyForAudience'\n\n/**\n * Whether a form element’s own controls should be locked for a given audience.\n *\n * `approverEditability` wins over the element’s `readOnly` flag for approvers,\n * so a field can be locked for submitters and still editable during review.\n * Whole-form read-only (`useFormIsReadOnly`) is applied by the renderer, not\n * here.\n */\nexport default function resolveFormElementReadOnly(\n element: FormTypes.FormElement,\n audience: FormTypes.FormElementHiddenFromAudience,\n): boolean {\n if (audience === 'APPROVER' && isApproverEditable(element)) {\n return false\n }\n\n return (\n ('readOnly' in element && element.readOnly === true) ||\n isElementReadOnlyForAudience(element, audience)\n )\n}\n"]}
|