@oneblink/apps-react 13.0.0-beta.1 → 13.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.
- package/dist/apps/services/api/submissions.d.ts +1 -1
- package/dist/apps/services/api/submissions.js +0 -5
- package/dist/apps/services/api/submissions.js.map +1 -1
- package/dist/apps/submission-service.d.ts +1 -1
- package/dist/apps/submission-service.js.map +1 -1
- package/dist/components/renderer/LookupButton.d.ts +1 -2
- package/dist/components/renderer/LookupButton.js +7 -6
- package/dist/components/renderer/LookupButton.js.map +1 -1
- package/dist/components/renderer/LookupNotification.js +23 -15
- package/dist/components/renderer/LookupNotification.js.map +1 -1
- package/dist/form-elements/FormElementABN.js +1 -1
- package/dist/form-elements/FormElementABN.js.map +1 -1
- package/dist/form-elements/FormElementBSB.js +1 -1
- package/dist/form-elements/FormElementBSB.js.map +1 -1
- package/dist/form-elements/FormElementBarcodeScanner.js +1 -1
- package/dist/form-elements/FormElementBarcodeScanner.js.map +1 -1
- package/dist/form-elements/FormElementCheckBoxes.js +1 -1
- package/dist/form-elements/FormElementCheckBoxes.js.map +1 -1
- package/dist/form-elements/FormElementDate.js +1 -1
- package/dist/form-elements/FormElementDate.js.map +1 -1
- package/dist/form-elements/FormElementDateTime.js +1 -1
- package/dist/form-elements/FormElementDateTime.js.map +1 -1
- package/dist/form-elements/FormElementEmail.js +1 -1
- package/dist/form-elements/FormElementEmail.js.map +1 -1
- package/dist/form-elements/FormElementLookupButton.js +1 -1
- package/dist/form-elements/FormElementLookupButton.js.map +1 -1
- package/dist/form-elements/FormElementNumber.js +1 -1
- package/dist/form-elements/FormElementNumber.js.map +1 -1
- package/dist/form-elements/FormElementSelect.js +1 -1
- package/dist/form-elements/FormElementSelect.js.map +1 -1
- package/dist/form-elements/FormElementTelephone.js +1 -1
- package/dist/form-elements/FormElementTelephone.js.map +1 -1
- package/dist/form-elements/FormElementText.js +1 -1
- package/dist/form-elements/FormElementText.js.map +1 -1
- package/dist/form-elements/FormElementTextarea.js +1 -1
- package/dist/form-elements/FormElementTextarea.js.map +1 -1
- package/dist/form-elements/FormElementTime.js +1 -1
- package/dist/form-elements/FormElementTime.js.map +1 -1
- package/dist/hooks/useLookupNotification.d.ts +22 -2
- package/dist/hooks/useLookupNotification.js +2 -1
- package/dist/hooks/useLookupNotification.js.map +1 -1
- package/package.json +1 -1
|
@@ -146,11 +146,6 @@ export async function downloadFormSubmission({ formId, submissionId, abortSignal
|
|
|
146
146
|
title: 'Submission Data Unavailable',
|
|
147
147
|
});
|
|
148
148
|
}
|
|
149
|
-
if (!result.versionId) {
|
|
150
|
-
throw new OneBlinkAppsError('The submission version could not be determined. Please reload and try again.', {
|
|
151
|
-
title: 'Submission Version Unavailable',
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
149
|
return {
|
|
155
150
|
data: result.data,
|
|
156
151
|
versionId: result.versionId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submissions.js","sourceRoot":"","sources":["../../../../src/apps/services/api/submissions.ts"],"names":[],"mappings":"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","sourcesContent":["import OneBlinkAppsError from '../errors/oneBlinkAppsError'\nimport Sentry from '../../Sentry'\nimport { isOffline } from '../../offline-service'\nimport { getDeviceInformation } from '../getDeviceInformation'\nimport { FormSubmission, ProgressListener } from '../../types/submissions'\nimport { getUserToken } from '../user-token'\nimport generateOneBlinkUploader from '../generateOneBlinkUploader'\nimport { OneBlinkStorageError } from '@oneblink/storage'\nimport generateOneBlinkDownloader from '../generateOneBlinkDownloader'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\n\nconst getBadRequestError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(error.message, {\n title: 'Invalid Submission',\n httpStatusCode: error.httpStatusCode,\n })\n}\nconst getUnauthenticatedError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(\n 'The form you are attempting to complete requires authentication. Please login and try again.',\n {\n requiresLogin: true,\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n },\n )\n}\nconst getUnauthorisedError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(\n 'You do not have access to complete this form. Please contact your administrator to gain the correct level of access.',\n {\n requiresAccessRequest: true,\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n },\n )\n}\nconst getNotFoundError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(\n 'We could not find the form you are looking for. Please contact your administrator to ensure your form configuration has been completed successfully.',\n {\n title: 'Unknown Form',\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n },\n )\n}\nconst getDefaultError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n },\n )\n}\n\nconst handleError = (error: OneBlinkStorageError) => {\n if (/Failed to fetch/.test((error as Error).message)) {\n throw new OneBlinkAppsError(\n 'We encountered a network related issue. Please ensure you are connected to the internet before trying again. If the problem persists, contact your administrator.',\n {\n title: 'Connectivity Issues',\n originalError: error as Error,\n isOffline: true,\n },\n )\n }\n switch (error.httpStatusCode) {\n case 400: {\n return getBadRequestError(error)\n }\n case 401: {\n return getUnauthenticatedError(error)\n }\n case 403: {\n return getUnauthorisedError(error)\n }\n case 404: {\n return getNotFoundError(error)\n }\n case 409: {\n return new OneBlinkAppsError(error.message, {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n conflict: error.conflict,\n })\n }\n default: {\n return getDefaultError(error)\n }\n }\n}\n\nexport async function uploadFormSubmission(\n formSubmission: FormSubmission,\n /**\n * The date and time (in ISO format) the form was completed I.e. when the user\n * clicked the submit button\n */\n completionTimestamp: string,\n onProgress?: ProgressListener,\n abortSignal?: AbortSignal,\n) {\n try {\n const oneblinkUploader = generateOneBlinkUploader()\n\n const userToken = getUserToken()\n\n console.log('Uploading submission')\n return await oneblinkUploader.uploadSubmission({\n completionTimestamp,\n submission: formSubmission.submission,\n definition: formSubmission.definition,\n device: getDeviceInformation(),\n userToken: userToken || undefined,\n previousFormSubmissionApprovalId:\n formSubmission.previousFormSubmissionApprovalId,\n jobId: formSubmission.jobId || undefined,\n formsAppId: formSubmission.formsAppId,\n externalId: formSubmission.externalId || undefined,\n taskId: formSubmission.taskCompletion?.task.taskId || undefined,\n taskActionId: formSubmission.taskCompletion?.taskAction.taskActionId,\n taskGroupInstanceId:\n formSubmission.taskCompletion?.taskGroupInstance?.taskGroupInstanceId,\n taskCompletionTimestamp: formSubmission.taskCompletion?.completedAt,\n taskIsAdhoc: formSubmission.taskCompletion?.isAdhoc,\n recaptchas: formSubmission.recaptchas,\n onProgress,\n abortSignal,\n formSubmissionDraftId: formSubmission.formSubmissionDraftId,\n })\n } catch (error) {\n throw handleError(error as OneBlinkStorageError)\n }\n}\n\nexport async function uploadFormSubmissionEdit({\n submission,\n definition,\n submissionId,\n context,\n editedS3ObjectVersionId,\n onProgress,\n abortSignal,\n}: {\n submission: SubmissionTypes.NewS3SubmissionData['submission']\n definition: FormTypes.Form\n submissionId: string\n context: SubmissionTypes.FormSubmissionMetaEditContext\n editedS3ObjectVersionId: string\n onProgress?: ProgressListener\n abortSignal?: AbortSignal\n}) {\n try {\n const oneblinkUploader = generateOneBlinkUploader()\n return await oneblinkUploader.uploadFormSubmissionEdit({\n submission,\n definition,\n device: getDeviceInformation(),\n completionTimestamp: new Date().toISOString(),\n submissionId,\n context,\n editedS3ObjectVersionId,\n onProgress,\n abortSignal,\n })\n } catch (error) {\n throw handleError(error as OneBlinkStorageError)\n }\n}\n\nexport async function downloadFormSubmission({\n formId,\n submissionId,\n abortSignal,\n versionId,\n}: {\n formId: number\n submissionId: string\n abortSignal?: AbortSignal\n versionId?: string\n}) {\n try {\n console.log('Attempting to download form submission data:', {\n formId,\n submissionId,\n versionId,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const result = await oneblinkDownloader.downloadSubmission({\n formId,\n submissionId,\n abortSignal,\n versionId,\n })\n if (!result) {\n throw new OneBlinkAppsError(\n \"This submission has been removed based on your administrator's retention policy.\",\n {\n title: 'Submission Data Unavailable',\n },\n )\n }\n if (!result.versionId) {\n throw new OneBlinkAppsError(\n 'The submission version could not be determined. Please reload and try again.',\n {\n title: 'Submission Version Unavailable',\n },\n )\n }\n return {\n data: result.data,\n versionId: result.versionId,\n }\n } catch (error) {\n console.error('Error retrieving form submission data', error)\n\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline, please connect to the internet and try again',\n {\n originalError: error instanceof Error ? error : undefined,\n isOffline: true,\n },\n )\n }\n\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 401: {\n throw new OneBlinkAppsError(\n 'The submission you are attempting to view requires authentication. Please login and try again.',\n {\n originalError: error,\n requiresLogin: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to submission data. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(error.message, {\n title: 'Invalid Request',\n httpStatusCode: error.httpStatusCode,\n })\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error instanceof Error ? error : undefined,\n httpStatusCode:\n error instanceof OneBlinkStorageError\n ? error.httpStatusCode\n : undefined,\n },\n )\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"submissions.js","sourceRoot":"","sources":["../../../../src/apps/services/api/submissions.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,6BAA6B,CAAA;AAC3D,OAAO,MAAM,MAAM,cAAc,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,wBAAwB,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,0BAA0B,MAAM,+BAA+B,CAAA;AAGtE,MAAM,kBAAkB,GAAG,CAAC,KAA2B,EAAE,EAAE;IACzD,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE;QAC1C,KAAK,EAAE,oBAAoB;QAC3B,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CAAC,CAAA;AACJ,CAAC,CAAA;AACD,MAAM,uBAAuB,GAAG,CAAC,KAA2B,EAAE,EAAE;IAC9D,OAAO,IAAI,iBAAiB,CAC1B,8FAA8F,EAC9F;QACE,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CACF,CAAA;AACH,CAAC,CAAA;AACD,MAAM,oBAAoB,GAAG,CAAC,KAA2B,EAAE,EAAE;IAC3D,OAAO,IAAI,iBAAiB,CAC1B,sHAAsH,EACtH;QACE,qBAAqB,EAAE,IAAI;QAC3B,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CACF,CAAA;AACH,CAAC,CAAA;AACD,MAAM,gBAAgB,GAAG,CAAC,KAA2B,EAAE,EAAE;IACvD,OAAO,IAAI,iBAAiB,CAC1B,sJAAsJ,EACtJ;QACE,KAAK,EAAE,cAAc;QACrB,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CACF,CAAA;AACH,CAAC,CAAA;AACD,MAAM,eAAe,GAAG,CAAC,KAA2B,EAAE,EAAE;IACtD,OAAO,IAAI,iBAAiB,CAC1B,gFAAgF,EAChF;QACE,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,KAA2B,EAAE,EAAE;IAClD,IAAI,iBAAiB,CAAC,IAAI,CAAE,KAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,iBAAiB,CACzB,mKAAmK,EACnK;YACE,KAAK,EAAE,qBAAqB;YAC5B,aAAa,EAAE,KAAc;YAC7B,SAAS,EAAE,IAAI;SAChB,CACF,CAAA;IACH,CAAC;IACD,QAAQ,KAAK,CAAC,cAAc,EAAE,CAAC;QAC7B,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;QACD,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAA;QACvC,CAAC;QACD,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;QACD,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;QACD,KAAK,GAAG,CAAC,CAAC,CAAC;YACT,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC1C,aAAa,EAAE,KAAK;gBACpB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,cAA8B;AAC9B;;;GAGG;AACH,mBAA2B,EAC3B,UAA6B,EAC7B,WAAyB;;IAEzB,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,wBAAwB,EAAE,CAAA;QAEnD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;QAEhC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;QACnC,OAAO,MAAM,gBAAgB,CAAC,gBAAgB,CAAC;YAC7C,mBAAmB;YACnB,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,MAAM,EAAE,oBAAoB,EAAE;YAC9B,SAAS,EAAE,SAAS,IAAI,SAAS;YACjC,gCAAgC,EAC9B,cAAc,CAAC,gCAAgC;YACjD,KAAK,EAAE,cAAc,CAAC,KAAK,IAAI,SAAS;YACxC,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,UAAU,EAAE,cAAc,CAAC,UAAU,IAAI,SAAS;YAClD,MAAM,EAAE,CAAA,MAAA,cAAc,CAAC,cAAc,0CAAE,IAAI,CAAC,MAAM,KAAI,SAAS;YAC/D,YAAY,EAAE,MAAA,cAAc,CAAC,cAAc,0CAAE,UAAU,CAAC,YAAY;YACpE,mBAAmB,EACjB,MAAA,MAAA,cAAc,CAAC,cAAc,0CAAE,iBAAiB,0CAAE,mBAAmB;YACvE,uBAAuB,EAAE,MAAA,cAAc,CAAC,cAAc,0CAAE,WAAW;YACnE,WAAW,EAAE,MAAA,cAAc,CAAC,cAAc,0CAAE,OAAO;YACnD,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,UAAU;YACV,WAAW;YACX,qBAAqB,EAAE,cAAc,CAAC,qBAAqB;SAC5D,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,WAAW,CAAC,KAA6B,CAAC,CAAA;IAClD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,EAC7C,UAAU,EACV,UAAU,EACV,YAAY,EACZ,OAAO,EACP,uBAAuB,EACvB,UAAU,EACV,WAAW,GASZ;IACC,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,wBAAwB,EAAE,CAAA;QACnD,OAAO,MAAM,gBAAgB,CAAC,wBAAwB,CAAC;YACrD,UAAU;YACV,UAAU;YACV,MAAM,EAAE,oBAAoB,EAAE;YAC9B,mBAAmB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC7C,YAAY;YACZ,OAAO;YACP,uBAAuB;YACvB,UAAU;YACV,WAAW;SACZ,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,WAAW,CAAC,KAA6B,CAAC,CAAA;IAClD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAC3C,MAAM,EACN,YAAY,EACZ,WAAW,EACX,SAAS,GAMV;IACC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,8CAA8C,EAAE;YAC1D,MAAM;YACN,YAAY;YACZ,SAAS;SACV,CAAC,CAAA;QACF,MAAM,kBAAkB,GAAG,0BAA0B,EAAE,CAAA;QACvD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,kBAAkB,CAAC;YACzD,MAAM;YACN,YAAY;YACZ,WAAW;YACX,SAAS;SACV,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,iBAAiB,CACzB,kFAAkF,EAClF;gBACE,KAAK,EAAE,6BAA6B;aACrC,CACF,CAAA;QACH,CAAC;QACD,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAA;QAE7D,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,MAAM,KAAK,CAAA;QACb,CAAC;QAED,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAE9B,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,iBAAiB,CACzB,yEAAyE,EACzE;gBACE,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBACzD,SAAS,EAAE,IAAI;aAChB,CACF,CAAA;QACH,CAAC;QAED,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC1C,QAAQ,KAAK,CAAC,cAAc,EAAE,CAAC;gBAC7B,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,gGAAgG,EAChG;wBACE,aAAa,EAAE,KAAK;wBACpB,aAAa,EAAE,IAAI;wBACnB,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC,CACF,CAAA;gBACH,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CACzB,mHAAmH,EACnH;wBACE,aAAa,EAAE,KAAK;wBACpB,qBAAqB,EAAE,IAAI;wBAC3B,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC,CACF,CAAA;gBACH,CAAC;gBACD,KAAK,GAAG,CAAC;gBACT,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE;wBACzC,KAAK,EAAE,iBAAiB;wBACxB,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,iBAAiB,CACzB,gFAAgF,EAChF;YACE,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACzD,cAAc,EACZ,KAAK,YAAY,oBAAoB;gBACnC,CAAC,CAAC,KAAK,CAAC,cAAc;gBACtB,CAAC,CAAC,SAAS;SAChB,CACF,CAAA;IACH,CAAC;AACH,CAAC","sourcesContent":["import OneBlinkAppsError from '../errors/oneBlinkAppsError'\nimport Sentry from '../../Sentry'\nimport { isOffline } from '../../offline-service'\nimport { getDeviceInformation } from '../getDeviceInformation'\nimport { FormSubmission, ProgressListener } from '../../types/submissions'\nimport { getUserToken } from '../user-token'\nimport generateOneBlinkUploader from '../generateOneBlinkUploader'\nimport { OneBlinkStorageError } from '@oneblink/storage'\nimport generateOneBlinkDownloader from '../generateOneBlinkDownloader'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\n\nconst getBadRequestError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(error.message, {\n title: 'Invalid Submission',\n httpStatusCode: error.httpStatusCode,\n })\n}\nconst getUnauthenticatedError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(\n 'The form you are attempting to complete requires authentication. Please login and try again.',\n {\n requiresLogin: true,\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n },\n )\n}\nconst getUnauthorisedError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(\n 'You do not have access to complete this form. Please contact your administrator to gain the correct level of access.',\n {\n requiresAccessRequest: true,\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n },\n )\n}\nconst getNotFoundError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(\n 'We could not find the form you are looking for. Please contact your administrator to ensure your form configuration has been completed successfully.',\n {\n title: 'Unknown Form',\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n },\n )\n}\nconst getDefaultError = (error: OneBlinkStorageError) => {\n return new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n },\n )\n}\n\nconst handleError = (error: OneBlinkStorageError) => {\n if (/Failed to fetch/.test((error as Error).message)) {\n throw new OneBlinkAppsError(\n 'We encountered a network related issue. Please ensure you are connected to the internet before trying again. If the problem persists, contact your administrator.',\n {\n title: 'Connectivity Issues',\n originalError: error as Error,\n isOffline: true,\n },\n )\n }\n switch (error.httpStatusCode) {\n case 400: {\n return getBadRequestError(error)\n }\n case 401: {\n return getUnauthenticatedError(error)\n }\n case 403: {\n return getUnauthorisedError(error)\n }\n case 404: {\n return getNotFoundError(error)\n }\n case 409: {\n return new OneBlinkAppsError(error.message, {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n conflict: error.conflict,\n })\n }\n default: {\n return getDefaultError(error)\n }\n }\n}\n\nexport async function uploadFormSubmission(\n formSubmission: FormSubmission,\n /**\n * The date and time (in ISO format) the form was completed I.e. when the user\n * clicked the submit button\n */\n completionTimestamp: string,\n onProgress?: ProgressListener,\n abortSignal?: AbortSignal,\n) {\n try {\n const oneblinkUploader = generateOneBlinkUploader()\n\n const userToken = getUserToken()\n\n console.log('Uploading submission')\n return await oneblinkUploader.uploadSubmission({\n completionTimestamp,\n submission: formSubmission.submission,\n definition: formSubmission.definition,\n device: getDeviceInformation(),\n userToken: userToken || undefined,\n previousFormSubmissionApprovalId:\n formSubmission.previousFormSubmissionApprovalId,\n jobId: formSubmission.jobId || undefined,\n formsAppId: formSubmission.formsAppId,\n externalId: formSubmission.externalId || undefined,\n taskId: formSubmission.taskCompletion?.task.taskId || undefined,\n taskActionId: formSubmission.taskCompletion?.taskAction.taskActionId,\n taskGroupInstanceId:\n formSubmission.taskCompletion?.taskGroupInstance?.taskGroupInstanceId,\n taskCompletionTimestamp: formSubmission.taskCompletion?.completedAt,\n taskIsAdhoc: formSubmission.taskCompletion?.isAdhoc,\n recaptchas: formSubmission.recaptchas,\n onProgress,\n abortSignal,\n formSubmissionDraftId: formSubmission.formSubmissionDraftId,\n })\n } catch (error) {\n throw handleError(error as OneBlinkStorageError)\n }\n}\n\nexport async function uploadFormSubmissionEdit({\n submission,\n definition,\n submissionId,\n context,\n editedS3ObjectVersionId,\n onProgress,\n abortSignal,\n}: {\n submission: SubmissionTypes.NewS3SubmissionData['submission']\n definition: FormTypes.Form\n submissionId: string\n context: SubmissionTypes.FormSubmissionMetaEditContext\n editedS3ObjectVersionId: string\n onProgress?: ProgressListener\n abortSignal?: AbortSignal\n}) {\n try {\n const oneblinkUploader = generateOneBlinkUploader()\n return await oneblinkUploader.uploadFormSubmissionEdit({\n submission,\n definition,\n device: getDeviceInformation(),\n completionTimestamp: new Date().toISOString(),\n submissionId,\n context,\n editedS3ObjectVersionId,\n onProgress,\n abortSignal,\n })\n } catch (error) {\n throw handleError(error as OneBlinkStorageError)\n }\n}\n\nexport async function downloadFormSubmission({\n formId,\n submissionId,\n abortSignal,\n versionId,\n}: {\n formId: number\n submissionId: string\n abortSignal?: AbortSignal\n versionId?: string\n}) {\n try {\n console.log('Attempting to download form submission data:', {\n formId,\n submissionId,\n versionId,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const result = await oneblinkDownloader.downloadSubmission({\n formId,\n submissionId,\n abortSignal,\n versionId,\n })\n if (!result) {\n throw new OneBlinkAppsError(\n \"This submission has been removed based on your administrator's retention policy.\",\n {\n title: 'Submission Data Unavailable',\n },\n )\n }\n return {\n data: result.data,\n versionId: result.versionId,\n }\n } catch (error) {\n console.error('Error retrieving form submission data', error)\n\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline, please connect to the internet and try again',\n {\n originalError: error instanceof Error ? error : undefined,\n isOffline: true,\n },\n )\n }\n\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 401: {\n throw new OneBlinkAppsError(\n 'The submission you are attempting to view requires authentication. Please login and try again.',\n {\n originalError: error,\n requiresLogin: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to submission data. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(error.message, {\n title: 'Invalid Request',\n httpStatusCode: error.httpStatusCode,\n })\n }\n }\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error instanceof Error ? error : undefined,\n httpStatusCode:\n error instanceof OneBlinkStorageError\n ? error.httpStatusCode\n : undefined,\n },\n )\n }\n}\n"]}
|
|
@@ -225,6 +225,6 @@ declare function getSubmissionData({ formId, submissionId, abortSignal, }: {
|
|
|
225
225
|
abortSignal?: AbortSignal;
|
|
226
226
|
}): Promise<{
|
|
227
227
|
data: SubmissionTypes.S3SubmissionData;
|
|
228
|
-
versionId: string;
|
|
228
|
+
versionId: string | undefined;
|
|
229
229
|
}>;
|
|
230
230
|
export { submit, executePostSubmissionAction, executeCancelAction, goBackOrCloseWindow, getPendingQueueSubmissions, deletePendingQueueSubmission, editPendingQueueSubmission, cancelEditingPendingQueueSubmission, registerPendingQueueListener, processPendingQueue, BaseFormSubmission, NewDraftSubmission, NewFormSubmission, DraftSubmissionInput, DraftSubmission, FormSubmission, FormSubmissionResult, PendingFormSubmission, SubmissionParams, registerPendingQueueAttachmentProgressListener, registerPendingQueueProgressListener, ProgressListener, ProgressListenerEvent, PendingQueueListener, PendingQueueAction, getSubmissionData, uploadFormSubmissionEdit, getPostSubmissionAttachments, };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submission-service.js","sourceRoot":"","sources":["../../src/apps/submission-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,mCAAmC,EACnC,4BAA4B,EAC5B,0BAA0B,EAC1B,8CAA8C,EAC9C,oCAAoC,EACpC,oCAAoC,EACpC,4BAA4B,GAG7B,MAAM,0BAA0B,CAAA;AACjC,OAAO,sCAAsC,MAAM,mDAAmD,CAAA;AAEtG,OAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,OAAO,qBAAqB,MAAM,kCAAkC,CAAA;AACpE,OAAO,UAIN,MAAM,mBAAmB,CAAA;AAW1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,4BAA4B,MAAM,gDAAgD,CAAA;AAEzF,IAAI,yBAAyB,GAAG,KAAK,CAAA;AAErC;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,mBAAmB,CAAC,EACjC,6BAA6B,EAC7B,yBAAyB,GAI1B;IACC,IAAI,yBAAyB,EAAE,CAAC;QAC9B,OAAM;IACR,CAAC;IACD,yBAAyB,GAAG,IAAI,CAAA;IAEhC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;IACtD,MAAM,uBAAuB,GAAG,MAAM,0BAA0B,EAAE,CAAA;IAElE,OAAO,CAAC,GAAG,CACT,SAAS,uBAAuB,CAAC,MAAM,sCAAsC,CAC9E,CAAA;IACD,KAAK,MAAM,sBAAsB,IAAI,uBAAuB,EAAE,CAAC;QAC7D,IAAI,SAAS,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,kEAAkE,EAClE,sBAAsB,CACvB,CAAA;YACD,SAAQ;QACV,CAAC;QAED,IAAI,sBAAsB,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CACT,sEAAsE,EACtE,sBAAsB,CACvB,CAAA;YACD,SAAQ;QACV,CAAC;QAED,IACE,sBAAsB,CAAC,UAAU,CAAC,eAAe;YACjD,CAAC,UAAU,EAAE;YACb,CAAC,aAAa,EAAE,EAChB,CAAC;YACD,OAAO,CAAC,GAAG,CACT,6HAA6H,EAC7H,sBAAsB,CACvB,CAAA;YACD,SAAQ;QACV,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CACT,sDAAsD,EACtD,sBAAsB,CACvB,CAAA;YAED,sBAAsB,CAAC,YAAY,GAAG,IAAI,CAAA;YAC1C,sBAAsB,CAAC,KAAK,GAAG,SAAS,CAAA;YACxC,MAAM,4BAA4B,CAChC,sBAAsB,CAAC,gBAAgB,EACvC,sBAAsB,EACtB,gBAAgB,CACjB,CAAA;YAED,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CACpD,sBAAsB,CACvB,CAAA;YACD,sBAAsB,CAAC,UAAU,GAAG;gBAClC,GAAG,kBAAkB;aACtB,CAAA;YACD,MAAM,WAAW,GAAG,8BAA8B,CAChD,sBAAsB,CAAC,UAAU,CAAC,QAAQ,EAC1C,sBAAsB,CAAC,UAAU,CAClC,CAAA;YACD,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAC1C,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAClD,CAAA;YACD,IAAI,iBAAiB,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,oBAAoB,iBAAiB,CAAC,MAAM,cAC1C,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EACvC,GAAG,CACJ,CAAA;YACH,CAAC;YACD,MAAM,6BAA6B,CAAC;gBAClC,qBAAqB,EAAE,IAAI;gBAC3B,cAAc,EAAE,sBAAsB;gBACtC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;oBACpB,oCAAoC,CAAC;wBACnC,GAAG,KAAK;wBACR,gBAAgB,EAAE,sBAAsB,CAAC,gBAAgB;qBAC1D,CAAC,CAAA;gBACJ,CAAC;gBACD,6BAA6B;gBAC7B,yBAAyB;gBACzB,cAAc,EAAE,SAAS;gBACzB,iBAAiB,EAAE,SAAS;gBAC5B,mBAAmB,EAAE,sBAAsB,CAAC,gBAAgB;aAC7D,CAAC,CAAA;YAEF,MAAM,4BAA4B,CAChC,sBAAsB,CAAC,gBAAgB,EACvC,kBAAkB,CACnB,CAAA;YAED,OAAO,CAAC,GAAG,CACT,0DAA0D,EAC1D,sBAAsB,CACvB,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;YAC9B,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAA;YAC1E,sBAAsB,CAAC,YAAY,GAAG,KAAK,CAAA;YAC3C,IAAK,KAAe,CAAC,OAAO,EAAE,CAAC;gBAC7B,sBAAsB,CAAC,KAAK,GAAI,KAAe,CAAC,OAAO,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,sBAAsB,CAAC,KAAK;oBAC1B,wJAAwJ,CAAA;YAC5J,CAAC;YACD,MAAM,4BAA4B,CAChC,sBAAsB,CAAC,gBAAgB,EACvC,sBAAsB,EACtB,eAAe,CAChB,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,qEAAqE,CACtE,CAAA;IACD,yBAAyB,GAAG,KAAK,CAAA;AACnC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,KAAK,UAAU,MAAM,CACnB,MAEC;IAED,OAAO,MAAM,6BAA6B,CAAC;QACzC,GAAG,MAAM;QACT,mBAAmB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC9C,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,6BAA6B,CAAC,EAC3C,WAAW,EACX,GAAG,MAAM,EAIV;IACC,MAAM,oBAAoB,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;IACrD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,CAAA;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAA;YACtD,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAA;AAC7B,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,mBAAmB;IACnB,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,mBAAmB;QACnB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;QAC7B,OAAM;IACR,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAA;IAEd,+CAA+C;IAC/C,2CAA2C;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;YACxE,MAAM,CACJ,IAAI,KAAK,CACP,kFAAkF,CACnF,CACF,CAAA;QACH,CAAC,EAAE,GAAG,CAAC,CAAA;IACT,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,UAAU,mBAAmB;IAChC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,EAAE,CAAA;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IACvB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,KAAK,UAAU,mBAAmB,CAChC,2BAIC,EACD,EACE,uBAAuB,EACvB,uBAAuB,GAIxB;IAED,MAAM,oBAAoB,GAAyB;QACjD,GAAG,2BAA2B;QAC9B,UAAU,EAAE,GAAG;QACf,qBAAqB,EAAE,SAAS;QAChC,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,SAAS;QACrB,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;QACd,gBAAgB,EAAE,KAAK;QACvB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;QAClB,mBAAmB,EAAE,IAAI;QACzB,sBAAsB,EAAE,KAAK;KAC9B,CAAA;IAED,IAAI,YAAY,GAAG,oBAAoB,CAAC,UAAU,CAAC,YAAY,CAAA;IAC/D,IAAI,iBAAiB,GAAG,oBAAoB,CAAC,UAAU,CAAC,iBAAiB,CAAA;IAEzE,IAAI,oBAAoB,CAAC,cAAc,EAAE,CAAC;QACxC,YAAY,GAAG,KAAK,CAAA;QACpB,iBAAiB,GAAG,oBAAoB,CAAC,cAAc,CAAC,WAAW,CAAA;IACrE,CAAC;IAED,MAAM,aAAa,CAAC,oBAAoB,EAAE;QACxC,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,iBAAiB;QAC9B,uBAAuB;QACvB,uBAAuB;KACxB,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,KAAK,UAAU,2BAA2B,CACxC,gBAAsC,EACtC,EACE,uBAAuB,EACvB,uBAAuB,GAIxB;IAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;IACvD,IAAI,oBAAoB,GAAG,gBAAgB,CAAC,UAAU,CAAC,oBAAoB,CAAA;IAC3E,IAAI,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,WAAW,CAAA;IAEzD,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC;QAChC,oBAAoB,GAAG,KAAK,CAAA;QAC5B,WAAW,GAAG,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAA;IACtD,CAAC;SAAM,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;QACpC,oBAAoB,GAAG,KAAK,CAAA;QAC5B,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAA;IACtD,CAAC;SAAM,IAAI,gBAAgB,CAAC,cAAc,EAAE,CAAC;QAC3C,oBAAoB,GAAG,KAAK,CAAA;QAC5B,WAAW,GAAG,gBAAgB,CAAC,cAAc,CAAC,WAAW,CAAA;IAC3D,CAAC;IAED,MAAM,aAAa,CAAC,gBAAgB,EAAE;QACpC,MAAM,EAAE,oBAAoB;QAC5B,WAAW;QACX,uBAAuB;QACvB,uBAAuB;KACxB,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,gBAAsC,EACtC,EACE,MAAM,EACN,WAAW,EACX,uBAAuB,EACvB,uBAAuB,GAMxB;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,WAAW,EAAE,CAAA;QACtB,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACrC,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACjD,CAAC;iBAAM,CAAC;gBACN,uBAAuB,CAAC,GAAG,CAAC,CAAA;YAC9B,CAAC;YACD,MAAK;QACP,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,MAAM,GAAG,sCAAsC,CACnD,WAAW,IAAI,GAAG,EAClB,gBAAgB,CACjB,CAAC,IAAI,CAAA;YACN,+CAA+C;YAC/C,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACtB,uBAAuB,CAAC,MAAM,CAAC,CAAA;gBAC/B,OAAM;YACR,CAAC;YAED,uBAAuB,CAAC,MAAM,CAAC,CAAA;YAE/B,8CAA8C;YAC9C,yCAAyC;YACzC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,qDAAqD;gBACrD,gDAAgD;gBAChD,UAAU,CAAC,GAAG,EAAE;oBACd,uBAAuB,CAAC,GAAG,CAAC,CAAA;gBAC9B,CAAC,EAAE,IAAI,CAAC,CAAA;YACV,CAAC;YACD,MAAK;QACP,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,OAAO,CAAC,CAAC,CAAC;YACR,2EAA2E;YAC3E,OAAO,mBAAmB,EAAE,CAAA;QAC9B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,KAAK,UAAU,iBAAiB,CAAC,EAC/B,MAAM,EACN,YAAY,EACZ,WAAW,GAKZ;IAIC,OAAO,MAAM,sBAAsB,CAAC;QAClC,MAAM;QACN,YAAY;QACZ,WAAW;KACZ,CAAC,CAAA;AACJ,CAAC;AAED,OAAO,EACL,MAAM,EACN,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,mBAAmB,EAUnB,8CAA8C,EAC9C,oCAAoC,EAKpC,iBAAiB,EACjB,wBAAwB,EACxB,4BAA4B,GAC7B,CAAA","sourcesContent":["import { isOffline } from './offline-service'\nimport { getFormsKeyId, isLoggedIn } from './auth-service'\nimport {\n registerPendingQueueListener,\n getPendingQueueSubmissions,\n updatePendingQueueSubmission,\n cancelEditingPendingQueueSubmission,\n deletePendingQueueSubmission,\n editPendingQueueSubmission,\n registerPendingQueueAttachmentProgressListener,\n registerPendingQueueProgressListener,\n executePendingQueueProgressListeners,\n removePendingQueueSubmission,\n PendingQueueListener,\n PendingQueueAction,\n} from './services/pending-queue'\nimport replaceInjectablesWithSubmissionValues from './services/replaceInjectablesWithSubmissionValues'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport Sentry from './Sentry'\nimport prepareSubmissionData from './services/prepareSubmissionData'\nimport submitForm, {\n SubmissionParams,\n ProgressListener,\n ProgressListenerEvent,\n} from './services/submit'\nimport {\n PendingFormSubmission,\n FormSubmission,\n FormSubmissionResult,\n BaseFormSubmission,\n NewDraftSubmission,\n NewFormSubmission,\n DraftSubmission,\n DraftSubmissionInput,\n} from './types/submissions'\nimport { deleteAutoSaveData } from './auto-save-service'\nimport {\n downloadFormSubmission,\n uploadFormSubmissionEdit,\n} from './services/api/submissions'\nimport { getSubmissionAttachmentDetails } from './attachments-service'\nimport getPostSubmissionAttachments from './services/api/post-submission-attachment-urls'\n\nlet _isProcessingPendingQueue = false\n\n/**\n * Force processing the pending queue. This must be called to process the\n * pending queue and is best used when the application comes back online.\n *\n * ### Example\n *\n * ```js\n * await submissionService.processPendingQueue()\n * ```\n *\n * @returns\n */\nasync function processPendingQueue({\n shouldRunExternalIdGeneration,\n shouldRunServerValidation,\n}: {\n shouldRunExternalIdGeneration: boolean\n shouldRunServerValidation: boolean\n}): Promise<void> {\n if (_isProcessingPendingQueue) {\n return\n }\n _isProcessingPendingQueue = true\n\n console.log('Checking pending queue for submissions.')\n const pendingQueueSubmissions = await getPendingQueueSubmissions()\n\n console.log(\n `Found ${pendingQueueSubmissions.length} submission(s) in the pending queue.`,\n )\n for (const pendingQueueSubmission of pendingQueueSubmissions) {\n if (isOffline()) {\n console.log(\n 'Application is offline, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n if (pendingQueueSubmission.isEditing) {\n console.log(\n 'submission is being edited, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n if (\n pendingQueueSubmission.definition.isAuthenticated &&\n !isLoggedIn() &&\n !getFormsKeyId()\n ) {\n console.log(\n 'Authentication is required for this form but the user does not have a valid token, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n try {\n console.log(\n 'Attempting to process submission from pending queue:',\n pendingQueueSubmission,\n )\n\n pendingQueueSubmission.isSubmitting = true\n pendingQueueSubmission.error = undefined\n await updatePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n pendingQueueSubmission,\n 'SUBMIT_STARTED',\n )\n\n const preparedSubmission = await prepareSubmissionData(\n pendingQueueSubmission,\n )\n pendingQueueSubmission.submission = {\n ...preparedSubmission,\n }\n const attachments = getSubmissionAttachmentDetails(\n pendingQueueSubmission.definition.elements,\n pendingQueueSubmission.submission,\n )\n const failedAttachments = attachments.filter(\n (attachment) => attachment.value.type === 'ERROR',\n )\n if (failedAttachments.length) {\n throw new Error(\n `Failed to upload ${failedAttachments.length} attachment${\n failedAttachments.length > 1 ? 's' : ''\n }.`,\n )\n }\n await submitWithCompletionTimestamp({\n isPendingQueueEnabled: true,\n formSubmission: pendingQueueSubmission,\n onProgress: (event) => {\n executePendingQueueProgressListeners({\n ...event,\n pendingTimestamp: pendingQueueSubmission.pendingTimestamp,\n })\n },\n shouldRunExternalIdGeneration,\n shouldRunServerValidation,\n paymentFormUrl: undefined,\n paymentReceiptUrl: undefined,\n completionTimestamp: pendingQueueSubmission.pendingTimestamp,\n })\n\n await removePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n 'SUBMIT_SUCCEEDED',\n )\n\n console.log(\n 'Successfully processed submission from the pending queue',\n pendingQueueSubmission,\n )\n } catch (error) {\n Sentry.captureException(error)\n console.error('Error processing submission from the pending queue', error)\n pendingQueueSubmission.isSubmitting = false\n if ((error as Error).message) {\n pendingQueueSubmission.error = (error as Error).message\n } else {\n pendingQueueSubmission.error =\n 'An unknown error has occurred, which has prevented your Form from submitting. Please try again, or contact your Administrator if the problem persists.'\n }\n await updatePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n pendingQueueSubmission,\n 'SUBMIT_FAILED',\n )\n }\n }\n\n console.log(\n 'Finished attempting to processing submissions in the pending queue.',\n )\n _isProcessingPendingQueue = false\n}\n\n/**\n * Submit a FormSubmission. Offline submissions will be added to a pending queue\n * and be processed using the `processPendingQueue()` function. FormSubmissions\n * with payment submission events will return the FormSubmissionResult with a\n * `payment` property set, this should be used to redirect the user to the\n * payment URL. Will also handle cleaning up auto save data (if the\n * `autoSaveKey` property is passed), locally stored drafts and prefill data.\n *\n * ### Example\n *\n * ```js\n * const formSubmission = {\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here',\n * },\n * definition: OneBlinkForm,\n * captchaTokens: [],\n * formSubmissionDraftId: '2974602c-2c5b-4b46-b086-87ee9b2aa233',\n * jobId: 'bb37d1da-9cda-4950-a36a-22f58b25de3a',\n * preFillFormDataId: '7763f828-4aaf-49dc-9c1b-e2eeea8fa990',\n * externalId: 'external-id-set-by-developer',\n * }\n *\n * // Pass paymentReceiptUrl if submission may require a payment\n * const paymentReceiptUrl = `${window.location.origin}/payment-receipt`\n *\n * // Pass schedulingBookingUrlConfiguration if submission utilise scheduling\n * const schedulingBookingUrlConfiguration = {\n * schedulingBookingUrl: 'https://my-website.com/booking',\n * schedulingRescheduleUrl: 'https://my-website.com/reschedule',\n * schedulingCancelUrl: 'https://my-website.com/cancel',\n * }\n * const submissionResult = await submissionService.submit({\n * formSubmission,\n * paymentReceiptUrl,\n * schedulingBookingUrlConfiguration,\n * })\n *\n * if (submissionResult.scheduling) {\n * // Redirect user to booking form\n * window.location.href = submissionResult.scheduling.bookingUrl\n * return\n * }\n *\n * if (submissionResult.payment) {\n * // Redirect user to payment form\n * window.location.href = submissionResult.payment.hostedFormUrl\n * return\n * }\n *\n * if (submissionResult.isOffline) {\n * if (submissionResult.isInPendingQueue) {\n * // Display message to user that the submission\n * // has been added to the pending queue\n * } else {\n * // Display message to user that this submission can\n * // not be processed while offline (most likely because it requires a payment)\n * }\n * return\n * }\n *\n * // submissionResult.submissionId and submissionResult.submissionTimestamp\n * // will be set if the submission was successful\n * ```\n *\n * @param params\n * @returns\n */\nasync function submit(\n params: SubmissionParams & {\n autoSaveKey?: string\n },\n): Promise<FormSubmissionResult> {\n return await submitWithCompletionTimestamp({\n ...params,\n completionTimestamp: new Date().toISOString(),\n })\n}\n\nasync function submitWithCompletionTimestamp({\n autoSaveKey,\n ...params\n}: SubmissionParams & {\n autoSaveKey?: string\n completionTimestamp: string\n}): Promise<FormSubmissionResult> {\n const formSubmissionResult = await submitForm(params)\n if (typeof autoSaveKey === 'string') {\n try {\n await deleteAutoSaveData(params.formSubmission.definition.id, autoSaveKey)\n } catch (error) {\n console.warn('Error removing auto save data: ', error)\n Sentry.captureException(error)\n }\n }\n return formSubmissionResult\n}\n\nasync function closeWindow(): Promise<void> {\n // @ts-expect-error\n if (window.cordova && window.cordova.plugins.exit) {\n // @ts-expect-error\n window.cordova.plugins.exit()\n return\n }\n\n window.close()\n\n // If the browser has not closed after timeout,\n // we throw an error to display to the user\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n console.log('Could not close as window was not opened using JavaScript')\n reject(\n new Error(\n 'We were unable to close your browser, could you please close it manually for us?',\n ),\n )\n }, 500)\n })\n}\n\n/**\n * Go back in the browser history or attempts to close the browser tab if there\n * is no history.\n *\n * ### Example\n *\n * ```js\n * try {\n * await submissionService.goBackOrCloseWindow()\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @returns\n */\nasync function goBackOrCloseWindow(): Promise<void> {\n if (window.history.length <= 1) {\n return closeWindow()\n } else {\n window.history.back()\n }\n}\n\n/**\n * Action to cancel completing a form, currently goes back in the browser\n * history or attempts to close the browser tab if there is no history.\n *\n * ### Example\n *\n * ```js\n * const options = {\n * definition: OneBlinkForm,\n * externalId: 'external-id-set-by-developer',\n * }\n * // Only used for relative URLs\n * const pushRelativePath = (path) => {\n * window.location.href = path\n * }\n * // Only used for aboslute URLS\n * const replaceAbsolutePath = window.location.replace\n *\n * try {\n * await submissionService.executeCancelAction(options, {\n * onRedirectToRelativeUrl: pushRelativePath,\n * onRedirectToAbsoluteUrl: replaceAbsolutePath,\n * })\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @param options\n * @param redirectConfig\n */\nasync function executeCancelAction(\n formSubmissionResultOptions: {\n definition: FormTypes.Form\n externalId: string | null\n taskCompletion?: FormSubmissionResult['taskCompletion']\n },\n {\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n const formSubmissionResult: FormSubmissionResult = {\n ...formSubmissionResultOptions,\n formsAppId: NaN,\n formSubmissionDraftId: undefined,\n jobId: undefined,\n externalId: undefined,\n preFillFormDataId: null,\n recaptchas: [],\n submission: {},\n isInPendingQueue: false,\n isOffline: false,\n payment: null,\n scheduling: null,\n submissionId: null,\n submissionTimestamp: null,\n isUploadingAttachments: false,\n }\n\n let cancelAction = formSubmissionResult.definition.cancelAction\n let cancelRedirectUrl = formSubmissionResult.definition.cancelRedirectUrl\n\n if (formSubmissionResult.taskCompletion) {\n cancelAction = 'URL'\n cancelRedirectUrl = formSubmissionResult.taskCompletion.redirectUrl\n }\n\n await executeAction(formSubmissionResult, {\n action: cancelAction,\n redirectUrl: cancelRedirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n })\n}\n\n/**\n * Execute the post submission action for a form after a successful form\n * submission.\n *\n * ### Example\n *\n * ```js\n * const formSubmissionResult = {\n * submissionId: '89c6e98e-f56f-45fc-84fe-c4fc62331d34',\n * submissionTimestamp: '2020-07-29T01:03:26.573Z'\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here'\n * },\n * definition: OneBlinkForm,\n * payment: {\n * hostedFormUrl: 'https://payment.com/transaction'\n * },\n * formSubmissionDraftId: '2974602c-2c5b-4b46-b086-87ee9b2aa233',\n * jobId: 'bb37d1da-9cda-4950-a36a-22f58b25de3a',\n * preFillFormDataId: '7763f828-4aaf-49dc-9c1b-e2eeea8fa990',\n * externalId: 'external-id-set-by-developer',\n * }\n * // Only used for relative URLs\n * const pushRelativePath = (path) => {\n * window.location.href = path\n * }\n * // Only used for aboslute URLS\n * const replaceAbsolutePath = window.location.replace\n *\n * try {\n * await submissionService.executePostSubmissionAction(formSubmissionResult, {\n * onRedirectToRelativeUrl: pushRelativePath,\n * onRedirectToAbsoluteUrl: replaceAbsolutePath,\n * })\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @param submissionResult\n * @param redirectConfig\n */\nasync function executePostSubmissionAction(\n submissionResult: FormSubmissionResult,\n {\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n console.log('Attempting to run post submission action')\n let postSubmissionAction = submissionResult.definition.postSubmissionAction\n let redirectUrl = submissionResult.definition.redirectUrl\n\n if (submissionResult.scheduling) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.scheduling.bookingUrl\n } else if (submissionResult.payment) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.payment.hostedFormUrl\n } else if (submissionResult.taskCompletion) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.taskCompletion.redirectUrl\n }\n\n await executeAction(submissionResult, {\n action: postSubmissionAction,\n redirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n })\n}\n\nasync function executeAction(\n submissionResult: FormSubmissionResult,\n {\n action,\n redirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n action: FormTypes.FormPostSubmissionAction\n redirectUrl: string | undefined\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n switch (action) {\n case 'CLOSE':\n return closeWindow()\n case 'FORMS_LIBRARY': {\n if (window.location.pathname === '/') {\n onRedirectToAbsoluteUrl(window.location.origin)\n } else {\n onRedirectToRelativeUrl('/')\n }\n break\n }\n case 'URL': {\n const newUrl = replaceInjectablesWithSubmissionValues(\n redirectUrl || '/',\n submissionResult,\n ).text\n // Relative URLs can be navigated to internally\n if (newUrl[0] === '/') {\n onRedirectToRelativeUrl(newUrl)\n return\n }\n\n onRedirectToAbsoluteUrl(newUrl)\n\n // If we are in cordova land, we will navigate\n // back to the home screen after redirect\n if (window.cordova) {\n // Wait a couple of seconds to ensure the browser has\n // been opened before navigating away from form.\n setTimeout(() => {\n onRedirectToRelativeUrl('/')\n }, 2000)\n }\n break\n }\n case 'BACK':\n default: {\n // if there's no post submission action for some reason, use prev. logic...\n return goBackOrCloseWindow()\n }\n }\n}\n\n/**\n * Retrieve submission data for a known formId and submissionId\n *\n * #### Example\n *\n * ```js\n * const formId = 1\n * const submissionId = 'fba95b9d-5a9c-463d-ab68-867f431e4120'\n * const credentials = await formSubmissionService.getSubmissionData({\n * formId,\n * submissionId,\n * })\n * ```\n *\n * @param formId\n * @param submissionId\n * @param abortSignal\n * @returns\n */\nasync function getSubmissionData({\n formId,\n submissionId,\n abortSignal,\n}: {\n formId: number\n submissionId: string\n abortSignal?: AbortSignal\n}): Promise<{\n data: SubmissionTypes.S3SubmissionData\n versionId: string\n}> {\n return await downloadFormSubmission({\n formId,\n submissionId,\n abortSignal,\n })\n}\n\nexport {\n submit,\n executePostSubmissionAction,\n executeCancelAction,\n goBackOrCloseWindow,\n getPendingQueueSubmissions,\n deletePendingQueueSubmission,\n editPendingQueueSubmission,\n cancelEditingPendingQueueSubmission,\n registerPendingQueueListener,\n processPendingQueue,\n BaseFormSubmission,\n NewDraftSubmission,\n NewFormSubmission,\n DraftSubmissionInput,\n DraftSubmission,\n FormSubmission,\n FormSubmissionResult,\n PendingFormSubmission,\n SubmissionParams,\n registerPendingQueueAttachmentProgressListener,\n registerPendingQueueProgressListener,\n ProgressListener,\n ProgressListenerEvent,\n PendingQueueListener,\n PendingQueueAction,\n getSubmissionData,\n uploadFormSubmissionEdit,\n getPostSubmissionAttachments,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"submission-service.js","sourceRoot":"","sources":["../../src/apps/submission-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { isOffline } from './offline-service'\nimport { getFormsKeyId, isLoggedIn } from './auth-service'\nimport {\n registerPendingQueueListener,\n getPendingQueueSubmissions,\n updatePendingQueueSubmission,\n cancelEditingPendingQueueSubmission,\n deletePendingQueueSubmission,\n editPendingQueueSubmission,\n registerPendingQueueAttachmentProgressListener,\n registerPendingQueueProgressListener,\n executePendingQueueProgressListeners,\n removePendingQueueSubmission,\n PendingQueueListener,\n PendingQueueAction,\n} from './services/pending-queue'\nimport replaceInjectablesWithSubmissionValues from './services/replaceInjectablesWithSubmissionValues'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport Sentry from './Sentry'\nimport prepareSubmissionData from './services/prepareSubmissionData'\nimport submitForm, {\n SubmissionParams,\n ProgressListener,\n ProgressListenerEvent,\n} from './services/submit'\nimport {\n PendingFormSubmission,\n FormSubmission,\n FormSubmissionResult,\n BaseFormSubmission,\n NewDraftSubmission,\n NewFormSubmission,\n DraftSubmission,\n DraftSubmissionInput,\n} from './types/submissions'\nimport { deleteAutoSaveData } from './auto-save-service'\nimport {\n downloadFormSubmission,\n uploadFormSubmissionEdit,\n} from './services/api/submissions'\nimport { getSubmissionAttachmentDetails } from './attachments-service'\nimport getPostSubmissionAttachments from './services/api/post-submission-attachment-urls'\n\nlet _isProcessingPendingQueue = false\n\n/**\n * Force processing the pending queue. This must be called to process the\n * pending queue and is best used when the application comes back online.\n *\n * ### Example\n *\n * ```js\n * await submissionService.processPendingQueue()\n * ```\n *\n * @returns\n */\nasync function processPendingQueue({\n shouldRunExternalIdGeneration,\n shouldRunServerValidation,\n}: {\n shouldRunExternalIdGeneration: boolean\n shouldRunServerValidation: boolean\n}): Promise<void> {\n if (_isProcessingPendingQueue) {\n return\n }\n _isProcessingPendingQueue = true\n\n console.log('Checking pending queue for submissions.')\n const pendingQueueSubmissions = await getPendingQueueSubmissions()\n\n console.log(\n `Found ${pendingQueueSubmissions.length} submission(s) in the pending queue.`,\n )\n for (const pendingQueueSubmission of pendingQueueSubmissions) {\n if (isOffline()) {\n console.log(\n 'Application is offline, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n if (pendingQueueSubmission.isEditing) {\n console.log(\n 'submission is being edited, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n if (\n pendingQueueSubmission.definition.isAuthenticated &&\n !isLoggedIn() &&\n !getFormsKeyId()\n ) {\n console.log(\n 'Authentication is required for this form but the user does not have a valid token, leaving submission in the pending queue:',\n pendingQueueSubmission,\n )\n continue\n }\n\n try {\n console.log(\n 'Attempting to process submission from pending queue:',\n pendingQueueSubmission,\n )\n\n pendingQueueSubmission.isSubmitting = true\n pendingQueueSubmission.error = undefined\n await updatePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n pendingQueueSubmission,\n 'SUBMIT_STARTED',\n )\n\n const preparedSubmission = await prepareSubmissionData(\n pendingQueueSubmission,\n )\n pendingQueueSubmission.submission = {\n ...preparedSubmission,\n }\n const attachments = getSubmissionAttachmentDetails(\n pendingQueueSubmission.definition.elements,\n pendingQueueSubmission.submission,\n )\n const failedAttachments = attachments.filter(\n (attachment) => attachment.value.type === 'ERROR',\n )\n if (failedAttachments.length) {\n throw new Error(\n `Failed to upload ${failedAttachments.length} attachment${\n failedAttachments.length > 1 ? 's' : ''\n }.`,\n )\n }\n await submitWithCompletionTimestamp({\n isPendingQueueEnabled: true,\n formSubmission: pendingQueueSubmission,\n onProgress: (event) => {\n executePendingQueueProgressListeners({\n ...event,\n pendingTimestamp: pendingQueueSubmission.pendingTimestamp,\n })\n },\n shouldRunExternalIdGeneration,\n shouldRunServerValidation,\n paymentFormUrl: undefined,\n paymentReceiptUrl: undefined,\n completionTimestamp: pendingQueueSubmission.pendingTimestamp,\n })\n\n await removePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n 'SUBMIT_SUCCEEDED',\n )\n\n console.log(\n 'Successfully processed submission from the pending queue',\n pendingQueueSubmission,\n )\n } catch (error) {\n Sentry.captureException(error)\n console.error('Error processing submission from the pending queue', error)\n pendingQueueSubmission.isSubmitting = false\n if ((error as Error).message) {\n pendingQueueSubmission.error = (error as Error).message\n } else {\n pendingQueueSubmission.error =\n 'An unknown error has occurred, which has prevented your Form from submitting. Please try again, or contact your Administrator if the problem persists.'\n }\n await updatePendingQueueSubmission(\n pendingQueueSubmission.pendingTimestamp,\n pendingQueueSubmission,\n 'SUBMIT_FAILED',\n )\n }\n }\n\n console.log(\n 'Finished attempting to processing submissions in the pending queue.',\n )\n _isProcessingPendingQueue = false\n}\n\n/**\n * Submit a FormSubmission. Offline submissions will be added to a pending queue\n * and be processed using the `processPendingQueue()` function. FormSubmissions\n * with payment submission events will return the FormSubmissionResult with a\n * `payment` property set, this should be used to redirect the user to the\n * payment URL. Will also handle cleaning up auto save data (if the\n * `autoSaveKey` property is passed), locally stored drafts and prefill data.\n *\n * ### Example\n *\n * ```js\n * const formSubmission = {\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here',\n * },\n * definition: OneBlinkForm,\n * captchaTokens: [],\n * formSubmissionDraftId: '2974602c-2c5b-4b46-b086-87ee9b2aa233',\n * jobId: 'bb37d1da-9cda-4950-a36a-22f58b25de3a',\n * preFillFormDataId: '7763f828-4aaf-49dc-9c1b-e2eeea8fa990',\n * externalId: 'external-id-set-by-developer',\n * }\n *\n * // Pass paymentReceiptUrl if submission may require a payment\n * const paymentReceiptUrl = `${window.location.origin}/payment-receipt`\n *\n * // Pass schedulingBookingUrlConfiguration if submission utilise scheduling\n * const schedulingBookingUrlConfiguration = {\n * schedulingBookingUrl: 'https://my-website.com/booking',\n * schedulingRescheduleUrl: 'https://my-website.com/reschedule',\n * schedulingCancelUrl: 'https://my-website.com/cancel',\n * }\n * const submissionResult = await submissionService.submit({\n * formSubmission,\n * paymentReceiptUrl,\n * schedulingBookingUrlConfiguration,\n * })\n *\n * if (submissionResult.scheduling) {\n * // Redirect user to booking form\n * window.location.href = submissionResult.scheduling.bookingUrl\n * return\n * }\n *\n * if (submissionResult.payment) {\n * // Redirect user to payment form\n * window.location.href = submissionResult.payment.hostedFormUrl\n * return\n * }\n *\n * if (submissionResult.isOffline) {\n * if (submissionResult.isInPendingQueue) {\n * // Display message to user that the submission\n * // has been added to the pending queue\n * } else {\n * // Display message to user that this submission can\n * // not be processed while offline (most likely because it requires a payment)\n * }\n * return\n * }\n *\n * // submissionResult.submissionId and submissionResult.submissionTimestamp\n * // will be set if the submission was successful\n * ```\n *\n * @param params\n * @returns\n */\nasync function submit(\n params: SubmissionParams & {\n autoSaveKey?: string\n },\n): Promise<FormSubmissionResult> {\n return await submitWithCompletionTimestamp({\n ...params,\n completionTimestamp: new Date().toISOString(),\n })\n}\n\nasync function submitWithCompletionTimestamp({\n autoSaveKey,\n ...params\n}: SubmissionParams & {\n autoSaveKey?: string\n completionTimestamp: string\n}): Promise<FormSubmissionResult> {\n const formSubmissionResult = await submitForm(params)\n if (typeof autoSaveKey === 'string') {\n try {\n await deleteAutoSaveData(params.formSubmission.definition.id, autoSaveKey)\n } catch (error) {\n console.warn('Error removing auto save data: ', error)\n Sentry.captureException(error)\n }\n }\n return formSubmissionResult\n}\n\nasync function closeWindow(): Promise<void> {\n // @ts-expect-error\n if (window.cordova && window.cordova.plugins.exit) {\n // @ts-expect-error\n window.cordova.plugins.exit()\n return\n }\n\n window.close()\n\n // If the browser has not closed after timeout,\n // we throw an error to display to the user\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n console.log('Could not close as window was not opened using JavaScript')\n reject(\n new Error(\n 'We were unable to close your browser, could you please close it manually for us?',\n ),\n )\n }, 500)\n })\n}\n\n/**\n * Go back in the browser history or attempts to close the browser tab if there\n * is no history.\n *\n * ### Example\n *\n * ```js\n * try {\n * await submissionService.goBackOrCloseWindow()\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @returns\n */\nasync function goBackOrCloseWindow(): Promise<void> {\n if (window.history.length <= 1) {\n return closeWindow()\n } else {\n window.history.back()\n }\n}\n\n/**\n * Action to cancel completing a form, currently goes back in the browser\n * history or attempts to close the browser tab if there is no history.\n *\n * ### Example\n *\n * ```js\n * const options = {\n * definition: OneBlinkForm,\n * externalId: 'external-id-set-by-developer',\n * }\n * // Only used for relative URLs\n * const pushRelativePath = (path) => {\n * window.location.href = path\n * }\n * // Only used for aboslute URLS\n * const replaceAbsolutePath = window.location.replace\n *\n * try {\n * await submissionService.executeCancelAction(options, {\n * onRedirectToRelativeUrl: pushRelativePath,\n * onRedirectToAbsoluteUrl: replaceAbsolutePath,\n * })\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @param options\n * @param redirectConfig\n */\nasync function executeCancelAction(\n formSubmissionResultOptions: {\n definition: FormTypes.Form\n externalId: string | null\n taskCompletion?: FormSubmissionResult['taskCompletion']\n },\n {\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n const formSubmissionResult: FormSubmissionResult = {\n ...formSubmissionResultOptions,\n formsAppId: NaN,\n formSubmissionDraftId: undefined,\n jobId: undefined,\n externalId: undefined,\n preFillFormDataId: null,\n recaptchas: [],\n submission: {},\n isInPendingQueue: false,\n isOffline: false,\n payment: null,\n scheduling: null,\n submissionId: null,\n submissionTimestamp: null,\n isUploadingAttachments: false,\n }\n\n let cancelAction = formSubmissionResult.definition.cancelAction\n let cancelRedirectUrl = formSubmissionResult.definition.cancelRedirectUrl\n\n if (formSubmissionResult.taskCompletion) {\n cancelAction = 'URL'\n cancelRedirectUrl = formSubmissionResult.taskCompletion.redirectUrl\n }\n\n await executeAction(formSubmissionResult, {\n action: cancelAction,\n redirectUrl: cancelRedirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n })\n}\n\n/**\n * Execute the post submission action for a form after a successful form\n * submission.\n *\n * ### Example\n *\n * ```js\n * const formSubmissionResult = {\n * submissionId: '89c6e98e-f56f-45fc-84fe-c4fc62331d34',\n * submissionTimestamp: '2020-07-29T01:03:26.573Z'\n * formsAppId: 1,\n * submission: {\n * form: 'data',\n * goes: 'here'\n * },\n * definition: OneBlinkForm,\n * payment: {\n * hostedFormUrl: 'https://payment.com/transaction'\n * },\n * formSubmissionDraftId: '2974602c-2c5b-4b46-b086-87ee9b2aa233',\n * jobId: 'bb37d1da-9cda-4950-a36a-22f58b25de3a',\n * preFillFormDataId: '7763f828-4aaf-49dc-9c1b-e2eeea8fa990',\n * externalId: 'external-id-set-by-developer',\n * }\n * // Only used for relative URLs\n * const pushRelativePath = (path) => {\n * window.location.href = path\n * }\n * // Only used for aboslute URLS\n * const replaceAbsolutePath = window.location.replace\n *\n * try {\n * await submissionService.executePostSubmissionAction(formSubmissionResult, {\n * onRedirectToRelativeUrl: pushRelativePath,\n * onRedirectToAbsoluteUrl: replaceAbsolutePath,\n * })\n * } catch (error) {\n * // Handle error while closing browser tab.\n * // Display message to user to close it manually\n * }\n * ```\n *\n * @param submissionResult\n * @param redirectConfig\n */\nasync function executePostSubmissionAction(\n submissionResult: FormSubmissionResult,\n {\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n console.log('Attempting to run post submission action')\n let postSubmissionAction = submissionResult.definition.postSubmissionAction\n let redirectUrl = submissionResult.definition.redirectUrl\n\n if (submissionResult.scheduling) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.scheduling.bookingUrl\n } else if (submissionResult.payment) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.payment.hostedFormUrl\n } else if (submissionResult.taskCompletion) {\n postSubmissionAction = 'URL'\n redirectUrl = submissionResult.taskCompletion.redirectUrl\n }\n\n await executeAction(submissionResult, {\n action: postSubmissionAction,\n redirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n })\n}\n\nasync function executeAction(\n submissionResult: FormSubmissionResult,\n {\n action,\n redirectUrl,\n onRedirectToRelativeUrl,\n onRedirectToAbsoluteUrl,\n }: {\n action: FormTypes.FormPostSubmissionAction\n redirectUrl: string | undefined\n onRedirectToRelativeUrl: (url: string) => void\n onRedirectToAbsoluteUrl: (url: string) => void\n },\n): Promise<void> {\n switch (action) {\n case 'CLOSE':\n return closeWindow()\n case 'FORMS_LIBRARY': {\n if (window.location.pathname === '/') {\n onRedirectToAbsoluteUrl(window.location.origin)\n } else {\n onRedirectToRelativeUrl('/')\n }\n break\n }\n case 'URL': {\n const newUrl = replaceInjectablesWithSubmissionValues(\n redirectUrl || '/',\n submissionResult,\n ).text\n // Relative URLs can be navigated to internally\n if (newUrl[0] === '/') {\n onRedirectToRelativeUrl(newUrl)\n return\n }\n\n onRedirectToAbsoluteUrl(newUrl)\n\n // If we are in cordova land, we will navigate\n // back to the home screen after redirect\n if (window.cordova) {\n // Wait a couple of seconds to ensure the browser has\n // been opened before navigating away from form.\n setTimeout(() => {\n onRedirectToRelativeUrl('/')\n }, 2000)\n }\n break\n }\n case 'BACK':\n default: {\n // if there's no post submission action for some reason, use prev. logic...\n return goBackOrCloseWindow()\n }\n }\n}\n\n/**\n * Retrieve submission data for a known formId and submissionId\n *\n * #### Example\n *\n * ```js\n * const formId = 1\n * const submissionId = 'fba95b9d-5a9c-463d-ab68-867f431e4120'\n * const credentials = await formSubmissionService.getSubmissionData({\n * formId,\n * submissionId,\n * })\n * ```\n *\n * @param formId\n * @param submissionId\n * @param abortSignal\n * @returns\n */\nasync function getSubmissionData({\n formId,\n submissionId,\n abortSignal,\n}: {\n formId: number\n submissionId: string\n abortSignal?: AbortSignal\n}): Promise<{\n data: SubmissionTypes.S3SubmissionData\n versionId: string | undefined\n}> {\n return await downloadFormSubmission({\n formId,\n submissionId,\n abortSignal,\n })\n}\n\nexport {\n submit,\n executePostSubmissionAction,\n executeCancelAction,\n goBackOrCloseWindow,\n getPendingQueueSubmissions,\n deletePendingQueueSubmission,\n editPendingQueueSubmission,\n cancelEditingPendingQueueSubmission,\n registerPendingQueueListener,\n processPendingQueue,\n BaseFormSubmission,\n NewDraftSubmission,\n NewFormSubmission,\n DraftSubmissionInput,\n DraftSubmission,\n FormSubmission,\n FormSubmissionResult,\n PendingFormSubmission,\n SubmissionParams,\n registerPendingQueueAttachmentProgressListener,\n registerPendingQueueProgressListener,\n ProgressListener,\n ProgressListenerEvent,\n PendingQueueListener,\n PendingQueueAction,\n getSubmissionData,\n uploadFormSubmissionEdit,\n getPostSubmissionAttachments,\n}\n"]}
|
|
@@ -2,13 +2,12 @@ import * as React from 'react';
|
|
|
2
2
|
import { EnvironmentTypes } from '@oneblink/types';
|
|
3
3
|
type Props = {
|
|
4
4
|
value: unknown | undefined;
|
|
5
|
-
readOnly: boolean;
|
|
6
5
|
validationMessage: string | undefined;
|
|
7
6
|
hasMarginTop?: boolean;
|
|
8
7
|
isInputButton?: boolean;
|
|
9
8
|
lookupButtonConfig?: EnvironmentTypes.ButtonConfiguration;
|
|
10
9
|
overrideRequiredMessage: string | undefined;
|
|
11
10
|
};
|
|
12
|
-
declare function LookupButton({ value,
|
|
11
|
+
declare function LookupButton({ value, validationMessage, hasMarginTop, isInputButton, lookupButtonConfig, overrideRequiredMessage, }: Props): import("react/jsx-runtime").JSX.Element | null;
|
|
13
12
|
declare const _default: React.MemoExoticComponent<typeof LookupButton>;
|
|
14
13
|
export default _default;
|
|
@@ -4,9 +4,9 @@ import clsx from 'clsx';
|
|
|
4
4
|
import useLookupNotification from '../../hooks/useLookupNotification';
|
|
5
5
|
import { generateLookupValidationMessage } from '../../services/form-validation/validators';
|
|
6
6
|
import MaterialIcon from '../MaterialIcon';
|
|
7
|
-
function LookupButton({ value,
|
|
7
|
+
function LookupButton({ value, validationMessage, hasMarginTop, isInputButton, lookupButtonConfig, overrideRequiredMessage, }) {
|
|
8
8
|
var _a, _b;
|
|
9
|
-
const { isLookup, onLookup,
|
|
9
|
+
const { isLookup, onLookup, isLookupRequestInFlight, isLoading, allowLookupOnEmptyValue, areLookupsDisallowed, } = useLookupNotification(value);
|
|
10
10
|
if (!isLookup) {
|
|
11
11
|
return null;
|
|
12
12
|
}
|
|
@@ -17,10 +17,11 @@ function LookupButton({ value, readOnly, validationMessage, hasMarginTop, isInpu
|
|
|
17
17
|
'ob-button': !isInputButton,
|
|
18
18
|
'has-margin-top-8': hasMarginTop,
|
|
19
19
|
}), onClick: () => onLookup(), disabled:
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
// Deliberately not the element's own `readOnly` flag: a locked field
|
|
21
|
+
// populated by a previous lookup still needs its button to run the
|
|
22
|
+
// next lookup in the chain.
|
|
23
|
+
areLookupsDisallowed ||
|
|
24
|
+
isLookupRequestInFlight ||
|
|
24
25
|
isLoading ||
|
|
25
26
|
(isEmptyValue && !allowLookupOnEmptyValue) ||
|
|
26
27
|
(!isEmptyValue &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LookupButton.js","sourceRoot":"","sources":["../../../src/components/renderer/LookupButton.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,qBAAqB,MAAM,mCAAmC,CAAA;AACrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAA;AAE3F,OAAO,YAAY,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"LookupButton.js","sourceRoot":"","sources":["../../../src/components/renderer/LookupButton.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,qBAAqB,MAAM,mCAAmC,CAAA;AACrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAA;AAE3F,OAAO,YAAY,MAAM,iBAAiB,CAAA;AAW1C,SAAS,YAAY,CAAC,EACpB,KAAK,EACL,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,uBAAuB,GACjB;;IACN,MAAM,EACJ,QAAQ,EACR,QAAQ,EACR,uBAAuB,EACvB,SAAS,EACT,uBAAuB,EACvB,oBAAoB,GACrB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;IAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAA;IAE1D,MAAM,MAAM,GAAG,CACb,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CACb,2DAA2D,EAC3D;YACE,YAAY,EAAE,SAAS;YACvB,gBAAgB,EAAE,aAAa;YAC/B,WAAW,EAAE,CAAC,aAAa;YAC3B,kBAAkB,EAAE,YAAY;SACjC,CACF,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,EACzB,QAAQ;QACN,qEAAqE;QACrE,mEAAmE;QACnE,4BAA4B;QAC5B,oBAAoB;YACpB,uBAAuB;YACvB,SAAS;YACT,CAAC,YAAY,IAAI,CAAC,uBAAuB,CAAC;YAC1C,CAAC,CAAC,YAAY;gBACZ,CAAC,CAAC,iBAAiB;gBACnB,iBAAiB;oBACf,+BAA+B,CAC7B,kBAAkB,EAClB,uBAAuB,CACxB,CAAC,aAGP,aAAa,IAAI,gBAAa,EAC/B,eAAM,SAAS,EAAC,MAAM,YACpB,KAAC,YAAY,cAAE,MAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,IAAI,mCAAI,QAAQ,GAAgB,GAC9D,EACP,gBAAM,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,uBACtD,MAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,KAAK,mCAAI,QAAQ,IACvC,IACA,CACV,CAAA;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,cAAK,SAAS,EAAC,SAAS,YAAE,MAAM,GAAO,CAAA;IAChD,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\nimport useLookupNotification from '../../hooks/useLookupNotification'\nimport { generateLookupValidationMessage } from '../../services/form-validation/validators'\nimport { EnvironmentTypes } from '@oneblink/types'\nimport MaterialIcon from '../MaterialIcon'\n\ntype Props = {\n value: unknown | undefined\n validationMessage: string | undefined\n hasMarginTop?: boolean\n isInputButton?: boolean\n lookupButtonConfig?: EnvironmentTypes.ButtonConfiguration\n overrideRequiredMessage: string | undefined\n}\n\nfunction LookupButton({\n value,\n validationMessage,\n hasMarginTop,\n isInputButton,\n lookupButtonConfig,\n overrideRequiredMessage,\n}: Props) {\n const {\n isLookup,\n onLookup,\n isLookupRequestInFlight,\n isLoading,\n allowLookupOnEmptyValue,\n areLookupsDisallowed,\n } = useLookupNotification(value)\n if (!isLookup) {\n return null\n }\n\n const isEmptyValue = value === undefined || value === null\n\n const button = (\n <button\n type=\"button\"\n className={clsx(\n 'button is-primary ob-lookup__button cypress-lookup-button',\n {\n 'is-loading': isLoading,\n 'is-input-addon': isInputButton,\n 'ob-button': !isInputButton,\n 'has-margin-top-8': hasMarginTop,\n },\n )}\n onClick={() => onLookup()}\n disabled={\n // Deliberately not the element's own `readOnly` flag: a locked field\n // populated by a previous lookup still needs its button to run the\n // next lookup in the chain.\n areLookupsDisallowed ||\n isLookupRequestInFlight ||\n isLoading ||\n (isEmptyValue && !allowLookupOnEmptyValue) ||\n (!isEmptyValue &&\n !!validationMessage &&\n validationMessage !==\n generateLookupValidationMessage(\n lookupButtonConfig,\n overrideRequiredMessage,\n ))\n }\n >\n {isInputButton && <span></span>}\n <span className=\"icon\">\n <MaterialIcon>{lookupButtonConfig?.icon ?? 'search'}</MaterialIcon>\n </span>\n <span className={isInputButton ? 'is-hidden-mobile' : undefined}>\n {lookupButtonConfig?.label ?? 'Lookup'}\n </span>\n </button>\n )\n\n if (isInputButton) {\n return <div className=\"control\">{button}</div>\n }\n\n return button\n}\n\nexport default React.memo(LookupButton)\n"]}
|
|
@@ -29,7 +29,7 @@ function LookupNotificationComponent({ autoLookupValue, stringifyAutoLookupValue
|
|
|
29
29
|
const [hasLookupFailed, setHasLookupFailed] = React.useState(false);
|
|
30
30
|
const [hasLookupSucceeded, setHasLookupSucceeded] = React.useState(false);
|
|
31
31
|
const [isCancellable, setIsCancellable] = React.useState(false);
|
|
32
|
-
const [
|
|
32
|
+
const [isLookupRequestInFlight, setIsLookupRequestInFlight] = React.useState(false);
|
|
33
33
|
const [lookupErrorHTML, setLookupErrorHTML] = React.useState(null);
|
|
34
34
|
const { formSubmissionModel: model } = useFormSubmissionModel();
|
|
35
35
|
const formIsReadOnly = useFormIsReadOnly();
|
|
@@ -99,19 +99,20 @@ function LookupNotificationComponent({ autoLookupValue, stringifyAutoLookupValue
|
|
|
99
99
|
};
|
|
100
100
|
});
|
|
101
101
|
}, [element, injectPagesAfter, onLookup]);
|
|
102
|
+
// Definition-level `readOnly` must not suppress lookups for a submitter:
|
|
103
|
+
// prefills and defaults still need to populate related fields, and a locked
|
|
104
|
+
// field can still be the input to a chained lookup. Approver locks are
|
|
105
|
+
// different. Re-running a lookup from an existing submitted value could
|
|
106
|
+
// overwrite persisted answers merely by opening the review, so only approver
|
|
107
|
+
// editable elements may run one.
|
|
108
|
+
const areLookupsDisallowed = formIsReadOnly || isElementReadOnlyForAudience(element, audience);
|
|
102
109
|
const isNotStaticLookup = React.useMemo(() => {
|
|
103
110
|
return ((formElementDataLookup && formElementDataLookup.type !== 'STATIC_DATA') ||
|
|
104
111
|
(formElementElementLookup &&
|
|
105
112
|
formElementElementLookup.type !== 'STATIC_DATA'));
|
|
106
113
|
}, [formElementDataLookup, formElementElementLookup]);
|
|
107
114
|
const triggerLookup = React.useCallback(async ({ newValue, abortController, continueLookupOnAbort }) => {
|
|
108
|
-
|
|
109
|
-
// submitter: prefills and defaults still need to populate related
|
|
110
|
-
// fields. Approver locks are different. Re-running a lookup from an
|
|
111
|
-
// existing submitted value could overwrite persisted answers merely by
|
|
112
|
-
// opening the review, so only approver-editable elements may run one.
|
|
113
|
-
if (formIsReadOnly ||
|
|
114
|
-
isElementReadOnlyForAudience(element, audience)) {
|
|
115
|
+
if (areLookupsDisallowed) {
|
|
115
116
|
return;
|
|
116
117
|
}
|
|
117
118
|
setIsLookingUp(true);
|
|
@@ -119,7 +120,7 @@ function LookupNotificationComponent({ autoLookupValue, stringifyAutoLookupValue
|
|
|
119
120
|
setHasLookupFailed(true);
|
|
120
121
|
return;
|
|
121
122
|
}
|
|
122
|
-
|
|
123
|
+
setIsLookupRequestInFlight(true);
|
|
123
124
|
setIsCancellable(false);
|
|
124
125
|
setHasLookupFailed(false);
|
|
125
126
|
setHasLookupSucceeded(false);
|
|
@@ -188,18 +189,17 @@ function LookupNotificationComponent({ autoLookupValue, stringifyAutoLookupValue
|
|
|
188
189
|
finally {
|
|
189
190
|
clearTimeout(isCancellableTimeout);
|
|
190
191
|
if (isMounted.current) {
|
|
191
|
-
|
|
192
|
+
setIsLookupRequestInFlight(false);
|
|
192
193
|
setOnCancelLookup(undefined);
|
|
193
194
|
}
|
|
194
195
|
}
|
|
195
196
|
}, [
|
|
196
|
-
audience,
|
|
197
197
|
definition,
|
|
198
198
|
element,
|
|
199
199
|
excludeDefinition,
|
|
200
200
|
formElementDataLookup,
|
|
201
201
|
formElementElementLookup,
|
|
202
|
-
|
|
202
|
+
areLookupsDisallowed,
|
|
203
203
|
isMounted,
|
|
204
204
|
isNotStaticLookup,
|
|
205
205
|
isOffline,
|
|
@@ -257,12 +257,20 @@ function LookupNotificationComponent({ autoLookupValue, stringifyAutoLookupValue
|
|
|
257
257
|
}, [autoLookupValue, triggerLookup]);
|
|
258
258
|
const contextValue = React.useMemo(() => ({
|
|
259
259
|
isLookup: true,
|
|
260
|
-
|
|
260
|
+
isLookupRequestInFlight,
|
|
261
261
|
isLoading,
|
|
262
262
|
onLookup: triggerLookup,
|
|
263
263
|
allowLookupOnEmptyValue: runLookupOnClear,
|
|
264
264
|
isLookingUp,
|
|
265
|
-
|
|
265
|
+
areLookupsDisallowed,
|
|
266
|
+
}), [
|
|
267
|
+
isLookupRequestInFlight,
|
|
268
|
+
isLoading,
|
|
269
|
+
runLookupOnClear,
|
|
270
|
+
triggerLookup,
|
|
271
|
+
isLookingUp,
|
|
272
|
+
areLookupsDisallowed,
|
|
273
|
+
]);
|
|
266
274
|
return (_jsxs(LookupNotificationContext.Provider, { value: contextValue, children: [children, loadError && (_jsx(ErrorMessage, { title: "Error Loading Configuration", onTryAgain: onTryAgain, children: _jsx("span", { className: "cypress-lookup-notification-loading-error", children: loadError.message }) })), _jsx("div", { className: clsx('ob-lookup__notification', {
|
|
267
275
|
'is-looking-up': isLookingUp,
|
|
268
276
|
'is-extended': hasLookupFailed || (isCancellable && !hasLookupSucceeded),
|
|
@@ -274,7 +282,7 @@ function LookupNotificationComponent({ autoLookupValue, stringifyAutoLookupValue
|
|
|
274
282
|
dangerouslySetInnerHTML: {
|
|
275
283
|
__html: lookupErrorHTML || '',
|
|
276
284
|
} }), autoLookupValue !== undefined &&
|
|
277
|
-
autoLookupValue !== null && (_jsxs("button", { type: "button", className: clsx('fade-in button is-primary ob-lookup__retry-button cypress-retry-lookup-button has-margin-top-8'), onClick: () => retryLookup(), disabled:
|
|
285
|
+
autoLookupValue !== null && (_jsxs("button", { type: "button", className: clsx('fade-in button is-primary ob-lookup__retry-button cypress-retry-lookup-button has-margin-top-8'), onClick: () => retryLookup(), disabled: isLookupRequestInFlight || isLoading, "aria-label": "lookup-retry-button", children: [_jsx("span", {}), _jsx("span", { className: "icon", children: _jsx(MaterialIcon, { className: "refresh", children: "refresh" }) }), _jsx("span", { children: "\u00A0Retry Lookup" })] }))] })) })] })), hasLookupSucceeded && (_jsx(_Fragment, { children: _jsx(MaterialIcon, { className: "has-text-success fade-in", role: "status", "aria-label": "lookup successful", children: "check_circle_outline" }) })), !hasLookupSucceeded && !hasLookupFailed && _jsx(OnLoading, { small: true }), isCancellable && !hasLookupSucceeded && !hasLookupFailed && (_jsxs("div", { className: "has-margin-top-5 fade-in", role: "alert", children: [_jsx("p", { children: "Taking longer than expected?" }), _jsx("button", { type: "button", className: "button has-margin-top-8", onClick: onCancelLookup, children: "Cancel" })] }))] }) })] }));
|
|
278
286
|
}
|
|
279
287
|
export default function LookupNotification(props) {
|
|
280
288
|
if (props.element.isDataLookup || props.element.isElementLookup) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LookupNotification.js","sourceRoot":"","sources":["../../../src/components/renderer/LookupNotification.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAe,MAAM,YAAY,CAAA;AAGhD,OAAO,YAAY,MAAM,0BAA0B,CAAA;AACnD,OAAO,SAAS,MAAM,aAAa,CAAA;AACnC,OAAO,mBAAmB,MAAM,sCAAsC,CAAA;AACtE,OAAO,EACL,yBAAyB,GAE1B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,iBAAiB,MAAM,+BAA+B,CAAA;AAC7D,OAAO,cAAc,MAAM,4BAA4B,CAAA;AACvD,OAAO,sBAAsB,MAAM,2CAA2C,CAAA;AAC9E,OAAO,iBAAiB,MAAM,+BAA+B,CAAA;AAC7D,OAAO,YAAY,MAAM,0BAA0B,CAAA;AACnD,OAAO,qBAAqB,MAAM,mCAAmC,CAAA;AACrE,OAAO,oBAAoB,MAAM,oCAAoC,CAAA;AACrE,OAAO,eAAe,MAAM,6BAA6B,CAAA;AACzD,OAAO,4BAA4B,MAAM,6CAA6C,CAAA;AAGtF,OAAO,YAAY,MAAM,0BAA0B,CAAA;AACnD,OAAO,YAAY,MAAM,iBAAiB,CAAA;AAe1C,SAAS,2BAA2B,CAAC,EACnC,eAAe,EACf,wBAAwB,EACxB,OAAO,EACP,QAAQ,EACR,QAAQ,GACF;IACN,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAA;IACtC,MAAM,gBAAgB,GAAG,cAAc,EAAE,CAAA;IACzC,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,GAC5D,qBAAqB,EAAE,CAAA;IAEzB,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAExD,SAAS,CAAC,CAAA;IACZ,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAC1D,IAAI,CACL,CAAA;IACD,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,sBAAsB,EAAE,CAAA;IAC/D,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAA;IAC1C,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAA;IAElC,MAAM,wBAAwB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAClD,OAAO,kBAAkB,CAAC,IAAI,CAC5B,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,KAAK,OAAO,CAAC,eAAe,CACtE,CAAA;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAE1E,MAAM,qBAAqB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC/C,OAAO,kBAAkB,CAAC,IAAI,CAC5B,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,KAAK,OAAO,CAAC,YAAY,CAChE,CAAA;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAEpE,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAU,GAAG,EAAE;QACnD,OAAO,CAAC,CAAC,CACP,CAAA,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,gBAAgB;aACvC,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,gBAAgB,CAAA,CAC3C,CAAA;IACH,CAAC,EAAE;QACD,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,gBAAgB;QACvC,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,gBAAgB;KAC3C,CAAC,CAAA;IAEF,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC3C,OAAO,CAAC,CAAC,CACP,CAAC,CAAA,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,IAAI,MAAK,aAAa;aAC5C,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAE,iBAAiB,CAAA,CAAC;YAC3C,CAAC,CAAA,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,IAAI,MAAK,aAAa;iBAC/C,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,iBAAiB,CAAA,CAAC,CAC/C,CAAA;IACH,CAAC,EAAE,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC,CAAA;IAErD,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CACvC,CAAC,EACC,QAAQ,EACR,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GAQf,EAAE,EAAE;QACH,MAAM,oBAAoB,GAAG,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3D,IAAI,mBAAmB,IAAI,oBAAoB,KAAK,KAAK,EAAE,CAAC;YAC1D,IAAI,mBAAmB,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACrE,gBAAgB,CACd,OAAO,EACP,mBAA8C,EAC9C,gBAAgB,CACjB,CAAA;gBACD,OAAM;YACR,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE;YACrD,IAAI,WAAW,GAA4B,QAAQ,CAAA;YACnD,IACE,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC;gBAClC,oBAAoB,KAAK,KAAK,EAC9B,CAAC;gBACD,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CACvC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAC9B,CAAA;gBACD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAA;gBAChD,CAAC;qBAAM,CAAC;oBACN,gEAAgE;oBAChE,WAAW,GAAG,QAAQ,CAAC,MAAM;oBAC3B,yFAAyF;oBACzF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,KAAK,OAAO,CAAC,EAAE,CAC5C,CAAA;oBACD,WAAW,CAAC,MAAM,CAChB,cAAc,GAAG,CAAC,EAClB,CAAC,EACD,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBAC/B,yFAAyF;wBACzF,CAAC,CAAC,mBAAmB,GAAG,OAAO,CAAC,EAAE,CAAA;wBAClC,OAAO,CAAC,CAAA;oBACV,CAAC,CAAC,CACH,CAAA;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,QAAQ,EAAE,WAAW;gBACrB,UAAU,EAAE,mBAAmB,CAAC,WAAW,EAAE;oBAC3C,GAAG,UAAU;oBACb,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ;oBACxB,GAAG,gBAAgB;iBACpB,CAAC;gBACF,eAAe,EAAE,oBAAoB,CAAC;oBACpC,gBAAgB;oBAChB,iBAAiB,EAAE,UAAU;oBAC7B,eAAe,EAAE;wBACf,GAAG,eAAe;wBAClB,GAAG,cAAc;qBAClB;iBACF,CAAC;aACH,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EACD,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CACtC,CAAA;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC3C,OAAO,CACL,CAAC,qBAAqB,IAAI,qBAAqB,CAAC,IAAI,KAAK,aAAa,CAAC;YACvE,CAAC,wBAAwB;gBACvB,wBAAwB,CAAC,IAAI,KAAK,aAAa,CAAC,CACnD,CAAA;IACH,CAAC,EAAE,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC,CAAA;IAErD,MAAM,aAAa,GAAG,KAAK,CAAC,WAAW,CAGrC,KAAK,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,qBAAqB,EAAE,EAAE,EAAE;QAC7D,mEAAmE;QACnE,kEAAkE;QAClE,oEAAoE;QACpE,uEAAuE;QACvE,sEAAsE;QACtE,IACE,cAAc;YACd,4BAA4B,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC/C,CAAC;YACD,OAAM;QACR,CAAC;QAED,cAAc,CAAC,IAAI,CAAC,CAAA;QAEpB,IAAI,SAAS,IAAI,iBAAiB,EAAE,CAAC;YACnC,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACxB,OAAM;QACR,CAAC;QAED,aAAa,CAAC,IAAI,CAAC,CAAA;QACnB,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACvB,kBAAkB,CAAC,KAAK,CAAC,CAAA;QACzB,qBAAqB,CAAC,KAAK,CAAC,CAAA;QAC5B,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxB,iBAAiB,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;YAC3B,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,cAAc,CAAC,KAAK,CAAC,CAAA;YACvB,CAAC;YACD,eAAe,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC,CAAC,CAAA;QAEF,uDAAuD;QACvD,MAAM,oBAAoB,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3C,gBAAgB,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACnD,CAAC,EAAE,IAAI,CAAC,CAAA;QAER,MAAM,OAAO,GAAuB;YAClC,OAAO;YACP,UAAU,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACvD,UAAU,EAAE;gBACV,GAAG,KAAK;gBACR,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ;aACzB;SACF,CAAA;QAED,IAAI,CAAC;YACH,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChE,WAAW,CAAC,qBAAqB,EAAE,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC;gBACnE,WAAW,CACT,wBAAwB,EACxB,OAAO,EACP,eAAe,CAAC,MAAM,CACvB;aACF,CAAC,CAAA;YAEF,eAAe,CAAC;gBACd,QAAQ;gBACR,gBAAgB,EAAE,gBAEL;gBACb,mBAAmB,EAAE,mBAER;gBACb,cAAc,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE;aACzC,CAAC,CAAA;YAEF,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,qBAAqB,CAAC,IAAI,CAAC,CAAA;YAC7B,CAAC;YAED,kEAAkE;YAClE,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;oBACtB,cAAc,CAAC,KAAK,CAAC,CAAA;gBACvB,CAAC;YACH,CAAC,EAAE,GAAG,CAAC,CAAA;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACvB,OAAM;YACR,CAAC;YAED,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;gBAC5B,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,cAAc,CAAC,KAAK,CAAC,CAAA;gBACvB,CAAC;gBACD,OAAM;YACR,CAAC;YAED,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACxB,eAAe,CAAC;gBACd,QAAQ,EAAE,QAAQ;gBAClB,gBAAgB,EAAE,EAAE;gBACpB,mBAAmB,EAAE,EAAE;gBACvB,cAAc,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE;aAC1C,CAAC,CAAA;YACF,kBAAkB,CAChB,OAAO,KAAK,KAAK,QAAQ;gBACvB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,gHAAgH,CACrH,CAAA;QACH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,oBAAoB,CAAC,CAAA;YAClC,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,aAAa,CAAC,KAAK,CAAC,CAAA;gBACpB,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC;IACH,CAAC,EACD;QACE,QAAQ;QACR,UAAU;QACV,OAAO;QACP,iBAAiB;QACjB,qBAAqB;QACrB,wBAAwB;QACxB,cAAc;QACd,SAAS;QACT,iBAAiB;QACjB,SAAS;QACT,eAAe;QACf,KAAK;KACN,CACF,CAAA;IAED,+CAA+C;IAC/C,gEAAgE;IAChE,+DAA+D;IAC/D,8DAA8D;IAC9D,wDAAwD;IACxD,MAAM,qBAAqB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC/C,IAAI,wBAAwB,EAAE,CAAC;YAC7B,OAAO,wBAAwB,CAAC,eAAe,CAAC,CAAA;QAClD,CAAC;aAAM,CAAC;YACN,OAAO,eAAe,CAAA;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC,CAAA;IAC/C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAM;QACR,CAAC;QACD,MAAM,YAAY,GAAG,eAAe,IAAI,kBAAkB,CAAA;QAE1D,yEAAyE;QACzE,uEAAuE;QACvE,qFAAqF;QACrF,IACE,CAAC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI,CAAC;YAC3D,CAAC,CAAC,gBAAgB,IAAI,CAAC,YAAY,CAAC,EACpC,CAAC;YACD,cAAc,CAAC,KAAK,CAAC,CAAA;YACrB,OAAM;QACR,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAC7C,aAAa,CAAC;YACZ,QAAQ,EAAE,eAAe;YACzB,eAAe;YACf,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAA;QACF,OAAO,GAAG,EAAE;YACV,eAAe,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC,CAAA;QACD,gDAAgD;QAChD,sDAAsD;QACtD,qDAAqD;QACrD,2DAA2D;QAC3D,uDAAuD;IACzD,CAAC,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,CAAA;IAEtC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACzC,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;QAC7C,aAAa,CAAC;YACZ,QAAQ,EAAE,eAAe;YACzB,eAAe;YACf,qBAAqB,EAAE,IAAI;SAC5B,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC,CAAA;IAEpC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAChC,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE,IAAI;QACd,UAAU;QACV,SAAS;QACT,QAAQ,EAAE,aAAa;QACvB,uBAAuB,EAAE,gBAAgB;QACzC,WAAW;KACZ,CAAC,EACF,CAAC,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,CAAC,CACtE,CAAA;IAED,OAAO,CACL,MAAC,yBAAyB,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,aACpD,QAAQ,EAER,SAAS,IAAI,CACZ,KAAC,YAAY,IACX,KAAK,EAAC,6BAA6B,EACnC,UAAU,EAAE,UAAU,YAEtB,eAAM,SAAS,EAAC,2CAA2C,YACxD,SAAS,CAAC,OAAO,GACb,GACM,CAChB,EAED,cACE,SAAS,EAAE,IAAI,CAAC,yBAAyB,EAAE;oBACzC,eAAe,EAAE,WAAW;oBAC5B,aAAa,EACX,eAAe,IAAI,CAAC,aAAa,IAAI,CAAC,kBAAkB,CAAC;oBAC3D,cAAc,EACZ,eAAe;wBACf,eAAe,KAAK,SAAS;wBAC7B,eAAe,KAAK,IAAI;iBAC3B,CAAC,YAEF,eAAK,SAAS,EAAC,iDAAiD,aAC7D,eAAe,IAAI,CAClB,8BACE,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,gBAAgB,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,gBACzB,6BAA6B,GACxC,EAEF,wBACG,SAAS,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAChC,0BACE,KAAC,YAAY,IAAC,SAAS,EAAC,0BAA0B,yBAEnC,EACf,YAAG,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,OAAO,8FAG/B,IACA,CACP,CAAC,CAAC,CAAC,CACF,0BACE,KAAC,YAAY,IAAC,SAAS,EAAC,yBAAyB,8BAElC,EACf,YACE,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,SAAS;gDACnB,2CAA2C;gDAC3C,uBAAuB,EAAE;oDACvB,MAAM,EAAE,eAAe,IAAI,EAAE;iDAC9B,GACD,EACD,eAAe,KAAK,SAAS;gDAC5B,eAAe,KAAK,IAAI,IAAI,CAC1B,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CACb,gGAAgG,CACjG,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,EAC5B,QAAQ,EAAE,UAAU,IAAI,SAAS,gBACtB,qBAAqB,aAEhC,gBAAa,EACb,eAAM,SAAS,EAAC,MAAM,YACpB,KAAC,YAAY,IAAC,SAAS,EAAC,SAAS,wBAElB,GACV,EACP,gDAA+B,IACxB,CACV,IACC,CACP,GACG,IACL,CACJ,EAEA,kBAAkB,IAAI,CACrB,4BACE,KAAC,YAAY,IACX,SAAS,EAAC,0BAA0B,EACpC,IAAI,EAAC,QAAQ,gBACF,mBAAmB,qCAGjB,GACd,CACJ,EAEA,CAAC,kBAAkB,IAAI,CAAC,eAAe,IAAI,KAAC,SAAS,IAAC,KAAK,SAAG,EAE9D,aAAa,IAAI,CAAC,kBAAkB,IAAI,CAAC,eAAe,IAAI,CAC3D,eAAK,SAAS,EAAC,0BAA0B,EAAC,IAAI,EAAC,OAAO,aACpD,uDAAmC,EACnC,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,cAAc,uBAGhB,IACL,CACP,IACG,GACF,IAC6B,CACtC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,KAAY;IACrD,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAChE,OAAO,KAAC,2BAA2B,OAAK,KAAK,GAAI,CAAA;IACnD,CAAC;IAED,OAAO,4BAAG,KAAK,CAAC,QAAQ,GAAI,CAAA;AAC9B,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,iBAAkE,EAClE,OAA2B,EAC3B,WAAwB;IAMxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAM;IACR,CAAC;IAED,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAA;QACxC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;QAElD,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CACnD,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,UAAU,CAAC;YAC5C,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAC/D,CAAA;QAED,wBAAwB;QACxB,OAAO,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,QAAQ,CAAC,MAAM,CAEpC,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE;YAC1B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,MAAM;oBACT,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAA;oBACpD,MAAK;gBACP,KAAK,QAAQ;oBACX,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;oBACtD,MAAK;gBACP,KAAK,OAAO;oBACV,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAAA;oBACjD,MAAK;YACT,CAAC;YACD,OAAO,YAAY,CAAA;QACrB,CAAC,EAAE,EAAE,CAAC,CAAA;IACR,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CACT,uEAAuE,EACvE,iBAAiB,CAClB,CAAA;QACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAA;IACvC,OAAO,CAAC,GAAG,CACT,gBAAgB,iBAAiB,CAAC,IAAI,qBAAqB,EAC3D,iBAAiB,CAAC,GAAG,CACtB,CAAA;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,GAAG,EAAE;QAClD,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,WAAW;KACpB,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,OAAO,CAAC,GAAG,CACT,+BAA+B,EAC/B,iBAAiB,CAAC,GAAG,EACrB,QAAQ,CAAC,MAAM,EACf,IAAI,CACL,CAAA;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,CAAC,gBAAgB,CACrB,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC,MAAM,0BAA0B,CAAC,CACjE,CAAA;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpD,MAAM,IAAI,CAAC,OAAO,CAAA;QACpB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,OAAO,IAA+B,CAAA;AACxC,CAAC","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\nimport { generateHeaders } from '../../apps/services/fetch'\nimport { Sentry, formService } from '../../apps'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\n\nimport useIsOffline from '../../hooks/useIsOffline'\nimport OnLoading from './OnLoading'\nimport generateDefaultData from '../../services/generate-default-data'\nimport {\n LookupNotificationContext,\n LookupNotificationContextValue,\n} from '../../hooks/useLookupNotification'\nimport useFormDefinition from '../../hooks/useFormDefinition'\nimport useInjectPages from '../../hooks/useInjectPages'\nimport useFormSubmissionModel from '../../hooks/useFormSubmissionModelContext'\nimport useFormIsReadOnly from '../../hooks/useFormIsReadOnly'\nimport useIsMounted from '../../hooks/useIsMounted'\nimport useFormElementLookups from '../../hooks/useFormElementLookups'\nimport mergeExecutedLookups from '../../utils/merge-executed-lookups'\nimport useFormAudience from '../../hooks/useFormAudience'\nimport isElementReadOnlyForAudience from '../../services/isElementReadOnlyForAudience'\n\nimport { FormElementLookupHandler, ExecutedLookups } from '../../types/form'\nimport ErrorMessage from '../messages/ErrorMessage'\nimport MaterialIcon from '../MaterialIcon'\n\ntype FetchLookupPayload = {\n element: FormTypes.LookupFormElement\n definition?: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n}\ntype Props = {\n autoLookupValue?: unknown\n stringifyAutoLookupValue?: (autoLookupValue: unknown) => string\n element: FormTypes.LookupFormElement\n onLookup: FormElementLookupHandler\n children: React.ReactNode\n}\n\nfunction LookupNotificationComponent({\n autoLookupValue,\n stringifyAutoLookupValue,\n element,\n onLookup,\n children,\n}: Props) {\n const isMounted = useIsMounted()\n const isOffline = useIsOffline()\n const definition = useFormDefinition()\n const injectPagesAfter = useInjectPages()\n const { isLoading, formElementLookups, loadError, onTryAgain } =\n useFormElementLookups()\n\n const [onCancelLookup, setOnCancelLookup] = React.useState<\n (() => void) | undefined\n >(undefined)\n const [isLookingUp, setIsLookingUp] = React.useState(false)\n const [hasLookupFailed, setHasLookupFailed] = React.useState(false)\n const [hasLookupSucceeded, setHasLookupSucceeded] = React.useState(false)\n const [isCancellable, setIsCancellable] = React.useState(false)\n const [isDisabled, setIsDisabled] = React.useState(false)\n const [lookupErrorHTML, setLookupErrorHTML] = React.useState<string | null>(\n null,\n )\n const { formSubmissionModel: model } = useFormSubmissionModel()\n const formIsReadOnly = useFormIsReadOnly()\n const audience = useFormAudience()\n\n const formElementElementLookup = React.useMemo(() => {\n return formElementLookups.find(\n ({ id }) => element.isElementLookup && id === element.elementLookupId,\n )\n }, [element.elementLookupId, element.isElementLookup, formElementLookups])\n\n const formElementDataLookup = React.useMemo(() => {\n return formElementLookups.find(\n ({ id }) => element.isDataLookup && id === element.dataLookupId,\n )\n }, [element.dataLookupId, element.isDataLookup, formElementLookups])\n\n const runLookupOnClear = React.useMemo<boolean>(() => {\n return !!(\n formElementDataLookup?.runLookupOnClear ||\n formElementElementLookup?.runLookupOnClear\n )\n }, [\n formElementDataLookup?.runLookupOnClear,\n formElementElementLookup?.runLookupOnClear,\n ])\n\n const excludeDefinition = React.useMemo(() => {\n return !!(\n (formElementDataLookup?.type !== 'STATIC_DATA' &&\n formElementDataLookup?.excludeDefinition) ||\n (formElementElementLookup?.type !== 'STATIC_DATA' &&\n formElementElementLookup?.excludeDefinition)\n )\n }, [formElementDataLookup, formElementElementLookup])\n\n const mergeLookupData = React.useCallback(\n ({\n newValue,\n dataLookupResult,\n elementLookupResult,\n executedLookup,\n }: {\n newValue: unknown\n dataLookupResult:\n | SubmissionTypes.S3SubmissionData['submission']\n | undefined\n elementLookupResult: FormTypes.FormElement[] | undefined\n executedLookup: ExecutedLookups\n }) => {\n const executedLookupResult = executedLookup?.[element.name]\n if (elementLookupResult && executedLookupResult !== false) {\n if (elementLookupResult[0] && elementLookupResult[0].type === 'page') {\n injectPagesAfter(\n element,\n elementLookupResult as FormTypes.PageElement[],\n dataLookupResult,\n )\n return\n }\n }\n\n onLookup(({ submission, elements, executedLookups }) => {\n let allElements: FormTypes.FormElement[] = elements\n if (\n Array.isArray(elementLookupResult) &&\n executedLookupResult !== false\n ) {\n const indexOfElement = elements.findIndex(\n ({ id }) => id === element.id,\n )\n if (indexOfElement === -1) {\n console.log('Could not find element', element)\n } else {\n // Filter out already injected elements if lookup was successful\n allElements = elements.filter(\n // @ts-expect-error Sorry typescript, we need to check a property you don't approve of :(\n (e) => e.injectedByElementId !== element.id,\n )\n allElements.splice(\n indexOfElement + 1,\n 0,\n ...elementLookupResult.map((e) => {\n // @ts-expect-error Sorry typescript, we need to check a property you don't approve of :(\n e.injectedByElementId = element.id\n return e\n }),\n )\n }\n }\n\n return {\n elements: allElements,\n submission: generateDefaultData(allElements, {\n ...submission,\n [element.name]: newValue,\n ...dataLookupResult,\n }),\n executedLookups: mergeExecutedLookups({\n dataLookupResult,\n currentSubmission: submission,\n executedLookups: {\n ...executedLookups,\n ...executedLookup,\n },\n }),\n }\n })\n },\n [element, injectPagesAfter, onLookup],\n )\n\n const isNotStaticLookup = React.useMemo(() => {\n return (\n (formElementDataLookup && formElementDataLookup.type !== 'STATIC_DATA') ||\n (formElementElementLookup &&\n formElementElementLookup.type !== 'STATIC_DATA')\n )\n }, [formElementDataLookup, formElementElementLookup])\n\n const triggerLookup = React.useCallback<\n LookupNotificationContextValue['onLookup']\n >(\n async ({ newValue, abortController, continueLookupOnAbort }) => {\n // Definition-level `readOnly` must not suppress auto-lookups for a\n // submitter: prefills and defaults still need to populate related\n // fields. Approver locks are different. Re-running a lookup from an\n // existing submitted value could overwrite persisted answers merely by\n // opening the review, so only approver-editable elements may run one.\n if (\n formIsReadOnly ||\n isElementReadOnlyForAudience(element, audience)\n ) {\n return\n }\n\n setIsLookingUp(true)\n\n if (isOffline && isNotStaticLookup) {\n setHasLookupFailed(true)\n return\n }\n\n setIsDisabled(true)\n setIsCancellable(false)\n setHasLookupFailed(false)\n setHasLookupSucceeded(false)\n setLookupErrorHTML(null)\n setOnCancelLookup(() => () => {\n if (isMounted.current) {\n setIsLookingUp(false)\n }\n abortController.abort()\n })\n\n // After certain amount of time, show the cancel button\n const isCancellableTimeout = setTimeout(() => {\n setIsCancellable(!abortController.signal.aborted)\n }, 5000)\n\n const payload: FetchLookupPayload = {\n element,\n definition: !excludeDefinition ? definition : undefined,\n submission: {\n ...model,\n [element.name]: newValue,\n },\n }\n\n try {\n const [dataLookupResult, elementLookupResult] = await Promise.all([\n fetchLookup(formElementDataLookup, payload, abortController.signal),\n fetchLookup(\n formElementElementLookup,\n payload,\n abortController.signal,\n ),\n ])\n\n mergeLookupData({\n newValue,\n dataLookupResult: dataLookupResult as\n | SubmissionTypes.S3SubmissionData['submission']\n | undefined,\n elementLookupResult: elementLookupResult as\n | FormTypes.FormElement[]\n | undefined,\n executedLookup: { [element.name]: true },\n })\n\n if (isMounted.current) {\n setHasLookupSucceeded(true)\n }\n\n // After certain amount of time, hide the lookup succeeded message\n setTimeout(() => {\n if (isMounted.current) {\n setIsLookingUp(false)\n }\n }, 750)\n } catch (error) {\n if (!isMounted.current) {\n return\n }\n\n if (abortController.signal.aborted) {\n console.log('Fetch aborted')\n if (!continueLookupOnAbort) {\n setIsLookingUp(false)\n }\n return\n }\n\n setHasLookupFailed(true)\n mergeLookupData({\n newValue: newValue,\n dataLookupResult: {},\n elementLookupResult: [],\n executedLookup: { [element.name]: false },\n })\n setLookupErrorHTML(\n typeof error === 'string'\n ? error\n : 'It looks like something went wrong.<br/>Please try again.<br />If the issue continues, please contact support.',\n )\n } finally {\n clearTimeout(isCancellableTimeout)\n if (isMounted.current) {\n setIsDisabled(false)\n setOnCancelLookup(undefined)\n }\n }\n },\n [\n audience,\n definition,\n element,\n excludeDefinition,\n formElementDataLookup,\n formElementElementLookup,\n formIsReadOnly,\n isMounted,\n isNotStaticLookup,\n isOffline,\n mergeLookupData,\n model,\n ],\n )\n\n // For certain elements, do not add click event\n // instead, watch model for changes and trigger lookup function.\n // We add this stringify function here to allow the value to be\n // an object which may have a reference change, but the values\n // have not changed. e.g. the 'location' element's value\n const autoLookupValueString = React.useMemo(() => {\n if (stringifyAutoLookupValue) {\n return stringifyAutoLookupValue(autoLookupValue)\n } else {\n return autoLookupValue\n }\n }, [autoLookupValue, stringifyAutoLookupValue])\n React.useEffect(() => {\n if (isLoading || loadError) {\n return\n }\n const hasLookupRan = hasLookupFailed || hasLookupSucceeded\n\n // For lookups configured with `runLookupOnClear` set to true, we want to\n // allow empty values for `autoLookupValue`, but only if the lookup has\n // been ran previously. This prevents the lookup running on load with an empty value.\n if (\n (autoLookupValue === undefined || autoLookupValue === null) &&\n (!runLookupOnClear || !hasLookupRan)\n ) {\n setIsLookingUp(false)\n return\n }\n const abortController = new AbortController()\n triggerLookup({\n newValue: autoLookupValue,\n abortController,\n continueLookupOnAbort: true,\n })\n return () => {\n abortController.abort()\n }\n // Wants to use \"triggerLookup\" as a dependency,\n // however, this will change on any change made on any\n // element. Checking if \"value\" has changed is enough\n // to trigger a lookup when the correct dependencies change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoLookupValueString, isLoading])\n\n const retryLookup = React.useCallback(() => {\n const abortController = new AbortController()\n triggerLookup({\n newValue: autoLookupValue,\n abortController,\n continueLookupOnAbort: true,\n })\n }, [autoLookupValue, triggerLookup])\n\n const contextValue = React.useMemo(\n () => ({\n isLookup: true,\n isDisabled,\n isLoading,\n onLookup: triggerLookup,\n allowLookupOnEmptyValue: runLookupOnClear,\n isLookingUp,\n }),\n [isDisabled, isLoading, runLookupOnClear, triggerLookup, isLookingUp],\n )\n\n return (\n <LookupNotificationContext.Provider value={contextValue}>\n {children}\n\n {loadError && (\n <ErrorMessage\n title=\"Error Loading Configuration\"\n onTryAgain={onTryAgain}\n >\n <span className=\"cypress-lookup-notification-loading-error\">\n {loadError.message}\n </span>\n </ErrorMessage>\n )}\n\n <div\n className={clsx('ob-lookup__notification', {\n 'is-looking-up': isLookingUp,\n 'is-extended':\n hasLookupFailed || (isCancellable && !hasLookupSucceeded),\n 'is-retryable':\n hasLookupFailed &&\n autoLookupValue !== undefined &&\n autoLookupValue !== null,\n })}\n >\n <div className=\"notification has-margin-top-7 has-text-centered\">\n {hasLookupFailed && (\n <>\n <button\n type=\"button\"\n className=\"delete fade-in\"\n onClick={() => setIsLookingUp(false)}\n aria-label=\"lookup-failure-close-button\"\n />\n\n <div>\n {isOffline && isNotStaticLookup ? (\n <div>\n <MaterialIcon className=\"fade-in has-text-warning\">\n wifi_off\n </MaterialIcon>\n <p className=\"fade-in\" role=\"alert\">\n It looks like you're offline. Please try again when\n connectivity is restored.\n </p>\n </div>\n ) : (\n <div>\n <MaterialIcon className=\"fade-in has-text-danger\">\n error_outline\n </MaterialIcon>\n <p\n role=\"alert\"\n className=\"fade-in\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: lookupErrorHTML || '',\n }}\n />\n {autoLookupValue !== undefined &&\n autoLookupValue !== null && (\n <button\n type=\"button\"\n className={clsx(\n 'fade-in button is-primary ob-lookup__retry-button cypress-retry-lookup-button has-margin-top-8',\n )}\n onClick={() => retryLookup()}\n disabled={isDisabled || isLoading}\n aria-label=\"lookup-retry-button\"\n >\n <span></span>\n <span className=\"icon\">\n <MaterialIcon className=\"refresh\">\n refresh\n </MaterialIcon>\n </span>\n <span> Retry Lookup</span>\n </button>\n )}\n </div>\n )}\n </div>\n </>\n )}\n\n {hasLookupSucceeded && (\n <>\n <MaterialIcon\n className=\"has-text-success fade-in\"\n role=\"status\"\n aria-label=\"lookup successful\"\n >\n check_circle_outline\n </MaterialIcon>\n </>\n )}\n\n {!hasLookupSucceeded && !hasLookupFailed && <OnLoading small />}\n\n {isCancellable && !hasLookupSucceeded && !hasLookupFailed && (\n <div className=\"has-margin-top-5 fade-in\" role=\"alert\">\n <p>Taking longer than expected?</p>\n <button\n type=\"button\"\n className=\"button has-margin-top-8\"\n onClick={onCancelLookup}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n </div>\n </LookupNotificationContext.Provider>\n )\n}\n\nexport default function LookupNotification(props: Props) {\n if (props.element.isDataLookup || props.element.isElementLookup) {\n return <LookupNotificationComponent {...props} />\n }\n\n return <>{props.children}</>\n}\n\nasync function fetchLookup(\n formElementLookup: formService.FormElementLookupResult | undefined,\n payload: FetchLookupPayload,\n abortSignal: AbortSignal,\n): Promise<\n | SubmissionTypes.S3SubmissionData['submission']\n | FormTypes.FormElement[]\n | undefined\n> {\n if (!formElementLookup) {\n return\n }\n\n if (formElementLookup.records) {\n const elementName = payload.element.name\n const inputValue = payload.submission[elementName]\n\n const matchingRecord = formElementLookup.records.find(\n (r) =>\n (r.inputType === 'UNDEFINED' && !inputValue) ||\n (r.inputType !== 'UNDEFINED' && r.inputValue === inputValue),\n )\n\n // insert prefill values\n return matchingRecord?.preFills.reduce<\n SubmissionTypes.S3SubmissionData['submission']\n >((lookupResult, prefill) => {\n switch (prefill.type) {\n case 'TEXT':\n lookupResult[prefill.formElementName] = prefill.text\n break\n case 'NUMBER':\n lookupResult[prefill.formElementName] = prefill.number\n break\n case 'CLEAR':\n lookupResult[prefill.formElementName] = undefined\n break\n }\n return lookupResult\n }, {})\n }\n\n if (!formElementLookup.url) {\n console.log(\n 'Could not find dynamic URL or static records for form element lookup:',\n formElementLookup,\n )\n throw new Error('Could not find element lookup configuration')\n }\n\n const headers = await generateHeaders()\n console.log(\n `Attempting a ${formElementLookup.type} lookup request to:`,\n formElementLookup.url,\n )\n const response = await fetch(formElementLookup.url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: abortSignal,\n })\n\n const data = await response.json()\n console.log(\n 'Response from lookup to: POST',\n formElementLookup.url,\n response.status,\n data,\n )\n\n if (!response.ok) {\n Sentry.captureException(\n new Error(`Received ${response.status} status code from lookup`),\n )\n if (response.status === 400 && data && data.message) {\n throw data.message\n }\n throw new Error('Invalid response from lookup')\n }\n\n return data as FormTypes.FormElement[]\n}\n"]}
|
|
1
|
+
{"version":3,"file":"LookupNotification.js","sourceRoot":"","sources":["../../../src/components/renderer/LookupNotification.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\nimport { generateHeaders } from '../../apps/services/fetch'\nimport { Sentry, formService } from '../../apps'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\n\nimport useIsOffline from '../../hooks/useIsOffline'\nimport OnLoading from './OnLoading'\nimport generateDefaultData from '../../services/generate-default-data'\nimport {\n LookupNotificationContext,\n LookupNotificationContextValue,\n} from '../../hooks/useLookupNotification'\nimport useFormDefinition from '../../hooks/useFormDefinition'\nimport useInjectPages from '../../hooks/useInjectPages'\nimport useFormSubmissionModel from '../../hooks/useFormSubmissionModelContext'\nimport useFormIsReadOnly from '../../hooks/useFormIsReadOnly'\nimport useIsMounted from '../../hooks/useIsMounted'\nimport useFormElementLookups from '../../hooks/useFormElementLookups'\nimport mergeExecutedLookups from '../../utils/merge-executed-lookups'\nimport useFormAudience from '../../hooks/useFormAudience'\nimport isElementReadOnlyForAudience from '../../services/isElementReadOnlyForAudience'\n\nimport { FormElementLookupHandler, ExecutedLookups } from '../../types/form'\nimport ErrorMessage from '../messages/ErrorMessage'\nimport MaterialIcon from '../MaterialIcon'\n\ntype FetchLookupPayload = {\n element: FormTypes.LookupFormElement\n definition?: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n}\ntype Props = {\n autoLookupValue?: unknown\n stringifyAutoLookupValue?: (autoLookupValue: unknown) => string\n element: FormTypes.LookupFormElement\n onLookup: FormElementLookupHandler\n children: React.ReactNode\n}\n\nfunction LookupNotificationComponent({\n autoLookupValue,\n stringifyAutoLookupValue,\n element,\n onLookup,\n children,\n}: Props) {\n const isMounted = useIsMounted()\n const isOffline = useIsOffline()\n const definition = useFormDefinition()\n const injectPagesAfter = useInjectPages()\n const { isLoading, formElementLookups, loadError, onTryAgain } =\n useFormElementLookups()\n\n const [onCancelLookup, setOnCancelLookup] = React.useState<\n (() => void) | undefined\n >(undefined)\n const [isLookingUp, setIsLookingUp] = React.useState(false)\n const [hasLookupFailed, setHasLookupFailed] = React.useState(false)\n const [hasLookupSucceeded, setHasLookupSucceeded] = React.useState(false)\n const [isCancellable, setIsCancellable] = React.useState(false)\n const [isLookupRequestInFlight, setIsLookupRequestInFlight] =\n React.useState(false)\n const [lookupErrorHTML, setLookupErrorHTML] = React.useState<string | null>(\n null,\n )\n const { formSubmissionModel: model } = useFormSubmissionModel()\n const formIsReadOnly = useFormIsReadOnly()\n const audience = useFormAudience()\n\n const formElementElementLookup = React.useMemo(() => {\n return formElementLookups.find(\n ({ id }) => element.isElementLookup && id === element.elementLookupId,\n )\n }, [element.elementLookupId, element.isElementLookup, formElementLookups])\n\n const formElementDataLookup = React.useMemo(() => {\n return formElementLookups.find(\n ({ id }) => element.isDataLookup && id === element.dataLookupId,\n )\n }, [element.dataLookupId, element.isDataLookup, formElementLookups])\n\n const runLookupOnClear = React.useMemo<boolean>(() => {\n return !!(\n formElementDataLookup?.runLookupOnClear ||\n formElementElementLookup?.runLookupOnClear\n )\n }, [\n formElementDataLookup?.runLookupOnClear,\n formElementElementLookup?.runLookupOnClear,\n ])\n\n const excludeDefinition = React.useMemo(() => {\n return !!(\n (formElementDataLookup?.type !== 'STATIC_DATA' &&\n formElementDataLookup?.excludeDefinition) ||\n (formElementElementLookup?.type !== 'STATIC_DATA' &&\n formElementElementLookup?.excludeDefinition)\n )\n }, [formElementDataLookup, formElementElementLookup])\n\n const mergeLookupData = React.useCallback(\n ({\n newValue,\n dataLookupResult,\n elementLookupResult,\n executedLookup,\n }: {\n newValue: unknown\n dataLookupResult:\n | SubmissionTypes.S3SubmissionData['submission']\n | undefined\n elementLookupResult: FormTypes.FormElement[] | undefined\n executedLookup: ExecutedLookups\n }) => {\n const executedLookupResult = executedLookup?.[element.name]\n if (elementLookupResult && executedLookupResult !== false) {\n if (elementLookupResult[0] && elementLookupResult[0].type === 'page') {\n injectPagesAfter(\n element,\n elementLookupResult as FormTypes.PageElement[],\n dataLookupResult,\n )\n return\n }\n }\n\n onLookup(({ submission, elements, executedLookups }) => {\n let allElements: FormTypes.FormElement[] = elements\n if (\n Array.isArray(elementLookupResult) &&\n executedLookupResult !== false\n ) {\n const indexOfElement = elements.findIndex(\n ({ id }) => id === element.id,\n )\n if (indexOfElement === -1) {\n console.log('Could not find element', element)\n } else {\n // Filter out already injected elements if lookup was successful\n allElements = elements.filter(\n // @ts-expect-error Sorry typescript, we need to check a property you don't approve of :(\n (e) => e.injectedByElementId !== element.id,\n )\n allElements.splice(\n indexOfElement + 1,\n 0,\n ...elementLookupResult.map((e) => {\n // @ts-expect-error Sorry typescript, we need to check a property you don't approve of :(\n e.injectedByElementId = element.id\n return e\n }),\n )\n }\n }\n\n return {\n elements: allElements,\n submission: generateDefaultData(allElements, {\n ...submission,\n [element.name]: newValue,\n ...dataLookupResult,\n }),\n executedLookups: mergeExecutedLookups({\n dataLookupResult,\n currentSubmission: submission,\n executedLookups: {\n ...executedLookups,\n ...executedLookup,\n },\n }),\n }\n })\n },\n [element, injectPagesAfter, onLookup],\n )\n\n // Definition-level `readOnly` must not suppress lookups for a submitter:\n // prefills and defaults still need to populate related fields, and a locked\n // field can still be the input to a chained lookup. Approver locks are\n // different. Re-running a lookup from an existing submitted value could\n // overwrite persisted answers merely by opening the review, so only approver\n // editable elements may run one.\n const areLookupsDisallowed =\n formIsReadOnly || isElementReadOnlyForAudience(element, audience)\n\n const isNotStaticLookup = React.useMemo(() => {\n return (\n (formElementDataLookup && formElementDataLookup.type !== 'STATIC_DATA') ||\n (formElementElementLookup &&\n formElementElementLookup.type !== 'STATIC_DATA')\n )\n }, [formElementDataLookup, formElementElementLookup])\n\n const triggerLookup = React.useCallback<\n LookupNotificationContextValue['onLookup']\n >(\n async ({ newValue, abortController, continueLookupOnAbort }) => {\n if (areLookupsDisallowed) {\n return\n }\n\n setIsLookingUp(true)\n\n if (isOffline && isNotStaticLookup) {\n setHasLookupFailed(true)\n return\n }\n\n setIsLookupRequestInFlight(true)\n setIsCancellable(false)\n setHasLookupFailed(false)\n setHasLookupSucceeded(false)\n setLookupErrorHTML(null)\n setOnCancelLookup(() => () => {\n if (isMounted.current) {\n setIsLookingUp(false)\n }\n abortController.abort()\n })\n\n // After certain amount of time, show the cancel button\n const isCancellableTimeout = setTimeout(() => {\n setIsCancellable(!abortController.signal.aborted)\n }, 5000)\n\n const payload: FetchLookupPayload = {\n element,\n definition: !excludeDefinition ? definition : undefined,\n submission: {\n ...model,\n [element.name]: newValue,\n },\n }\n\n try {\n const [dataLookupResult, elementLookupResult] = await Promise.all([\n fetchLookup(formElementDataLookup, payload, abortController.signal),\n fetchLookup(\n formElementElementLookup,\n payload,\n abortController.signal,\n ),\n ])\n\n mergeLookupData({\n newValue,\n dataLookupResult: dataLookupResult as\n | SubmissionTypes.S3SubmissionData['submission']\n | undefined,\n elementLookupResult: elementLookupResult as\n | FormTypes.FormElement[]\n | undefined,\n executedLookup: { [element.name]: true },\n })\n\n if (isMounted.current) {\n setHasLookupSucceeded(true)\n }\n\n // After certain amount of time, hide the lookup succeeded message\n setTimeout(() => {\n if (isMounted.current) {\n setIsLookingUp(false)\n }\n }, 750)\n } catch (error) {\n if (!isMounted.current) {\n return\n }\n\n if (abortController.signal.aborted) {\n console.log('Fetch aborted')\n if (!continueLookupOnAbort) {\n setIsLookingUp(false)\n }\n return\n }\n\n setHasLookupFailed(true)\n mergeLookupData({\n newValue: newValue,\n dataLookupResult: {},\n elementLookupResult: [],\n executedLookup: { [element.name]: false },\n })\n setLookupErrorHTML(\n typeof error === 'string'\n ? error\n : 'It looks like something went wrong.<br/>Please try again.<br />If the issue continues, please contact support.',\n )\n } finally {\n clearTimeout(isCancellableTimeout)\n if (isMounted.current) {\n setIsLookupRequestInFlight(false)\n setOnCancelLookup(undefined)\n }\n }\n },\n [\n definition,\n element,\n excludeDefinition,\n formElementDataLookup,\n formElementElementLookup,\n areLookupsDisallowed,\n isMounted,\n isNotStaticLookup,\n isOffline,\n mergeLookupData,\n model,\n ],\n )\n\n // For certain elements, do not add click event\n // instead, watch model for changes and trigger lookup function.\n // We add this stringify function here to allow the value to be\n // an object which may have a reference change, but the values\n // have not changed. e.g. the 'location' element's value\n const autoLookupValueString = React.useMemo(() => {\n if (stringifyAutoLookupValue) {\n return stringifyAutoLookupValue(autoLookupValue)\n } else {\n return autoLookupValue\n }\n }, [autoLookupValue, stringifyAutoLookupValue])\n React.useEffect(() => {\n if (isLoading || loadError) {\n return\n }\n const hasLookupRan = hasLookupFailed || hasLookupSucceeded\n\n // For lookups configured with `runLookupOnClear` set to true, we want to\n // allow empty values for `autoLookupValue`, but only if the lookup has\n // been ran previously. This prevents the lookup running on load with an empty value.\n if (\n (autoLookupValue === undefined || autoLookupValue === null) &&\n (!runLookupOnClear || !hasLookupRan)\n ) {\n setIsLookingUp(false)\n return\n }\n const abortController = new AbortController()\n triggerLookup({\n newValue: autoLookupValue,\n abortController,\n continueLookupOnAbort: true,\n })\n return () => {\n abortController.abort()\n }\n // Wants to use \"triggerLookup\" as a dependency,\n // however, this will change on any change made on any\n // element. Checking if \"value\" has changed is enough\n // to trigger a lookup when the correct dependencies change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoLookupValueString, isLoading])\n\n const retryLookup = React.useCallback(() => {\n const abortController = new AbortController()\n triggerLookup({\n newValue: autoLookupValue,\n abortController,\n continueLookupOnAbort: true,\n })\n }, [autoLookupValue, triggerLookup])\n\n const contextValue = React.useMemo(\n () => ({\n isLookup: true,\n isLookupRequestInFlight,\n isLoading,\n onLookup: triggerLookup,\n allowLookupOnEmptyValue: runLookupOnClear,\n isLookingUp,\n areLookupsDisallowed,\n }),\n [\n isLookupRequestInFlight,\n isLoading,\n runLookupOnClear,\n triggerLookup,\n isLookingUp,\n areLookupsDisallowed,\n ],\n )\n\n return (\n <LookupNotificationContext.Provider value={contextValue}>\n {children}\n\n {loadError && (\n <ErrorMessage\n title=\"Error Loading Configuration\"\n onTryAgain={onTryAgain}\n >\n <span className=\"cypress-lookup-notification-loading-error\">\n {loadError.message}\n </span>\n </ErrorMessage>\n )}\n\n <div\n className={clsx('ob-lookup__notification', {\n 'is-looking-up': isLookingUp,\n 'is-extended':\n hasLookupFailed || (isCancellable && !hasLookupSucceeded),\n 'is-retryable':\n hasLookupFailed &&\n autoLookupValue !== undefined &&\n autoLookupValue !== null,\n })}\n >\n <div className=\"notification has-margin-top-7 has-text-centered\">\n {hasLookupFailed && (\n <>\n <button\n type=\"button\"\n className=\"delete fade-in\"\n onClick={() => setIsLookingUp(false)}\n aria-label=\"lookup-failure-close-button\"\n />\n\n <div>\n {isOffline && isNotStaticLookup ? (\n <div>\n <MaterialIcon className=\"fade-in has-text-warning\">\n wifi_off\n </MaterialIcon>\n <p className=\"fade-in\" role=\"alert\">\n It looks like you're offline. Please try again when\n connectivity is restored.\n </p>\n </div>\n ) : (\n <div>\n <MaterialIcon className=\"fade-in has-text-danger\">\n error_outline\n </MaterialIcon>\n <p\n role=\"alert\"\n className=\"fade-in\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n __html: lookupErrorHTML || '',\n }}\n />\n {autoLookupValue !== undefined &&\n autoLookupValue !== null && (\n <button\n type=\"button\"\n className={clsx(\n 'fade-in button is-primary ob-lookup__retry-button cypress-retry-lookup-button has-margin-top-8',\n )}\n onClick={() => retryLookup()}\n disabled={isLookupRequestInFlight || isLoading}\n aria-label=\"lookup-retry-button\"\n >\n <span></span>\n <span className=\"icon\">\n <MaterialIcon className=\"refresh\">\n refresh\n </MaterialIcon>\n </span>\n <span> Retry Lookup</span>\n </button>\n )}\n </div>\n )}\n </div>\n </>\n )}\n\n {hasLookupSucceeded && (\n <>\n <MaterialIcon\n className=\"has-text-success fade-in\"\n role=\"status\"\n aria-label=\"lookup successful\"\n >\n check_circle_outline\n </MaterialIcon>\n </>\n )}\n\n {!hasLookupSucceeded && !hasLookupFailed && <OnLoading small />}\n\n {isCancellable && !hasLookupSucceeded && !hasLookupFailed && (\n <div className=\"has-margin-top-5 fade-in\" role=\"alert\">\n <p>Taking longer than expected?</p>\n <button\n type=\"button\"\n className=\"button has-margin-top-8\"\n onClick={onCancelLookup}\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n </div>\n </LookupNotificationContext.Provider>\n )\n}\n\nexport default function LookupNotification(props: Props) {\n if (props.element.isDataLookup || props.element.isElementLookup) {\n return <LookupNotificationComponent {...props} />\n }\n\n return <>{props.children}</>\n}\n\nasync function fetchLookup(\n formElementLookup: formService.FormElementLookupResult | undefined,\n payload: FetchLookupPayload,\n abortSignal: AbortSignal,\n): Promise<\n | SubmissionTypes.S3SubmissionData['submission']\n | FormTypes.FormElement[]\n | undefined\n> {\n if (!formElementLookup) {\n return\n }\n\n if (formElementLookup.records) {\n const elementName = payload.element.name\n const inputValue = payload.submission[elementName]\n\n const matchingRecord = formElementLookup.records.find(\n (r) =>\n (r.inputType === 'UNDEFINED' && !inputValue) ||\n (r.inputType !== 'UNDEFINED' && r.inputValue === inputValue),\n )\n\n // insert prefill values\n return matchingRecord?.preFills.reduce<\n SubmissionTypes.S3SubmissionData['submission']\n >((lookupResult, prefill) => {\n switch (prefill.type) {\n case 'TEXT':\n lookupResult[prefill.formElementName] = prefill.text\n break\n case 'NUMBER':\n lookupResult[prefill.formElementName] = prefill.number\n break\n case 'CLEAR':\n lookupResult[prefill.formElementName] = undefined\n break\n }\n return lookupResult\n }, {})\n }\n\n if (!formElementLookup.url) {\n console.log(\n 'Could not find dynamic URL or static records for form element lookup:',\n formElementLookup,\n )\n throw new Error('Could not find element lookup configuration')\n }\n\n const headers = await generateHeaders()\n console.log(\n `Attempting a ${formElementLookup.type} lookup request to:`,\n formElementLookup.url,\n )\n const response = await fetch(formElementLookup.url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: abortSignal,\n })\n\n const data = await response.json()\n console.log(\n 'Response from lookup to: POST',\n formElementLookup.url,\n response.status,\n data,\n )\n\n if (!response.ok) {\n Sentry.captureException(\n new Error(`Received ${response.status} status code from lookup`),\n )\n if (response.status === 400 && data && data.message) {\n throw data.message\n }\n throw new Error('Invalid response from lookup')\n }\n\n return data as FormTypes.FormElement[]\n}\n"]}
|
|
@@ -153,7 +153,7 @@ function FormElementABN({ id, element, readOnly, value, onChange, validationMess
|
|
|
153
153
|
}, required: element.required, disabled: readOnly, onBlur: () => {
|
|
154
154
|
setIsDirty();
|
|
155
155
|
removeFocus();
|
|
156
|
-
}, onFocus: setIsFocused, "aria-describedby": ariaDescribedby, autoComplete: autocompleteAttributes, "aria-required": element.required }) }), value && (_jsx(ABNDisplay, { abnRecord: value, className: "ob-abn__display-desktop" })), hasCopyButton && (_jsx("div", { className: "control", children: _jsx(CopyToClipboardButton, { className: "button is-input-addon copy-button cypress-copy-to-clipboard-button", text: label }) })), _jsx(LookupButton, {
|
|
156
|
+
}, onFocus: setIsFocused, "aria-describedby": ariaDescribedby, autoComplete: autocompleteAttributes, "aria-required": element.required }) }), value && (_jsx(ABNDisplay, { abnRecord: value, className: "ob-abn__display-desktop" })), hasCopyButton && (_jsx("div", { className: "control", children: _jsx(CopyToClipboardButton, { className: "button is-input-addon copy-button cypress-copy-to-clipboard-button", text: label }) })), _jsx(LookupButton, { isInputButton: true, value: value, validationMessage: validationMessage, lookupButtonConfig: element.lookupButton, overrideRequiredMessage: undefined })] }), value && (_jsx(ABNDisplay, { abnRecord: value, className: "ob-abn__display-mobile" })), isDisplayingValidationMessage && (_jsx(FormElementValidationMessage, { message: (error === null || error === void 0 ? void 0 : error.message) || validationMessage }))] }) }));
|
|
157
157
|
}
|
|
158
158
|
export default React.memo(FormElementABN);
|
|
159
159
|
const ABNDisplay = ({ abnRecord, className, }) => {
|