@oneblink/apps-react 8.7.0-beta.2 → 8.7.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.
@@ -42,6 +42,7 @@ import { sendGoogleAnalyticsEvent } from './utils/sendGoogleAnalyticsEvent';
42
42
  import { useUserProfileForInjectablesOutsideContext } from './hooks/useUserProfileForInjectables';
43
43
  import OneBlinkFormFooter from './components/OneBlinkFormFooter';
44
44
  import { ValidationIconConfigurationContext } from './hooks/useValidationIconConfiguration';
45
+ import { FormSubmissionModelContextProvider } from './hooks/useFormSubmissionModelContext';
45
46
  function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captchaSiteKey, definition, disabled, isPreview, submission, isReadOnly, onCancel, onSubmit, onSaveDraft, setFormSubmission, buttons, validationIcon, primaryColour, attachmentRetentionInDays, isPendingQueueEnabled, handleNavigateAway, isInfoPage: isInfoPageProp, lastElementUpdated, executedLookups, task, taskGroup, taskGroupInstance, onUploadAttachment, captchaType, shouldUseNavigableValidationErrorsNotification = true, navigableValidationErrorsNotificationSettings, replaceInjectablesOverrides, sectionState, }) {
46
47
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
47
48
  const isOffline = useIsOffline();
@@ -787,7 +788,8 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
787
788
  React.createElement(CustomisableButtonInner, { label: isInfoPage
788
789
  ? 'Done'
789
790
  : ((_e = buttons === null || buttons === void 0 ? void 0 : buttons.submit) === null || _e === void 0 ? void 0 : _e.label) || 'Submit', icon: (_f = buttons === null || buttons === void 0 ? void 0 : buttons.submit) === null || _f === void 0 ? void 0 : _f.icon })))))))),
790
- !!((_g = definition.footer) === null || _g === void 0 ? void 0 : _g.html) && (React.createElement(OneBlinkFormFooter, { footer: (_h = definition.footer) === null || _h === void 0 ? void 0 : _h.html })),
791
+ !!((_g = definition.footer) === null || _g === void 0 ? void 0 : _g.html) && (React.createElement(FormSubmissionModelContextProvider, { elements: definition.elements, model: submission, formElementsConditionallyShown: formElementsConditionallyShown },
792
+ React.createElement(OneBlinkFormFooter, { footer: (_h = definition.footer) === null || _h === void 0 ? void 0 : _h.html }))),
791
793
  !isReadOnly && !isPreview && (React.createElement(React.Fragment, null,
792
794
  React.createElement(Prompt, { when: isDirty && !isNavigationAllowed, message: handleBlockedNavigation }),
793
795
  React.createElement(Modal, { isOpen: hasConfirmedNavigation === false, title: "Unsaved Changes", cardClassName: "cypress-cancel-confirm", titleClassName: "cypress-cancel-confirm-title", bodyClassName: "cypress-cancel-confirm-body", actions: React.createElement(React.Fragment, null,
@@ -1 +1 @@
1
- {"version":3,"file":"OneBlinkFormBase.js","sourceRoot":"","sources":["../src/OneBlinkFormBase.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { createTheme as createMuiTheme, ThemeProvider } from '@mui/material'\nimport Tooltip from './components/renderer/Tooltip'\nimport { Prompt, useHistory } from 'react-router-dom'\nimport clsx from 'clsx'\nimport * as bulmaToast from 'bulma-toast'\nimport {\n localisationService,\n submissionService,\n attachmentsService,\n} from '@oneblink/apps'\nimport {\n EnvironmentTypes,\n FormTypes,\n FormsAppsTypes,\n ScheduledTasksTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport * as H from 'history'\nimport { LocalizationProvider } from '@mui/x-date-pickers'\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'\n\nimport Modal from './components/renderer/Modal'\nimport cleanFormSubmissionModel from './services/cleanFormSubmissionModel'\nimport PageFormElements from './components/renderer/PageFormElements'\nimport useFormValidation from './hooks/useFormValidation'\nimport useConditionalLogic from './hooks/useConditionalLogic'\nimport usePages from './hooks/usePages'\nimport useLookups from './hooks/useLookups'\nimport { FormDefinitionContext } from './hooks/useFormDefinition'\nimport {\n ReplaceInjectablesOverridesContext,\n ReplaceInjectablesOverrides,\n} from './hooks/useReplaceInjectablesOverrides'\nimport { InjectPagesContext } from './hooks/useInjectPages'\nimport { FormElementOptionsContextProvider } from './hooks/useDynamicOptionsLoaderState'\nimport { FormElementLookupsContextProvider } from './hooks/useFormElementLookups'\nimport { OneBlinkFormContainerContext } from './hooks/useOneBlinkFormContainer'\nimport { GoogleMapsApiKeyContext } from './hooks/useGoogleMapsApiKey'\nimport { AbnLookupAuthenticationGuidContext } from './hooks/useAbnLookupAuthenticationGuid'\nimport { CaptchaContext } from './hooks/useCaptcha'\nimport { FormIsReadOnlyContext } from './hooks/useFormIsReadOnly'\nimport { AttachmentBlobsProvider } from './hooks/attachments/useAttachmentBlobs'\nimport useIsOffline from './hooks/useIsOffline'\nimport CustomisableButtonInner from './components/renderer/CustomisableButtonInner'\nimport {\n CaptchaType,\n ExecutedLookups,\n FormElementsValidation,\n NestedFormElementValueChangeHandler,\n SetFormSubmission,\n SectionState,\n} from './types/form'\nimport checkBsbsAreInvalid from './services/checkBsbsAreInvalid'\nimport checkIfBsbsAreValidating from './services/checkIfBsbsAreValidating'\nimport checkIfAttachmentsExist from './services/checkIfAttachmentsExist'\nimport { injectDynamicElements } from './services/dynamic-elements'\nimport useAuth from './hooks/useAuth'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport { TaskContext } from './hooks/useTaskContext'\nimport { OnUploadAttachmentContext } from './hooks/useOnUploadAttachment'\nimport { injectOptionsAcrossAllElements } from './services/injectableOptions'\nimport MaterialIcon from './components/MaterialIcon'\nimport ReCAPTCHA from 'react-google-recaptcha'\nimport ValidationErrorsCard from './components/ValidationErrorsCard'\nimport { sendGoogleAnalyticsEvent } from './utils/sendGoogleAnalyticsEvent'\nimport { useUserProfileForInjectablesOutsideContext } from './hooks/useUserProfileForInjectables'\nimport OneBlinkFormFooter from './components/OneBlinkFormFooter'\nimport { ValidationIconConfigurationContext } from './hooks/useValidationIconConfiguration'\n\nexport type OneBlinkReadOnlyFormProps = {\n /**\n * A [Google Maps API\n * Key](https://developers.google.com/maps/documentation/javascript/get-api-key).\n * Required if the form contains a `location` form element.\n */\n googleMapsApiKey?: string\n /** Hex colour value for certain inputs (defaults to `#4c8da7`). */\n primaryColour?: string\n /**\n * Pass a task if the user was attempting to complete a scheduled task via a\n * form submission\n */\n task?: ScheduledTasksTypes.Task\n /**\n * Pass a task group if the user was attempting to complete a scheduled task\n * associated with a group via a form submission\n */\n taskGroup?: ScheduledTasksTypes.TaskGroup\n /**\n * Pass a task group instance if the user was attempting to complete a\n * scheduled task associated with a group via a form submission\n */\n taskGroupInstance?: ScheduledTasksTypes.TaskGroupInstance\n /**\n * Override the default behaviour when injecting values, such as in an info\n * element or a default value.\n */\n replaceInjectablesOverrides?: ReplaceInjectablesOverrides\n}\n\nexport type OneBlinkFormBaseProps = OneBlinkReadOnlyFormProps & {\n /** The function to call when the user cancels the form */\n onCancel: () => unknown\n /**\n * The function to call when the user submits the form with valid submission\n * data. See\n * [NewFormSubmission](https://oneblink.github.io/apps/modules/submissionService.html#NewFormSubmission)\n * for the structure of the argument.\n */\n onSubmit: (newFormSubmission: submissionService.NewFormSubmission) => unknown\n /** Whether the form is currently able to be submitted. False by default. */\n disabled?: boolean\n /** Whether the form is in preview mode. False by default. */\n isPreview?: boolean\n /**\n * An [ABN Lookup Authentication\n * Guid](https://abr.business.gov.au/Tools/WebServices). Required if the form\n * contains a `abn` form element.\n */\n abnLookupAuthenticationGuid?: string\n /**\n * A [reCAPTCHA Site Key](https://developers.google.com/recaptcha/intro).\n * Required if the form contains a `captcha` form element.\n */\n captchaSiteKey?: string\n /** Change properties for certain buttons on the form. */\n buttons?: FormsAppsTypes.FormsListStyles['buttons']\n /** Set a custom validation icon and accessible label. */\n validationIcon?: EnvironmentTypes.FormsAppEnvironmentStyles['validationIcon']\n /** Number of days attachments are retained for. */\n attachmentRetentionInDays?: number\n /**\n * If set to `false`, submission will be prevented while offline. If set to\n * `true`, the user will be prompted to allow them to continue with\n * attachments uploading in the background later.\n */\n isPendingQueueEnabled: boolean\n /**\n * The function to call when the user wishes to save their submission data as\n * a draft submission. If not specified, drafts cannot be saved. See\n * [NewDraftSubmission](https://oneblink.github.io/apps/modules/submissionService.html#NewDraftSubmission)\n * for the structure of the argument.\n */\n onSaveDraft?: (\n newDraftSubmission: submissionService.NewDraftSubmission,\n ) => unknown\n /**\n * The function to call when the user needs to navigate away from the form.\n * e.g. `history.push`\n */\n handleNavigateAway?: () => unknown\n /**\n * Determines whether the form is submittable or not. Info page type forms\n * show a \"Done\" button instead of a \"Submit\" button. Defaults to\n * \"CALCULATED\"\n */\n isInfoPage?: 'YES' | 'NO' | 'CALCULATED'\n /**\n * The function to call when a user uploads an attachment through an element\n * that allows attachment upload. See\n * [uploadAttachment](https://oneblink.github.io/apps/modules/attachmentsService.html#uploadAttachment)\n * for the structure of the argument and a sample function to be used.\n */\n onUploadAttachment?: typeof attachmentsService.uploadAttachment\n /**\n * Determines whether to use checkboxes or invisible recaptcha v2 for captcha\n * elements. Defaults to \"CHECKBOX\"\n */\n captchaType?: CaptchaType\n\n /**\n * Whether the form should use a navigable validation errors notification, or\n * a simple validation errors notification\n *\n * @default true\n */\n shouldUseNavigableValidationErrorsNotification?: boolean\n /** Various settings for the navigable validation errors notification */\n navigableValidationErrorsNotificationSettings?: {\n /**\n * A pixel offset for validation error navigation markers. Use this to\n * account for any headers your page might have. If not set, we will attempt\n * to calculate the offset for you. Please note: Calculating this value is\n * not supported when passing in a `scrollableContainerId`.\n */\n navigationTopOffset?: number\n /**\n * The HTML Element ID of the scrollable container your form resides in. If\n * not set, will scroll on the window.\n */\n scrollableContainerId?: string\n }\n}\n\nexport type OneBlinkFormUncontrolledProps = {\n /** The OneBlink Form to render */\n form: FormTypes.Form\n /** The initial submission data */\n initialSubmission?: SubmissionTypes.S3SubmissionData['submission']\n}\n\nexport type OneBlinkFormControlledProps = {\n definition: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n setFormSubmission: SetFormSubmission\n lastElementUpdated?: FormTypes.FormElement\n executedLookups: ExecutedLookups\n sectionState?: SectionState\n}\n\ntype Props = OneBlinkFormBaseProps &\n OneBlinkFormControlledProps & {\n isReadOnly: boolean\n }\n\nfunction OneBlinkFormBase({\n googleMapsApiKey,\n abnLookupAuthenticationGuid,\n captchaSiteKey,\n definition,\n disabled,\n isPreview,\n submission,\n isReadOnly,\n onCancel,\n onSubmit,\n onSaveDraft,\n setFormSubmission,\n buttons,\n validationIcon,\n primaryColour,\n attachmentRetentionInDays,\n isPendingQueueEnabled,\n handleNavigateAway,\n isInfoPage: isInfoPageProp,\n lastElementUpdated,\n executedLookups,\n task,\n taskGroup,\n taskGroupInstance,\n onUploadAttachment,\n captchaType,\n shouldUseNavigableValidationErrorsNotification = true,\n navigableValidationErrorsNotificationSettings,\n replaceInjectablesOverrides,\n sectionState,\n}: Props) {\n const isOffline = useIsOffline()\n const { isUsingFormsKey } = useAuth()\n const userProfileForInjectables = useUserProfileForInjectablesOutsideContext(\n replaceInjectablesOverrides?.getUserProfile,\n )\n const captchasRef = React.useRef<Array<ReCAPTCHA>>([])\n\n const theme = React.useMemo(\n () =>\n createMuiTheme({\n palette: {\n primary: {\n main: primaryColour || '#4c8da7',\n },\n success: {\n main: '#4caf50',\n },\n },\n }),\n [primaryColour],\n )\n\n const isInfoPage = React.useMemo(() => {\n if (!!isInfoPageProp && isInfoPageProp !== 'CALCULATED') {\n return isInfoPageProp === 'YES'\n }\n return formElementsService.determineIsInfoPage(definition)\n }, [definition, isInfoPageProp])\n\n const taskContextValue = React.useMemo(() => {\n return {\n task,\n taskGroup,\n taskGroupInstance,\n }\n }, [task, taskGroup, taskGroupInstance])\n\n //\n //\n // #region Form Definition\n\n const pages = React.useMemo<FormTypes.PageElement[]>(() => {\n if (definition.isMultiPage) {\n return definition.elements.reduce(\n (\n pageElements: FormTypes.PageElement[],\n formElement: FormTypes.FormElement,\n ) => {\n if (formElement.type === 'page') {\n pageElements.push(formElement)\n }\n return pageElements\n },\n [],\n )\n } else {\n return [\n {\n type: 'page',\n id: definition.id.toString(),\n label: definition.name,\n elements: definition.elements,\n conditionallyShow: false,\n requiresAllConditionallyShowPredicates: false,\n },\n ]\n }\n }, [\n definition.elements,\n definition.id,\n definition.isMultiPage,\n definition.name,\n ])\n\n const pagesWithDynamicElements = React.useMemo<\n FormTypes.PageElement[]\n >(() => {\n return injectDynamicElements(pages) as FormTypes.PageElement[]\n }, [pages])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Unsaved Changed\n\n const history = useHistory()\n\n const [isPreparingToSubmit, setIsPreparingToSubmit] =\n React.useState<boolean>(false)\n const [\n { isDirty, isNavigationAllowed, hasConfirmedNavigation, goToLocation },\n setUnsavedChangesState,\n ] = React.useState<{\n isDirty: boolean\n isNavigationAllowed: boolean\n hasConfirmedNavigation: boolean | null\n goToLocation: H.Location | null\n }>({\n isDirty: false,\n isNavigationAllowed: false,\n hasConfirmedNavigation: null,\n goToLocation: null,\n })\n const [promptOfflineSubmissionAttempt, setPromptOfflineSubmissionAttempt] =\n React.useState<boolean>(false)\n const [promptUploadingAttachments, setPromptUploadingAttachments] =\n React.useState<boolean>(false)\n const handleBlockedNavigation = React.useCallback<\n (location: H.Location, action: H.Action) => string | boolean\n >((location) => {\n setUnsavedChangesState((current) => ({\n ...current,\n goToLocation: location,\n hasConfirmedNavigation: false,\n }))\n return false\n }, [])\n\n const handleKeepGoing = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n goToLocation: null,\n hasConfirmedNavigation: null,\n }))\n }, [])\n\n const handleDiscardUnsavedChanges = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n isNavigationAllowed: true,\n hasConfirmedNavigation: true,\n }))\n sendGoogleAnalyticsEvent('oneblink_form_abandon', {\n formId: definition.id,\n formName: definition.name,\n })\n }, [definition.id, definition.name])\n\n React.useEffect(() => {\n if (hasConfirmedNavigation) {\n // Navigate to the previous blocked location with your navigate function\n if (goToLocation) {\n history.push(`${goToLocation.pathname}${goToLocation.search}`)\n if (handleNavigateAway) {\n handleNavigateAway()\n }\n } else {\n onCancel()\n }\n }\n }, [\n goToLocation,\n handleNavigateAway,\n hasConfirmedNavigation,\n history,\n onCancel,\n ])\n\n const handleCancel = React.useCallback(() => {\n if (isDirty) {\n setUnsavedChangesState((current) => ({\n ...current,\n hasConfirmedNavigation: false,\n }))\n } else {\n sendGoogleAnalyticsEvent('oneblink_form_abandon', {\n formId: definition.id,\n formName: definition.name,\n })\n onCancel()\n }\n }, [definition.id, definition.name, isDirty, onCancel])\n\n const allowNavigation = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n isNavigationAllowed: true,\n }))\n }, [])\n\n // #endregion Unsaved Changed\n //\n //\n\n //\n //\n // #region Conditional Logic\n\n const {\n formElementsConditionallyShown,\n conditionalLogicError,\n submissionConditionallyEnabled,\n } = useConditionalLogic({\n formElements: pagesWithDynamicElements,\n submission,\n enableSubmission: definition.enableSubmission,\n })\n\n // #endregion\n //\n //\n\n //\n //\n // #region Validation\n\n const validationErrorToastFocusElementRef =\n React.useRef<HTMLButtonElement>(null)\n const [isShowingValidationErrorsCard, setIsShowingValidationErrorsCard] =\n React.useState(false)\n const { validate } = useFormValidation(pages)\n\n const recaptchaType = React.useMemo(\n () => captchaType ?? 'CHECKBOX',\n [captchaType],\n )\n\n const formElementsValidation = React.useMemo<\n FormElementsValidation | undefined\n >(\n () =>\n !isReadOnly\n ? validate(\n submission,\n formElementsConditionallyShown,\n executedLookups ?? {},\n recaptchaType,\n isOffline,\n )\n : undefined,\n [\n isReadOnly,\n validate,\n submission,\n formElementsConditionallyShown,\n executedLookups,\n recaptchaType,\n isOffline,\n ],\n )\n\n React.useEffect(() => {\n if (!formElementsValidation) {\n setIsShowingValidationErrorsCard(false)\n }\n }, [formElementsValidation])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Pages\n\n const [hasAttemptedSubmit, setHasAttemptedSubmit] = React.useState(false)\n\n const {\n visiblePages,\n isFirstVisiblePage,\n isLastVisiblePage,\n isDisplayingCurrentPageError,\n isShowingMultiplePages,\n isStepsHeaderActive,\n toggleStepsNavigation,\n currentPageIndex,\n currentPage,\n currentPageNumber,\n checkDisplayPageError,\n setPageId,\n goToPreviousPage,\n goToNextPage,\n scrollToTopOfPageHTMLElementRef,\n } = usePages({\n hasAttemptedSubmit,\n pages,\n formElementsValidation,\n formElementsConditionallyShown,\n })\n\n // #endregion\n //\n //\n\n //\n //\n // #region Submissions\n\n const getCurrentSubmissionData = React.useCallback(\n (stripBinaryData: boolean) => {\n const { model, captchaTokens } = cleanFormSubmissionModel(\n submission,\n definition.elements,\n formElementsConditionallyShown,\n stripBinaryData,\n )\n return {\n submission: model,\n captchaTokens,\n }\n },\n [definition.elements, formElementsConditionallyShown, submission],\n )\n\n const obFormContainerHTMLElementRef = React.useRef<HTMLDivElement>(null)\n React.useEffect(() => {\n const obFormContainerHTMLElement = obFormContainerHTMLElementRef.current\n if (obFormContainerHTMLElement) {\n console.log(\n 'Setting toast notifications to be appended to HTML Element',\n obFormContainerHTMLElement,\n )\n bulmaToast.setDefaults({\n position: 'bottom-right',\n opacity: 0.95,\n appendTo: obFormContainerHTMLElement,\n })\n }\n return () => {\n bulmaToast.resetDefaults()\n }\n }, [])\n\n const checkAttachmentsCanBeSubmitted = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n // Prevent submission until all attachment uploads are finished\n // Unless the user is offline, in which case, the uploads will\n // be taken care of by a pending queue if enabled, otherwise\n // the user will be prompted to try again or save a draft.\n if (isOffline) {\n return true\n }\n const attachmentsAreUploading =\n attachmentsService.checkIfAttachmentsAreUploading(\n definition,\n submission,\n )\n\n if (attachmentsAreUploading) {\n if (isUsingFormsKey || !isPendingQueueEnabled) {\n bulmaToast.toast({\n message:\n 'Attachments are still uploading, please wait for them to finish before trying again.',\n type: 'is-primary',\n extraClasses: 'ob-toast cypress-still-uploading-toast',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return false\n } else {\n setPromptUploadingAttachments(true)\n return false\n }\n }\n\n return true\n },\n [definition, isOffline, isPendingQueueEnabled, isUsingFormsKey],\n )\n\n const checkBsbsCanBeSubmitted = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n return !checkBsbsAreInvalid(definition, submission)\n },\n [definition],\n )\n\n const checkBsbAreValidating = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n if (checkIfBsbsAreValidating(definition, submission)) {\n bulmaToast.toast({\n message:\n 'Bsb(s) are still being validated, please wait for them to finish before trying again.',\n type: 'is-primary',\n extraClasses: 'ob-toast cypress-still-validating-toast',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return false\n }\n\n return true\n },\n [definition],\n )\n\n const addCaptchaRef = React.useCallback((recaptcha: ReCAPTCHA) => {\n captchasRef.current.push(recaptcha)\n // this allows the FormElementCaptcha element to unregister any captchas\n return () => {\n captchasRef.current = captchasRef.current.filter(\n (recaptchaInstance) => recaptchaInstance !== recaptcha,\n )\n }\n }, [])\n\n const captchaContextValue = React.useMemo(\n () => ({\n captchaSiteKey,\n captchaType: recaptchaType,\n addCaptchaRef,\n }),\n [addCaptchaRef, captchaSiteKey, recaptchaType],\n )\n\n const resetRecaptchas = React.useCallback(() => {\n // unset the submission model value for each captcha element\n const updatedModel = { ...submission }\n formElementsService.forEachFormElement(definition.elements, (element) => {\n if (element.type === 'captcha') {\n updatedModel[element.name] = undefined\n }\n })\n // reset each captcha\n if (captchaType === 'CHECKBOX') {\n captchasRef.current.forEach((captcha) => {\n captcha.reset()\n })\n }\n\n setHasAttemptedSubmit(false)\n setFormSubmission((current) => {\n return { ...current, submission: updatedModel }\n })\n }, [definition.elements, setFormSubmission, submission, captchaType])\n\n const prepareSubmission = React.useCallback(\n async (\n continueWhilstAttachmentsAreUploading: boolean,\n ): Promise<ReturnType<typeof getCurrentSubmissionData> | undefined> => {\n const submissionData = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submissionData.submission)) {\n return\n }\n if (formElementsValidation) {\n console.log('Validation errors', formElementsValidation)\n if (!shouldUseNavigableValidationErrorsNotification) {\n bulmaToast.toast({\n message: 'Please fix validation errors',\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n }\n setIsShowingValidationErrorsCard(true)\n validationErrorToastFocusElementRef.current?.focus()\n return\n }\n if (!checkBsbsCanBeSubmitted(submissionData.submission)) {\n return\n }\n if (\n !continueWhilstAttachmentsAreUploading &&\n !checkAttachmentsCanBeSubmitted(submissionData.submission)\n ) {\n return\n }\n\n if (captchaType === 'INVISIBLE') {\n if (captchasRef.current.length) {\n const tokenResults = await Promise.allSettled(\n captchasRef.current.map((captcha) => captcha.executeAsync()),\n )\n\n const captchaTokens: string[] = []\n\n for (const result of tokenResults) {\n if (result.status === 'rejected' || !result.value) {\n console.log('Captcha token failure')\n bulmaToast.toast({\n message: 'Failed to get a captcha token',\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-failed-captcha-token-creation',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n captchaTokens.push(result.value)\n }\n\n submissionData.captchaTokens = captchaTokens\n }\n }\n\n // check if attachments exist\n const newSubmission = checkIfAttachmentsExist(\n definition,\n submissionData.submission,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n submission: newSubmission,\n }))\n bulmaToast.toast({\n message:\n \"Some files that were included in your submission have been removed based on your administrator's data retention policy, please remove them and upload them again.\",\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n\n if (isOffline && !isPendingQueueEnabled) {\n console.log('User is offline and form does not support a pending queue')\n setPromptOfflineSubmissionAttempt(true)\n return\n }\n return submissionData\n },\n [\n attachmentRetentionInDays,\n captchaType,\n checkAttachmentsCanBeSubmitted,\n checkBsbAreValidating,\n checkBsbsCanBeSubmitted,\n definition,\n formElementsValidation,\n getCurrentSubmissionData,\n isOffline,\n isPendingQueueEnabled,\n setFormSubmission,\n shouldUseNavigableValidationErrorsNotification,\n ],\n )\n\n const handleSubmit = React.useCallback(\n async (\n event:\n | React.FormEvent<HTMLFormElement>\n | React.MouseEvent<HTMLButtonElement, MouseEvent>,\n continueWhilstAttachmentsAreUploading: boolean,\n ) => {\n event.preventDefault()\n if (disabled || isReadOnly) return\n setHasAttemptedSubmit(true)\n\n setIsPreparingToSubmit(true)\n\n const submissionData = await prepareSubmission(\n continueWhilstAttachmentsAreUploading,\n )\n\n if (!submissionData) {\n setIsPreparingToSubmit(false)\n return\n }\n\n allowNavigation()\n\n // transplant injected options on the definition\n const elementsWithInjectedOptions = injectOptionsAcrossAllElements({\n contextElements: definition.elements,\n elements: definition.elements,\n submission: submissionData.submission,\n taskContext: taskContextValue,\n userProfile: userProfileForInjectables,\n })\n setIsPreparingToSubmit(false)\n resetRecaptchas()\n onSubmit({\n definition: {\n ...definition,\n elements: elementsWithInjectedOptions,\n },\n submission: submissionData.submission,\n recaptchas: submissionData.captchaTokens.map((token) => ({\n token,\n siteKey: captchaSiteKey as string,\n })),\n })\n sendGoogleAnalyticsEvent('oneblink_form_submit', {\n formId: definition.id,\n formName: definition.name,\n })\n },\n [\n disabled,\n isReadOnly,\n prepareSubmission,\n allowNavigation,\n definition,\n taskContextValue,\n userProfileForInjectables,\n resetRecaptchas,\n onSubmit,\n captchaSiteKey,\n ],\n )\n\n const handleSaveDraft = React.useCallback(\n (continueWhilstAttachmentsAreUploading: boolean) => {\n if (disabled) return\n if (onSaveDraft) {\n allowNavigation()\n\n // For drafts we don't need to save the captcha tokens,\n // they will need to prove they are not robot again\n const { submission } = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submission)) {\n return\n }\n if (\n !continueWhilstAttachmentsAreUploading &&\n !checkAttachmentsCanBeSubmitted(submission)\n ) {\n return\n }\n onSaveDraft({\n definition,\n submission,\n backgroundUpload: continueWhilstAttachmentsAreUploading,\n lastElementUpdated,\n sectionState,\n })\n }\n },\n [\n allowNavigation,\n checkAttachmentsCanBeSubmitted,\n definition,\n disabled,\n getCurrentSubmissionData,\n onSaveDraft,\n checkBsbAreValidating,\n lastElementUpdated,\n sectionState,\n ],\n )\n\n const handleContinueWithAttachments = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n setPromptUploadingAttachments(false)\n if (hasAttemptedSubmit) {\n handleSubmit(e, true)\n } else {\n handleSaveDraft(true)\n }\n },\n [\n handleSubmit,\n setPromptUploadingAttachments,\n hasAttemptedSubmit,\n handleSaveDraft,\n ],\n )\n const handleWaitForAttachments = React.useCallback(() => {\n setPromptUploadingAttachments(false)\n }, [setPromptUploadingAttachments])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Lookups\n\n const { handlePagesLookupResult } = useLookups(\n definition.id,\n setFormSubmission,\n )\n\n // #endregion\n //\n //\n\n //\n //\n // #region Submission/Definition Changes\n\n const handleChange = React.useCallback<NestedFormElementValueChangeHandler>(\n (element, { value, executedLookups, deleteSection, sectionState }) => {\n if (\n //This will ensure on a read only form that the summary and calculation elements\n //can still be displayed as it needs handleChange so it can render\n //due to the dynamic nature of the summary element.\n (disabled &&\n element.type !== 'summary' &&\n element.type !== 'calculation') ||\n element.type === 'page'\n ) {\n return\n }\n\n setUnsavedChangesState((current) => ({\n ...current,\n isDirty: true,\n }))\n if (element.type === 'section') {\n setFormSubmission((currentFormSubmission) => {\n const currentSectionState = currentFormSubmission.sectionState || []\n const existingSectionIndex = currentSectionState.findIndex(\n (section) => section.id === element.id,\n )\n const sectionIsInState = existingSectionIndex >= 0\n let newSectionState: SectionState\n if (sectionIsInState && deleteSection) {\n newSectionState = currentSectionState.filter(\n (section) => section.id !== element.id,\n )\n } else if (sectionIsInState) {\n // Update state of the section\n newSectionState = currentSectionState.map((section, index) =>\n index === existingSectionIndex\n ? {\n ...section,\n state:\n section.state === 'COLLAPSED' ? 'EXPANDED' : 'COLLAPSED',\n }\n : section,\n )\n } else {\n // Add the section to state\n newSectionState = [\n ...currentSectionState,\n {\n id: element.id,\n state: element.isCollapsed ? 'EXPANDED' : 'COLLAPSED',\n },\n ]\n }\n\n return {\n ...currentFormSubmission,\n sectionState: newSectionState,\n }\n })\n }\n // dont update the last element updated for elements the user cannot set the value of\n else if (element.type === 'summary' || element.type === 'calculation') {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n submission: {\n ...currentFormSubmission.submission,\n [element.name]:\n typeof value === 'function'\n ? value(currentFormSubmission.submission[element.name])\n : value,\n },\n }))\n } else {\n setFormSubmission((currentFormSubmission) => {\n return {\n ...currentFormSubmission,\n submission: {\n ...currentFormSubmission.submission,\n [element.name]:\n typeof value === 'function'\n ? value(currentFormSubmission.submission[element.name])\n : value,\n },\n lastElementUpdated: element,\n executedLookups: {\n ...currentFormSubmission.executedLookups,\n [element.name]:\n typeof executedLookups === 'function'\n ? executedLookups(\n currentFormSubmission.executedLookups?.[element.name],\n )\n : executedLookups,\n },\n sectionState: sectionState\n ? typeof sectionState === 'function'\n ? sectionState(currentFormSubmission.sectionState)\n : sectionState\n : currentFormSubmission.sectionState,\n }\n })\n }\n },\n [disabled, setFormSubmission],\n )\n\n // #endregion\n //\n //\n\n const lastElementUpdatedExistsOnForm = React.useMemo(() => {\n return !!formElementsService.findFormElement(\n definition.elements,\n (el) => el.id === lastElementUpdated?.id,\n )\n }, [definition.elements, lastElementUpdated])\n\n const lastElementUpdatedPage = React.useMemo(() => {\n return definition.elements.find((pageElement: FormTypes.FormElement) => {\n if (pageElement.type === 'page') {\n return formElementsService.findFormElement(\n pageElement.elements,\n (el) => el.id === lastElementUpdated?.id,\n )\n }\n })\n }, [lastElementUpdated, definition])\n\n const [hasResumed, setHasResumed] = React.useState(false)\n React.useEffect(() => {\n if (!hasResumed) {\n if (lastElementUpdated && lastElementUpdatedExistsOnForm) {\n if (lastElementUpdatedPage) {\n setPageId(lastElementUpdatedPage.id)\n }\n const element = document.querySelector(\n `[data-element-id=\"${lastElementUpdated.id}\"]`,\n )\n if (element) {\n window.requestAnimationFrame(() => {\n element.scrollIntoView({ behavior: 'smooth' })\n })\n }\n }\n if (sectionState) {\n {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n sectionState,\n }))\n }\n }\n setHasResumed(true)\n }\n }, [\n lastElementUpdated,\n hasResumed,\n lastElementUpdatedPage,\n lastElementUpdatedExistsOnForm,\n setPageId,\n sectionState,\n setFormSubmission,\n ])\n\n if (conditionalLogicError) {\n return (\n <>\n <div className=\"has-text-centered\">\n <MaterialIcon className=\"has-text-warning icon-x-large\">\n error\n </MaterialIcon>\n <h3 className=\"title is-3\">Bad Form Configuration</h3>\n <p className=\"cypress-conditional-logic-error-message\">\n {conditionalLogicError.message}\n </p>\n <p className=\"has-text-grey\">\n {localisationService.formatDatetimeLong(new Date())}\n </p>\n </div>\n </>\n )\n }\n\n return (\n <ThemeProvider theme={theme}>\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <ReplaceInjectablesOverridesContext.Provider\n value={replaceInjectablesOverrides}\n >\n <FormDefinitionContext.Provider value={definition}>\n <FormElementOptionsContextProvider>\n <FormElementLookupsContextProvider>\n <OneBlinkFormContainerContext.Provider\n value={obFormContainerHTMLElementRef.current}\n >\n <div\n className={clsx('ob-form-container', {\n 'is-showing-pages': isShowingMultiplePages,\n })}\n ref={obFormContainerHTMLElementRef}\n >\n <form\n name=\"obForm\"\n className={`ob-form cypress-ob-form ob-form__page-${\n currentPageIndex + 1\n }`}\n noValidate\n onSubmit={(e) => handleSubmit(e, false)}\n >\n <div>\n <div ref={scrollToTopOfPageHTMLElementRef} />\n {isShowingMultiplePages && (\n <div\n className={clsx('ob-steps-navigation', {\n 'is-active': isStepsHeaderActive,\n })}\n >\n <div\n className={clsx('ob-steps-navigation__header', {\n 'is-active': isStepsHeaderActive,\n })}\n onClick={toggleStepsNavigation}\n >\n <span className=\"icon is-invisible\">\n <MaterialIcon>keyboard_arrow_down</MaterialIcon>\n </span>\n <div className=\"steps-header-active-page\">\n {isDisplayingCurrentPageError ? (\n <span className=\"icon\">\n <MaterialIcon className=\"has-text-danger is-size-4\">\n warning\n </MaterialIcon>\n </span>\n ) : (\n <span className=\"steps-header-active-page-icon\">\n {currentPageNumber}\n </span>\n )}\n <span className=\"steps-header-active-page-label cypress-tablet-step-title\">\n {currentPage ? currentPage.label : ''}\n </span>\n </div>\n <span className=\"dropdown icon\">\n <MaterialIcon>keyboard_arrow_down</MaterialIcon>\n </span>\n </div>\n\n <div\n className={clsx('ob-steps-navigation__steps', {\n 'is-active': isStepsHeaderActive,\n })}\n >\n <div className=\"steps is-small is-horizontal-tablet cypress-steps\">\n {visiblePages.map(\n (\n page: FormTypes.PageElement,\n index: number,\n ) => {\n const hasErrors =\n checkDisplayPageError(page)\n return (\n <div\n key={page.id}\n id={`steps-navigation-step-${page.id}`}\n className={clsx(\n 'step-item cypress-step-item',\n {\n 'is-active':\n currentPage.id === page.id,\n 'is-completed':\n currentPageIndex > index,\n 'is-error': hasErrors,\n },\n )}\n onClick={(e) => {\n e.stopPropagation()\n if (page.id !== currentPage.id) {\n setPageId(page.id)\n }\n }}\n >\n <div\n className=\"step-marker step-marker-error ob-step-marker cypress-step-marker\"\n // @ts-expect-error ???\n name={`cypress-page-stepper-${index + 1}`}\n value={index + 1}\n >\n {hasErrors ? (\n <Tooltip title=\"Page has errors\">\n <span className=\"icon tooltip has-tooltip-top cypress-page-error\">\n <MaterialIcon className=\"has-text-danger is-size-3\">\n warning\n </MaterialIcon>\n </span>\n </Tooltip>\n ) : (\n <span>{index + 1}</span>\n )}\n </div>\n <div className=\"step-details ob-step-details\">\n <p\n className=\"step-title ob-step-title cypress-desktop-step-title\"\n id={`steps-navigation-step-label-${page.id}`}\n >\n {page.label}\n </p>\n </div>\n </div>\n )\n },\n )}\n </div>\n </div>\n </div>\n )}\n\n <div\n className={clsx('ob-steps-navigation__background', {\n 'is-active': isStepsHeaderActive,\n })}\n onClick={toggleStepsNavigation}\n />\n\n <div className=\"steps\">\n <div\n className={clsx('steps-content', {\n 'is-single-step': !isShowingMultiplePages,\n })}\n >\n <InjectPagesContext.Provider\n value={handlePagesLookupResult}\n >\n <GoogleMapsApiKeyContext.Provider\n value={googleMapsApiKey}\n >\n <AbnLookupAuthenticationGuidContext.Provider\n value={abnLookupAuthenticationGuid}\n >\n <ValidationIconConfigurationContext.Provider\n value={validationIcon}\n >\n <CaptchaContext.Provider\n value={captchaContextValue}\n >\n <AttachmentBlobsProvider>\n <FormIsReadOnlyContext.Provider\n value={isReadOnly}\n >\n <TaskContext.Provider\n value={taskContextValue}\n >\n <OnUploadAttachmentContext.Provider\n value={onUploadAttachment}\n >\n {visiblePages.map(\n (\n pageElement: FormTypes.PageElement,\n ) => (\n <PageFormElements\n key={pageElement.id}\n isActive={\n pageElement.id ===\n currentPage.id\n }\n formId={definition.id}\n formElementsConditionallyShown={\n formElementsConditionallyShown\n }\n formElementsValidation={\n formElementsValidation\n }\n displayValidationMessages={\n hasAttemptedSubmit ||\n isDisplayingCurrentPageError\n }\n pageElement={pageElement}\n onChange={handleChange}\n model={submission}\n setFormSubmission={\n setFormSubmission\n }\n sectionState={sectionState}\n />\n ),\n )}\n </OnUploadAttachmentContext.Provider>\n </TaskContext.Provider>\n </FormIsReadOnlyContext.Provider>\n </AttachmentBlobsProvider>\n </CaptchaContext.Provider>\n </ValidationIconConfigurationContext.Provider>\n </AbnLookupAuthenticationGuidContext.Provider>\n </GoogleMapsApiKeyContext.Provider>\n </InjectPagesContext.Provider>\n </div>\n\n {isShowingMultiplePages && (\n <div className=\"steps-actions\">\n <div className=\"steps-action\">\n <button\n type=\"button\"\n onClick={goToPreviousPage}\n disabled={isFirstVisiblePage}\n className=\"button is-light cypress-pages-previous\"\n >\n <span className=\"icon\">\n <MaterialIcon>\n keyboard_arrow_left\n </MaterialIcon>\n </span>\n <span>Back</span>\n </button>\n </div>\n <div className=\"step-progress-mobile cypress-steps-mobile\">\n {visiblePages.map(\n (page: FormTypes.PageElement, index) => (\n <div\n key={page.id}\n className={clsx(\n 'step-progress-mobile-dot',\n {\n 'is-active':\n currentPage.id === page.id,\n 'is-completed':\n currentPageIndex > index,\n 'has-background-danger':\n currentPage.id !== page.id &&\n checkDisplayPageError(page),\n },\n )}\n />\n ),\n )}\n </div>\n <div className=\"steps-action\">\n <button\n type=\"button\"\n onClick={goToNextPage}\n disabled={isLastVisiblePage}\n className=\"button is-light cypress-pages-next\"\n >\n <span>Next</span>\n <span className=\"icon\">\n <MaterialIcon>\n keyboard_arrow_right\n </MaterialIcon>\n </span>\n </button>\n </div>\n </div>\n )}\n </div>\n {!isReadOnly && (\n <div className=\"buttons ob-buttons ob-buttons-submit\">\n {onSaveDraft && !isInfoPage && (\n <button\n type=\"button\"\n className=\"button ob-button is-primary ob-button-save-draft cypress-save-draft-form\"\n onClick={() => handleSaveDraft(false)}\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={\n buttons?.saveDraft?.label || 'Save Draft'\n }\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span className=\"ob-buttons-submit__spacer\"></span>\n {!isInfoPage && (\n <button\n type=\"button\"\n className=\"button ob-button is-light ob-button-submit-cancel cypress-cancel-form\"\n onClick={handleCancel}\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={buttons?.cancel?.label || 'Cancel'}\n icon={buttons?.cancel?.icon}\n />\n </button>\n )}\n {isLastVisiblePage && (\n <Tooltip\n title={\n submissionConditionallyEnabled\n ? ''\n : 'Submission disabled: Your inputs have not met the criteria for submission'\n }\n >\n <button\n type=\"submit\"\n className={clsx(\n 'button ob-button is-success ob-button-submit cypress-submit-form-button cypress-submit-form',\n { 'is-loading': isPreparingToSubmit },\n {\n 'ob-button-submit-is-disabled':\n submissionConditionallyEnabled,\n },\n )}\n disabled={\n isPreview ||\n disabled ||\n isPreparingToSubmit ||\n !submissionConditionallyEnabled\n }\n >\n <CustomisableButtonInner\n label={\n isInfoPage\n ? 'Done'\n : buttons?.submit?.label || 'Submit'\n }\n icon={buttons?.submit?.icon}\n />\n </button>\n </Tooltip>\n )}\n </div>\n )}\n </div>\n </form>\n\n {!!definition.footer?.html && (\n <OneBlinkFormFooter footer={definition.footer?.html} />\n )}\n\n {!isReadOnly && !isPreview && (\n <React.Fragment>\n <Prompt\n when={isDirty && !isNavigationAllowed}\n message={handleBlockedNavigation}\n />\n <Modal\n isOpen={hasConfirmedNavigation === false}\n title=\"Unsaved Changes\"\n cardClassName=\"cypress-cancel-confirm\"\n titleClassName=\"cypress-cancel-confirm-title\"\n bodyClassName=\"cypress-cancel-confirm-body\"\n actions={\n <>\n {onSaveDraft && (\n <button\n type=\"button\"\n className=\"button ob-button is-success cypress-cancel-confirm-save-draft\"\n onClick={() => handleSaveDraft(false)}\n >\n <CustomisableButtonInner\n label={\n buttons?.saveDraft?.label || 'Save Draft'\n }\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span style={{ flex: 1 }}></span>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-cancel-confirm-back\"\n onClick={handleKeepGoing}\n >\n <CustomisableButtonInner\n label={\n buttons?.cancelPromptNo?.label || 'Back'\n }\n icon={buttons?.cancelPromptNo?.icon}\n />\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-cancel-confirm-discard\"\n onClick={handleDiscardUnsavedChanges}\n autoFocus\n >\n <CustomisableButtonInner\n label={\n buttons?.cancelPromptYes?.label || 'Discard'\n }\n icon={buttons?.cancelPromptYes?.icon}\n />\n </button>\n </>\n }\n >\n <p>\n You have unsaved changes, are you sure you want\n discard them?\n </p>\n </Modal>\n <Modal\n isOpen={promptUploadingAttachments === true}\n title=\"Attachment upload in progress\"\n cardClassName=\"cypress-attachments-wait-continue\"\n titleClassName=\"cypress-attachments-confirm-wait-title\"\n bodyClassName=\"cypress-attachments-confirm-wait-body\"\n actions={\n <>\n <span style={{ flex: 1 }}></span>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-attachments-confirm-wait\"\n onClick={handleWaitForAttachments}\n >\n Wait\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-attachments-confirm-continue\"\n onClick={handleContinueWithAttachments}\n autoFocus\n >\n Continue\n </button>\n </>\n }\n >\n <p>\n Your attachments are still uploading, do you want to\n wait for the uploads to complete or continue using\n the app? If you click continue the attachments will\n upload in the background. Do not close the app until\n the upload has been completed.\n </p>\n </Modal>\n\n <Modal\n isOpen={promptOfflineSubmissionAttempt}\n title=\"It looks like you're Offline\"\n className=\"ob-modal__offline-submission-attempt\"\n cardClassName=\"cypress-submission-offline has-text-centered\"\n titleClassName=\"cypress-offline-title\"\n bodyClassName=\"cypress-offline-body\"\n actions={\n <>\n {onSaveDraft && (\n <button\n type=\"button\"\n className=\"button ob-button ob-button__offline-submission-attempt-save-draft is-success\"\n onClick={() => handleSaveDraft(false)}\n >\n <CustomisableButtonInner\n label={\n buttons?.saveDraft?.label || 'Save Draft'\n }\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span style={{ flex: 1 }}></span>\n <button\n className=\"button ob-button ob-button__offline-submission-attempt-cancel is-light\"\n onClick={() =>\n setPromptOfflineSubmissionAttempt(false)\n }\n >\n Cancel\n </button>\n <button\n className=\"button ob-button ob-button__offline-submission-attempt-try-again is-primary\"\n onClick={(e) => {\n setPromptOfflineSubmissionAttempt(false)\n handleSubmit(e, false)\n }}\n autoFocus\n >\n Try Again\n </button>\n </>\n }\n >\n <p className=\"ob-modal__offline-submission-attempt-message\">\n You cannot submit this form while offline, please\n try again when connectivity is restored.\n {onSaveDraft && (\n <span className=\"ob-modal__offline-submission-attempt-save-draft-message\">\n {' '}\n Alternatively, click the{' '}\n <b>\n {buttons?.saveDraft?.label || 'Save Draft'}\n </b>{' '}\n button below to come back to this later.\n </span>\n )}\n </p>\n <MaterialIcon className=\"has-text-warning icon-x-large ob-modal__offline-submission-attempt-icon\">\n wifi_off\n </MaterialIcon>\n </Modal>\n </React.Fragment>\n )}\n {shouldUseNavigableValidationErrorsNotification &&\n isShowingValidationErrorsCard && (\n <ValidationErrorsCard\n visiblePages={visiblePages}\n formElementsValidation={formElementsValidation}\n setPageId={setPageId}\n currentPage={currentPage}\n navigationTopOffset={\n navigableValidationErrorsNotificationSettings?.navigationTopOffset ??\n 'CALCULATE'\n }\n scrollableContainerId={\n navigableValidationErrorsNotificationSettings?.scrollableContainerId\n }\n validationErrorToastFocusElementRef={\n validationErrorToastFocusElementRef\n }\n />\n )}\n </div>\n </OneBlinkFormContainerContext.Provider>\n </FormElementLookupsContextProvider>\n </FormElementOptionsContextProvider>\n </FormDefinitionContext.Provider>\n </ReplaceInjectablesOverridesContext.Provider>\n </LocalizationProvider>\n </ThemeProvider>\n )\n}\n\nexport default React.memo(OneBlinkFormBase)\n"]}
1
+ {"version":3,"file":"OneBlinkFormBase.js","sourceRoot":"","sources":["../src/OneBlinkFormBase.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { createTheme as createMuiTheme, ThemeProvider } from '@mui/material'\nimport Tooltip from './components/renderer/Tooltip'\nimport { Prompt, useHistory } from 'react-router-dom'\nimport clsx from 'clsx'\nimport * as bulmaToast from 'bulma-toast'\nimport {\n localisationService,\n submissionService,\n attachmentsService,\n} from '@oneblink/apps'\nimport {\n EnvironmentTypes,\n FormTypes,\n FormsAppsTypes,\n ScheduledTasksTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport * as H from 'history'\nimport { LocalizationProvider } from '@mui/x-date-pickers'\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'\n\nimport Modal from './components/renderer/Modal'\nimport cleanFormSubmissionModel from './services/cleanFormSubmissionModel'\nimport PageFormElements from './components/renderer/PageFormElements'\nimport useFormValidation from './hooks/useFormValidation'\nimport useConditionalLogic from './hooks/useConditionalLogic'\nimport usePages from './hooks/usePages'\nimport useLookups from './hooks/useLookups'\nimport { FormDefinitionContext } from './hooks/useFormDefinition'\nimport {\n ReplaceInjectablesOverridesContext,\n ReplaceInjectablesOverrides,\n} from './hooks/useReplaceInjectablesOverrides'\nimport { InjectPagesContext } from './hooks/useInjectPages'\nimport { FormElementOptionsContextProvider } from './hooks/useDynamicOptionsLoaderState'\nimport { FormElementLookupsContextProvider } from './hooks/useFormElementLookups'\nimport { OneBlinkFormContainerContext } from './hooks/useOneBlinkFormContainer'\nimport { GoogleMapsApiKeyContext } from './hooks/useGoogleMapsApiKey'\nimport { AbnLookupAuthenticationGuidContext } from './hooks/useAbnLookupAuthenticationGuid'\nimport { CaptchaContext } from './hooks/useCaptcha'\nimport { FormIsReadOnlyContext } from './hooks/useFormIsReadOnly'\nimport { AttachmentBlobsProvider } from './hooks/attachments/useAttachmentBlobs'\nimport useIsOffline from './hooks/useIsOffline'\nimport CustomisableButtonInner from './components/renderer/CustomisableButtonInner'\nimport {\n CaptchaType,\n ExecutedLookups,\n FormElementsValidation,\n NestedFormElementValueChangeHandler,\n SetFormSubmission,\n SectionState,\n} from './types/form'\nimport checkBsbsAreInvalid from './services/checkBsbsAreInvalid'\nimport checkIfBsbsAreValidating from './services/checkIfBsbsAreValidating'\nimport checkIfAttachmentsExist from './services/checkIfAttachmentsExist'\nimport { injectDynamicElements } from './services/dynamic-elements'\nimport useAuth from './hooks/useAuth'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport { TaskContext } from './hooks/useTaskContext'\nimport { OnUploadAttachmentContext } from './hooks/useOnUploadAttachment'\nimport { injectOptionsAcrossAllElements } from './services/injectableOptions'\nimport MaterialIcon from './components/MaterialIcon'\nimport ReCAPTCHA from 'react-google-recaptcha'\nimport ValidationErrorsCard from './components/ValidationErrorsCard'\nimport { sendGoogleAnalyticsEvent } from './utils/sendGoogleAnalyticsEvent'\nimport { useUserProfileForInjectablesOutsideContext } from './hooks/useUserProfileForInjectables'\nimport OneBlinkFormFooter from './components/OneBlinkFormFooter'\nimport { ValidationIconConfigurationContext } from './hooks/useValidationIconConfiguration'\nimport { FormSubmissionModelContextProvider } from './hooks/useFormSubmissionModelContext'\n\nexport type OneBlinkReadOnlyFormProps = {\n /**\n * A [Google Maps API\n * Key](https://developers.google.com/maps/documentation/javascript/get-api-key).\n * Required if the form contains a `location` form element.\n */\n googleMapsApiKey?: string\n /** Hex colour value for certain inputs (defaults to `#4c8da7`). */\n primaryColour?: string\n /**\n * Pass a task if the user was attempting to complete a scheduled task via a\n * form submission\n */\n task?: ScheduledTasksTypes.Task\n /**\n * Pass a task group if the user was attempting to complete a scheduled task\n * associated with a group via a form submission\n */\n taskGroup?: ScheduledTasksTypes.TaskGroup\n /**\n * Pass a task group instance if the user was attempting to complete a\n * scheduled task associated with a group via a form submission\n */\n taskGroupInstance?: ScheduledTasksTypes.TaskGroupInstance\n /**\n * Override the default behaviour when injecting values, such as in an info\n * element or a default value.\n */\n replaceInjectablesOverrides?: ReplaceInjectablesOverrides\n}\n\nexport type OneBlinkFormBaseProps = OneBlinkReadOnlyFormProps & {\n /** The function to call when the user cancels the form */\n onCancel: () => unknown\n /**\n * The function to call when the user submits the form with valid submission\n * data. See\n * [NewFormSubmission](https://oneblink.github.io/apps/modules/submissionService.html#NewFormSubmission)\n * for the structure of the argument.\n */\n onSubmit: (newFormSubmission: submissionService.NewFormSubmission) => unknown\n /** Whether the form is currently able to be submitted. False by default. */\n disabled?: boolean\n /** Whether the form is in preview mode. False by default. */\n isPreview?: boolean\n /**\n * An [ABN Lookup Authentication\n * Guid](https://abr.business.gov.au/Tools/WebServices). Required if the form\n * contains a `abn` form element.\n */\n abnLookupAuthenticationGuid?: string\n /**\n * A [reCAPTCHA Site Key](https://developers.google.com/recaptcha/intro).\n * Required if the form contains a `captcha` form element.\n */\n captchaSiteKey?: string\n /** Change properties for certain buttons on the form. */\n buttons?: FormsAppsTypes.FormsListStyles['buttons']\n /** Set a custom validation icon and accessible label. */\n validationIcon?: EnvironmentTypes.FormsAppEnvironmentStyles['validationIcon']\n /** Number of days attachments are retained for. */\n attachmentRetentionInDays?: number\n /**\n * If set to `false`, submission will be prevented while offline. If set to\n * `true`, the user will be prompted to allow them to continue with\n * attachments uploading in the background later.\n */\n isPendingQueueEnabled: boolean\n /**\n * The function to call when the user wishes to save their submission data as\n * a draft submission. If not specified, drafts cannot be saved. See\n * [NewDraftSubmission](https://oneblink.github.io/apps/modules/submissionService.html#NewDraftSubmission)\n * for the structure of the argument.\n */\n onSaveDraft?: (\n newDraftSubmission: submissionService.NewDraftSubmission,\n ) => unknown\n /**\n * The function to call when the user needs to navigate away from the form.\n * e.g. `history.push`\n */\n handleNavigateAway?: () => unknown\n /**\n * Determines whether the form is submittable or not. Info page type forms\n * show a \"Done\" button instead of a \"Submit\" button. Defaults to\n * \"CALCULATED\"\n */\n isInfoPage?: 'YES' | 'NO' | 'CALCULATED'\n /**\n * The function to call when a user uploads an attachment through an element\n * that allows attachment upload. See\n * [uploadAttachment](https://oneblink.github.io/apps/modules/attachmentsService.html#uploadAttachment)\n * for the structure of the argument and a sample function to be used.\n */\n onUploadAttachment?: typeof attachmentsService.uploadAttachment\n /**\n * Determines whether to use checkboxes or invisible recaptcha v2 for captcha\n * elements. Defaults to \"CHECKBOX\"\n */\n captchaType?: CaptchaType\n\n /**\n * Whether the form should use a navigable validation errors notification, or\n * a simple validation errors notification\n *\n * @default true\n */\n shouldUseNavigableValidationErrorsNotification?: boolean\n /** Various settings for the navigable validation errors notification */\n navigableValidationErrorsNotificationSettings?: {\n /**\n * A pixel offset for validation error navigation markers. Use this to\n * account for any headers your page might have. If not set, we will attempt\n * to calculate the offset for you. Please note: Calculating this value is\n * not supported when passing in a `scrollableContainerId`.\n */\n navigationTopOffset?: number\n /**\n * The HTML Element ID of the scrollable container your form resides in. If\n * not set, will scroll on the window.\n */\n scrollableContainerId?: string\n }\n}\n\nexport type OneBlinkFormUncontrolledProps = {\n /** The OneBlink Form to render */\n form: FormTypes.Form\n /** The initial submission data */\n initialSubmission?: SubmissionTypes.S3SubmissionData['submission']\n}\n\nexport type OneBlinkFormControlledProps = {\n definition: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n setFormSubmission: SetFormSubmission\n lastElementUpdated?: FormTypes.FormElement\n executedLookups: ExecutedLookups\n sectionState?: SectionState\n}\n\ntype Props = OneBlinkFormBaseProps &\n OneBlinkFormControlledProps & {\n isReadOnly: boolean\n }\n\nfunction OneBlinkFormBase({\n googleMapsApiKey,\n abnLookupAuthenticationGuid,\n captchaSiteKey,\n definition,\n disabled,\n isPreview,\n submission,\n isReadOnly,\n onCancel,\n onSubmit,\n onSaveDraft,\n setFormSubmission,\n buttons,\n validationIcon,\n primaryColour,\n attachmentRetentionInDays,\n isPendingQueueEnabled,\n handleNavigateAway,\n isInfoPage: isInfoPageProp,\n lastElementUpdated,\n executedLookups,\n task,\n taskGroup,\n taskGroupInstance,\n onUploadAttachment,\n captchaType,\n shouldUseNavigableValidationErrorsNotification = true,\n navigableValidationErrorsNotificationSettings,\n replaceInjectablesOverrides,\n sectionState,\n}: Props) {\n const isOffline = useIsOffline()\n const { isUsingFormsKey } = useAuth()\n const userProfileForInjectables = useUserProfileForInjectablesOutsideContext(\n replaceInjectablesOverrides?.getUserProfile,\n )\n const captchasRef = React.useRef<Array<ReCAPTCHA>>([])\n\n const theme = React.useMemo(\n () =>\n createMuiTheme({\n palette: {\n primary: {\n main: primaryColour || '#4c8da7',\n },\n success: {\n main: '#4caf50',\n },\n },\n }),\n [primaryColour],\n )\n\n const isInfoPage = React.useMemo(() => {\n if (!!isInfoPageProp && isInfoPageProp !== 'CALCULATED') {\n return isInfoPageProp === 'YES'\n }\n return formElementsService.determineIsInfoPage(definition)\n }, [definition, isInfoPageProp])\n\n const taskContextValue = React.useMemo(() => {\n return {\n task,\n taskGroup,\n taskGroupInstance,\n }\n }, [task, taskGroup, taskGroupInstance])\n\n //\n //\n // #region Form Definition\n\n const pages = React.useMemo<FormTypes.PageElement[]>(() => {\n if (definition.isMultiPage) {\n return definition.elements.reduce(\n (\n pageElements: FormTypes.PageElement[],\n formElement: FormTypes.FormElement,\n ) => {\n if (formElement.type === 'page') {\n pageElements.push(formElement)\n }\n return pageElements\n },\n [],\n )\n } else {\n return [\n {\n type: 'page',\n id: definition.id.toString(),\n label: definition.name,\n elements: definition.elements,\n conditionallyShow: false,\n requiresAllConditionallyShowPredicates: false,\n },\n ]\n }\n }, [\n definition.elements,\n definition.id,\n definition.isMultiPage,\n definition.name,\n ])\n\n const pagesWithDynamicElements = React.useMemo<\n FormTypes.PageElement[]\n >(() => {\n return injectDynamicElements(pages) as FormTypes.PageElement[]\n }, [pages])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Unsaved Changed\n\n const history = useHistory()\n\n const [isPreparingToSubmit, setIsPreparingToSubmit] =\n React.useState<boolean>(false)\n const [\n { isDirty, isNavigationAllowed, hasConfirmedNavigation, goToLocation },\n setUnsavedChangesState,\n ] = React.useState<{\n isDirty: boolean\n isNavigationAllowed: boolean\n hasConfirmedNavigation: boolean | null\n goToLocation: H.Location | null\n }>({\n isDirty: false,\n isNavigationAllowed: false,\n hasConfirmedNavigation: null,\n goToLocation: null,\n })\n const [promptOfflineSubmissionAttempt, setPromptOfflineSubmissionAttempt] =\n React.useState<boolean>(false)\n const [promptUploadingAttachments, setPromptUploadingAttachments] =\n React.useState<boolean>(false)\n const handleBlockedNavigation = React.useCallback<\n (location: H.Location, action: H.Action) => string | boolean\n >((location) => {\n setUnsavedChangesState((current) => ({\n ...current,\n goToLocation: location,\n hasConfirmedNavigation: false,\n }))\n return false\n }, [])\n\n const handleKeepGoing = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n goToLocation: null,\n hasConfirmedNavigation: null,\n }))\n }, [])\n\n const handleDiscardUnsavedChanges = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n isNavigationAllowed: true,\n hasConfirmedNavigation: true,\n }))\n sendGoogleAnalyticsEvent('oneblink_form_abandon', {\n formId: definition.id,\n formName: definition.name,\n })\n }, [definition.id, definition.name])\n\n React.useEffect(() => {\n if (hasConfirmedNavigation) {\n // Navigate to the previous blocked location with your navigate function\n if (goToLocation) {\n history.push(`${goToLocation.pathname}${goToLocation.search}`)\n if (handleNavigateAway) {\n handleNavigateAway()\n }\n } else {\n onCancel()\n }\n }\n }, [\n goToLocation,\n handleNavigateAway,\n hasConfirmedNavigation,\n history,\n onCancel,\n ])\n\n const handleCancel = React.useCallback(() => {\n if (isDirty) {\n setUnsavedChangesState((current) => ({\n ...current,\n hasConfirmedNavigation: false,\n }))\n } else {\n sendGoogleAnalyticsEvent('oneblink_form_abandon', {\n formId: definition.id,\n formName: definition.name,\n })\n onCancel()\n }\n }, [definition.id, definition.name, isDirty, onCancel])\n\n const allowNavigation = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n isNavigationAllowed: true,\n }))\n }, [])\n\n // #endregion Unsaved Changed\n //\n //\n\n //\n //\n // #region Conditional Logic\n\n const {\n formElementsConditionallyShown,\n conditionalLogicError,\n submissionConditionallyEnabled,\n } = useConditionalLogic({\n formElements: pagesWithDynamicElements,\n submission,\n enableSubmission: definition.enableSubmission,\n })\n\n // #endregion\n //\n //\n\n //\n //\n // #region Validation\n\n const validationErrorToastFocusElementRef =\n React.useRef<HTMLButtonElement>(null)\n const [isShowingValidationErrorsCard, setIsShowingValidationErrorsCard] =\n React.useState(false)\n const { validate } = useFormValidation(pages)\n\n const recaptchaType = React.useMemo(\n () => captchaType ?? 'CHECKBOX',\n [captchaType],\n )\n\n const formElementsValidation = React.useMemo<\n FormElementsValidation | undefined\n >(\n () =>\n !isReadOnly\n ? validate(\n submission,\n formElementsConditionallyShown,\n executedLookups ?? {},\n recaptchaType,\n isOffline,\n )\n : undefined,\n [\n isReadOnly,\n validate,\n submission,\n formElementsConditionallyShown,\n executedLookups,\n recaptchaType,\n isOffline,\n ],\n )\n\n React.useEffect(() => {\n if (!formElementsValidation) {\n setIsShowingValidationErrorsCard(false)\n }\n }, [formElementsValidation])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Pages\n\n const [hasAttemptedSubmit, setHasAttemptedSubmit] = React.useState(false)\n\n const {\n visiblePages,\n isFirstVisiblePage,\n isLastVisiblePage,\n isDisplayingCurrentPageError,\n isShowingMultiplePages,\n isStepsHeaderActive,\n toggleStepsNavigation,\n currentPageIndex,\n currentPage,\n currentPageNumber,\n checkDisplayPageError,\n setPageId,\n goToPreviousPage,\n goToNextPage,\n scrollToTopOfPageHTMLElementRef,\n } = usePages({\n hasAttemptedSubmit,\n pages,\n formElementsValidation,\n formElementsConditionallyShown,\n })\n\n // #endregion\n //\n //\n\n //\n //\n // #region Submissions\n\n const getCurrentSubmissionData = React.useCallback(\n (stripBinaryData: boolean) => {\n const { model, captchaTokens } = cleanFormSubmissionModel(\n submission,\n definition.elements,\n formElementsConditionallyShown,\n stripBinaryData,\n )\n return {\n submission: model,\n captchaTokens,\n }\n },\n [definition.elements, formElementsConditionallyShown, submission],\n )\n\n const obFormContainerHTMLElementRef = React.useRef<HTMLDivElement>(null)\n React.useEffect(() => {\n const obFormContainerHTMLElement = obFormContainerHTMLElementRef.current\n if (obFormContainerHTMLElement) {\n console.log(\n 'Setting toast notifications to be appended to HTML Element',\n obFormContainerHTMLElement,\n )\n bulmaToast.setDefaults({\n position: 'bottom-right',\n opacity: 0.95,\n appendTo: obFormContainerHTMLElement,\n })\n }\n return () => {\n bulmaToast.resetDefaults()\n }\n }, [])\n\n const checkAttachmentsCanBeSubmitted = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n // Prevent submission until all attachment uploads are finished\n // Unless the user is offline, in which case, the uploads will\n // be taken care of by a pending queue if enabled, otherwise\n // the user will be prompted to try again or save a draft.\n if (isOffline) {\n return true\n }\n const attachmentsAreUploading =\n attachmentsService.checkIfAttachmentsAreUploading(\n definition,\n submission,\n )\n\n if (attachmentsAreUploading) {\n if (isUsingFormsKey || !isPendingQueueEnabled) {\n bulmaToast.toast({\n message:\n 'Attachments are still uploading, please wait for them to finish before trying again.',\n type: 'is-primary',\n extraClasses: 'ob-toast cypress-still-uploading-toast',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return false\n } else {\n setPromptUploadingAttachments(true)\n return false\n }\n }\n\n return true\n },\n [definition, isOffline, isPendingQueueEnabled, isUsingFormsKey],\n )\n\n const checkBsbsCanBeSubmitted = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n return !checkBsbsAreInvalid(definition, submission)\n },\n [definition],\n )\n\n const checkBsbAreValidating = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n if (checkIfBsbsAreValidating(definition, submission)) {\n bulmaToast.toast({\n message:\n 'Bsb(s) are still being validated, please wait for them to finish before trying again.',\n type: 'is-primary',\n extraClasses: 'ob-toast cypress-still-validating-toast',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return false\n }\n\n return true\n },\n [definition],\n )\n\n const addCaptchaRef = React.useCallback((recaptcha: ReCAPTCHA) => {\n captchasRef.current.push(recaptcha)\n // this allows the FormElementCaptcha element to unregister any captchas\n return () => {\n captchasRef.current = captchasRef.current.filter(\n (recaptchaInstance) => recaptchaInstance !== recaptcha,\n )\n }\n }, [])\n\n const captchaContextValue = React.useMemo(\n () => ({\n captchaSiteKey,\n captchaType: recaptchaType,\n addCaptchaRef,\n }),\n [addCaptchaRef, captchaSiteKey, recaptchaType],\n )\n\n const resetRecaptchas = React.useCallback(() => {\n // unset the submission model value for each captcha element\n const updatedModel = { ...submission }\n formElementsService.forEachFormElement(definition.elements, (element) => {\n if (element.type === 'captcha') {\n updatedModel[element.name] = undefined\n }\n })\n // reset each captcha\n if (captchaType === 'CHECKBOX') {\n captchasRef.current.forEach((captcha) => {\n captcha.reset()\n })\n }\n\n setHasAttemptedSubmit(false)\n setFormSubmission((current) => {\n return { ...current, submission: updatedModel }\n })\n }, [definition.elements, setFormSubmission, submission, captchaType])\n\n const prepareSubmission = React.useCallback(\n async (\n continueWhilstAttachmentsAreUploading: boolean,\n ): Promise<ReturnType<typeof getCurrentSubmissionData> | undefined> => {\n const submissionData = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submissionData.submission)) {\n return\n }\n if (formElementsValidation) {\n console.log('Validation errors', formElementsValidation)\n if (!shouldUseNavigableValidationErrorsNotification) {\n bulmaToast.toast({\n message: 'Please fix validation errors',\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n }\n setIsShowingValidationErrorsCard(true)\n validationErrorToastFocusElementRef.current?.focus()\n return\n }\n if (!checkBsbsCanBeSubmitted(submissionData.submission)) {\n return\n }\n if (\n !continueWhilstAttachmentsAreUploading &&\n !checkAttachmentsCanBeSubmitted(submissionData.submission)\n ) {\n return\n }\n\n if (captchaType === 'INVISIBLE') {\n if (captchasRef.current.length) {\n const tokenResults = await Promise.allSettled(\n captchasRef.current.map((captcha) => captcha.executeAsync()),\n )\n\n const captchaTokens: string[] = []\n\n for (const result of tokenResults) {\n if (result.status === 'rejected' || !result.value) {\n console.log('Captcha token failure')\n bulmaToast.toast({\n message: 'Failed to get a captcha token',\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-failed-captcha-token-creation',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n captchaTokens.push(result.value)\n }\n\n submissionData.captchaTokens = captchaTokens\n }\n }\n\n // check if attachments exist\n const newSubmission = checkIfAttachmentsExist(\n definition,\n submissionData.submission,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n submission: newSubmission,\n }))\n bulmaToast.toast({\n message:\n \"Some files that were included in your submission have been removed based on your administrator's data retention policy, please remove them and upload them again.\",\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n\n if (isOffline && !isPendingQueueEnabled) {\n console.log('User is offline and form does not support a pending queue')\n setPromptOfflineSubmissionAttempt(true)\n return\n }\n return submissionData\n },\n [\n attachmentRetentionInDays,\n captchaType,\n checkAttachmentsCanBeSubmitted,\n checkBsbAreValidating,\n checkBsbsCanBeSubmitted,\n definition,\n formElementsValidation,\n getCurrentSubmissionData,\n isOffline,\n isPendingQueueEnabled,\n setFormSubmission,\n shouldUseNavigableValidationErrorsNotification,\n ],\n )\n\n const handleSubmit = React.useCallback(\n async (\n event:\n | React.FormEvent<HTMLFormElement>\n | React.MouseEvent<HTMLButtonElement, MouseEvent>,\n continueWhilstAttachmentsAreUploading: boolean,\n ) => {\n event.preventDefault()\n if (disabled || isReadOnly) return\n setHasAttemptedSubmit(true)\n\n setIsPreparingToSubmit(true)\n\n const submissionData = await prepareSubmission(\n continueWhilstAttachmentsAreUploading,\n )\n\n if (!submissionData) {\n setIsPreparingToSubmit(false)\n return\n }\n\n allowNavigation()\n\n // transplant injected options on the definition\n const elementsWithInjectedOptions = injectOptionsAcrossAllElements({\n contextElements: definition.elements,\n elements: definition.elements,\n submission: submissionData.submission,\n taskContext: taskContextValue,\n userProfile: userProfileForInjectables,\n })\n setIsPreparingToSubmit(false)\n resetRecaptchas()\n onSubmit({\n definition: {\n ...definition,\n elements: elementsWithInjectedOptions,\n },\n submission: submissionData.submission,\n recaptchas: submissionData.captchaTokens.map((token) => ({\n token,\n siteKey: captchaSiteKey as string,\n })),\n })\n sendGoogleAnalyticsEvent('oneblink_form_submit', {\n formId: definition.id,\n formName: definition.name,\n })\n },\n [\n disabled,\n isReadOnly,\n prepareSubmission,\n allowNavigation,\n definition,\n taskContextValue,\n userProfileForInjectables,\n resetRecaptchas,\n onSubmit,\n captchaSiteKey,\n ],\n )\n\n const handleSaveDraft = React.useCallback(\n (continueWhilstAttachmentsAreUploading: boolean) => {\n if (disabled) return\n if (onSaveDraft) {\n allowNavigation()\n\n // For drafts we don't need to save the captcha tokens,\n // they will need to prove they are not robot again\n const { submission } = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submission)) {\n return\n }\n if (\n !continueWhilstAttachmentsAreUploading &&\n !checkAttachmentsCanBeSubmitted(submission)\n ) {\n return\n }\n onSaveDraft({\n definition,\n submission,\n backgroundUpload: continueWhilstAttachmentsAreUploading,\n lastElementUpdated,\n sectionState,\n })\n }\n },\n [\n allowNavigation,\n checkAttachmentsCanBeSubmitted,\n definition,\n disabled,\n getCurrentSubmissionData,\n onSaveDraft,\n checkBsbAreValidating,\n lastElementUpdated,\n sectionState,\n ],\n )\n\n const handleContinueWithAttachments = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n setPromptUploadingAttachments(false)\n if (hasAttemptedSubmit) {\n handleSubmit(e, true)\n } else {\n handleSaveDraft(true)\n }\n },\n [\n handleSubmit,\n setPromptUploadingAttachments,\n hasAttemptedSubmit,\n handleSaveDraft,\n ],\n )\n const handleWaitForAttachments = React.useCallback(() => {\n setPromptUploadingAttachments(false)\n }, [setPromptUploadingAttachments])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Lookups\n\n const { handlePagesLookupResult } = useLookups(\n definition.id,\n setFormSubmission,\n )\n\n // #endregion\n //\n //\n\n //\n //\n // #region Submission/Definition Changes\n\n const handleChange = React.useCallback<NestedFormElementValueChangeHandler>(\n (element, { value, executedLookups, deleteSection, sectionState }) => {\n if (\n //This will ensure on a read only form that the summary and calculation elements\n //can still be displayed as it needs handleChange so it can render\n //due to the dynamic nature of the summary element.\n (disabled &&\n element.type !== 'summary' &&\n element.type !== 'calculation') ||\n element.type === 'page'\n ) {\n return\n }\n\n setUnsavedChangesState((current) => ({\n ...current,\n isDirty: true,\n }))\n if (element.type === 'section') {\n setFormSubmission((currentFormSubmission) => {\n const currentSectionState = currentFormSubmission.sectionState || []\n const existingSectionIndex = currentSectionState.findIndex(\n (section) => section.id === element.id,\n )\n const sectionIsInState = existingSectionIndex >= 0\n let newSectionState: SectionState\n if (sectionIsInState && deleteSection) {\n newSectionState = currentSectionState.filter(\n (section) => section.id !== element.id,\n )\n } else if (sectionIsInState) {\n // Update state of the section\n newSectionState = currentSectionState.map((section, index) =>\n index === existingSectionIndex\n ? {\n ...section,\n state:\n section.state === 'COLLAPSED' ? 'EXPANDED' : 'COLLAPSED',\n }\n : section,\n )\n } else {\n // Add the section to state\n newSectionState = [\n ...currentSectionState,\n {\n id: element.id,\n state: element.isCollapsed ? 'EXPANDED' : 'COLLAPSED',\n },\n ]\n }\n\n return {\n ...currentFormSubmission,\n sectionState: newSectionState,\n }\n })\n }\n // dont update the last element updated for elements the user cannot set the value of\n else if (element.type === 'summary' || element.type === 'calculation') {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n submission: {\n ...currentFormSubmission.submission,\n [element.name]:\n typeof value === 'function'\n ? value(currentFormSubmission.submission[element.name])\n : value,\n },\n }))\n } else {\n setFormSubmission((currentFormSubmission) => {\n return {\n ...currentFormSubmission,\n submission: {\n ...currentFormSubmission.submission,\n [element.name]:\n typeof value === 'function'\n ? value(currentFormSubmission.submission[element.name])\n : value,\n },\n lastElementUpdated: element,\n executedLookups: {\n ...currentFormSubmission.executedLookups,\n [element.name]:\n typeof executedLookups === 'function'\n ? executedLookups(\n currentFormSubmission.executedLookups?.[element.name],\n )\n : executedLookups,\n },\n sectionState: sectionState\n ? typeof sectionState === 'function'\n ? sectionState(currentFormSubmission.sectionState)\n : sectionState\n : currentFormSubmission.sectionState,\n }\n })\n }\n },\n [disabled, setFormSubmission],\n )\n\n // #endregion\n //\n //\n\n const lastElementUpdatedExistsOnForm = React.useMemo(() => {\n return !!formElementsService.findFormElement(\n definition.elements,\n (el) => el.id === lastElementUpdated?.id,\n )\n }, [definition.elements, lastElementUpdated])\n\n const lastElementUpdatedPage = React.useMemo(() => {\n return definition.elements.find((pageElement: FormTypes.FormElement) => {\n if (pageElement.type === 'page') {\n return formElementsService.findFormElement(\n pageElement.elements,\n (el) => el.id === lastElementUpdated?.id,\n )\n }\n })\n }, [lastElementUpdated, definition])\n\n const [hasResumed, setHasResumed] = React.useState(false)\n React.useEffect(() => {\n if (!hasResumed) {\n if (lastElementUpdated && lastElementUpdatedExistsOnForm) {\n if (lastElementUpdatedPage) {\n setPageId(lastElementUpdatedPage.id)\n }\n const element = document.querySelector(\n `[data-element-id=\"${lastElementUpdated.id}\"]`,\n )\n if (element) {\n window.requestAnimationFrame(() => {\n element.scrollIntoView({ behavior: 'smooth' })\n })\n }\n }\n if (sectionState) {\n {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n sectionState,\n }))\n }\n }\n setHasResumed(true)\n }\n }, [\n lastElementUpdated,\n hasResumed,\n lastElementUpdatedPage,\n lastElementUpdatedExistsOnForm,\n setPageId,\n sectionState,\n setFormSubmission,\n ])\n\n if (conditionalLogicError) {\n return (\n <>\n <div className=\"has-text-centered\">\n <MaterialIcon className=\"has-text-warning icon-x-large\">\n error\n </MaterialIcon>\n <h3 className=\"title is-3\">Bad Form Configuration</h3>\n <p className=\"cypress-conditional-logic-error-message\">\n {conditionalLogicError.message}\n </p>\n <p className=\"has-text-grey\">\n {localisationService.formatDatetimeLong(new Date())}\n </p>\n </div>\n </>\n )\n }\n\n return (\n <ThemeProvider theme={theme}>\n <LocalizationProvider dateAdapter={AdapterDateFns}>\n <ReplaceInjectablesOverridesContext.Provider\n value={replaceInjectablesOverrides}\n >\n <FormDefinitionContext.Provider value={definition}>\n <FormElementOptionsContextProvider>\n <FormElementLookupsContextProvider>\n <OneBlinkFormContainerContext.Provider\n value={obFormContainerHTMLElementRef.current}\n >\n <div\n className={clsx('ob-form-container', {\n 'is-showing-pages': isShowingMultiplePages,\n })}\n ref={obFormContainerHTMLElementRef}\n >\n <form\n name=\"obForm\"\n className={`ob-form cypress-ob-form ob-form__page-${\n currentPageIndex + 1\n }`}\n noValidate\n onSubmit={(e) => handleSubmit(e, false)}\n >\n <div>\n <div ref={scrollToTopOfPageHTMLElementRef} />\n {isShowingMultiplePages && (\n <div\n className={clsx('ob-steps-navigation', {\n 'is-active': isStepsHeaderActive,\n })}\n >\n <div\n className={clsx('ob-steps-navigation__header', {\n 'is-active': isStepsHeaderActive,\n })}\n onClick={toggleStepsNavigation}\n >\n <span className=\"icon is-invisible\">\n <MaterialIcon>keyboard_arrow_down</MaterialIcon>\n </span>\n <div className=\"steps-header-active-page\">\n {isDisplayingCurrentPageError ? (\n <span className=\"icon\">\n <MaterialIcon className=\"has-text-danger is-size-4\">\n warning\n </MaterialIcon>\n </span>\n ) : (\n <span className=\"steps-header-active-page-icon\">\n {currentPageNumber}\n </span>\n )}\n <span className=\"steps-header-active-page-label cypress-tablet-step-title\">\n {currentPage ? currentPage.label : ''}\n </span>\n </div>\n <span className=\"dropdown icon\">\n <MaterialIcon>keyboard_arrow_down</MaterialIcon>\n </span>\n </div>\n\n <div\n className={clsx('ob-steps-navigation__steps', {\n 'is-active': isStepsHeaderActive,\n })}\n >\n <div className=\"steps is-small is-horizontal-tablet cypress-steps\">\n {visiblePages.map(\n (\n page: FormTypes.PageElement,\n index: number,\n ) => {\n const hasErrors =\n checkDisplayPageError(page)\n return (\n <div\n key={page.id}\n id={`steps-navigation-step-${page.id}`}\n className={clsx(\n 'step-item cypress-step-item',\n {\n 'is-active':\n currentPage.id === page.id,\n 'is-completed':\n currentPageIndex > index,\n 'is-error': hasErrors,\n },\n )}\n onClick={(e) => {\n e.stopPropagation()\n if (page.id !== currentPage.id) {\n setPageId(page.id)\n }\n }}\n >\n <div\n className=\"step-marker step-marker-error ob-step-marker cypress-step-marker\"\n // @ts-expect-error ???\n name={`cypress-page-stepper-${index + 1}`}\n value={index + 1}\n >\n {hasErrors ? (\n <Tooltip title=\"Page has errors\">\n <span className=\"icon tooltip has-tooltip-top cypress-page-error\">\n <MaterialIcon className=\"has-text-danger is-size-3\">\n warning\n </MaterialIcon>\n </span>\n </Tooltip>\n ) : (\n <span>{index + 1}</span>\n )}\n </div>\n <div className=\"step-details ob-step-details\">\n <p\n className=\"step-title ob-step-title cypress-desktop-step-title\"\n id={`steps-navigation-step-label-${page.id}`}\n >\n {page.label}\n </p>\n </div>\n </div>\n )\n },\n )}\n </div>\n </div>\n </div>\n )}\n\n <div\n className={clsx('ob-steps-navigation__background', {\n 'is-active': isStepsHeaderActive,\n })}\n onClick={toggleStepsNavigation}\n />\n\n <div className=\"steps\">\n <div\n className={clsx('steps-content', {\n 'is-single-step': !isShowingMultiplePages,\n })}\n >\n <InjectPagesContext.Provider\n value={handlePagesLookupResult}\n >\n <GoogleMapsApiKeyContext.Provider\n value={googleMapsApiKey}\n >\n <AbnLookupAuthenticationGuidContext.Provider\n value={abnLookupAuthenticationGuid}\n >\n <ValidationIconConfigurationContext.Provider\n value={validationIcon}\n >\n <CaptchaContext.Provider\n value={captchaContextValue}\n >\n <AttachmentBlobsProvider>\n <FormIsReadOnlyContext.Provider\n value={isReadOnly}\n >\n <TaskContext.Provider\n value={taskContextValue}\n >\n <OnUploadAttachmentContext.Provider\n value={onUploadAttachment}\n >\n {visiblePages.map(\n (\n pageElement: FormTypes.PageElement,\n ) => (\n <PageFormElements\n key={pageElement.id}\n isActive={\n pageElement.id ===\n currentPage.id\n }\n formId={definition.id}\n formElementsConditionallyShown={\n formElementsConditionallyShown\n }\n formElementsValidation={\n formElementsValidation\n }\n displayValidationMessages={\n hasAttemptedSubmit ||\n isDisplayingCurrentPageError\n }\n pageElement={pageElement}\n onChange={handleChange}\n model={submission}\n setFormSubmission={\n setFormSubmission\n }\n sectionState={sectionState}\n />\n ),\n )}\n </OnUploadAttachmentContext.Provider>\n </TaskContext.Provider>\n </FormIsReadOnlyContext.Provider>\n </AttachmentBlobsProvider>\n </CaptchaContext.Provider>\n </ValidationIconConfigurationContext.Provider>\n </AbnLookupAuthenticationGuidContext.Provider>\n </GoogleMapsApiKeyContext.Provider>\n </InjectPagesContext.Provider>\n </div>\n\n {isShowingMultiplePages && (\n <div className=\"steps-actions\">\n <div className=\"steps-action\">\n <button\n type=\"button\"\n onClick={goToPreviousPage}\n disabled={isFirstVisiblePage}\n className=\"button is-light cypress-pages-previous\"\n >\n <span className=\"icon\">\n <MaterialIcon>\n keyboard_arrow_left\n </MaterialIcon>\n </span>\n <span>Back</span>\n </button>\n </div>\n <div className=\"step-progress-mobile cypress-steps-mobile\">\n {visiblePages.map(\n (page: FormTypes.PageElement, index) => (\n <div\n key={page.id}\n className={clsx(\n 'step-progress-mobile-dot',\n {\n 'is-active':\n currentPage.id === page.id,\n 'is-completed':\n currentPageIndex > index,\n 'has-background-danger':\n currentPage.id !== page.id &&\n checkDisplayPageError(page),\n },\n )}\n />\n ),\n )}\n </div>\n <div className=\"steps-action\">\n <button\n type=\"button\"\n onClick={goToNextPage}\n disabled={isLastVisiblePage}\n className=\"button is-light cypress-pages-next\"\n >\n <span>Next</span>\n <span className=\"icon\">\n <MaterialIcon>\n keyboard_arrow_right\n </MaterialIcon>\n </span>\n </button>\n </div>\n </div>\n )}\n </div>\n {!isReadOnly && (\n <div className=\"buttons ob-buttons ob-buttons-submit\">\n {onSaveDraft && !isInfoPage && (\n <button\n type=\"button\"\n className=\"button ob-button is-primary ob-button-save-draft cypress-save-draft-form\"\n onClick={() => handleSaveDraft(false)}\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={\n buttons?.saveDraft?.label || 'Save Draft'\n }\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span className=\"ob-buttons-submit__spacer\"></span>\n {!isInfoPage && (\n <button\n type=\"button\"\n className=\"button ob-button is-light ob-button-submit-cancel cypress-cancel-form\"\n onClick={handleCancel}\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={buttons?.cancel?.label || 'Cancel'}\n icon={buttons?.cancel?.icon}\n />\n </button>\n )}\n {isLastVisiblePage && (\n <Tooltip\n title={\n submissionConditionallyEnabled\n ? ''\n : 'Submission disabled: Your inputs have not met the criteria for submission'\n }\n >\n <button\n type=\"submit\"\n className={clsx(\n 'button ob-button is-success ob-button-submit cypress-submit-form-button cypress-submit-form',\n { 'is-loading': isPreparingToSubmit },\n {\n 'ob-button-submit-is-disabled':\n submissionConditionallyEnabled,\n },\n )}\n disabled={\n isPreview ||\n disabled ||\n isPreparingToSubmit ||\n !submissionConditionallyEnabled\n }\n >\n <CustomisableButtonInner\n label={\n isInfoPage\n ? 'Done'\n : buttons?.submit?.label || 'Submit'\n }\n icon={buttons?.submit?.icon}\n />\n </button>\n </Tooltip>\n )}\n </div>\n )}\n </div>\n </form>\n\n {!!definition.footer?.html && (\n <FormSubmissionModelContextProvider\n elements={definition.elements}\n model={submission}\n formElementsConditionallyShown={\n formElementsConditionallyShown\n }\n >\n <OneBlinkFormFooter footer={definition.footer?.html} />\n </FormSubmissionModelContextProvider>\n )}\n\n {!isReadOnly && !isPreview && (\n <React.Fragment>\n <Prompt\n when={isDirty && !isNavigationAllowed}\n message={handleBlockedNavigation}\n />\n <Modal\n isOpen={hasConfirmedNavigation === false}\n title=\"Unsaved Changes\"\n cardClassName=\"cypress-cancel-confirm\"\n titleClassName=\"cypress-cancel-confirm-title\"\n bodyClassName=\"cypress-cancel-confirm-body\"\n actions={\n <>\n {onSaveDraft && (\n <button\n type=\"button\"\n className=\"button ob-button is-success cypress-cancel-confirm-save-draft\"\n onClick={() => handleSaveDraft(false)}\n >\n <CustomisableButtonInner\n label={\n buttons?.saveDraft?.label || 'Save Draft'\n }\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span style={{ flex: 1 }}></span>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-cancel-confirm-back\"\n onClick={handleKeepGoing}\n >\n <CustomisableButtonInner\n label={\n buttons?.cancelPromptNo?.label || 'Back'\n }\n icon={buttons?.cancelPromptNo?.icon}\n />\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-cancel-confirm-discard\"\n onClick={handleDiscardUnsavedChanges}\n autoFocus\n >\n <CustomisableButtonInner\n label={\n buttons?.cancelPromptYes?.label || 'Discard'\n }\n icon={buttons?.cancelPromptYes?.icon}\n />\n </button>\n </>\n }\n >\n <p>\n You have unsaved changes, are you sure you want\n discard them?\n </p>\n </Modal>\n <Modal\n isOpen={promptUploadingAttachments === true}\n title=\"Attachment upload in progress\"\n cardClassName=\"cypress-attachments-wait-continue\"\n titleClassName=\"cypress-attachments-confirm-wait-title\"\n bodyClassName=\"cypress-attachments-confirm-wait-body\"\n actions={\n <>\n <span style={{ flex: 1 }}></span>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-attachments-confirm-wait\"\n onClick={handleWaitForAttachments}\n >\n Wait\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-attachments-confirm-continue\"\n onClick={handleContinueWithAttachments}\n autoFocus\n >\n Continue\n </button>\n </>\n }\n >\n <p>\n Your attachments are still uploading, do you want to\n wait for the uploads to complete or continue using\n the app? If you click continue the attachments will\n upload in the background. Do not close the app until\n the upload has been completed.\n </p>\n </Modal>\n\n <Modal\n isOpen={promptOfflineSubmissionAttempt}\n title=\"It looks like you're Offline\"\n className=\"ob-modal__offline-submission-attempt\"\n cardClassName=\"cypress-submission-offline has-text-centered\"\n titleClassName=\"cypress-offline-title\"\n bodyClassName=\"cypress-offline-body\"\n actions={\n <>\n {onSaveDraft && (\n <button\n type=\"button\"\n className=\"button ob-button ob-button__offline-submission-attempt-save-draft is-success\"\n onClick={() => handleSaveDraft(false)}\n >\n <CustomisableButtonInner\n label={\n buttons?.saveDraft?.label || 'Save Draft'\n }\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span style={{ flex: 1 }}></span>\n <button\n className=\"button ob-button ob-button__offline-submission-attempt-cancel is-light\"\n onClick={() =>\n setPromptOfflineSubmissionAttempt(false)\n }\n >\n Cancel\n </button>\n <button\n className=\"button ob-button ob-button__offline-submission-attempt-try-again is-primary\"\n onClick={(e) => {\n setPromptOfflineSubmissionAttempt(false)\n handleSubmit(e, false)\n }}\n autoFocus\n >\n Try Again\n </button>\n </>\n }\n >\n <p className=\"ob-modal__offline-submission-attempt-message\">\n You cannot submit this form while offline, please\n try again when connectivity is restored.\n {onSaveDraft && (\n <span className=\"ob-modal__offline-submission-attempt-save-draft-message\">\n {' '}\n Alternatively, click the{' '}\n <b>\n {buttons?.saveDraft?.label || 'Save Draft'}\n </b>{' '}\n button below to come back to this later.\n </span>\n )}\n </p>\n <MaterialIcon className=\"has-text-warning icon-x-large ob-modal__offline-submission-attempt-icon\">\n wifi_off\n </MaterialIcon>\n </Modal>\n </React.Fragment>\n )}\n {shouldUseNavigableValidationErrorsNotification &&\n isShowingValidationErrorsCard && (\n <ValidationErrorsCard\n visiblePages={visiblePages}\n formElementsValidation={formElementsValidation}\n setPageId={setPageId}\n currentPage={currentPage}\n navigationTopOffset={\n navigableValidationErrorsNotificationSettings?.navigationTopOffset ??\n 'CALCULATE'\n }\n scrollableContainerId={\n navigableValidationErrorsNotificationSettings?.scrollableContainerId\n }\n validationErrorToastFocusElementRef={\n validationErrorToastFocusElementRef\n }\n />\n )}\n </div>\n </OneBlinkFormContainerContext.Provider>\n </FormElementLookupsContextProvider>\n </FormElementOptionsContextProvider>\n </FormDefinitionContext.Provider>\n </ReplaceInjectablesOverridesContext.Provider>\n </LocalizationProvider>\n </ThemeProvider>\n )\n}\n\nexport default React.memo(OneBlinkFormBase)\n"]}
@@ -3,7 +3,8 @@ import QuillHTML from './QuillHTML';
3
3
  import useReplaceableText from '../hooks/useReplaceableText';
4
4
  function OneBlinkFormFooter({ footer }) {
5
5
  const html = useReplaceableText(footer);
6
- return React.createElement(QuillHTML, { html: html, className: "ob-footer-container" });
6
+ return (React.createElement("footer", { className: "ob-footer-container" },
7
+ React.createElement(QuillHTML, { html: html })));
7
8
  }
8
9
  export default memo(OneBlinkFormFooter);
9
10
  //# sourceMappingURL=OneBlinkFormFooter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OneBlinkFormFooter.js","sourceRoot":"","sources":["../../src/components/OneBlinkFormFooter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,SAAS,MAAM,aAAa,CAAA;AACnC,OAAO,kBAAkB,MAAM,6BAA6B,CAAA;AAE5D,SAAS,kBAAkB,CAAC,EAAE,MAAM,EAAsB;IACxD,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAEvC,OAAO,oBAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,qBAAqB,GAAG,CAAA;AAClE,CAAC;AAED,eAAe,IAAI,CAAC,kBAAkB,CAAC,CAAA","sourcesContent":["import React, { memo } from 'react'\nimport QuillHTML from './QuillHTML'\nimport useReplaceableText from '../hooks/useReplaceableText'\n\nfunction OneBlinkFormFooter({ footer }: { footer: string }) {\n const html = useReplaceableText(footer)\n\n return <QuillHTML html={html} className=\"ob-footer-container\" />\n}\n\nexport default memo(OneBlinkFormFooter)\n"]}
1
+ {"version":3,"file":"OneBlinkFormFooter.js","sourceRoot":"","sources":["../../src/components/OneBlinkFormFooter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,SAAS,MAAM,aAAa,CAAA;AACnC,OAAO,kBAAkB,MAAM,6BAA6B,CAAA;AAE5D,SAAS,kBAAkB,CAAC,EAAE,MAAM,EAAsB;IACxD,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAEvC,OAAO,CACL,gCAAQ,SAAS,EAAC,qBAAqB;QACrC,oBAAC,SAAS,IAAC,IAAI,EAAE,IAAI,GAAI,CAClB,CACV,CAAA;AACH,CAAC;AAED,eAAe,IAAI,CAAC,kBAAkB,CAAC,CAAA","sourcesContent":["import React, { memo } from 'react'\nimport QuillHTML from './QuillHTML'\nimport useReplaceableText from '../hooks/useReplaceableText'\n\nfunction OneBlinkFormFooter({ footer }: { footer: string }) {\n const html = useReplaceableText(footer)\n\n return (\n <footer className=\"ob-footer-container\">\n <QuillHTML html={html} />\n </footer>\n )\n}\n\nexport default memo(OneBlinkFormFooter)\n"]}
@@ -15,7 +15,7 @@ export function stringifyAttachments(value) {
15
15
  }
16
16
  function FormElementFiles({ id, element, value, onChange, validationMessage, displayValidationMessage, isDirty, setIsDirty, }) {
17
17
  const ariaDescribedby = useElementAriaDescribedby(id, element);
18
- const { addAttachments, removeAttachment, changeAttachment } = useAttachments(element, onChange, setIsDirty);
18
+ const { addAttachments, removeAttachment, changeAttachment } = useAttachments(element, onChange, setIsDirty, element.maxFileSize);
19
19
  const inputRef = React.useRef(null);
20
20
  const handleAdd = React.useCallback(() => {
21
21
  if (!inputRef.current)
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementFiles.js","sourceRoot":"","sources":["../../src/form-elements/FormElementFiles.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport FormElementFile from './FormElementFile'\nimport useAttachments from '../hooks/attachments/useAttachments'\nimport {\n checkFileNameIsValid,\n checkFileNameExtensionIsValid,\n} from '../services/form-validation/validators'\nimport { attachmentsService } from '@oneblink/apps'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport MaterialIcon from '../components/MaterialIcon'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\nexport function stringifyAttachments(\n value: attachmentsService.Attachment[] | undefined,\n): string {\n if (value?.every((attachment) => !attachment.type)) {\n return JSON.stringify(value)\n }\n return ''\n}\n\nfunction FormElementFiles({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n isDirty,\n setIsDirty,\n}: {\n id: string\n element: FormTypes.FilesElement\n value?: attachmentsService.Attachment[]\n onChange: FormElementValueChangeHandler<attachmentsService.Attachment[]>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n} & IsDirtyProps) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const { addAttachments, removeAttachment, changeAttachment } = useAttachments(\n element,\n onChange,\n setIsDirty,\n )\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const handleAdd = React.useCallback(() => {\n if (!inputRef.current) return\n // RESET HTML FILE INPUT VALUE SO FILES PREVIOUSLY ADDED AND REMOVED ARE RECOGNISED\n inputRef.current.value = ''\n inputRef.current.click()\n }, [])\n\n const attachments = value || []\n\n const { isLookingUp } = React.useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (isDirty || displayValidationMessage) && !!validationMessage && !isLookingUp\n\n return (\n <div className=\"cypress-files-element\">\n <FormElementLabelContainer\n className=\"ob-files\"\n element={element}\n id={id}\n required={!!element.minEntries}\n >\n <input\n ref={inputRef}\n type=\"file\"\n name={element.name}\n id={id}\n className=\"file-input ob-input\"\n multiple={element.maxEntries !== 1}\n disabled={element.readOnly}\n onChange={(event) =>\n addAttachments(\n event.target.files ? Array.from(event.target.files) : [],\n )\n }\n />\n <div className=\"control cypress-files-control\">\n <div className=\"columns is-multiline ob-columns-container\">\n {attachments.map((attachment, index) => {\n return (\n <FormElementFile\n key={attachment.type ? attachment._id : attachment.id}\n element={element}\n onRemove={removeAttachment}\n file={attachment}\n onChange={changeAttachment}\n disableUpload={\n (!!element.maxEntries &&\n attachments.length > element.maxEntries) ||\n !checkFileNameIsValid(element, attachment.fileName) ||\n !checkFileNameExtensionIsValid(element, attachment.fileName)\n }\n index={index}\n />\n )\n })}\n {!element.readOnly &&\n (!element.maxEntries ||\n attachments.length < element.maxEntries) && (\n <div className=\"column is-one-quarter-ob\">\n <button\n type=\"button\"\n className=\"button ob-files__add-new-button\"\n onClick={handleAdd}\n aria-describedby={ariaDescribedby}\n onBlur={setIsDirty}\n >\n <MaterialIcon className=\"icon-x-large\">add</MaterialIcon>\n </button>\n </div>\n )}\n </div>\n </div>\n\n {isDisplayingValidationMessage && (\n <FormElementValidationMessage message={validationMessage} />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementFiles)\n"]}
1
+ {"version":3,"file":"FormElementFiles.js","sourceRoot":"","sources":["../../src/form-elements/FormElementFiles.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport FormElementFile from './FormElementFile'\nimport useAttachments from '../hooks/attachments/useAttachments'\nimport {\n checkFileNameIsValid,\n checkFileNameExtensionIsValid,\n} from '../services/form-validation/validators'\nimport { attachmentsService } from '@oneblink/apps'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport MaterialIcon from '../components/MaterialIcon'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\nexport function stringifyAttachments(\n value: attachmentsService.Attachment[] | undefined,\n): string {\n if (value?.every((attachment) => !attachment.type)) {\n return JSON.stringify(value)\n }\n return ''\n}\n\nfunction FormElementFiles({\n id,\n element,\n value,\n onChange,\n validationMessage,\n displayValidationMessage,\n isDirty,\n setIsDirty,\n}: {\n id: string\n element: FormTypes.FilesElement\n value?: attachmentsService.Attachment[]\n onChange: FormElementValueChangeHandler<attachmentsService.Attachment[]>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n} & IsDirtyProps) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const { addAttachments, removeAttachment, changeAttachment } = useAttachments(\n element,\n onChange,\n setIsDirty,\n element.maxFileSize,\n )\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n const handleAdd = React.useCallback(() => {\n if (!inputRef.current) return\n // RESET HTML FILE INPUT VALUE SO FILES PREVIOUSLY ADDED AND REMOVED ARE RECOGNISED\n inputRef.current.value = ''\n inputRef.current.click()\n }, [])\n\n const attachments = value || []\n\n const { isLookingUp } = React.useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (isDirty || displayValidationMessage) && !!validationMessage && !isLookingUp\n\n return (\n <div className=\"cypress-files-element\">\n <FormElementLabelContainer\n className=\"ob-files\"\n element={element}\n id={id}\n required={!!element.minEntries}\n >\n <input\n ref={inputRef}\n type=\"file\"\n name={element.name}\n id={id}\n className=\"file-input ob-input\"\n multiple={element.maxEntries !== 1}\n disabled={element.readOnly}\n onChange={(event) =>\n addAttachments(\n event.target.files ? Array.from(event.target.files) : [],\n )\n }\n />\n <div className=\"control cypress-files-control\">\n <div className=\"columns is-multiline ob-columns-container\">\n {attachments.map((attachment, index) => {\n return (\n <FormElementFile\n key={attachment.type ? attachment._id : attachment.id}\n element={element}\n onRemove={removeAttachment}\n file={attachment}\n onChange={changeAttachment}\n disableUpload={\n (!!element.maxEntries &&\n attachments.length > element.maxEntries) ||\n !checkFileNameIsValid(element, attachment.fileName) ||\n !checkFileNameExtensionIsValid(element, attachment.fileName)\n }\n index={index}\n />\n )\n })}\n {!element.readOnly &&\n (!element.maxEntries ||\n attachments.length < element.maxEntries) && (\n <div className=\"column is-one-quarter-ob\">\n <button\n type=\"button\"\n className=\"button ob-files__add-new-button\"\n onClick={handleAdd}\n aria-describedby={ariaDescribedby}\n onBlur={setIsDirty}\n >\n <MaterialIcon className=\"icon-x-large\">add</MaterialIcon>\n </button>\n </div>\n )}\n </div>\n </div>\n\n {isDisplayingValidationMessage && (\n <FormElementValidationMessage message={validationMessage} />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementFiles)\n"]}
@@ -1,7 +1,7 @@
1
1
  import { FormTypes } from '@oneblink/types';
2
2
  import { attachmentsService } from '@oneblink/apps';
3
3
  import { FormElementValueChangeHandler, IsDirtyProps } from '../../types/form';
4
- declare const useAttachments: (element: FormTypes.FilesElement, onChange: FormElementValueChangeHandler<attachmentsService.Attachment[]>, setIsDirty: IsDirtyProps["setIsDirty"]) => {
4
+ declare const useAttachments: (element: FormTypes.FilesElement, onChange: FormElementValueChangeHandler<attachmentsService.Attachment[]>, setIsDirty: IsDirtyProps["setIsDirty"], maxFileSize: number | undefined) => {
5
5
  addAttachments: (files: File[]) => Promise<void>;
6
6
  removeAttachment: (id: string) => void;
7
7
  changeAttachment: (id: string, attachment: attachmentsService.Attachment) => void;
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { prepareNewAttachment, generateErrorAttachment, correctFileOrientation, } from '../../services/attachments';
3
3
  import { canvasToBlob } from '../../services/blob-utils';
4
4
  import useIsMounted from '../useIsMounted';
5
- const useAttachments = (element, onChange, setIsDirty) => {
5
+ const useAttachments = (element, onChange, setIsDirty, maxFileSize) => {
6
6
  const isMounted = useIsMounted();
7
7
  const addAttachments = React.useCallback(async (files) => {
8
8
  if (!files.length)
@@ -11,6 +11,10 @@ const useAttachments = (element, onChange, setIsDirty) => {
11
11
  if (!file.size) {
12
12
  return generateErrorAttachment(file, file.name, element, 'You cannot upload an empty file.');
13
13
  }
14
+ const fileSizeInMB = file.size / 1024 / 1024;
15
+ if (maxFileSize && fileSizeInMB > maxFileSize) {
16
+ return generateErrorAttachment(file, file.name, element, `File size ${fileSizeInMB.toFixed(2)}MB exceeds the allowed maximum of ${maxFileSize}MB.`);
17
+ }
14
18
  const result = await correctFileOrientation(file);
15
19
  if (result instanceof Blob) {
16
20
  return prepareNewAttachment(result, file.name, element);
@@ -28,7 +32,7 @@ const useAttachments = (element, onChange, setIsDirty) => {
28
32
  if (isMounted.current) {
29
33
  setIsDirty();
30
34
  }
31
- }, [element, isMounted, onChange, setIsDirty]);
35
+ }, [element, isMounted, maxFileSize, onChange, setIsDirty]);
32
36
  const removeAttachment = React.useCallback((id) => {
33
37
  onChange(element, {
34
38
  value: (currentAttachments) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useAttachments.js","sourceRoot":"","sources":["../../../src/hooks/attachments/useAttachments.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport * as React from 'react'\nimport {\n prepareNewAttachment,\n generateErrorAttachment,\n correctFileOrientation,\n} from '../../services/attachments'\nimport { attachmentsService } from '@oneblink/apps'\nimport { canvasToBlob } from '../../services/blob-utils'\nimport useIsMounted from '../useIsMounted'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../../types/form'\n\nconst useAttachments = (\n element: FormTypes.FilesElement,\n onChange: FormElementValueChangeHandler<attachmentsService.Attachment[]>,\n setIsDirty: IsDirtyProps['setIsDirty'],\n) => {\n const isMounted = useIsMounted()\n\n const addAttachments = React.useCallback(\n async (files: File[]): Promise<void> => {\n if (!files.length) return\n const newAttachments: Array<\n attachmentsService.AttachmentNew | attachmentsService.AttachmentError\n > = await Promise.all(\n files.map(async (file) => {\n if (!file.size) {\n return generateErrorAttachment(\n file,\n file.name,\n element,\n 'You cannot upload an empty file.',\n )\n }\n const result = await correctFileOrientation(file)\n if (result instanceof Blob) {\n return prepareNewAttachment(result, file.name, element)\n }\n\n const blob = await canvasToBlob(result)\n return prepareNewAttachment(blob, file.name, element)\n }),\n )\n\n onChange(element, {\n value: (currentAttachments) => {\n if (!currentAttachments) return newAttachments\n return [...currentAttachments, ...newAttachments]\n },\n })\n if (isMounted.current) {\n setIsDirty()\n }\n },\n [element, isMounted, onChange, setIsDirty],\n )\n\n const removeAttachment = React.useCallback(\n (id: string) => {\n onChange(element, {\n value: (currentAttachments) => {\n const newAttachments = currentAttachments?.filter((att) => {\n // Return items that are not the removed id\n if (!att.type) {\n return att.id !== id\n }\n return att._id !== id\n })\n if (newAttachments?.length) {\n return newAttachments\n }\n },\n })\n if (isMounted.current) {\n setIsDirty()\n }\n },\n [element, isMounted, onChange, setIsDirty],\n )\n\n const changeAttachment = React.useCallback(\n (id: string, attachment: attachmentsService.Attachment) => {\n onChange(element, {\n value: (currentAttachments) => {\n if (!currentAttachments) return\n return currentAttachments.map((att) => {\n // Can only change attachments that are not uploaded (have a type)\n if (att.type && att._id === id) {\n return attachment\n }\n return att\n })\n },\n })\n if (isMounted.current) {\n setIsDirty()\n }\n },\n [element, isMounted, onChange, setIsDirty],\n )\n\n return {\n addAttachments,\n removeAttachment,\n changeAttachment,\n }\n}\n\nexport default useAttachments\n"]}
1
+ {"version":3,"file":"useAttachments.js","sourceRoot":"","sources":["../../../src/hooks/attachments/useAttachments.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport * as React from 'react'\nimport {\n prepareNewAttachment,\n generateErrorAttachment,\n correctFileOrientation,\n} from '../../services/attachments'\nimport { attachmentsService } from '@oneblink/apps'\nimport { canvasToBlob } from '../../services/blob-utils'\nimport useIsMounted from '../useIsMounted'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../../types/form'\n\nconst useAttachments = (\n element: FormTypes.FilesElement,\n onChange: FormElementValueChangeHandler<attachmentsService.Attachment[]>,\n setIsDirty: IsDirtyProps['setIsDirty'],\n maxFileSize: number | undefined,\n) => {\n const isMounted = useIsMounted()\n\n const addAttachments = React.useCallback(\n async (files: File[]): Promise<void> => {\n if (!files.length) return\n const newAttachments: Array<\n attachmentsService.AttachmentNew | attachmentsService.AttachmentError\n > = await Promise.all(\n files.map(async (file) => {\n if (!file.size) {\n return generateErrorAttachment(\n file,\n file.name,\n element,\n 'You cannot upload an empty file.',\n )\n }\n const fileSizeInMB = file.size / 1024 / 1024\n if (maxFileSize && fileSizeInMB > maxFileSize) {\n return generateErrorAttachment(\n file,\n file.name,\n element,\n `File size ${fileSizeInMB.toFixed(2)}MB exceeds the allowed maximum of ${maxFileSize}MB.`,\n )\n }\n const result = await correctFileOrientation(file)\n if (result instanceof Blob) {\n return prepareNewAttachment(result, file.name, element)\n }\n\n const blob = await canvasToBlob(result)\n return prepareNewAttachment(blob, file.name, element)\n }),\n )\n\n onChange(element, {\n value: (currentAttachments) => {\n if (!currentAttachments) return newAttachments\n return [...currentAttachments, ...newAttachments]\n },\n })\n if (isMounted.current) {\n setIsDirty()\n }\n },\n [element, isMounted, maxFileSize, onChange, setIsDirty],\n )\n\n const removeAttachment = React.useCallback(\n (id: string) => {\n onChange(element, {\n value: (currentAttachments) => {\n const newAttachments = currentAttachments?.filter((att) => {\n // Return items that are not the removed id\n if (!att.type) {\n return att.id !== id\n }\n return att._id !== id\n })\n if (newAttachments?.length) {\n return newAttachments\n }\n },\n })\n if (isMounted.current) {\n setIsDirty()\n }\n },\n [element, isMounted, onChange, setIsDirty],\n )\n\n const changeAttachment = React.useCallback(\n (id: string, attachment: attachmentsService.Attachment) => {\n onChange(element, {\n value: (currentAttachments) => {\n if (!currentAttachments) return\n return currentAttachments.map((att) => {\n // Can only change attachments that are not uploaded (have a type)\n if (att.type && att._id === id) {\n return attachment\n }\n return att\n })\n },\n })\n if (isMounted.current) {\n setIsDirty()\n }\n },\n [element, isMounted, onChange, setIsDirty],\n )\n\n return {\n addAttachments,\n removeAttachment,\n changeAttachment,\n }\n}\n\nexport default useAttachments\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": "8.7.0-beta.2",
4
+ "version": "8.7.0-beta.3",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"
@@ -47,7 +47,7 @@
47
47
  "@mui/lab": "^5.0.0-alpha.152",
48
48
  "@mui/material": "^5.15.6",
49
49
  "@mui/x-date-pickers": "^6.20.2",
50
- "@oneblink/apps": "^23.1.0-beta.2",
50
+ "@oneblink/apps": "^23.1.0-beta.3",
51
51
  "@oneblink/release-cli": "^3.4.0-beta.1",
52
52
  "@oneblink/types": "github:oneblink/types",
53
53
  "@types/blueimp-load-image": "^5.16.6",