@oneblink/apps-react 3.2.0-beta.1 → 4.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,7 +13,7 @@ export type BaseProps = {
13
13
  buttons?: FormsAppsTypes.FormsListStyles['buttons'];
14
14
  primaryColour?: string;
15
15
  attachmentRetentionInDays?: number;
16
- allowSubmitWithPendingAttachments?: boolean;
16
+ isPendingQueueEnabled: boolean;
17
17
  onSaveDraft?: (newDraftSubmission: submissionService.NewDraftSubmission) => unknown;
18
18
  handleNavigateAway?: () => unknown;
19
19
  isInfoPage?: 'YES' | 'NO' | 'CALCULATED';
@@ -27,6 +27,6 @@ export type ControlledProps = {
27
27
  type Props = BaseProps & ControlledProps & {
28
28
  isReadOnly: boolean;
29
29
  };
30
- declare function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captchaSiteKey, definition, disabled, isPreview, submission, isReadOnly, onCancel, onSubmit, onSaveDraft, setFormSubmission, buttons, primaryColour, attachmentRetentionInDays, allowSubmitWithPendingAttachments, handleNavigateAway, isInfoPage: isInfoPageProp, lastElementUpdated, }: Props): JSX.Element;
30
+ declare function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captchaSiteKey, definition, disabled, isPreview, submission, isReadOnly, onCancel, onSubmit, onSaveDraft, setFormSubmission, buttons, primaryColour, attachmentRetentionInDays, isPendingQueueEnabled, handleNavigateAway, isInfoPage: isInfoPageProp, lastElementUpdated, }: Props): JSX.Element;
31
31
  declare const _default: React.MemoExoticComponent<typeof OneBlinkFormBase>;
32
32
  export default _default;
@@ -28,10 +28,9 @@ import checkBsbsAreInvalid from './services/checkBsbsAreInvalid';
28
28
  import checkIfBsbsAreValidating from './services/checkIfBsbsAreValidating';
29
29
  import checkIfAttachmentsExist from './services/checkIfAttachmentsExist';
30
30
  import useAuth from './hooks/useAuth';
31
- import determineIsInfoPage from './services/determineIsInfoPage';
32
31
  import { formElementsService } from '@oneblink/sdk-core';
33
- function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captchaSiteKey, definition, disabled, isPreview, submission, isReadOnly, onCancel, onSubmit, onSaveDraft, setFormSubmission, buttons, primaryColour, attachmentRetentionInDays, allowSubmitWithPendingAttachments, handleNavigateAway, isInfoPage: isInfoPageProp, lastElementUpdated, }) {
34
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
32
+ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captchaSiteKey, definition, disabled, isPreview, submission, isReadOnly, onCancel, onSubmit, onSaveDraft, setFormSubmission, buttons, primaryColour, attachmentRetentionInDays, isPendingQueueEnabled, handleNavigateAway, isInfoPage: isInfoPageProp, lastElementUpdated, }) {
33
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
35
34
  const isOffline = useIsOffline();
36
35
  const { isUsingFormsKey } = useAuth();
37
36
  const theme = React.useMemo(() => createMuiTheme({
@@ -48,7 +47,7 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
48
47
  if (!!isInfoPageProp && isInfoPageProp !== 'CALCULATED') {
49
48
  return isInfoPageProp === 'YES';
50
49
  }
51
- return determineIsInfoPage(definition);
50
+ return formElementsService.determineIsInfoPage(definition);
52
51
  }, [definition, isInfoPageProp]);
53
52
  //
54
53
  //
@@ -93,6 +92,7 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
93
92
  hasConfirmedNavigation: null,
94
93
  goToLocation: null,
95
94
  });
95
+ const [promptOfflineSubmissionAttempt, setPromptOfflineSubmissionAttempt] = React.useState(false);
96
96
  const [promptUploadingAttachments, setPromptUploadingAttachments] = React.useState(false);
97
97
  const handleBlockedNavigation = React.useCallback((location) => {
98
98
  setUnsavedChangesState((current) => ({
@@ -221,17 +221,18 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
221
221
  const checkAttachmentsCanBeSubmitted = React.useCallback((submission) => {
222
222
  // Prevent submission until all attachment uploads are finished
223
223
  // Unless the user is offline, in which case, the uploads will
224
- // be taken care of by a pending queue...hopefully.
224
+ // be taken care of by a pending queue if enabled, otherwise
225
+ // the user will be prompted to try again or save a draft.
225
226
  if (isOffline) {
226
227
  return true;
227
228
  }
228
229
  const attachmentsAreUploading = attachmentsService.checkIfAttachmentsAreUploading(definition, submission);
229
230
  if (attachmentsAreUploading) {
230
- if (isUsingFormsKey || !allowSubmitWithPendingAttachments) {
231
+ if (isUsingFormsKey || !isPendingQueueEnabled) {
231
232
  bulmaToast.toast({
232
233
  message: 'Attachments are still uploading, please wait for them to finish before trying again.',
233
- // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes
234
- type: 'ob-toast is-primary cypress-still-uploading-toast',
234
+ type: 'is-primary',
235
+ extraClasses: 'ob-toast cypress-still-uploading-toast',
235
236
  duration: 4000,
236
237
  pauseOnHover: true,
237
238
  closeOnClick: true,
@@ -244,7 +245,7 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
244
245
  }
245
246
  }
246
247
  return true;
247
- }, [definition, isOffline, isUsingFormsKey, allowSubmitWithPendingAttachments]);
248
+ }, [definition, isOffline, isPendingQueueEnabled, isUsingFormsKey]);
248
249
  const checkBsbsCanBeSubmitted = React.useCallback((submission) => {
249
250
  return !checkBsbsAreInvalid(definition, submission);
250
251
  }, [definition]);
@@ -252,8 +253,8 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
252
253
  if (checkIfBsbsAreValidating(definition, submission)) {
253
254
  bulmaToast.toast({
254
255
  message: 'Bsb(s) are still being validated, please wait for them to finish before trying again.',
255
- // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes
256
- type: 'ob-toast is-primary cypress-still-validating-toast',
256
+ type: 'is-primary',
257
+ extraClasses: 'ob-toast cypress-still-validating-toast',
257
258
  duration: 4000,
258
259
  pauseOnHover: true,
259
260
  closeOnClick: true,
@@ -275,8 +276,8 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
275
276
  console.log('Validation errors', formElementsValidation);
276
277
  bulmaToast.toast({
277
278
  message: 'Please fix validation errors',
278
- // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes
279
- type: 'ob-toast is-danger cypress-invalid-submit-attempt',
279
+ type: 'is-danger',
280
+ extraClasses: 'ob-toast cypress-invalid-submit-attempt',
280
281
  duration: 4000,
281
282
  pauseOnHover: true,
282
283
  closeOnClick: true,
@@ -286,10 +287,9 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
286
287
  if (!checkBsbsCanBeSubmitted(submissionData.submission)) {
287
288
  return;
288
289
  }
289
- if (!continueWhilstAttachmentsAreUploading) {
290
- if (!checkAttachmentsCanBeSubmitted(submissionData.submission)) {
291
- return;
292
- }
290
+ if (!continueWhilstAttachmentsAreUploading &&
291
+ !checkAttachmentsCanBeSubmitted(submissionData.submission)) {
292
+ return;
293
293
  }
294
294
  // check if attachments exist
295
295
  const newSubmission = checkIfAttachmentsExist(definition, submissionData.submission, attachmentRetentionInDays);
@@ -300,14 +300,19 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
300
300
  }));
301
301
  bulmaToast.toast({
302
302
  message: "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.",
303
- // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes
304
- type: 'ob-toast is-danger cypress-invalid-submit-attempt',
303
+ type: 'is-danger',
304
+ extraClasses: 'ob-toast cypress-invalid-submit-attempt',
305
305
  duration: 4000,
306
306
  pauseOnHover: true,
307
307
  closeOnClick: true,
308
308
  });
309
309
  return;
310
310
  }
311
+ if (isOffline && !isPendingQueueEnabled) {
312
+ console.log('User is offline and form does not support a pending queue');
313
+ setPromptOfflineSubmissionAttempt(true);
314
+ return;
315
+ }
311
316
  allowNavigation();
312
317
  onSubmit({
313
318
  definition,
@@ -320,12 +325,14 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
320
325
  getCurrentSubmissionData,
321
326
  checkBsbAreValidating,
322
327
  formElementsValidation,
323
- checkAttachmentsCanBeSubmitted,
324
328
  checkBsbsCanBeSubmitted,
325
329
  definition,
326
330
  attachmentRetentionInDays,
331
+ isOffline,
332
+ isPendingQueueEnabled,
327
333
  allowNavigation,
328
334
  onSubmit,
335
+ checkAttachmentsCanBeSubmitted,
329
336
  setFormSubmission,
330
337
  ]);
331
338
  const handleSaveDraft = React.useCallback((continueWhilstAttachmentsAreUploading) => {
@@ -339,10 +346,9 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
339
346
  if (!checkBsbAreValidating(submission)) {
340
347
  return;
341
348
  }
342
- if (!continueWhilstAttachmentsAreUploading) {
343
- if (!checkAttachmentsCanBeSubmitted(submission)) {
344
- return;
345
- }
349
+ if (!continueWhilstAttachmentsAreUploading &&
350
+ !checkAttachmentsCanBeSubmitted(submission)) {
351
+ return;
346
352
  }
347
353
  onSaveDraft({
348
354
  definition,
@@ -569,7 +575,22 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
569
575
  React.createElement("span", { style: { flex: 1 } }),
570
576
  React.createElement("button", { type: "button", className: "button ob-button is-light cypress-attachments-confirm-wait", onClick: handleWaitForAttachments }, "Wait"),
571
577
  React.createElement("button", { type: "button", className: "button ob-button is-primary cypress-attachments-confirm-continue", onClick: handleContinueWithAttachments }, "Continue")) },
572
- React.createElement("p", null, "Your attachments are still uploading, do you want to wait for the uploads to complete or continue using the app? If you click continue the attachments will upload in the background. Do not close the app until the upload has been completed.")))))));
578
+ React.createElement("p", null, "Your attachments are still uploading, do you want to wait for the uploads to complete or continue using the app? If you click continue the attachments will upload in the background. Do not close the app until the upload has been completed.")),
579
+ React.createElement(Modal, { isOpen: promptOfflineSubmissionAttempt, title: "It looks like you're Offline", className: "ob-modal__offline-submission-attempt", cardClassName: "cypress-submission-offline has-text-centered", titleClassName: "cypress-offline-title", bodyClassName: "cypress-offline-body", actions: React.createElement(React.Fragment, null,
580
+ onSaveDraft && (React.createElement("button", { type: "button", className: "button ob-button ob-button__offline-submission-attempt-save-draft is-success", onClick: () => handleSaveDraft(false) },
581
+ React.createElement(CustomisableButtonInner, { label: ((_o = buttons === null || buttons === void 0 ? void 0 : buttons.saveDraft) === null || _o === void 0 ? void 0 : _o.label) || 'Save Draft', icon: (_p = buttons === null || buttons === void 0 ? void 0 : buttons.saveDraft) === null || _p === void 0 ? void 0 : _p.icon }))),
582
+ React.createElement("span", { style: { flex: 1 } }),
583
+ React.createElement("button", { className: "button ob-button ob-button__offline-submission-attempt-cancel is-light", onClick: () => setPromptOfflineSubmissionAttempt(false) }, "Cancel"),
584
+ React.createElement("button", { className: "button ob-button ob-button__offline-submission-attempt-try-again is-primary", onClick: (e) => handleSubmit(e, false) }, "Try Again")) },
585
+ React.createElement("p", { className: "ob-modal__offline-submission-attempt-message" },
586
+ "You cannot submit this form while offline, please try again when connectivity is restored.",
587
+ onSaveDraft && (React.createElement("span", { className: "ob-modal__offline-submission-attempt-save-draft-message" },
588
+ ' ',
589
+ "Alternatively, click the",
590
+ ' ',
591
+ React.createElement("b", null, ((_q = buttons === null || buttons === void 0 ? void 0 : buttons.saveDraft) === null || _q === void 0 ? void 0 : _q.label) || 'Save Draft'),
592
+ " button below to come back to this later."))),
593
+ React.createElement("i", { className: "material-icons has-text-warning icon-x-large ob-modal__offline-submission-attempt-icon" }, "wifi_off")))))));
573
594
  }
574
595
  export default React.memo(OneBlinkFormBase);
575
596
  //# sourceMappingURL=OneBlinkFormBase.js.map
@@ -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 {\n createTheme as createMuiTheme,\n ThemeProvider,\n Tooltip,\n} from '@mui/material'\nimport { Prompt, useHistory } from 'react-router-dom'\nimport clsx from 'clsx'\nimport * as bulmaToast from 'bulma-toast'\nimport { localisationService, submissionService } from '@oneblink/apps'\nimport { FormTypes, FormsAppsTypes } from '@oneblink/types'\nimport { attachmentsService } from '@oneblink/apps'\nimport * as H from 'history'\n\nimport Modal from './components/renderer/Modal'\nimport OneBlinkAppsErrorOriginalMessage from './components/renderer/OneBlinkAppsErrorOriginalMessage'\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 { InjectPagesContext } from './hooks/useInjectPages'\nimport { ExecutedLookupProvider } from './hooks/useExecutedLookupCallback'\nimport useDynamicOptionsLoaderState from './hooks/useDynamicOptionsLoaderState'\nimport { GoogleMapsApiKeyContext } from './hooks/useGoogleMapsApiKey'\nimport { AbnLookupAuthenticationGuidContext } from './hooks/useAbnLookupAuthenticationGuid'\nimport { CaptchaSiteKeyContext } from './hooks/useCaptchaSiteKey'\nimport { FormIsReadOnlyContext } from './hooks/useFormIsReadOnly'\nimport { AttachmentBlobsProvider } from './hooks/attachments/useAttachmentBlobs'\nimport useIsOffline from './hooks/useIsOffline'\nimport CustomisableButtonInner from './components/renderer/CustomisableButtonInner'\nimport {\n FormElementsValidation,\n FormElementValueChangeHandler,\n FormSubmissionModel,\n SetFormSubmission,\n} from './types/form'\nimport checkBsbsAreInvalid from './services/checkBsbsAreInvalid'\nimport checkIfBsbsAreValidating from './services/checkIfBsbsAreValidating'\nimport checkIfAttachmentsExist from './services/checkIfAttachmentsExist'\nimport useAuth from './hooks/useAuth'\nimport determineIsInfoPage from './services/determineIsInfoPage'\nimport { formElementsService } from '@oneblink/sdk-core'\n\nexport type BaseProps = {\n onCancel: () => unknown\n onSubmit: (newFormSubmission: submissionService.NewFormSubmission) => unknown\n disabled?: boolean\n isPreview?: boolean\n googleMapsApiKey?: string\n abnLookupAuthenticationGuid?: string\n captchaSiteKey?: string\n buttons?: FormsAppsTypes.FormsListStyles['buttons']\n primaryColour?: string\n attachmentRetentionInDays?: number\n allowSubmitWithPendingAttachments?: boolean\n onSaveDraft?: (\n newDraftSubmission: submissionService.NewDraftSubmission,\n ) => unknown\n handleNavigateAway?: () => unknown\n isInfoPage?: 'YES' | 'NO' | 'CALCULATED'\n}\n\nexport type ControlledProps = {\n definition: FormTypes.Form\n submission: FormSubmissionModel\n setFormSubmission: SetFormSubmission\n lastElementUpdated?: FormTypes.FormElement\n}\n\ntype Props = BaseProps &\n ControlledProps & {\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 primaryColour,\n attachmentRetentionInDays,\n allowSubmitWithPendingAttachments,\n handleNavigateAway,\n isInfoPage: isInfoPageProp,\n lastElementUpdated,\n}: Props) {\n const isOffline = useIsOffline()\n const { isUsingFormsKey } = useAuth()\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 determineIsInfoPage(definition)\n }, [definition, isInfoPageProp])\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 // #endregion\n //\n //\n\n //\n //\n // #region Unsaved Changed\n\n const history = useHistory()\n\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 [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 }, [])\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 onCancel()\n }\n }, [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 { formElementsConditionallyShown, conditionalLogicError } =\n useConditionalLogic(definition, submission)\n\n // #endregion\n //\n //\n\n //\n //\n // #region Validation\n\n const { validate, executedLookup, executeLookupFailed } =\n useFormValidation(pages)\n\n const formElementsValidation = React.useMemo<\n FormElementsValidation | undefined\n >(\n () =>\n !isReadOnly\n ? validate(submission, formElementsConditionallyShown)\n : undefined,\n [formElementsConditionallyShown, isReadOnly, submission, validate],\n )\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 Dynamic Options\n\n const loadDynamicOptionsState = useDynamicOptionsLoaderState(\n definition,\n setFormSubmission,\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: FormSubmissionModel) => {\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...hopefully.\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 || !allowSubmitWithPendingAttachments) {\n bulmaToast.toast({\n message:\n 'Attachments are still uploading, please wait for them to finish before trying again.',\n // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes\n type: 'ob-toast is-primary 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, isUsingFormsKey, allowSubmitWithPendingAttachments],\n )\n\n const checkBsbsCanBeSubmitted = React.useCallback(\n (submission: FormSubmissionModel) => {\n return !checkBsbsAreInvalid(definition, submission)\n },\n [definition],\n )\n\n const checkBsbAreValidating = React.useCallback(\n (submission: FormSubmissionModel) => {\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 // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes\n type: 'ob-toast is-primary 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 handleSubmit = React.useCallback(\n (\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 const submissionData = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submissionData.submission)) {\n return\n }\n if (formElementsValidation) {\n console.log('Validation errors', formElementsValidation)\n bulmaToast.toast({\n message: 'Please fix validation errors',\n // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes\n type: 'ob-toast is-danger cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n if (!checkBsbsCanBeSubmitted(submissionData.submission)) {\n return\n }\n if (!continueWhilstAttachmentsAreUploading) {\n if (!checkAttachmentsCanBeSubmitted(submissionData.submission)) {\n return\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 // @ts-expect-error bulma sets this string as a class, so we are hacking in our own classes\n type: 'ob-toast is-danger cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n\n allowNavigation()\n\n onSubmit({\n definition,\n submission: submissionData.submission,\n captchaTokens: submissionData.captchaTokens,\n })\n },\n [\n disabled,\n isReadOnly,\n getCurrentSubmissionData,\n checkBsbAreValidating,\n formElementsValidation,\n checkAttachmentsCanBeSubmitted,\n checkBsbsCanBeSubmitted,\n definition,\n attachmentRetentionInDays,\n allowNavigation,\n onSubmit,\n setFormSubmission,\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 (!continueWhilstAttachmentsAreUploading) {\n if (!checkAttachmentsCanBeSubmitted(submission)) {\n return\n }\n }\n onSaveDraft({\n definition,\n submission,\n backgroundUpload: continueWhilstAttachmentsAreUploading,\n lastElementUpdated,\n })\n }\n },\n [\n allowNavigation,\n checkAttachmentsCanBeSubmitted,\n definition,\n disabled,\n getCurrentSubmissionData,\n onSaveDraft,\n checkBsbAreValidating,\n lastElementUpdated,\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<FormElementValueChangeHandler>(\n (element, value) => {\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 element.type === 'section'\n ) {\n return\n }\n\n setUnsavedChangesState((current) => ({\n ...current,\n isDirty: true,\n }))\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 lastElementUpdated: element,\n }))\n },\n [disabled, setFormSubmission],\n )\n\n // #endregion\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.getElementById(lastElementUpdated.id)\n if (element) {\n window.requestAnimationFrame(() => {\n element.scrollIntoView({ behavior: 'smooth' })\n })\n }\n }\n setHasResumed(true)\n }\n }, [\n lastElementUpdated,\n hasResumed,\n lastElementUpdatedPage,\n lastElementUpdatedExistsOnForm,\n setPageId,\n ])\n\n if (conditionalLogicError) {\n return (\n <>\n <div className=\"has-text-centered\">\n <i className=\"material-icons has-text-warning icon-x-large\">error</i>\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 if (loadDynamicOptionsState) {\n return (\n <>\n <div className=\"has-text-centered\">\n <i className=\"material-icons has-text-warning icon-x-large\">error</i>\n <h3 className=\"title is-3\">{loadDynamicOptionsState.error.title}</h3>\n <p>{loadDynamicOptionsState.error.message}</p>\n <p className=\"has-text-grey\">\n {localisationService.formatDatetimeLong(new Date())}\n </p>\n </div>\n\n <OneBlinkAppsErrorOriginalMessage\n error={loadDynamicOptionsState.error.originalError}\n />\n </>\n )\n }\n\n return (\n <ThemeProvider theme={theme}>\n <div className=\"ob-form-container\" ref={obFormContainerHTMLElementRef}>\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 <i className=\"material-icons\">keyboard_arrow_down</i>\n </span>\n <div className=\"steps-header-active-page\">\n {isDisplayingCurrentPageError ? (\n <span className=\"icon\">\n <i className=\"material-icons has-text-danger is-size-4\">\n warning\n </i>\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 <i className=\"material-icons\">keyboard_arrow_down</i>\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 (page: FormTypes.PageElement, index: number) => {\n const hasErrors = checkDisplayPageError(page)\n return (\n <div\n key={page.id}\n id={`steps-navigation-step-${page.id}`}\n className={clsx('step-item cypress-step-item', {\n 'is-active': currentPage.id === page.id,\n 'is-completed': currentPageIndex > index,\n 'is-error': hasErrors,\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 <i className=\"material-icons has-text-danger is-size-3\">\n warning\n </i>\n </span>\n </Tooltip>\n ) : (\n <span>{index + 1}</span>\n )}\n </div>\n <div className=\"step-details ob-step-details\">\n <p className=\"step-title ob-step-title cypress-desktop-step-title\">\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 <FormDefinitionContext.Provider value={definition}>\n <InjectPagesContext.Provider value={handlePagesLookupResult}>\n <ExecutedLookupProvider\n executedLookup={executedLookup}\n executeLookupFailed={executeLookupFailed}\n >\n <GoogleMapsApiKeyContext.Provider\n value={googleMapsApiKey}\n >\n <AbnLookupAuthenticationGuidContext.Provider\n value={abnLookupAuthenticationGuid}\n >\n <CaptchaSiteKeyContext.Provider\n value={captchaSiteKey}\n >\n <AttachmentBlobsProvider>\n <FormIsReadOnlyContext.Provider\n value={isReadOnly}\n >\n {visiblePages.map(\n (pageElement: FormTypes.PageElement) => (\n <PageFormElements\n key={pageElement.id}\n isActive={\n pageElement.id === 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={setFormSubmission}\n />\n ),\n )}\n </FormIsReadOnlyContext.Provider>\n </AttachmentBlobsProvider>\n </CaptchaSiteKeyContext.Provider>\n </AbnLookupAuthenticationGuidContext.Provider>\n </GoogleMapsApiKeyContext.Provider>\n </ExecutedLookupProvider>\n </InjectPagesContext.Provider>\n </FormDefinitionContext.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 <i className=\"material-icons\">keyboard_arrow_left</i>\n </span>\n <span>Back</span>\n </button>\n </div>\n <div className=\"step-progress-mobile cypress-steps-mobile\">\n {visiblePages.map((page: FormTypes.PageElement, index) => (\n <div\n key={page.id}\n className={clsx('step-progress-mobile-dot', {\n 'is-active': currentPage.id === page.id,\n 'is-completed': currentPageIndex > index,\n 'has-background-danger':\n currentPage.id !== page.id &&\n checkDisplayPageError(page),\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 <i className=\"material-icons\">keyboard_arrow_right</i>\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={buttons?.saveDraft?.label || 'Save Draft'}\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 <button\n type=\"submit\"\n className=\"button ob-button is-success ob-button-submit cypress-submit-form-button cypress-submit-form\"\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={\n isInfoPage ? 'Done' : buttons?.submit?.label || 'Submit'\n }\n icon={buttons?.submit?.icon}\n />\n </button>\n )}\n </div>\n )}\n </div>\n </form>\n\n {!isReadOnly && (\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={buttons?.saveDraft?.label || 'Save Draft'}\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={buttons?.cancelPromptNo?.label || 'Back'}\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 >\n <CustomisableButtonInner\n label={buttons?.cancelPromptYes?.label || 'Discard'}\n icon={buttons?.cancelPromptYes?.icon}\n />\n </button>\n </>\n }\n >\n <p>\n You have unsaved changes, are you sure you want 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 >\n Continue\n </button>\n </>\n }\n >\n <p>\n Your attachments are still uploading, do you want to wait for\n the uploads to complete or continue using the app? If you click\n continue the attachments will upload in the background. Do not\n close the app until the upload has been completed.\n </p>\n </Modal>\n </React.Fragment>\n )}\n </div>\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 {\n createTheme as createMuiTheme,\n ThemeProvider,\n Tooltip,\n} from '@mui/material'\nimport { Prompt, useHistory } from 'react-router-dom'\nimport clsx from 'clsx'\nimport * as bulmaToast from 'bulma-toast'\nimport { localisationService, submissionService } from '@oneblink/apps'\nimport { FormTypes, FormsAppsTypes } from '@oneblink/types'\nimport { attachmentsService } from '@oneblink/apps'\nimport * as H from 'history'\n\nimport Modal from './components/renderer/Modal'\nimport OneBlinkAppsErrorOriginalMessage from './components/renderer/OneBlinkAppsErrorOriginalMessage'\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 { InjectPagesContext } from './hooks/useInjectPages'\nimport { ExecutedLookupProvider } from './hooks/useExecutedLookupCallback'\nimport useDynamicOptionsLoaderState from './hooks/useDynamicOptionsLoaderState'\nimport { GoogleMapsApiKeyContext } from './hooks/useGoogleMapsApiKey'\nimport { AbnLookupAuthenticationGuidContext } from './hooks/useAbnLookupAuthenticationGuid'\nimport { CaptchaSiteKeyContext } from './hooks/useCaptchaSiteKey'\nimport { FormIsReadOnlyContext } from './hooks/useFormIsReadOnly'\nimport { AttachmentBlobsProvider } from './hooks/attachments/useAttachmentBlobs'\nimport useIsOffline from './hooks/useIsOffline'\nimport CustomisableButtonInner from './components/renderer/CustomisableButtonInner'\nimport {\n FormElementsValidation,\n FormElementValueChangeHandler,\n FormSubmissionModel,\n SetFormSubmission,\n} from './types/form'\nimport checkBsbsAreInvalid from './services/checkBsbsAreInvalid'\nimport checkIfBsbsAreValidating from './services/checkIfBsbsAreValidating'\nimport checkIfAttachmentsExist from './services/checkIfAttachmentsExist'\nimport useAuth from './hooks/useAuth'\nimport { formElementsService } from '@oneblink/sdk-core'\n\nexport type BaseProps = {\n onCancel: () => unknown\n onSubmit: (newFormSubmission: submissionService.NewFormSubmission) => unknown\n disabled?: boolean\n isPreview?: boolean\n googleMapsApiKey?: string\n abnLookupAuthenticationGuid?: string\n captchaSiteKey?: string\n buttons?: FormsAppsTypes.FormsListStyles['buttons']\n primaryColour?: string\n attachmentRetentionInDays?: number\n isPendingQueueEnabled: boolean\n onSaveDraft?: (\n newDraftSubmission: submissionService.NewDraftSubmission,\n ) => unknown\n handleNavigateAway?: () => unknown\n isInfoPage?: 'YES' | 'NO' | 'CALCULATED'\n}\n\nexport type ControlledProps = {\n definition: FormTypes.Form\n submission: FormSubmissionModel\n setFormSubmission: SetFormSubmission\n lastElementUpdated?: FormTypes.FormElement\n}\n\ntype Props = BaseProps &\n ControlledProps & {\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 primaryColour,\n attachmentRetentionInDays,\n isPendingQueueEnabled,\n handleNavigateAway,\n isInfoPage: isInfoPageProp,\n lastElementUpdated,\n}: Props) {\n const isOffline = useIsOffline()\n const { isUsingFormsKey } = useAuth()\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 //\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 // #endregion\n //\n //\n\n //\n //\n // #region Unsaved Changed\n\n const history = useHistory()\n\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 }, [])\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 onCancel()\n }\n }, [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 { formElementsConditionallyShown, conditionalLogicError } =\n useConditionalLogic(definition, submission)\n\n // #endregion\n //\n //\n\n //\n //\n // #region Validation\n\n const { validate, executedLookup, executeLookupFailed } =\n useFormValidation(pages)\n\n const formElementsValidation = React.useMemo<\n FormElementsValidation | undefined\n >(\n () =>\n !isReadOnly\n ? validate(submission, formElementsConditionallyShown)\n : undefined,\n [formElementsConditionallyShown, isReadOnly, submission, validate],\n )\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 Dynamic Options\n\n const loadDynamicOptionsState = useDynamicOptionsLoaderState(\n definition,\n setFormSubmission,\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: FormSubmissionModel) => {\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: FormSubmissionModel) => {\n return !checkBsbsAreInvalid(definition, submission)\n },\n [definition],\n )\n\n const checkBsbAreValidating = React.useCallback(\n (submission: FormSubmissionModel) => {\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 handleSubmit = React.useCallback(\n (\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 const submissionData = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submissionData.submission)) {\n return\n }\n if (formElementsValidation) {\n console.log('Validation errors', formElementsValidation)\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 return\n }\n if (!checkBsbsCanBeSubmitted(submissionData.submission)) {\n return\n }\n if (\n !continueWhilstAttachmentsAreUploading &&\n !checkAttachmentsCanBeSubmitted(submissionData.submission)\n ) {\n return\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\n allowNavigation()\n\n onSubmit({\n definition,\n submission: submissionData.submission,\n captchaTokens: submissionData.captchaTokens,\n })\n },\n [\n disabled,\n isReadOnly,\n getCurrentSubmissionData,\n checkBsbAreValidating,\n formElementsValidation,\n checkBsbsCanBeSubmitted,\n definition,\n attachmentRetentionInDays,\n isOffline,\n isPendingQueueEnabled,\n allowNavigation,\n onSubmit,\n checkAttachmentsCanBeSubmitted,\n setFormSubmission,\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 })\n }\n },\n [\n allowNavigation,\n checkAttachmentsCanBeSubmitted,\n definition,\n disabled,\n getCurrentSubmissionData,\n onSaveDraft,\n checkBsbAreValidating,\n lastElementUpdated,\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<FormElementValueChangeHandler>(\n (element, value) => {\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 element.type === 'section'\n ) {\n return\n }\n\n setUnsavedChangesState((current) => ({\n ...current,\n isDirty: true,\n }))\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 lastElementUpdated: element,\n }))\n },\n [disabled, setFormSubmission],\n )\n\n // #endregion\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.getElementById(lastElementUpdated.id)\n if (element) {\n window.requestAnimationFrame(() => {\n element.scrollIntoView({ behavior: 'smooth' })\n })\n }\n }\n setHasResumed(true)\n }\n }, [\n lastElementUpdated,\n hasResumed,\n lastElementUpdatedPage,\n lastElementUpdatedExistsOnForm,\n setPageId,\n ])\n\n if (conditionalLogicError) {\n return (\n <>\n <div className=\"has-text-centered\">\n <i className=\"material-icons has-text-warning icon-x-large\">error</i>\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 if (loadDynamicOptionsState) {\n return (\n <>\n <div className=\"has-text-centered\">\n <i className=\"material-icons has-text-warning icon-x-large\">error</i>\n <h3 className=\"title is-3\">{loadDynamicOptionsState.error.title}</h3>\n <p>{loadDynamicOptionsState.error.message}</p>\n <p className=\"has-text-grey\">\n {localisationService.formatDatetimeLong(new Date())}\n </p>\n </div>\n\n <OneBlinkAppsErrorOriginalMessage\n error={loadDynamicOptionsState.error.originalError}\n />\n </>\n )\n }\n\n return (\n <ThemeProvider theme={theme}>\n <div className=\"ob-form-container\" ref={obFormContainerHTMLElementRef}>\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 <i className=\"material-icons\">keyboard_arrow_down</i>\n </span>\n <div className=\"steps-header-active-page\">\n {isDisplayingCurrentPageError ? (\n <span className=\"icon\">\n <i className=\"material-icons has-text-danger is-size-4\">\n warning\n </i>\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 <i className=\"material-icons\">keyboard_arrow_down</i>\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 (page: FormTypes.PageElement, index: number) => {\n const hasErrors = checkDisplayPageError(page)\n return (\n <div\n key={page.id}\n id={`steps-navigation-step-${page.id}`}\n className={clsx('step-item cypress-step-item', {\n 'is-active': currentPage.id === page.id,\n 'is-completed': currentPageIndex > index,\n 'is-error': hasErrors,\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 <i className=\"material-icons has-text-danger is-size-3\">\n warning\n </i>\n </span>\n </Tooltip>\n ) : (\n <span>{index + 1}</span>\n )}\n </div>\n <div className=\"step-details ob-step-details\">\n <p className=\"step-title ob-step-title cypress-desktop-step-title\">\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 <FormDefinitionContext.Provider value={definition}>\n <InjectPagesContext.Provider value={handlePagesLookupResult}>\n <ExecutedLookupProvider\n executedLookup={executedLookup}\n executeLookupFailed={executeLookupFailed}\n >\n <GoogleMapsApiKeyContext.Provider\n value={googleMapsApiKey}\n >\n <AbnLookupAuthenticationGuidContext.Provider\n value={abnLookupAuthenticationGuid}\n >\n <CaptchaSiteKeyContext.Provider\n value={captchaSiteKey}\n >\n <AttachmentBlobsProvider>\n <FormIsReadOnlyContext.Provider\n value={isReadOnly}\n >\n {visiblePages.map(\n (pageElement: FormTypes.PageElement) => (\n <PageFormElements\n key={pageElement.id}\n isActive={\n pageElement.id === 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={setFormSubmission}\n />\n ),\n )}\n </FormIsReadOnlyContext.Provider>\n </AttachmentBlobsProvider>\n </CaptchaSiteKeyContext.Provider>\n </AbnLookupAuthenticationGuidContext.Provider>\n </GoogleMapsApiKeyContext.Provider>\n </ExecutedLookupProvider>\n </InjectPagesContext.Provider>\n </FormDefinitionContext.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 <i className=\"material-icons\">keyboard_arrow_left</i>\n </span>\n <span>Back</span>\n </button>\n </div>\n <div className=\"step-progress-mobile cypress-steps-mobile\">\n {visiblePages.map((page: FormTypes.PageElement, index) => (\n <div\n key={page.id}\n className={clsx('step-progress-mobile-dot', {\n 'is-active': currentPage.id === page.id,\n 'is-completed': currentPageIndex > index,\n 'has-background-danger':\n currentPage.id !== page.id &&\n checkDisplayPageError(page),\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 <i className=\"material-icons\">keyboard_arrow_right</i>\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={buttons?.saveDraft?.label || 'Save Draft'}\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 <button\n type=\"submit\"\n className=\"button ob-button is-success ob-button-submit cypress-submit-form-button cypress-submit-form\"\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={\n isInfoPage ? 'Done' : buttons?.submit?.label || 'Submit'\n }\n icon={buttons?.submit?.icon}\n />\n </button>\n )}\n </div>\n )}\n </div>\n </form>\n\n {!isReadOnly && (\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={buttons?.saveDraft?.label || 'Save Draft'}\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={buttons?.cancelPromptNo?.label || 'Back'}\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 >\n <CustomisableButtonInner\n label={buttons?.cancelPromptYes?.label || 'Discard'}\n icon={buttons?.cancelPromptYes?.icon}\n />\n </button>\n </>\n }\n >\n <p>\n You have unsaved changes, are you sure you want 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 >\n Continue\n </button>\n </>\n }\n >\n <p>\n Your attachments are still uploading, do you want to wait for\n the uploads to complete or continue using the app? If you click\n continue the attachments will upload in the background. Do not\n close the app until 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={buttons?.saveDraft?.label || 'Save Draft'}\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={() => setPromptOfflineSubmissionAttempt(false)}\n >\n Cancel\n </button>\n <button\n className=\"button ob-button ob-button__offline-submission-attempt-try-again is-primary\"\n onClick={(e) => handleSubmit(e, false)}\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 try again when\n connectivity is restored.\n {onSaveDraft && (\n <span className=\"ob-modal__offline-submission-attempt-save-draft-message\">\n {' '}\n Alternatively, click the{' '}\n <b>{buttons?.saveDraft?.label || 'Save Draft'}</b> button\n below to come back to this later.\n </span>\n )}\n </p>\n <i className=\"material-icons has-text-warning icon-x-large ob-modal__offline-submission-attempt-icon\">\n wifi_off\n </i>\n </Modal>\n </React.Fragment>\n )}\n </div>\n </ThemeProvider>\n )\n}\n\nexport default React.memo(OneBlinkFormBase)\n"]}
@@ -43,7 +43,7 @@ function OneBlinkReadOnlyForm({ form, initialSubmission, ...rest }) {
43
43
  };
44
44
  }, [definition]);
45
45
  const noop = React.useCallback(() => { }, []);
46
- return (React.createElement(OneBlinkFormBase, { definition: readOnlyDefinition, submission: submission, disabled: true, isReadOnly: true, onCancel: noop, onSubmit: noop, setFormSubmission: setFormSubmission, ...rest }));
46
+ return (React.createElement(OneBlinkFormBase, { definition: readOnlyDefinition, submission: submission, disabled: true, isReadOnly: true, onCancel: noop, onSubmit: noop, setFormSubmission: setFormSubmission, isPendingQueueEnabled: false, ...rest }));
47
47
  }
48
48
  export default React.memo(OneBlinkReadOnlyForm);
49
49
  //# sourceMappingURL=OneBlinkReadOnlyForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OneBlinkReadOnlyForm.js","sourceRoot":"","sources":["../src/OneBlinkReadOnlyForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;AACjD,OAAO,sBAAsB,MAAM,gCAAgC,CAAA;AAGnE,SAAS,sBAAsB,CAC7B,QAAiC;IAEjC,MAAM,WAAW,GAAG,QAAQ;SACzB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;SAC/C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IACE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YACtB,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,eAAe,CAAC;YACnC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC/B;YACA,OAAO;gBACL,GAAG,OAAO;gBACV,QAAQ,EAAE,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;aACzD,CAAA;SACF;QAED,IACE,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,OAAO;YACxB,OAAO,CAAC,IAAI,KAAK,aAAa;YAC9B,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,UAAU,EAC3B;YACA,OAAO;gBACL,GAAG,OAAO;gBACV,QAAQ,EAAE,IAAI;aACf,CAAA;SACF;QAED,OAAO,OAAO,CAAA;IAChB,CAAC,CAAC,CAAA;IAEJ,OAAO,WAAW,CAAA;AACpB,CAAC;AAQD,SAAS,oBAAoB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAS;IACvE,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,iBAAiB,CAAC,GACnD,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;IAEjD,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC5C,OAAO;YACL,GAAG,UAAU;YACb,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;SAC5D,CAAA;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAE5C,OAAO,CACL,oBAAC,gBAAgB,IACf,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,IAAI,EACd,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,IAAI,EACd,iBAAiB,EAAE,iBAAiB,KAChC,IAAI,GACR,CACH,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport OneBlinkFormBase from './OneBlinkFormBase'\nimport useFormSubmissionState from './hooks/useFormSubmissionState'\nimport { FormSubmissionModel } from './types/form'\n\nfunction recursivelySetReadOnly(\n elements: FormTypes.FormElement[],\n): FormTypes.FormElement[] {\n const newElements = elements\n .filter((element) => element.type !== 'captcha')\n .map((element) => {\n if (\n (element.type === 'form' ||\n element.type === 'section' ||\n element.type === 'page' ||\n element.type === 'repeatableSet') &&\n Array.isArray(element.elements)\n ) {\n return {\n ...element,\n elements: recursivelySetReadOnly(element.elements) || [],\n }\n }\n\n if (\n element.type !== 'section' &&\n element.type !== 'heading' &&\n element.type !== 'page' &&\n element.type !== 'html' &&\n element.type !== 'captcha' &&\n element.type !== 'image' &&\n element.type !== 'calculation' &&\n element.type !== 'summary' &&\n element.type !== 'form' &&\n element.type !== 'infoPage'\n ) {\n return {\n ...element,\n readOnly: true,\n }\n }\n\n return element\n })\n\n return newElements\n}\n\ntype Props = {\n form: FormTypes.Form\n initialSubmission?: FormSubmissionModel\n googleMapsApiKey?: string\n}\n\nfunction OneBlinkReadOnlyForm({ form, initialSubmission, ...rest }: Props) {\n const [{ submission, definition }, setFormSubmission] =\n useFormSubmissionState(form, initialSubmission)\n\n const readOnlyDefinition = React.useMemo(() => {\n return {\n ...definition,\n elements: recursivelySetReadOnly(definition.elements || []),\n }\n }, [definition])\n\n const noop = React.useCallback(() => {}, [])\n\n return (\n <OneBlinkFormBase\n definition={readOnlyDefinition}\n submission={submission}\n disabled={true}\n isReadOnly={true}\n onCancel={noop}\n onSubmit={noop}\n setFormSubmission={setFormSubmission}\n {...rest}\n />\n )\n}\n\nexport default React.memo(OneBlinkReadOnlyForm)\n"]}
1
+ {"version":3,"file":"OneBlinkReadOnlyForm.js","sourceRoot":"","sources":["../src/OneBlinkReadOnlyForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;AACjD,OAAO,sBAAsB,MAAM,gCAAgC,CAAA;AAGnE,SAAS,sBAAsB,CAC7B,QAAiC;IAEjC,MAAM,WAAW,GAAG,QAAQ;SACzB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;SAC/C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IACE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YACtB,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,eAAe,CAAC;YACnC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC/B;YACA,OAAO;gBACL,GAAG,OAAO;gBACV,QAAQ,EAAE,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;aACzD,CAAA;SACF;QAED,IACE,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,OAAO;YACxB,OAAO,CAAC,IAAI,KAAK,aAAa;YAC9B,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,UAAU,EAC3B;YACA,OAAO;gBACL,GAAG,OAAO;gBACV,QAAQ,EAAE,IAAI;aACf,CAAA;SACF;QAED,OAAO,OAAO,CAAA;IAChB,CAAC,CAAC,CAAA;IAEJ,OAAO,WAAW,CAAA;AACpB,CAAC;AAQD,SAAS,oBAAoB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAS;IACvE,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,iBAAiB,CAAC,GACnD,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;IAEjD,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC5C,OAAO;YACL,GAAG,UAAU;YACb,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;SAC5D,CAAA;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAE5C,OAAO,CACL,oBAAC,gBAAgB,IACf,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,IAAI,EACd,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,IAAI,EACd,iBAAiB,EAAE,iBAAiB,EACpC,qBAAqB,EAAE,KAAK,KACxB,IAAI,GACR,CACH,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport OneBlinkFormBase from './OneBlinkFormBase'\nimport useFormSubmissionState from './hooks/useFormSubmissionState'\nimport { FormSubmissionModel } from './types/form'\n\nfunction recursivelySetReadOnly(\n elements: FormTypes.FormElement[],\n): FormTypes.FormElement[] {\n const newElements = elements\n .filter((element) => element.type !== 'captcha')\n .map((element) => {\n if (\n (element.type === 'form' ||\n element.type === 'section' ||\n element.type === 'page' ||\n element.type === 'repeatableSet') &&\n Array.isArray(element.elements)\n ) {\n return {\n ...element,\n elements: recursivelySetReadOnly(element.elements) || [],\n }\n }\n\n if (\n element.type !== 'section' &&\n element.type !== 'heading' &&\n element.type !== 'page' &&\n element.type !== 'html' &&\n element.type !== 'captcha' &&\n element.type !== 'image' &&\n element.type !== 'calculation' &&\n element.type !== 'summary' &&\n element.type !== 'form' &&\n element.type !== 'infoPage'\n ) {\n return {\n ...element,\n readOnly: true,\n }\n }\n\n return element\n })\n\n return newElements\n}\n\ntype Props = {\n form: FormTypes.Form\n initialSubmission?: FormSubmissionModel\n googleMapsApiKey?: string\n}\n\nfunction OneBlinkReadOnlyForm({ form, initialSubmission, ...rest }: Props) {\n const [{ submission, definition }, setFormSubmission] =\n useFormSubmissionState(form, initialSubmission)\n\n const readOnlyDefinition = React.useMemo(() => {\n return {\n ...definition,\n elements: recursivelySetReadOnly(definition.elements || []),\n }\n }, [definition])\n\n const noop = React.useCallback(() => {}, [])\n\n return (\n <OneBlinkFormBase\n definition={readOnlyDefinition}\n submission={submission}\n disabled={true}\n isReadOnly={true}\n onCancel={noop}\n onSubmit={noop}\n setFormSubmission={setFormSubmission}\n isPendingQueueEnabled={false}\n {...rest}\n />\n )\n}\n\nexport default React.memo(OneBlinkReadOnlyForm)\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": "3.2.0-beta.1",
4
+ "version": "4.0.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"
@@ -11,7 +11,7 @@
11
11
  "@emotion/react": "^11.10.6",
12
12
  "@emotion/styled": "^11.10.6",
13
13
  "@mui/icons-material": "^5.11.11",
14
- "@oneblink/sdk-core": "^3.0.0-beta.2",
14
+ "@oneblink/sdk-core": "^3.1.0-beta.1",
15
15
  "@react-google-maps/api": "2.18.1",
16
16
  "blueimp-load-image": "^5.16.0",
17
17
  "bulma": "^0.9.3",
@@ -47,7 +47,7 @@
47
47
  "@mui/lab": "^5.0.0-alpha.95",
48
48
  "@mui/material": "^5.10.1",
49
49
  "@mui/x-date-pickers": "^5.0.0-beta.6",
50
- "@oneblink/apps": "^4.2.0-beta.2",
50
+ "@oneblink/apps": "^5.0.0-beta.1",
51
51
  "@oneblink/release-cli": "^2.0.2",
52
52
  "@oneblink/types": "github:oneblink/types",
53
53
  "@types/blueimp-load-image": "^5.16.0",
@@ -1,2 +0,0 @@
1
- import { FormTypes } from '@oneblink/types';
2
- export default function determineIsInfoPage(form: FormTypes.Form): boolean;
@@ -1,17 +0,0 @@
1
- import { formElementsService } from '@oneblink/sdk-core';
2
- const infoPageElements = [
3
- 'heading',
4
- 'html',
5
- 'image',
6
- 'section',
7
- 'page',
8
- 'infoPage',
9
- 'form',
10
- ];
11
- export default function determineIsInfoPage(form) {
12
- const foundInputElement = formElementsService.findFormElement(form.elements, (e) => {
13
- return !infoPageElements.includes(e.type);
14
- });
15
- return !foundInputElement;
16
- }
17
- //# sourceMappingURL=determineIsInfoPage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"determineIsInfoPage.js","sourceRoot":"","sources":["../../src/services/determineIsInfoPage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAGxD,MAAM,gBAAgB,GAAgC;IACpD,SAAS;IACT,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,UAAU;IACV,MAAM;CACP,CAAA;AACD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,IAAoB;IAC9D,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,eAAe,CAC3D,IAAI,CAAC,QAAQ,EACb,CAAC,CAAC,EAAE,EAAE;QACJ,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC,CACF,CAAA;IACD,OAAO,CAAC,iBAAiB,CAAA;AAC3B,CAAC","sourcesContent":["import { formElementsService } from '@oneblink/sdk-core'\nimport { FormTypes } from '@oneblink/types'\n\nconst infoPageElements: FormTypes.FormElementType[] = [\n 'heading',\n 'html',\n 'image',\n 'section',\n 'page',\n 'infoPage',\n 'form',\n]\nexport default function determineIsInfoPage(form: FormTypes.Form) {\n const foundInputElement = formElementsService.findFormElement(\n form.elements,\n (e) => {\n return !infoPageElements.includes(e.type)\n },\n )\n return !foundInputElement\n}\n"]}