@oneblink/apps-react 10.0.1-alpha.1 → 10.1.0-beta.2

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.
@@ -98,11 +98,12 @@ export declare function getTaskGroupInstances(formsAppId: number, abortSignal?:
98
98
  * @param options
99
99
  * @returns
100
100
  */
101
- export declare function completeTask({ formsAppId, taskId, taskActionId, taskGroupInstanceId, abortSignal, }: {
101
+ export declare function completeTask({ formsAppId, taskId, taskActionId, taskGroupInstanceId, completedAt, abortSignal, }: {
102
102
  formsAppId: number;
103
103
  taskId: string;
104
104
  taskActionId: string;
105
105
  taskGroupInstanceId: string | undefined;
106
+ completedAt: string | undefined;
106
107
  abortSignal?: AbortSignal;
107
108
  }): Promise<ScheduledTasksTypes.CompletedTask>;
108
109
  /**
@@ -142,10 +142,10 @@ export async function getTaskGroupInstances(formsAppId, abortSignal) {
142
142
  * @param options
143
143
  * @returns
144
144
  */
145
- export async function completeTask({ formsAppId, taskId, taskActionId, taskGroupInstanceId, abortSignal, }) {
145
+ export async function completeTask({ formsAppId, taskId, taskActionId, taskGroupInstanceId, completedAt, abortSignal, }) {
146
146
  const url = `${tenants.current.apiOrigin}/completed-tasks`;
147
147
  try {
148
- return await postRequest(url, { formsAppId, taskId, taskActionId, taskGroupInstanceId }, abortSignal);
148
+ return await postRequest(url, { formsAppId, taskId, taskActionId, taskGroupInstanceId, completedAt }, abortSignal);
149
149
  }
150
150
  catch (err) {
151
151
  Sentry.captureException(err);
@@ -1 +1 @@
1
- {"version":3,"file":"scheduled-tasks-service.js","sourceRoot":"","sources":["../../src/apps/scheduled-tasks-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ScheduledTasksTypes } from '@oneblink/types'\nimport tenants from './tenants'\nimport Sentry from './Sentry'\nimport {\n HTTPError,\n deleteRequest,\n getRequest,\n postRequest,\n} from './services/fetch'\nimport { isOffline } from './offline-service'\nimport OneBlinkAppsError from './services/errors/oneBlinkAppsError'\n\nexport interface TaskAvailability {\n task: ScheduledTasksTypes.Task\n completedTask?: ScheduledTasksTypes.CompletedTask\n daysAvailable: number\n}\n\nexport interface TaskResponse extends TaskAvailability {\n actions: ScheduledTasksTypes.TaskAction[]\n}\n\nasync function getTasks<\n T extends {\n taskResponses: TaskResponse[]\n },\n>(url: string, abortSignal?: AbortSignal) {\n try {\n return await getRequest<T>(url, abortSignal)\n } catch (err) {\n Sentry.captureException(err)\n\n const error = err as HTTPError\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline and do not have a local version of these scheduled tasks, please connect to the internet and try again',\n {\n originalError: error,\n isOffline: true,\n },\n )\n }\n switch (error.status) {\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the forms app you are looking for. Please contact support if the problem persists.',\n {\n originalError: error,\n title: 'Unknown Forms App',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.status,\n },\n )\n }\n }\n }\n}\n\n/**\n * Obtain all of the related Tasks for a specific Forms App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const date = '2023-12-01'\n * const tasks = await getTasksForFormsApp({ formsAppId, date })\n * ```\n *\n * @param formsAppId\n * @param abortSignal\n * @returns\n */\nexport async function getTasksForFormsApp({\n formsAppId,\n date,\n abortSignal,\n}: {\n formsAppId: number\n date: string\n abortSignal?: AbortSignal\n}): Promise<{\n taskResponses: TaskResponse[]\n}> {\n const url = `${tenants.current.apiOrigin}/forms-apps/${formsAppId}/scheduled-tasks?date=${date}`\n return await getTasks(url, abortSignal)\n}\n\n/**\n * Obtain all of the tasks related to a Task Group Instances in a specific Forms\n * App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const taskGroupInstanceId = 'abc123'\n * const date = '2023-12-01'\n * const tasks = await getTaskGroupInstanceTasks({\n * formsAppId,\n * taskGroupInstanceId,\n * date,\n * })\n * ```\n *\n * @param formsAppId\n * @param taskGroupInstanceId\n * @param abortSignal\n * @returns\n */\nexport async function getTaskGroupInstanceTasks({\n taskGroupInstanceId,\n date,\n formsAppId,\n abortSignal,\n}: {\n taskGroupInstanceId: string\n date: string\n formsAppId: number\n abortSignal?: AbortSignal\n}) {\n const url = `${tenants.current.apiOrigin}/forms-apps/${formsAppId}/scheduled-task-group-instances/${taskGroupInstanceId}?date=${date}`\n return await getTasks<{\n taskResponses: TaskResponse[]\n taskGroup: ScheduledTasksTypes.TaskGroup\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance\n }>(url, abortSignal)\n}\n\n/**\n * Obtain all of the Task Group instances for a specific Forms App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const taskGroupInstances = await getTaskGroupInstances(formsAppId)\n * ```\n *\n * @param formsAppId\n * @param abortSignal\n * @returns\n */\nexport async function getTaskGroupInstances(\n formsAppId: number,\n abortSignal?: AbortSignal,\n) {\n const url = `${tenants.current.apiOrigin}/forms-apps/${formsAppId}/scheduled-task-group-instances`\n try {\n return await getRequest<{\n taskGroupInstances: Array<\n ScheduledTasksTypes.TaskGroupInstance & {\n taskAvailabilities: TaskAvailability[]\n taskGroup: ScheduledTasksTypes.TaskGroup\n }\n >\n }>(url, abortSignal)\n } catch (err) {\n Sentry.captureException(err)\n\n const error = err as HTTPError\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline and do not have a local version of these scheduled task groups, please connect to the internet and try again',\n {\n originalError: error,\n isOffline: true,\n },\n )\n }\n switch (error.status) {\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the forms app you are looking for. Please contact support if the problem persists.',\n {\n originalError: error,\n title: 'Unknown Forms App',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.status,\n },\n )\n }\n }\n }\n}\n\n/**\n * Complete the related Task for a specific Forms App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const taskId = 2\n * const completedTask = await scheduledTasksService.completeTask({\n * formsAppId,\n * taskId,\n * })\n * ```\n *\n * @param options\n * @returns\n */\n\nexport async function completeTask({\n formsAppId,\n taskId,\n taskActionId,\n taskGroupInstanceId,\n abortSignal,\n}: {\n formsAppId: number\n taskId: string\n taskActionId: string\n taskGroupInstanceId: string | undefined\n abortSignal?: AbortSignal\n}): Promise<ScheduledTasksTypes.CompletedTask> {\n const url = `${tenants.current.apiOrigin}/completed-tasks`\n try {\n return await postRequest<ScheduledTasksTypes.CompletedTask>(\n url,\n { formsAppId, taskId, taskActionId, taskGroupInstanceId },\n abortSignal,\n )\n } catch (err) {\n Sentry.captureException(err)\n\n const error = err as HTTPError\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline, please connect to the internet and try again',\n {\n originalError: error,\n isOffline: true,\n },\n )\n }\n switch (error.status) {\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to complete this task. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.status,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(error.message, {\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.status,\n },\n )\n }\n }\n }\n}\n\n/**\n * Delete the completed task record related to a Task for a specific Forms App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const taskId = 2\n * const completedTask = await scheduledTasksService.completeTask({\n * formsAppId,\n * taskId,\n * })\n * await deleteCompletedTask(completedTask.id)\n * ```\n *\n * @param id\n * @param abortSignal\n * @returns\n */\n\nexport async function deleteCompletedTask(\n id: string,\n abortSignal?: AbortSignal,\n): Promise<void> {\n const url = `${tenants.current.apiOrigin}/completed-tasks/${id}`\n try {\n await deleteRequest(url, abortSignal)\n } catch (err) {\n Sentry.captureException(err)\n\n const error = err as HTTPError\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline, please connect to the internet and try again',\n {\n originalError: error,\n isOffline: true,\n },\n )\n }\n switch (error.status) {\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to delete completed tasks. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.status,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(error.message, {\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.status,\n },\n )\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"scheduled-tasks-service.js","sourceRoot":"","sources":["../../src/apps/scheduled-tasks-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ScheduledTasksTypes } from '@oneblink/types'\nimport tenants from './tenants'\nimport Sentry from './Sentry'\nimport {\n HTTPError,\n deleteRequest,\n getRequest,\n postRequest,\n} from './services/fetch'\nimport { isOffline } from './offline-service'\nimport OneBlinkAppsError from './services/errors/oneBlinkAppsError'\n\nexport interface TaskAvailability {\n task: ScheduledTasksTypes.Task\n completedTask?: ScheduledTasksTypes.CompletedTask\n daysAvailable: number\n}\n\nexport interface TaskResponse extends TaskAvailability {\n actions: ScheduledTasksTypes.TaskAction[]\n}\n\nasync function getTasks<\n T extends {\n taskResponses: TaskResponse[]\n },\n>(url: string, abortSignal?: AbortSignal) {\n try {\n return await getRequest<T>(url, abortSignal)\n } catch (err) {\n Sentry.captureException(err)\n\n const error = err as HTTPError\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline and do not have a local version of these scheduled tasks, please connect to the internet and try again',\n {\n originalError: error,\n isOffline: true,\n },\n )\n }\n switch (error.status) {\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the forms app you are looking for. Please contact support if the problem persists.',\n {\n originalError: error,\n title: 'Unknown Forms App',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.status,\n },\n )\n }\n }\n }\n}\n\n/**\n * Obtain all of the related Tasks for a specific Forms App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const date = '2023-12-01'\n * const tasks = await getTasksForFormsApp({ formsAppId, date })\n * ```\n *\n * @param formsAppId\n * @param abortSignal\n * @returns\n */\nexport async function getTasksForFormsApp({\n formsAppId,\n date,\n abortSignal,\n}: {\n formsAppId: number\n date: string\n abortSignal?: AbortSignal\n}): Promise<{\n taskResponses: TaskResponse[]\n}> {\n const url = `${tenants.current.apiOrigin}/forms-apps/${formsAppId}/scheduled-tasks?date=${date}`\n return await getTasks(url, abortSignal)\n}\n\n/**\n * Obtain all of the tasks related to a Task Group Instances in a specific Forms\n * App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const taskGroupInstanceId = 'abc123'\n * const date = '2023-12-01'\n * const tasks = await getTaskGroupInstanceTasks({\n * formsAppId,\n * taskGroupInstanceId,\n * date,\n * })\n * ```\n *\n * @param formsAppId\n * @param taskGroupInstanceId\n * @param abortSignal\n * @returns\n */\nexport async function getTaskGroupInstanceTasks({\n taskGroupInstanceId,\n date,\n formsAppId,\n abortSignal,\n}: {\n taskGroupInstanceId: string\n date: string\n formsAppId: number\n abortSignal?: AbortSignal\n}) {\n const url = `${tenants.current.apiOrigin}/forms-apps/${formsAppId}/scheduled-task-group-instances/${taskGroupInstanceId}?date=${date}`\n return await getTasks<{\n taskResponses: TaskResponse[]\n taskGroup: ScheduledTasksTypes.TaskGroup\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance\n }>(url, abortSignal)\n}\n\n/**\n * Obtain all of the Task Group instances for a specific Forms App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const taskGroupInstances = await getTaskGroupInstances(formsAppId)\n * ```\n *\n * @param formsAppId\n * @param abortSignal\n * @returns\n */\nexport async function getTaskGroupInstances(\n formsAppId: number,\n abortSignal?: AbortSignal,\n) {\n const url = `${tenants.current.apiOrigin}/forms-apps/${formsAppId}/scheduled-task-group-instances`\n try {\n return await getRequest<{\n taskGroupInstances: Array<\n ScheduledTasksTypes.TaskGroupInstance & {\n taskAvailabilities: TaskAvailability[]\n taskGroup: ScheduledTasksTypes.TaskGroup\n }\n >\n }>(url, abortSignal)\n } catch (err) {\n Sentry.captureException(err)\n\n const error = err as HTTPError\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline and do not have a local version of these scheduled task groups, please connect to the internet and try again',\n {\n originalError: error,\n isOffline: true,\n },\n )\n }\n switch (error.status) {\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the forms app you are looking for. Please contact support if the problem persists.',\n {\n originalError: error,\n title: 'Unknown Forms App',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.status,\n },\n )\n }\n }\n }\n}\n\n/**\n * Complete the related Task for a specific Forms App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const taskId = 2\n * const completedTask = await scheduledTasksService.completeTask({\n * formsAppId,\n * taskId,\n * })\n * ```\n *\n * @param options\n * @returns\n */\nexport async function completeTask({\n formsAppId,\n taskId,\n taskActionId,\n taskGroupInstanceId,\n completedAt,\n abortSignal,\n}: {\n formsAppId: number\n taskId: string\n taskActionId: string\n taskGroupInstanceId: string | undefined\n completedAt: string | undefined\n abortSignal?: AbortSignal\n}): Promise<ScheduledTasksTypes.CompletedTask> {\n const url = `${tenants.current.apiOrigin}/completed-tasks`\n try {\n return await postRequest<ScheduledTasksTypes.CompletedTask>(\n url,\n { formsAppId, taskId, taskActionId, taskGroupInstanceId, completedAt },\n abortSignal,\n )\n } catch (err) {\n Sentry.captureException(err)\n\n const error = err as HTTPError\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline, please connect to the internet and try again',\n {\n originalError: error,\n isOffline: true,\n },\n )\n }\n switch (error.status) {\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to complete this task. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.status,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(error.message, {\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.status,\n },\n )\n }\n }\n }\n}\n\n/**\n * Delete the completed task record related to a Task for a specific Forms App\n *\n * #### Example\n *\n * ```js\n * const formsAppId = 1\n * const taskId = 2\n * const completedTask = await scheduledTasksService.completeTask({\n * formsAppId,\n * taskId,\n * })\n * await deleteCompletedTask(completedTask.id)\n * ```\n *\n * @param id\n * @param abortSignal\n * @returns\n */\n\nexport async function deleteCompletedTask(\n id: string,\n abortSignal?: AbortSignal,\n): Promise<void> {\n const url = `${tenants.current.apiOrigin}/completed-tasks/${id}`\n try {\n await deleteRequest(url, abortSignal)\n } catch (err) {\n Sentry.captureException(err)\n\n const error = err as HTTPError\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline, please connect to the internet and try again',\n {\n originalError: error,\n isOffline: true,\n },\n )\n }\n switch (error.status) {\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to delete completed tasks. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n requiresAccessRequest: true,\n httpStatusCode: error.status,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(error.message, {\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n httpStatusCode: error.status,\n },\n )\n }\n }\n }\n}\n"]}
@@ -151,6 +151,7 @@ async function downloadDraftData(formSubmissionDraft, latestFormSubmissionDraftV
151
151
  taskAction: s3SubmissionData.taskAction,
152
152
  taskGroup: s3SubmissionData.taskGroup,
153
153
  taskGroupInstance: s3SubmissionData.taskGroupInstance,
154
+ completedAt: undefined,
154
155
  redirectUrl: '',
155
156
  },
156
157
  title: latestFormSubmissionDraftVersion.title,
@@ -1 +1 @@
1
- {"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../../src/apps/services/api/drafts.ts"],"names":[],"mappings":"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","sourcesContent":["import { SubmissionTypes } from '@oneblink/types'\nimport { getRequest, HTTPError, deleteRequest } from '../fetch'\nimport { isLoggedIn } from '../../auth-service'\nimport { getDeviceInformation } from '../getDeviceInformation'\nimport OneBlinkAppsError from '../errors/oneBlinkAppsError'\nimport tenants from '../../tenants'\nimport { getUserToken } from '../user-token'\nimport Sentry from '../../Sentry'\nimport prepareSubmissionData from '../prepareSubmissionData'\nimport { DraftSubmission, ProgressListener } from '../../types/submissions'\nimport generateOneBlinkUploader from '../generateOneBlinkUploader'\nimport { OneBlinkStorageError } from '@oneblink/storage'\nimport generateOneBlinkDownloader from '../generateOneBlinkDownloader'\nimport { isOffline } from '../../offline-service'\n\nasync function uploadDraftData(\n draftSubmission: DraftSubmission,\n onProgress?: ProgressListener,\n abortSignal?: AbortSignal,\n) {\n try {\n const submission = await prepareSubmissionData(draftSubmission)\n const oneblinkUploader = generateOneBlinkUploader()\n const userToken = getUserToken()\n console.log('Attempting to upload draft data')\n return await oneblinkUploader.uploadFormSubmissionDraft({\n submission,\n definition: draftSubmission.definition,\n device: getDeviceInformation(),\n userToken: userToken || undefined,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n jobId: draftSubmission.jobId,\n formsAppId: draftSubmission.formsAppId,\n externalId: draftSubmission.externalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance?.taskGroupInstanceId,\n formSubmissionDraftId: draftSubmission.formSubmissionDraftId,\n createdAt: draftSubmission.createdAt,\n title: draftSubmission.title,\n lastElementUpdated: draftSubmission.lastElementUpdated,\n sectionState: draftSubmission.sectionState,\n previousElapsedDurationSeconds:\n draftSubmission.previousElapsedDurationSeconds,\n onProgress,\n abortSignal,\n })\n } catch (error) {\n console.warn('Error occurred while attempting to upload draft data', error)\n Sentry.captureException(error)\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot save drafts until you have logged in. 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 drafts for this application. 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(\n 'We could not find the application your attempting upload a draft for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Application',\n httpStatusCode: error.httpStatusCode,\n },\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 },\n )\n }\n}\n\nasync function getFormSubmissionDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<SubmissionTypes.FormSubmissionDraft[]> {\n if (!isLoggedIn()) {\n console.log(\n 'Could not retrieve drafts from API as the current user is not logged in.',\n )\n return []\n }\n\n const url = new URL('/form-submission-drafts', tenants.current.apiOrigin)\n url.searchParams.append('formsAppId', formsAppId.toString())\n url.searchParams.append('isSubmitted', 'false')\n console.log('Attempting to retrieve drafts from API', url.href)\n\n try {\n const { formSubmissionDrafts } = await getRequest<{\n formSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n }>(url.href, abortSignal)\n return formSubmissionDrafts\n } catch (err) {\n console.warn(\n 'Error occurred while attempting to retrieve drafts from API',\n err,\n )\n if (err instanceof OneBlinkAppsError) {\n throw err\n }\n\n const error = err as HTTPError\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve your drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting retrieve drafts for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Error Syncing Drafts',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n },\n )\n }\n }\n }\n}\n\nasync function downloadDraftData(\n formSubmissionDraft: SubmissionTypes.FormSubmissionDraft,\n latestFormSubmissionDraftVersion: SubmissionTypes.FormSubmissionDraftVersion,\n abortSignal?: AbortSignal,\n): Promise<DraftSubmission | undefined> {\n try {\n console.log('Attempting to download draft form data:', {\n formSubmissionDraftVersionId: latestFormSubmissionDraftVersion.id,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const s3SubmissionData = await oneblinkDownloader.downloadDraftSubmission({\n formSubmissionDraftVersionId: latestFormSubmissionDraftVersion.id,\n abortSignal,\n })\n if (!s3SubmissionData) {\n return undefined\n }\n return {\n definition: s3SubmissionData.definition,\n submission: s3SubmissionData.submission,\n lastElementUpdated: s3SubmissionData.lastElementUpdated,\n // Drafts will always have a formsAppId, so we can safely cast to number\n formsAppId: s3SubmissionData.formsAppId as number,\n jobId: formSubmissionDraft.jobId,\n externalId: formSubmissionDraft.externalId,\n previousFormSubmissionApprovalId:\n formSubmissionDraft.previousFormSubmissionApprovalId,\n taskCompletion: s3SubmissionData.task &&\n s3SubmissionData.taskAction && {\n task: s3SubmissionData.task,\n taskAction: s3SubmissionData.taskAction,\n taskGroup: s3SubmissionData.taskGroup,\n taskGroupInstance: s3SubmissionData.taskGroupInstance,\n redirectUrl: '',\n },\n title: latestFormSubmissionDraftVersion.title,\n createdAt: latestFormSubmissionDraftVersion.createdAt,\n formSubmissionDraftId: formSubmissionDraft.id,\n sectionState: s3SubmissionData.sectionState,\n previousElapsedDurationSeconds:\n s3SubmissionData.previousElapsedDurationSeconds,\n }\n } catch (error) {\n if (abortSignal?.aborted) {\n return undefined\n }\n\n console.error(\n 'Error occurred while attempting to download draft data',\n error,\n )\n\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.httpStatusCode,\n })\n }\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve draft data until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresAccessRequest: true,\n },\n )\n }\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the draft your attempting retrieve. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Draft',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline and do not have a local copy of this draft available, please connect to the internet and try again',\n {\n originalError: error instanceof Error ? error : undefined,\n isOffline: true,\n },\n )\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n title: 'Unexpected Error',\n originalError: error instanceof Error ? error : undefined,\n httpStatusCode:\n error instanceof OneBlinkStorageError\n ? error.httpStatusCode\n : undefined,\n },\n )\n }\n}\n\nasync function deleteFormSubmissionDraft(\n formSubmissionDraftId: string,\n abortSignal?: AbortSignal,\n) {\n const url = `${tenants.current.apiOrigin}/form-submission-drafts/${formSubmissionDraftId}`\n console.log('Attempting to delete form submission draft remotely', url)\n try {\n await deleteRequest(url, abortSignal)\n } catch (error) {\n console.warn(\n 'Error occurred while attempting to delete a draft from API',\n error,\n )\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof HTTPError) {\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot delete drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n case 404: {\n console.warn(\n 'Remote draft does not exist, we will assume it has already been deleted.',\n formSubmissionDraftId,\n error,\n )\n return\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 as Error,\n },\n )\n }\n}\n\nexport {\n uploadDraftData,\n getFormSubmissionDrafts,\n downloadDraftData,\n deleteFormSubmissionDraft,\n}\n"]}
1
+ {"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../../../src/apps/services/api/drafts.ts"],"names":[],"mappings":"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","sourcesContent":["import { SubmissionTypes } from '@oneblink/types'\nimport { getRequest, HTTPError, deleteRequest } from '../fetch'\nimport { isLoggedIn } from '../../auth-service'\nimport { getDeviceInformation } from '../getDeviceInformation'\nimport OneBlinkAppsError from '../errors/oneBlinkAppsError'\nimport tenants from '../../tenants'\nimport { getUserToken } from '../user-token'\nimport Sentry from '../../Sentry'\nimport prepareSubmissionData from '../prepareSubmissionData'\nimport { DraftSubmission, ProgressListener } from '../../types/submissions'\nimport generateOneBlinkUploader from '../generateOneBlinkUploader'\nimport { OneBlinkStorageError } from '@oneblink/storage'\nimport generateOneBlinkDownloader from '../generateOneBlinkDownloader'\nimport { isOffline } from '../../offline-service'\n\nasync function uploadDraftData(\n draftSubmission: DraftSubmission,\n onProgress?: ProgressListener,\n abortSignal?: AbortSignal,\n) {\n try {\n const submission = await prepareSubmissionData(draftSubmission)\n const oneblinkUploader = generateOneBlinkUploader()\n const userToken = getUserToken()\n console.log('Attempting to upload draft data')\n return await oneblinkUploader.uploadFormSubmissionDraft({\n submission,\n definition: draftSubmission.definition,\n device: getDeviceInformation(),\n userToken: userToken || undefined,\n previousFormSubmissionApprovalId:\n draftSubmission.previousFormSubmissionApprovalId,\n jobId: draftSubmission.jobId,\n formsAppId: draftSubmission.formsAppId,\n externalId: draftSubmission.externalId,\n taskId: draftSubmission.taskCompletion?.task.taskId,\n taskActionId: draftSubmission.taskCompletion?.taskAction.taskActionId,\n taskGroupInstanceId:\n draftSubmission.taskCompletion?.taskGroupInstance?.taskGroupInstanceId,\n formSubmissionDraftId: draftSubmission.formSubmissionDraftId,\n createdAt: draftSubmission.createdAt,\n title: draftSubmission.title,\n lastElementUpdated: draftSubmission.lastElementUpdated,\n sectionState: draftSubmission.sectionState,\n previousElapsedDurationSeconds:\n draftSubmission.previousElapsedDurationSeconds,\n onProgress,\n abortSignal,\n })\n } catch (error) {\n console.warn('Error occurred while attempting to upload draft data', error)\n Sentry.captureException(error)\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot save drafts until you have logged in. 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 drafts for this application. 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(\n 'We could not find the application your attempting upload a draft for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Application',\n httpStatusCode: error.httpStatusCode,\n },\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 },\n )\n }\n}\n\nasync function getFormSubmissionDrafts(\n formsAppId: number,\n abortSignal?: AbortSignal,\n): Promise<SubmissionTypes.FormSubmissionDraft[]> {\n if (!isLoggedIn()) {\n console.log(\n 'Could not retrieve drafts from API as the current user is not logged in.',\n )\n return []\n }\n\n const url = new URL('/form-submission-drafts', tenants.current.apiOrigin)\n url.searchParams.append('formsAppId', formsAppId.toString())\n url.searchParams.append('isSubmitted', 'false')\n console.log('Attempting to retrieve drafts from API', url.href)\n\n try {\n const { formSubmissionDrafts } = await getRequest<{\n formSubmissionDrafts: SubmissionTypes.FormSubmissionDraft[]\n }>(url.href, abortSignal)\n return formSubmissionDrafts\n } catch (err) {\n console.warn(\n 'Error occurred while attempting to retrieve drafts from API',\n err,\n )\n if (err instanceof OneBlinkAppsError) {\n throw err\n }\n\n const error = err as HTTPError\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve your drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400:\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the application your attempting retrieve drafts for. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Error Syncing Drafts',\n httpStatusCode: error.status,\n },\n )\n }\n default: {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: error,\n },\n )\n }\n }\n }\n}\n\nasync function downloadDraftData(\n formSubmissionDraft: SubmissionTypes.FormSubmissionDraft,\n latestFormSubmissionDraftVersion: SubmissionTypes.FormSubmissionDraftVersion,\n abortSignal?: AbortSignal,\n): Promise<DraftSubmission | undefined> {\n try {\n console.log('Attempting to download draft form data:', {\n formSubmissionDraftVersionId: latestFormSubmissionDraftVersion.id,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const s3SubmissionData = await oneblinkDownloader.downloadDraftSubmission({\n formSubmissionDraftVersionId: latestFormSubmissionDraftVersion.id,\n abortSignal,\n })\n if (!s3SubmissionData) {\n return undefined\n }\n return {\n definition: s3SubmissionData.definition,\n submission: s3SubmissionData.submission,\n lastElementUpdated: s3SubmissionData.lastElementUpdated,\n // Drafts will always have a formsAppId, so we can safely cast to number\n formsAppId: s3SubmissionData.formsAppId as number,\n jobId: formSubmissionDraft.jobId,\n externalId: formSubmissionDraft.externalId,\n previousFormSubmissionApprovalId:\n formSubmissionDraft.previousFormSubmissionApprovalId,\n taskCompletion: s3SubmissionData.task &&\n s3SubmissionData.taskAction && {\n task: s3SubmissionData.task,\n taskAction: s3SubmissionData.taskAction,\n taskGroup: s3SubmissionData.taskGroup,\n taskGroupInstance: s3SubmissionData.taskGroupInstance,\n completedAt: undefined,\n redirectUrl: '',\n },\n title: latestFormSubmissionDraftVersion.title,\n createdAt: latestFormSubmissionDraftVersion.createdAt,\n formSubmissionDraftId: formSubmissionDraft.id,\n sectionState: s3SubmissionData.sectionState,\n previousElapsedDurationSeconds:\n s3SubmissionData.previousElapsedDurationSeconds,\n }\n } catch (error) {\n if (abortSignal?.aborted) {\n return undefined\n }\n\n console.error(\n 'Error occurred while attempting to download draft data',\n error,\n )\n\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof OneBlinkStorageError) {\n switch (error.httpStatusCode) {\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.httpStatusCode,\n })\n }\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot retrieve draft data until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.httpStatusCode,\n requiresAccessRequest: true,\n },\n )\n }\n case 404: {\n throw new OneBlinkAppsError(\n 'We could not find the draft your attempting retrieve. Please contact your administrator to ensure your application configuration has been completed successfully.',\n {\n originalError: error,\n title: 'Unknown Draft',\n httpStatusCode: error.httpStatusCode,\n },\n )\n }\n }\n }\n\n if (isOffline()) {\n throw new OneBlinkAppsError(\n 'You are currently offline and do not have a local copy of this draft available, please connect to the internet and try again',\n {\n originalError: error instanceof Error ? error : undefined,\n isOffline: true,\n },\n )\n }\n\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n title: 'Unexpected Error',\n originalError: error instanceof Error ? error : undefined,\n httpStatusCode:\n error instanceof OneBlinkStorageError\n ? error.httpStatusCode\n : undefined,\n },\n )\n }\n}\n\nasync function deleteFormSubmissionDraft(\n formSubmissionDraftId: string,\n abortSignal?: AbortSignal,\n) {\n const url = `${tenants.current.apiOrigin}/form-submission-drafts/${formSubmissionDraftId}`\n console.log('Attempting to delete form submission draft remotely', url)\n try {\n await deleteRequest(url, abortSignal)\n } catch (error) {\n console.warn(\n 'Error occurred while attempting to delete a draft from API',\n error,\n )\n if (error instanceof OneBlinkAppsError) {\n throw error\n }\n\n Sentry.captureException(error)\n\n if (error instanceof HTTPError) {\n switch (error.status) {\n case 401: {\n throw new OneBlinkAppsError(\n 'You cannot delete drafts until you have logged in. Please login and try again.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresLogin: true,\n },\n )\n }\n case 403: {\n throw new OneBlinkAppsError(\n 'You do not have access to drafts for this application. Please contact your administrator to gain the correct level of access.',\n {\n originalError: error,\n httpStatusCode: error.status,\n requiresAccessRequest: true,\n },\n )\n }\n case 400: {\n throw new OneBlinkAppsError(error.message, {\n originalError: error,\n title: 'Invalid Request',\n httpStatusCode: error.status,\n })\n }\n case 404: {\n console.warn(\n 'Remote draft does not exist, we will assume it has already been deleted.',\n formSubmissionDraftId,\n error,\n )\n return\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 as Error,\n },\n )\n }\n}\n\nexport {\n uploadDraftData,\n getFormSubmissionDrafts,\n downloadDraftData,\n deleteFormSubmissionDraft,\n}\n"]}
@@ -71,7 +71,7 @@ export async function uploadFormSubmission(formSubmission,
71
71
  * clicked the submit button
72
72
  */
73
73
  completionTimestamp, onProgress, abortSignal) {
74
- var _a, _b, _c, _d;
74
+ var _a, _b, _c, _d, _e;
75
75
  try {
76
76
  const oneblinkUploader = generateOneBlinkUploader();
77
77
  const userToken = getUserToken();
@@ -89,6 +89,7 @@ completionTimestamp, onProgress, abortSignal) {
89
89
  taskId: ((_a = formSubmission.taskCompletion) === null || _a === void 0 ? void 0 : _a.task.taskId) || undefined,
90
90
  taskActionId: (_b = formSubmission.taskCompletion) === null || _b === void 0 ? void 0 : _b.taskAction.taskActionId,
91
91
  taskGroupInstanceId: (_d = (_c = formSubmission.taskCompletion) === null || _c === void 0 ? void 0 : _c.taskGroupInstance) === null || _d === void 0 ? void 0 : _d.taskGroupInstanceId,
92
+ taskCompletionTimestamp: (_e = formSubmission.taskCompletion) === null || _e === void 0 ? void 0 : _e.completedAt,
92
93
  recaptchas: formSubmission.recaptchas,
93
94
  onProgress,
94
95
  abortSignal,
@@ -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'\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 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 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 downloadFormSubmission({\n formId,\n submissionId,\n abortSignal,\n}: {\n formId: number\n submissionId: string\n abortSignal?: AbortSignal\n}) {\n try {\n console.log('Attempting to download form submission data:', {\n formId,\n submissionId,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const submissionData = await oneblinkDownloader.downloadSubmission({\n formId,\n submissionId,\n abortSignal,\n })\n if (!submissionData) {\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 submissionData\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":"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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'\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 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 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 downloadFormSubmission({\n formId,\n submissionId,\n abortSignal,\n}: {\n formId: number\n submissionId: string\n abortSignal?: AbortSignal\n}) {\n try {\n console.log('Attempting to download form submission data:', {\n formId,\n submissionId,\n })\n const oneblinkDownloader = generateOneBlinkDownloader()\n const submissionData = await oneblinkDownloader.downloadSubmission({\n formId,\n submissionId,\n abortSignal,\n })\n if (!submissionData) {\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 submissionData\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"]}
@@ -55,6 +55,8 @@ export type BaseFormSubmission = {
55
55
  taskGroup: ScheduledTasksTypes.TaskGroup | undefined;
56
56
  /** The task group instance */
57
57
  taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance | undefined;
58
+ /** The date and time (in ISO format) when the task was completed */
59
+ completedAt: string | undefined;
58
60
  /**
59
61
  * The URL to redirect the user to after completing the task via form
60
62
  * submission
@@ -1 +1 @@
1
- {"version":3,"file":"submissions.js","sourceRoot":"","sources":["../../../src/apps/types/submissions.ts"],"names":[],"mappings":"","sourcesContent":["import {\n FormTypes,\n SubmissionEventTypes,\n SubmissionTypes,\n ScheduledTasksTypes,\n} from '@oneblink/types'\nimport { FormElement } from '@oneblink/types/typescript/forms'\n\nexport { ProgressListener, ProgressListenerEvent } from '@oneblink/storage'\n\nexport type BaseNewFormSubmission = {\n /** The submission data */\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** The form definition when the draft was saved */\n definition: FormTypes.Form\n}\n\nexport type NewDraftSubmission = BaseNewFormSubmission & {\n /**\n * Set to true if the submission should be uploaded in the background, false\n * or undefined if the submission should be uploaded immediately\n */\n backgroundUpload?: boolean\n /** The element that was last updated before the draft was saved */\n lastElementUpdated?: FormElement\n /** The state of sections before the draft was saved */\n sectionState?: SubmissionTypes.NewS3SubmissionData['sectionState']\n /**\n * The elapsed duration in seconds the user took to complete the submission\n * before the draft was saved\n */\n\n previousElapsedDurationSeconds?: SubmissionTypes.NewS3SubmissionData['previousElapsedDurationSeconds']\n}\n\nexport type NewFormSubmission = BaseNewFormSubmission & {\n /** The reCAPTCHA tokens to validate the submission */\n recaptchas?: Array<{\n /** The site key that was used to generate the reCAPTCHA token */\n siteKey: string\n /** A reCAPTCHA token */\n token: string\n }>\n}\n\nexport type BaseFormSubmission = {\n /** The id of the job to submit */\n jobId?: string\n /** The id of the Forms App submitting for */\n externalId?: string\n /**\n * The id of the previous form submission approval id. Only used when the form\n * submission is in response to `CLARIFICATION_REQUIRED` approval.\n */\n previousFormSubmissionApprovalId?: string\n /**\n * Will have a value if the user was attempting to complete a scheduled task\n * via a form submission\n */\n taskCompletion?: {\n /** The task */\n task: ScheduledTasksTypes.Task\n /** The task action */\n taskAction: ScheduledTasksTypes.TaskAction\n /** The task group */\n taskGroup: ScheduledTasksTypes.TaskGroup | undefined\n /** The task group instance */\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance | undefined\n /**\n * The URL to redirect the user to after completing the task via form\n * submission\n */\n redirectUrl: string\n }\n}\n\nexport type DraftSubmissionInput = NewDraftSubmission &\n BaseFormSubmission & {\n /** The id of the Forms App submitting for */\n formsAppId: number\n /** The title input by a user to identify the draft. */\n title: string\n }\n\nexport type DraftSubmission = DraftSubmissionInput & {\n /**\n * The date and time (in ISO format) when this version of the draft was\n * created.\n */\n createdAt: string\n /**\n * The identifier for the parent draft record. Created client side to store\n * the draft locally for offline capability\n */\n formSubmissionDraftId: string\n}\n\nexport type LocalFormSubmissionDraft = Omit<\n SubmissionTypes.FormSubmissionDraft,\n 'id' | 'versions'\n> & {\n /**\n * The versions of the draft data. `undefined` if it has not been uploaded\n * remotely yet.\n */\n versions: SubmissionTypes.FormSubmissionDraftVersion[] | undefined\n /** `true` if the draft was created by a public user (not logged in). */\n isPublic?: boolean\n} & (\n | {\n downloadStatus: 'PENDING' | 'DOWNLOADING' | 'NOT_AVAILABLE'\n }\n | {\n downloadStatus: 'ERROR'\n downloadError: string\n }\n | {\n downloadStatus: 'SUCCESS'\n draftSubmission: DraftSubmission\n }\n )\n\nexport type FormSubmission = NewFormSubmission &\n BaseFormSubmission & {\n /** The id of the Forms App submitting for */\n formsAppId?: number\n /** The id of the draft to clean up after successful submission */\n formSubmissionDraftId?: string\n /** The id of the prefill data to clean up after successful submission */\n preFillFormDataId: string | null\n }\n\nexport type FormSubmissionResult = FormSubmission & {\n /**\n * The identifier that represents the submission. `null` if the form\n * submission was unsuccessful\n */\n submissionId: string | null\n /**\n * The timestamp the form was submitted, `null` if the form submission was\n * unsuccessful\n */\n submissionTimestamp: string | null\n /** `null` if the form submission does not require a payment */\n payment: {\n /** The amount required to pay */\n amount: number\n /** The URL to redirect the user to after payment to display a receipt */\n paymentReceiptUrl: string\n /**\n * The URL to redirect the user to to make a payment for a form hosted by\n * customer instead of payment provider\n */\n paymentFormUrl: string | undefined\n /** The URL to redirect the user to to complete the payment process */\n hostedFormUrl: string\n /** The payment submission event */\n submissionEvent: SubmissionEventTypes.FormPaymentEvent\n } | null\n /** `null` if the form submission does not require a booking */\n scheduling: {\n /** The URL to redirect the user to to complete the booking process */\n bookingUrl: string\n /** The scheduling submission event */\n submissionEvent: SubmissionEventTypes.FormSchedulingEvent\n } | null\n /**\n * `true` if the submission was not submitted yet and was added to the pending\n * queue\n */\n isInPendingQueue: boolean\n /** `true` if the submission was attempted offline */\n isOffline: boolean\n /** True if the submission was attempted whilst attachments were uploading */\n isUploadingAttachments: boolean\n /** Exists if the form allows PDF download */\n /**\n * @deprecated Only returned when legacy post submission download\n * configuration is in use. For non legacy configured forms, use\n * `downloadSubmissionPdfs` instead.\n */\n downloadSubmissionPdfUrl?: string\n\n downloadSubmissionPdfs?: Array<{\n id: string\n configuration: SubmissionEventTypes.PDFConfiguration\n url: string\n }>\n /** The access token to download post-submission attachment urls and metadata. */\n attachmentsAccessToken?: string\n}\n\nexport type PendingFormSubmission = FormSubmission & {\n /** The date and time (in ISO format) the submission was attempted */\n pendingTimestamp: string\n /** `true` if the submission is currently being processed by the pending queue */\n isSubmitting?: boolean\n /** `true` if the submission is currently being edited */\n isEditing?: boolean\n /**\n * An error message that might be set while attempting to process the\n * submission in the pending queue\n */\n error?: string\n}\n"]}
1
+ {"version":3,"file":"submissions.js","sourceRoot":"","sources":["../../../src/apps/types/submissions.ts"],"names":[],"mappings":"","sourcesContent":["import {\n FormTypes,\n SubmissionEventTypes,\n SubmissionTypes,\n ScheduledTasksTypes,\n} from '@oneblink/types'\nimport { FormElement } from '@oneblink/types/typescript/forms'\n\nexport { ProgressListener, ProgressListenerEvent } from '@oneblink/storage'\n\nexport type BaseNewFormSubmission = {\n /** The submission data */\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** The form definition when the draft was saved */\n definition: FormTypes.Form\n}\n\nexport type NewDraftSubmission = BaseNewFormSubmission & {\n /**\n * Set to true if the submission should be uploaded in the background, false\n * or undefined if the submission should be uploaded immediately\n */\n backgroundUpload?: boolean\n /** The element that was last updated before the draft was saved */\n lastElementUpdated?: FormElement\n /** The state of sections before the draft was saved */\n sectionState?: SubmissionTypes.NewS3SubmissionData['sectionState']\n /**\n * The elapsed duration in seconds the user took to complete the submission\n * before the draft was saved\n */\n\n previousElapsedDurationSeconds?: SubmissionTypes.NewS3SubmissionData['previousElapsedDurationSeconds']\n}\n\nexport type NewFormSubmission = BaseNewFormSubmission & {\n /** The reCAPTCHA tokens to validate the submission */\n recaptchas?: Array<{\n /** The site key that was used to generate the reCAPTCHA token */\n siteKey: string\n /** A reCAPTCHA token */\n token: string\n }>\n}\n\nexport type BaseFormSubmission = {\n /** The id of the job to submit */\n jobId?: string\n /** The id of the Forms App submitting for */\n externalId?: string\n /**\n * The id of the previous form submission approval id. Only used when the form\n * submission is in response to `CLARIFICATION_REQUIRED` approval.\n */\n previousFormSubmissionApprovalId?: string\n /**\n * Will have a value if the user was attempting to complete a scheduled task\n * via a form submission\n */\n taskCompletion?: {\n /** The task */\n task: ScheduledTasksTypes.Task\n /** The task action */\n taskAction: ScheduledTasksTypes.TaskAction\n /** The task group */\n taskGroup: ScheduledTasksTypes.TaskGroup | undefined\n /** The task group instance */\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance | undefined\n /** The date and time (in ISO format) when the task was completed */\n completedAt: string | undefined\n /**\n * The URL to redirect the user to after completing the task via form\n * submission\n */\n redirectUrl: string\n }\n}\n\nexport type DraftSubmissionInput = NewDraftSubmission &\n BaseFormSubmission & {\n /** The id of the Forms App submitting for */\n formsAppId: number\n /** The title input by a user to identify the draft. */\n title: string\n }\n\nexport type DraftSubmission = DraftSubmissionInput & {\n /**\n * The date and time (in ISO format) when this version of the draft was\n * created.\n */\n createdAt: string\n /**\n * The identifier for the parent draft record. Created client side to store\n * the draft locally for offline capability\n */\n formSubmissionDraftId: string\n}\n\nexport type LocalFormSubmissionDraft = Omit<\n SubmissionTypes.FormSubmissionDraft,\n 'id' | 'versions'\n> & {\n /**\n * The versions of the draft data. `undefined` if it has not been uploaded\n * remotely yet.\n */\n versions: SubmissionTypes.FormSubmissionDraftVersion[] | undefined\n /** `true` if the draft was created by a public user (not logged in). */\n isPublic?: boolean\n} & (\n | {\n downloadStatus: 'PENDING' | 'DOWNLOADING' | 'NOT_AVAILABLE'\n }\n | {\n downloadStatus: 'ERROR'\n downloadError: string\n }\n | {\n downloadStatus: 'SUCCESS'\n draftSubmission: DraftSubmission\n }\n )\n\nexport type FormSubmission = NewFormSubmission &\n BaseFormSubmission & {\n /** The id of the Forms App submitting for */\n formsAppId?: number\n /** The id of the draft to clean up after successful submission */\n formSubmissionDraftId?: string\n /** The id of the prefill data to clean up after successful submission */\n preFillFormDataId: string | null\n }\n\nexport type FormSubmissionResult = FormSubmission & {\n /**\n * The identifier that represents the submission. `null` if the form\n * submission was unsuccessful\n */\n submissionId: string | null\n /**\n * The timestamp the form was submitted, `null` if the form submission was\n * unsuccessful\n */\n submissionTimestamp: string | null\n /** `null` if the form submission does not require a payment */\n payment: {\n /** The amount required to pay */\n amount: number\n /** The URL to redirect the user to after payment to display a receipt */\n paymentReceiptUrl: string\n /**\n * The URL to redirect the user to to make a payment for a form hosted by\n * customer instead of payment provider\n */\n paymentFormUrl: string | undefined\n /** The URL to redirect the user to to complete the payment process */\n hostedFormUrl: string\n /** The payment submission event */\n submissionEvent: SubmissionEventTypes.FormPaymentEvent\n } | null\n /** `null` if the form submission does not require a booking */\n scheduling: {\n /** The URL to redirect the user to to complete the booking process */\n bookingUrl: string\n /** The scheduling submission event */\n submissionEvent: SubmissionEventTypes.FormSchedulingEvent\n } | null\n /**\n * `true` if the submission was not submitted yet and was added to the pending\n * queue\n */\n isInPendingQueue: boolean\n /** `true` if the submission was attempted offline */\n isOffline: boolean\n /** True if the submission was attempted whilst attachments were uploading */\n isUploadingAttachments: boolean\n /** Exists if the form allows PDF download */\n /**\n * @deprecated Only returned when legacy post submission download\n * configuration is in use. For non legacy configured forms, use\n * `downloadSubmissionPdfs` instead.\n */\n downloadSubmissionPdfUrl?: string\n\n downloadSubmissionPdfs?: Array<{\n id: string\n configuration: SubmissionEventTypes.PDFConfiguration\n url: string\n }>\n /** The access token to download post-submission attachment urls and metadata. */\n attachmentsAccessToken?: string\n}\n\nexport type PendingFormSubmission = FormSubmission & {\n /** The date and time (in ISO format) the submission was attempted */\n pendingTimestamp: string\n /** `true` if the submission is currently being processed by the pending queue */\n isSubmitting?: boolean\n /** `true` if the submission is currently being edited */\n isEditing?: boolean\n /**\n * An error message that might be set while attempting to process the\n * submission in the pending queue\n */\n error?: string\n}\n"]}
@@ -382,7 +382,9 @@ export default function useFormStoreTable({ form, formStoreRecords, parameters,
382
382
  const storageKey = localStorageKey(form.id);
383
383
  const augmentedState = {
384
384
  ...state,
385
- hiddenColumns: Object.keys(state.columnVisibility),
385
+ hiddenColumns: Object.entries(state.columnVisibility)
386
+ .filter(([, isVisible]) => !isVisible)
387
+ .map(([column]) => column),
386
388
  formId: (_b = table.options.meta) === null || _b === void 0 ? void 0 : _b.formId,
387
389
  };
388
390
  localStorage.setItem(storageKey, JSON.stringify(augmentedState));
@@ -1 +1 @@
1
- {"version":3,"file":"useFormStoreTable.js","sourceRoot":"","sources":["../../../../src/components/formStore/table/useFormStoreTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { formStoreService, localisationService } from '../../../apps'\nimport {\n useReactTable,\n getCoreRowModel,\n OnChangeFn,\n SortingState,\n VisibilityState,\n} from '@tanstack/react-table'\nimport { format } from 'date-fns'\nimport generateColumns from './generateColumns'\nimport ActionedByTableCell from './ActionedByTableCell'\nimport TableCellCopyButton from './TableCellCopyButton'\nimport { OnChangeFilters } from '../../../hooks/useInfiniteScrollDataLoad'\nimport { FormStoreElementsContext } from '../OneBlinkFormStoreProvider'\nimport getVersionedFormTableState, { FormTableState } from './getVersionedState'\n\nconst defaultColumn = {\n minSize: 150,\n size: 225,\n}\n\nconst localStorageKey = (formId: number) =>\n `REACT_TABLE_STATE_FORM_STORE_${formId}`\n\nexport default function useFormStoreTable({\n form,\n formStoreRecords,\n parameters,\n onChangeParameters,\n onRefresh,\n submissionIdValidationMessage,\n}: {\n formStoreRecords: SubmissionTypes.FormStoreRecord[]\n form: FormTypes.Form\n parameters: formStoreService.FormStoreParameters\n onChangeParameters: OnChangeFilters<formStoreService.FormStoreParameters>\n onRefresh: () => void\n submissionIdValidationMessage?: string\n}) {\n // Resets parameters on form change\n React.useEffect(() => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: undefined,\n sorting: [\n {\n property: 'dateTimeSubmitted',\n direction: 'descending',\n },\n ],\n }),\n false,\n )\n }, [form, onChangeParameters])\n\n const formElements = React.useContext(FormStoreElementsContext)\n const columns = React.useMemo(() => {\n return generateColumns<SubmissionTypes.FormStoreRecord>({\n sorting: parameters.sorting,\n filters: parameters.filters,\n unwindRepeatableSets: parameters.unwindRepeatableSets,\n formElements,\n parentElementNames: [],\n onChangeParameters,\n allowCopy: true,\n initialColumns: [\n {\n id: 'COMPLETED_AT',\n header: 'Completion Date Time',\n meta: {\n sorting: {\n property: 'dateTimeCompleted',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'dateTimeCompleted',\n )?.direction,\n },\n filter: {\n type: 'DATETIME',\n value: parameters.filters?.dateTimeCompleted as\n | { $gte?: string; $lte?: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n dateTimeCompleted: newValue,\n },\n }),\n false,\n )\n },\n },\n },\n\n cell: ({ row: { original: formStoreRecord } }) => {\n if (!formStoreRecord.dateTimeCompleted) {\n return null\n }\n const text = format(\n new Date(formStoreRecord.dateTimeCompleted),\n localisationService.getDateFnsFormats().longDateTime,\n )\n return (\n <>\n {text}\n <TableCellCopyButton text={text} />\n </>\n )\n },\n },\n {\n id: 'SUBMITTED_AT',\n header: 'Submission Date Time',\n meta: {\n sorting: {\n property: 'dateTimeSubmitted',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'dateTimeSubmitted',\n )?.direction,\n },\n filter: {\n type: 'DATETIME',\n value: parameters.filters?.dateTimeSubmitted as\n | { $gte?: string; $lte?: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n dateTimeSubmitted: newValue,\n },\n }),\n false,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => {\n const text = format(\n new Date(formStoreRecord.dateTimeSubmitted),\n localisationService.getDateFnsFormats().longDateTime,\n )\n return (\n <>\n {text}\n <TableCellCopyButton text={text} />\n </>\n )\n },\n },\n {\n id: 'SUBMITTED_BY',\n header: 'Submitted By',\n meta: {\n sorting: undefined,\n filter: {\n type: 'TEXT',\n value: parameters.filters?.submittedBy as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n submittedBy: newValue,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <ActionedByTableCell\n userProfile={formStoreRecord.user}\n developerKey={formStoreRecord.key}\n variant=\"outlined\"\n />\n ),\n },\n {\n id: 'SUBMISSION_ID',\n header: 'Submission Id',\n meta: {\n sorting: undefined,\n filter: {\n type: 'SUBMISSION_ID',\n value: parameters.filters?.submissionId as\n | { $eq: string }\n | undefined,\n validationMessage: submissionIdValidationMessage,\n isInvalid: !!submissionIdValidationMessage,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n submissionId: newValue,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.submissionId}\n <TableCellCopyButton text={formStoreRecord.submissionId} />\n </>\n ),\n },\n {\n id: 'EXTERNAL_ID',\n header: 'External Id',\n meta: {\n sorting: {\n property: 'externalId',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'externalId',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.externalId as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n externalId: newValue,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.externalId}\n {formStoreRecord.externalId && (\n <TableCellCopyButton text={formStoreRecord.externalId} />\n )}\n </>\n ),\n },\n {\n id: 'TASK_GROUP',\n header: 'Task Group',\n meta: {\n sorting: {\n property: 'taskGroup.name',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'taskGroup.name',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.taskGroup?.name as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n taskGroup: newValue\n ? {\n name: newValue,\n }\n : undefined,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.taskGroup?.name}\n {formStoreRecord.taskGroup?.name && (\n <TableCellCopyButton text={formStoreRecord.taskGroup?.name} />\n )}\n </>\n ),\n },\n {\n id: 'TASK_GROUP_INSTANCE',\n header: 'Task Group Instance',\n meta: {\n sorting: {\n property: 'taskGroupInstance.label',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'taskGroupInstance.label',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.taskGroupInstance?.label as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n taskGroupInstance: newValue\n ? {\n label: newValue,\n }\n : undefined,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.taskGroupInstance?.label}\n {formStoreRecord.taskGroupInstance?.label && (\n <TableCellCopyButton\n text={formStoreRecord.taskGroupInstance?.label}\n />\n )}\n </>\n ),\n },\n {\n id: 'TASK',\n header: 'Task',\n meta: {\n sorting: {\n property: 'task.name',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'task.name',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.task?.name as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n task: newValue\n ? {\n name: newValue,\n }\n : undefined,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.task?.name}\n {formStoreRecord.task?.name && (\n <TableCellCopyButton text={formStoreRecord.task?.name} />\n )}\n </>\n ),\n },\n {\n id: 'TASK_ACTION',\n header: 'Task Action',\n meta: {\n sorting: {\n property: 'taskAction.label',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'taskAction.label',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.taskAction?.label as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n taskAction: newValue\n ? {\n label: newValue,\n }\n : undefined,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.taskAction?.label}\n {formStoreRecord.taskAction?.label && (\n <TableCellCopyButton text={formStoreRecord.taskAction?.label} />\n )}\n </>\n ),\n },\n ],\n })\n }, [\n formElements,\n onChangeParameters,\n parameters,\n submissionIdValidationMessage,\n ])\n\n const [initialState] = React.useState<FormTableState | undefined>(() => {\n const text = localStorage.getItem(localStorageKey(form.id))\n return getVersionedFormTableState(\n text\n ? JSON.parse(text)\n : {\n formId: form.id,\n },\n )\n })\n\n const transformedSorting = React.useMemo(() => {\n return parameters.sorting?.reduce<SortingState>(\n (memo, { property, direction }) => {\n const column = columns.find(\n (column) => column.meta?.sorting?.property === property,\n )\n if (column?.id) {\n memo.push({\n id: column.id,\n desc: direction === 'descending',\n })\n }\n return memo\n },\n [],\n )\n }, [parameters.sorting, columns])\n\n const onSortingChange: OnChangeFn<SortingState> = React.useCallback(\n (updaterOrValue) => {\n const sortingState =\n typeof updaterOrValue === 'function'\n ? updaterOrValue(\n // transform the parameters sorting state to the tanstack sorting state\n parameters.sorting?.reduce<SortingState>(\n (memo, { property, direction }) => {\n const column = columns.find(\n (column) => column.meta?.sorting?.property === property,\n )\n if (column?.id) {\n memo.push({\n id: column.id,\n desc: direction === 'descending',\n })\n }\n return memo\n },\n [],\n ) ?? [],\n )\n : updaterOrValue\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n // transform the tanstack sorting state to the parameters sorting state\n sorting: sortingState.reduce<\n NonNullable<formStoreService.FormStoreParameters['sorting']>\n >((memo, { id, desc }) => {\n const column = columns.find((column) => column.id === id)\n if (column?.meta?.sorting?.property) {\n memo.push({\n property: column.meta.sorting.property,\n direction: desc ? 'descending' : 'ascending',\n })\n }\n return memo\n }, []),\n }),\n false,\n )\n },\n [onChangeParameters, parameters.sorting, columns],\n )\n\n const [columnVisibility, setColumnVisibility] =\n React.useState<VisibilityState>(initialState?.columnVisibility || {})\n\n // eslint-disable-next-line react-hooks/incompatible-library\n const table = useReactTable({\n meta: {\n defaultHiddenColumnsVersion: initialState?.defaultHiddenColumnsVersion,\n formId: form.id,\n },\n columns,\n columnResizeMode: 'onChange',\n data: formStoreRecords,\n defaultColumn,\n state: {\n sorting: transformedSorting,\n columnVisibility,\n },\n onColumnVisibilityChange: setColumnVisibility,\n onSortingChange,\n manualFiltering: true,\n initialState,\n getCoreRowModel: getCoreRowModel<SubmissionTypes.FormStoreRecord>(),\n })\n\n const state = table.getState()\n\n React.useEffect(() => {\n if (table.options.meta?.formId !== form.id) {\n // If the form id changes, do not save the state from the previous form over the that of the new form\n return\n }\n if (!state.columnSizing.isResizingColumn) {\n const storageKey = localStorageKey(form.id)\n const augmentedState = {\n ...state,\n hiddenColumns: Object.keys(state.columnVisibility),\n formId: table.options.meta?.formId,\n }\n localStorage.setItem(storageKey, JSON.stringify(augmentedState))\n }\n }, [form.id, state, table.options.meta?.formId])\n\n return {\n ...table,\n form,\n parameters,\n onChangeParameters,\n onRefresh,\n submissionIdValidationMessage,\n } as const\n}\n"]}
1
+ {"version":3,"file":"useFormStoreTable.js","sourceRoot":"","sources":["../../../../src/components/formStore/table/useFormStoreTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { formStoreService, localisationService } from '../../../apps'\nimport {\n useReactTable,\n getCoreRowModel,\n OnChangeFn,\n SortingState,\n VisibilityState,\n} from '@tanstack/react-table'\nimport { format } from 'date-fns'\nimport generateColumns from './generateColumns'\nimport ActionedByTableCell from './ActionedByTableCell'\nimport TableCellCopyButton from './TableCellCopyButton'\nimport { OnChangeFilters } from '../../../hooks/useInfiniteScrollDataLoad'\nimport { FormStoreElementsContext } from '../OneBlinkFormStoreProvider'\nimport getVersionedFormTableState, { FormTableState } from './getVersionedState'\n\nconst defaultColumn = {\n minSize: 150,\n size: 225,\n}\n\nconst localStorageKey = (formId: number) =>\n `REACT_TABLE_STATE_FORM_STORE_${formId}`\n\nexport default function useFormStoreTable({\n form,\n formStoreRecords,\n parameters,\n onChangeParameters,\n onRefresh,\n submissionIdValidationMessage,\n}: {\n formStoreRecords: SubmissionTypes.FormStoreRecord[]\n form: FormTypes.Form\n parameters: formStoreService.FormStoreParameters\n onChangeParameters: OnChangeFilters<formStoreService.FormStoreParameters>\n onRefresh: () => void\n submissionIdValidationMessage?: string\n}) {\n // Resets parameters on form change\n React.useEffect(() => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: undefined,\n sorting: [\n {\n property: 'dateTimeSubmitted',\n direction: 'descending',\n },\n ],\n }),\n false,\n )\n }, [form, onChangeParameters])\n\n const formElements = React.useContext(FormStoreElementsContext)\n const columns = React.useMemo(() => {\n return generateColumns<SubmissionTypes.FormStoreRecord>({\n sorting: parameters.sorting,\n filters: parameters.filters,\n unwindRepeatableSets: parameters.unwindRepeatableSets,\n formElements,\n parentElementNames: [],\n onChangeParameters,\n allowCopy: true,\n initialColumns: [\n {\n id: 'COMPLETED_AT',\n header: 'Completion Date Time',\n meta: {\n sorting: {\n property: 'dateTimeCompleted',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'dateTimeCompleted',\n )?.direction,\n },\n filter: {\n type: 'DATETIME',\n value: parameters.filters?.dateTimeCompleted as\n | { $gte?: string; $lte?: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n dateTimeCompleted: newValue,\n },\n }),\n false,\n )\n },\n },\n },\n\n cell: ({ row: { original: formStoreRecord } }) => {\n if (!formStoreRecord.dateTimeCompleted) {\n return null\n }\n const text = format(\n new Date(formStoreRecord.dateTimeCompleted),\n localisationService.getDateFnsFormats().longDateTime,\n )\n return (\n <>\n {text}\n <TableCellCopyButton text={text} />\n </>\n )\n },\n },\n {\n id: 'SUBMITTED_AT',\n header: 'Submission Date Time',\n meta: {\n sorting: {\n property: 'dateTimeSubmitted',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'dateTimeSubmitted',\n )?.direction,\n },\n filter: {\n type: 'DATETIME',\n value: parameters.filters?.dateTimeSubmitted as\n | { $gte?: string; $lte?: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n dateTimeSubmitted: newValue,\n },\n }),\n false,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => {\n const text = format(\n new Date(formStoreRecord.dateTimeSubmitted),\n localisationService.getDateFnsFormats().longDateTime,\n )\n return (\n <>\n {text}\n <TableCellCopyButton text={text} />\n </>\n )\n },\n },\n {\n id: 'SUBMITTED_BY',\n header: 'Submitted By',\n meta: {\n sorting: undefined,\n filter: {\n type: 'TEXT',\n value: parameters.filters?.submittedBy as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n submittedBy: newValue,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <ActionedByTableCell\n userProfile={formStoreRecord.user}\n developerKey={formStoreRecord.key}\n variant=\"outlined\"\n />\n ),\n },\n {\n id: 'SUBMISSION_ID',\n header: 'Submission Id',\n meta: {\n sorting: undefined,\n filter: {\n type: 'SUBMISSION_ID',\n value: parameters.filters?.submissionId as\n | { $eq: string }\n | undefined,\n validationMessage: submissionIdValidationMessage,\n isInvalid: !!submissionIdValidationMessage,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n submissionId: newValue,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.submissionId}\n <TableCellCopyButton text={formStoreRecord.submissionId} />\n </>\n ),\n },\n {\n id: 'EXTERNAL_ID',\n header: 'External Id',\n meta: {\n sorting: {\n property: 'externalId',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'externalId',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.externalId as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n externalId: newValue,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.externalId}\n {formStoreRecord.externalId && (\n <TableCellCopyButton text={formStoreRecord.externalId} />\n )}\n </>\n ),\n },\n {\n id: 'TASK_GROUP',\n header: 'Task Group',\n meta: {\n sorting: {\n property: 'taskGroup.name',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'taskGroup.name',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.taskGroup?.name as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n taskGroup: newValue\n ? {\n name: newValue,\n }\n : undefined,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.taskGroup?.name}\n {formStoreRecord.taskGroup?.name && (\n <TableCellCopyButton text={formStoreRecord.taskGroup?.name} />\n )}\n </>\n ),\n },\n {\n id: 'TASK_GROUP_INSTANCE',\n header: 'Task Group Instance',\n meta: {\n sorting: {\n property: 'taskGroupInstance.label',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'taskGroupInstance.label',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.taskGroupInstance?.label as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n taskGroupInstance: newValue\n ? {\n label: newValue,\n }\n : undefined,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.taskGroupInstance?.label}\n {formStoreRecord.taskGroupInstance?.label && (\n <TableCellCopyButton\n text={formStoreRecord.taskGroupInstance?.label}\n />\n )}\n </>\n ),\n },\n {\n id: 'TASK',\n header: 'Task',\n meta: {\n sorting: {\n property: 'task.name',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'task.name',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.task?.name as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n task: newValue\n ? {\n name: newValue,\n }\n : undefined,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.task?.name}\n {formStoreRecord.task?.name && (\n <TableCellCopyButton text={formStoreRecord.task?.name} />\n )}\n </>\n ),\n },\n {\n id: 'TASK_ACTION',\n header: 'Task Action',\n meta: {\n sorting: {\n property: 'taskAction.label',\n direction: parameters.sorting?.find(\n ({ property }) => property === 'taskAction.label',\n )?.direction,\n },\n filter: {\n type: 'TEXT',\n value: parameters.filters?.taskAction?.label as\n | { $regex: string }\n | undefined,\n onChange: (newValue) => {\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n filters: {\n ...currentParameters.filters,\n taskAction: newValue\n ? {\n label: newValue,\n }\n : undefined,\n },\n }),\n true,\n )\n },\n },\n },\n cell: ({ row: { original: formStoreRecord } }) => (\n <>\n {formStoreRecord.taskAction?.label}\n {formStoreRecord.taskAction?.label && (\n <TableCellCopyButton text={formStoreRecord.taskAction?.label} />\n )}\n </>\n ),\n },\n ],\n })\n }, [\n formElements,\n onChangeParameters,\n parameters,\n submissionIdValidationMessage,\n ])\n\n const [initialState] = React.useState<FormTableState | undefined>(() => {\n const text = localStorage.getItem(localStorageKey(form.id))\n return getVersionedFormTableState(\n text\n ? JSON.parse(text)\n : {\n formId: form.id,\n },\n )\n })\n\n const transformedSorting = React.useMemo(() => {\n return parameters.sorting?.reduce<SortingState>(\n (memo, { property, direction }) => {\n const column = columns.find(\n (column) => column.meta?.sorting?.property === property,\n )\n if (column?.id) {\n memo.push({\n id: column.id,\n desc: direction === 'descending',\n })\n }\n return memo\n },\n [],\n )\n }, [parameters.sorting, columns])\n\n const onSortingChange: OnChangeFn<SortingState> = React.useCallback(\n (updaterOrValue) => {\n const sortingState =\n typeof updaterOrValue === 'function'\n ? updaterOrValue(\n // transform the parameters sorting state to the tanstack sorting state\n parameters.sorting?.reduce<SortingState>(\n (memo, { property, direction }) => {\n const column = columns.find(\n (column) => column.meta?.sorting?.property === property,\n )\n if (column?.id) {\n memo.push({\n id: column.id,\n desc: direction === 'descending',\n })\n }\n return memo\n },\n [],\n ) ?? [],\n )\n : updaterOrValue\n onChangeParameters(\n (currentParameters) => ({\n ...currentParameters,\n // transform the tanstack sorting state to the parameters sorting state\n sorting: sortingState.reduce<\n NonNullable<formStoreService.FormStoreParameters['sorting']>\n >((memo, { id, desc }) => {\n const column = columns.find((column) => column.id === id)\n if (column?.meta?.sorting?.property) {\n memo.push({\n property: column.meta.sorting.property,\n direction: desc ? 'descending' : 'ascending',\n })\n }\n return memo\n }, []),\n }),\n false,\n )\n },\n [onChangeParameters, parameters.sorting, columns],\n )\n\n const [columnVisibility, setColumnVisibility] =\n React.useState<VisibilityState>(initialState?.columnVisibility || {})\n\n // eslint-disable-next-line react-hooks/incompatible-library\n const table = useReactTable({\n meta: {\n defaultHiddenColumnsVersion: initialState?.defaultHiddenColumnsVersion,\n formId: form.id,\n },\n columns,\n columnResizeMode: 'onChange',\n data: formStoreRecords,\n defaultColumn,\n state: {\n sorting: transformedSorting,\n columnVisibility,\n },\n onColumnVisibilityChange: setColumnVisibility,\n onSortingChange,\n manualFiltering: true,\n initialState,\n getCoreRowModel: getCoreRowModel<SubmissionTypes.FormStoreRecord>(),\n })\n\n const state = table.getState()\n\n React.useEffect(() => {\n if (table.options.meta?.formId !== form.id) {\n // If the form id changes, do not save the state from the previous form over the that of the new form\n return\n }\n if (!state.columnSizing.isResizingColumn) {\n const storageKey = localStorageKey(form.id)\n const augmentedState = {\n ...state,\n hiddenColumns: Object.entries(state.columnVisibility)\n .filter(([, isVisible]) => !isVisible)\n .map(([column]) => column),\n formId: table.options.meta?.formId,\n }\n localStorage.setItem(storageKey, JSON.stringify(augmentedState))\n }\n }, [form.id, state, table.options.meta?.formId])\n\n return {\n ...table,\n form,\n parameters,\n onChangeParameters,\n onRefresh,\n submissionIdValidationMessage,\n } as const\n}\n"]}
@@ -1,12 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import { FormTypes } from '@oneblink/types';
3
- declare function FormElementLabelContainer({ className, element, id, required, children, leading, }: {
3
+ declare function FormElementLabelContainer({ className, element, id, required, children, leading, associateLabelWithInput, }: {
4
4
  className: string;
5
5
  element: FormTypes.FormElementBase;
6
6
  id: string;
7
7
  required: boolean;
8
8
  children: React.ReactNode;
9
9
  leading?: React.ReactNode;
10
+ /** When false, render the title as a span (no htmlFor), e.g. repeatable sets with no single control. */
11
+ associateLabelWithInput?: boolean;
10
12
  }): import("react/jsx-runtime").JSX.Element;
11
13
  export declare function HintTooltip({ hint, inputId, }: {
12
14
  hint: string;
@@ -4,10 +4,12 @@ import Tooltip from './Tooltip';
4
4
  import clsx from 'clsx';
5
5
  import useReplaceableText from '../../hooks/useReplaceableText';
6
6
  import QuillHTML from '../QuillHTML';
7
- function FormElementLabelContainer({ className, element, id, required, children, leading, }) {
8
- return (_jsxs("div", { className: clsx('ob-form__element', className), children: [_jsxs("div", { className: "label ob-label__container", children: [leading, _jsx("label", { className: clsx('ob-label', {
9
- 'ob-label__required is-required': required,
10
- }), htmlFor: id, id: `${id}-label`, children: element.label }), element.hint &&
7
+ function FormElementLabelContainer({ className, element, id, required, children, leading, associateLabelWithInput = true, }) {
8
+ const labelId = `${id}-label`;
9
+ const labelClassName = clsx('ob-label', {
10
+ 'ob-label__required is-required': required,
11
+ });
12
+ return (_jsxs("div", { className: clsx('ob-form__element', className), children: [_jsxs("div", { className: "label ob-label__container", children: [leading, associateLabelWithInput ? (_jsx("label", { className: labelClassName, htmlFor: id, id: labelId, children: element.label })) : (_jsx("span", { className: labelClassName, id: labelId, children: element.label })), element.hint &&
11
13
  (element.hintPosition === 'TOOLTIP' || !element.hintPosition) && (_jsx(HintTooltip, { hint: element.hint, inputId: id }))] }), element.hint && element.hintPosition === 'BELOW_LABEL' && (_jsx("div", { className: "ob-hint-text__container", children: _jsx(HintBelowLabel, { hint: element.hint, inputId: id }) })), children] }));
12
14
  }
13
15
  export function HintTooltip({ hint, inputId, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementLabelContainer.js","sourceRoot":"","sources":["../../../src/components/renderer/FormElementLabelContainer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,OAAO,MAAM,WAAW,CAAA;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,kBAAkB,MAAM,gCAAgC,CAAA;AAC/D,OAAO,SAAS,MAAM,cAAc,CAAA;AAEpC,SAAS,yBAAyB,CAAC,EACjC,SAAS,EACT,OAAO,EACP,EAAE,EACF,QAAQ,EACR,QAAQ,EACR,OAAO,GAQR;IACC,OAAO,CACL,eAAK,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,aACjD,eAAK,SAAS,EAAC,2BAA2B,aACvC,OAAO,EACR,gBACE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE;4BAC1B,gCAAgC,EAAE,QAAQ;yBAC3C,CAAC,EACF,OAAO,EAAE,EAAE,EACX,EAAE,EAAE,GAAG,EAAE,QAAQ,YAEhB,OAAO,CAAC,KAAK,GACR,EACP,OAAO,CAAC,IAAI;wBACX,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAC/D,KAAC,WAAW,IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAI,CACjD,IACC,EACL,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,YAAY,KAAK,aAAa,IAAI,CACzD,cAAK,SAAS,EAAC,yBAAyB,YACtC,KAAC,cAAc,IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAI,GAC/C,CACP,EACA,QAAQ,IACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,OAAO,GAIR;IACC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAErC,OAAO,CACL,KAAC,OAAO,IACN,KAAK,EAAE,KAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,iBAAiB,GAAG,EAC5D,KAAK,QACL,eAAe,EAAE,CAAC,EAClB,eAAe,EAAE,KAAK,EACtB,EAAE,EAAE,GAAG,OAAO,OAAO,YAGrB,YACE,SAAS,EAAC,6CAA6C,EACvD,IAAI,EAAC,SAAS,gBACH,kBAAkB,qBAG3B,GACI,CACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAC7B,IAAI,EACJ,OAAO,GAIR;IACC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAErC,OAAO,CACL,KAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,cAAc,EAAC,EAAE,EAAE,GAAG,OAAO,OAAO,GAAI,CAC1E,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport Tooltip from './Tooltip'\nimport clsx from 'clsx'\nimport { FormTypes } from '@oneblink/types'\nimport useReplaceableText from '../../hooks/useReplaceableText'\nimport QuillHTML from '../QuillHTML'\n\nfunction FormElementLabelContainer({\n className,\n element,\n id,\n required,\n children,\n leading,\n}: {\n className: string\n element: FormTypes.FormElementBase\n id: string\n required: boolean\n children: React.ReactNode\n leading?: React.ReactNode\n}) {\n return (\n <div className={clsx('ob-form__element', className)}>\n <div className=\"label ob-label__container\">\n {leading}\n <label\n className={clsx('ob-label', {\n 'ob-label__required is-required': required,\n })}\n htmlFor={id}\n id={`${id}-label`}\n >\n {element.label}\n </label>\n {element.hint &&\n (element.hintPosition === 'TOOLTIP' || !element.hintPosition) && (\n <HintTooltip hint={element.hint} inputId={id} />\n )}\n </div>\n {element.hint && element.hintPosition === 'BELOW_LABEL' && (\n <div className=\"ob-hint-text__container\">\n <HintBelowLabel hint={element.hint} inputId={id} />\n </div>\n )}\n {children}\n </div>\n )\n}\n\nexport function HintTooltip({\n hint,\n inputId,\n}: {\n hint: string\n inputId: string\n}) {\n const html = useReplaceableText(hint)\n\n return (\n <Tooltip\n title={<QuillHTML html={html} className=\"ob-hint-tooltip\" />}\n arrow\n enterTouchDelay={0}\n leaveTouchDelay={10000}\n id={`${inputId}-hint`}\n >\n {/* Tooltip does not work with the MaterialIcon component - it must remain an i tag*/}\n <i\n className=\"material-icons has-text-grey ob-label__hint\"\n role=\"tooltip\"\n aria-label=\"More information\"\n >\n info\n </i>\n </Tooltip>\n )\n}\n\nexport function HintBelowLabel({\n hint,\n inputId,\n}: {\n hint: string\n inputId: string\n}) {\n const html = useReplaceableText(hint)\n\n return (\n <QuillHTML html={html} className=\"ob-hint-text\" id={`${inputId}-hint`} />\n )\n}\n\nexport default React.memo(FormElementLabelContainer)\n"]}
1
+ {"version":3,"file":"FormElementLabelContainer.js","sourceRoot":"","sources":["../../../src/components/renderer/FormElementLabelContainer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,OAAO,MAAM,WAAW,CAAA;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,kBAAkB,MAAM,gCAAgC,CAAA;AAC/D,OAAO,SAAS,MAAM,cAAc,CAAA;AAEpC,SAAS,yBAAyB,CAAC,EACjC,SAAS,EACT,OAAO,EACP,EAAE,EACF,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,uBAAuB,GAAG,IAAI,GAU/B;IACC,MAAM,OAAO,GAAG,GAAG,EAAE,QAAQ,CAAA;IAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE;QACtC,gCAAgC,EAAE,QAAQ;KAC3C,CAAC,CAAA;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,aACjD,eAAK,SAAS,EAAC,2BAA2B,aACvC,OAAO,EACP,uBAAuB,CAAC,CAAC,CAAC,CACzB,gBAAO,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,YACvD,OAAO,CAAC,KAAK,GACR,CACT,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE,OAAO,YACzC,OAAO,CAAC,KAAK,GACT,CACR,EACA,OAAO,CAAC,IAAI;wBACX,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAC/D,KAAC,WAAW,IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAI,CACjD,IACC,EACL,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,YAAY,KAAK,aAAa,IAAI,CACzD,cAAK,SAAS,EAAC,yBAAyB,YACtC,KAAC,cAAc,IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAI,GAC/C,CACP,EACA,QAAQ,IACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,OAAO,GAIR;IACC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAErC,OAAO,CACL,KAAC,OAAO,IACN,KAAK,EAAE,KAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,iBAAiB,GAAG,EAC5D,KAAK,QACL,eAAe,EAAE,CAAC,EAClB,eAAe,EAAE,KAAK,EACtB,EAAE,EAAE,GAAG,OAAO,OAAO,YAGrB,YACE,SAAS,EAAC,6CAA6C,EACvD,IAAI,EAAC,SAAS,gBACH,kBAAkB,qBAG3B,GACI,CACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAC7B,IAAI,EACJ,OAAO,GAIR;IACC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAErC,OAAO,CACL,KAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,cAAc,EAAC,EAAE,EAAE,GAAG,OAAO,OAAO,GAAI,CAC1E,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport Tooltip from './Tooltip'\nimport clsx from 'clsx'\nimport { FormTypes } from '@oneblink/types'\nimport useReplaceableText from '../../hooks/useReplaceableText'\nimport QuillHTML from '../QuillHTML'\n\nfunction FormElementLabelContainer({\n className,\n element,\n id,\n required,\n children,\n leading,\n associateLabelWithInput = true,\n}: {\n className: string\n element: FormTypes.FormElementBase\n id: string\n required: boolean\n children: React.ReactNode\n leading?: React.ReactNode\n /** When false, render the title as a span (no htmlFor), e.g. repeatable sets with no single control. */\n associateLabelWithInput?: boolean\n}) {\n const labelId = `${id}-label`\n const labelClassName = clsx('ob-label', {\n 'ob-label__required is-required': required,\n })\n\n return (\n <div className={clsx('ob-form__element', className)}>\n <div className=\"label ob-label__container\">\n {leading}\n {associateLabelWithInput ? (\n <label className={labelClassName} htmlFor={id} id={labelId}>\n {element.label}\n </label>\n ) : (\n <span className={labelClassName} id={labelId}>\n {element.label}\n </span>\n )}\n {element.hint &&\n (element.hintPosition === 'TOOLTIP' || !element.hintPosition) && (\n <HintTooltip hint={element.hint} inputId={id} />\n )}\n </div>\n {element.hint && element.hintPosition === 'BELOW_LABEL' && (\n <div className=\"ob-hint-text__container\">\n <HintBelowLabel hint={element.hint} inputId={id} />\n </div>\n )}\n {children}\n </div>\n )\n}\n\nexport function HintTooltip({\n hint,\n inputId,\n}: {\n hint: string\n inputId: string\n}) {\n const html = useReplaceableText(hint)\n\n return (\n <Tooltip\n title={<QuillHTML html={html} className=\"ob-hint-tooltip\" />}\n arrow\n enterTouchDelay={0}\n leaveTouchDelay={10000}\n id={`${inputId}-hint`}\n >\n {/* Tooltip does not work with the MaterialIcon component - it must remain an i tag*/}\n <i\n className=\"material-icons has-text-grey ob-label__hint\"\n role=\"tooltip\"\n aria-label=\"More information\"\n >\n info\n </i>\n </Tooltip>\n )\n}\n\nexport function HintBelowLabel({\n hint,\n inputId,\n}: {\n hint: string\n inputId: string\n}) {\n const html = useReplaceableText(hint)\n\n return (\n <QuillHTML html={html} className=\"ob-hint-text\" id={`${inputId}-hint`} />\n )\n}\n\nexport default React.memo(FormElementLabelContainer)\n"]}
@@ -207,11 +207,11 @@ function FormElementRepeatableSet({ formId, element, value, formElementValidatio
207
207
  return 'single-add-button';
208
208
  }
209
209
  }, [element.layout]);
210
- return (_jsx("div", { className: clsx('cypress-repeatable-set-element', validationClassName), "aria-labelledby": `${id}-label`, "aria-describedby": ariaDescribedby, role: "region", children: _jsxs(FormElementLabelContainer, { className: clsx('ob-repeatable-set', isEven ? 'even' : 'odd', repeatableSetContainerClass), element: element, id: id, required: !!minSetEntries && minSetEntries > 0, children: [element.layout === 'MULTIPLE_ADD_BUTTONS' && showAddButton && (_jsx(AddButton, { onAdd: () => handleAddEntry(0), element: element, id: id, classes: ['ob-button-repeatable-set-layout__multiple-add-buttons'] })), entries.map((entry, index) => {
210
+ return (_jsx("div", { className: clsx('cypress-repeatable-set-element', validationClassName), "aria-labelledby": `${id}-label`, "aria-describedby": ariaDescribedby, role: "region", children: _jsxs(FormElementLabelContainer, { className: clsx('ob-repeatable-set', isEven ? 'even' : 'odd', repeatableSetContainerClass), element: element, id: id, required: !!minSetEntries && minSetEntries > 0, associateLabelWithInput: false, children: [element.layout === 'MULTIPLE_ADD_BUTTONS' && showAddButton && (_jsx(AddButton, { onAdd: () => handleAddEntry(0), element: element, classes: ['ob-button-repeatable-set-layout__multiple-add-buttons'] })), entries.map((entry, index) => {
211
211
  return (_jsx(RepeatableSetEntry, { formId: formId, index: index, id: id, isEven: isEven, entry: entry, element: element, showAddButton: element.layout === 'MULTIPLE_ADD_BUTTONS' && showAddButton, onChange: handleNestedChange, onLookup: onLookup, onAdd: handleAddEntry, onRemove: handleRemoveEntry, formElementsConditionallyShown: repeatableSetEntriesConditionallyShown[index.toString()], formElementsValidation: repeatableSetValidation &&
212
212
  repeatableSetValidation.entries[index.toString()], displayValidationMessages: displayValidationMessage, onUpdateFormElements: onUpdateFormElements, sectionState: sectionState }, entry[ENTRY_ID_PROPERTY_NAME]));
213
213
  }), (!element.layout || element.layout === 'SINGLE_ADD_BUTTON') &&
214
- showAddButton && (_jsx(AddButton, { onAdd: () => handleAddEntry(entries.length), element: element, id: id })), (isDirty || displayValidationMessage) &&
214
+ showAddButton && (_jsx(AddButton, { onAdd: () => handleAddEntry(entries.length), element: element })), (isDirty || displayValidationMessage) &&
215
215
  !!repeatableSetValidation &&
216
216
  !!repeatableSetValidation.set && (_jsx(FormElementValidationMessage, { message: repeatableSetValidation.set }))] }) }));
217
217
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementRepeatableSet.js","sourceRoot":"","sources":["../../src/form-elements/FormElementRepeatableSet.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport useBooleanState from '../hooks/useBooleanState'\nimport generateDefaultData, {\n ENTRY_ID_PROPERTY_NAME,\n generateNewRepeatableSetEntry,\n} from '../services/generate-default-data'\nimport OneBlinkFormElements from '../components/renderer/OneBlinkFormElements'\nimport Modal from '../components/renderer/Modal'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport useValidationClass from '../hooks/useValidationClass'\nimport {\n ExecutedLookups,\n FormElementConditionallyShown,\n FormElementLookupHandler,\n FormElementsConditionallyShown,\n FormElementsValidation,\n FormElementValidation,\n NestedFormElementValueChangeHandler,\n IsDirtyProps,\n UpdateFormElementsHandler,\n SectionState,\n} from '../types/form'\nimport useFormElementRepeatableSetEntries from '../hooks/useFormElementRepeatableSetEntries'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport MaterialIcon from '../components/MaterialIcon'\nimport ElementDOMId from '../utils/elementDOMIds'\nimport { Collapse } from '@mui/material'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\ntype Props = {\n formId: number\n id: string\n isEven: boolean\n element: FormTypes.RepeatableSetElement\n value: Array<SubmissionTypes.S3SubmissionData['submission']> | undefined\n onChange: NestedFormElementValueChangeHandler<\n SubmissionTypes.S3SubmissionData['submission'][]\n >\n onLookup: FormElementLookupHandler\n formElementConditionallyShown: FormElementConditionallyShown | undefined\n formElementValidation: FormElementValidation | undefined\n displayValidationMessage: boolean\n onUpdateFormElements: UpdateFormElementsHandler\n sectionState: SectionState\n} & IsDirtyProps\n\nconst RepeatableSetIndexContext = React.createContext<number>(0)\n\nfunction RepeatableSetEntryProvider({\n index,\n isAnimated,\n element,\n idPrefix,\n onRemove,\n children,\n}: {\n isAnimated: boolean\n index: number\n element: FormTypes.RepeatableSetElement\n idPrefix?: string\n onRemove: (\n index: number,\n element: FormTypes.RepeatableSetElement,\n idPrefix?: string,\n ) => void\n children: (renderProps: { onRemove: () => void }) => React.ReactNode\n}) {\n const [isExpanded, setIsExpanded] = React.useState(true)\n\n const handleRemove = React.useCallback(() => {\n if (isAnimated) {\n setIsExpanded(false)\n } else {\n onRemove(index, element, idPrefix)\n }\n }, [index, isAnimated, onRemove, element, idPrefix])\n\n const node = (\n <RepeatableSetIndexContext.Provider value={index}>\n {children({\n onRemove: handleRemove,\n })}\n </RepeatableSetIndexContext.Provider>\n )\n\n if (!isAnimated) {\n return node\n }\n\n return (\n <Collapse\n in={isExpanded}\n appear\n onExited={() => {\n onRemove(index, element, idPrefix)\n }}\n classes={{\n root: 'ob-repeatable-set__collapsible',\n wrapper: 'ob-repeatable-set__collapsible-wrapper',\n wrapperInner: 'ob-repeatable-set__collapsible-wrapper-inner',\n }}\n >\n {node}\n </Collapse>\n )\n}\n\nexport function useRepeatableSetIndexText(text: string) {\n const index = React.useContext(RepeatableSetIndexContext)\n return React.useMemo(\n () => text.replace('{INDEX}', (index + 1).toString()),\n [index, text],\n )\n}\n\nfunction FormElementRepeatableSet({\n formId,\n element,\n value,\n formElementValidation,\n id,\n isEven,\n displayValidationMessage,\n formElementConditionallyShown,\n onChange,\n onLookup,\n onUpdateFormElements,\n isDirty,\n setIsDirty,\n sectionState,\n}: Props) {\n const entries = React.useMemo(\n () => (Array.isArray(value) ? value : []),\n [value],\n )\n\n const handleAddEntry = React.useCallback(\n (index: number) => {\n onChange(element, {\n value: (existingEntries) => {\n const newEntries = [...(existingEntries || [])]\n const entry = generateDefaultData(\n element.elements,\n generateNewRepeatableSetEntry(),\n )\n\n newEntries.splice(index, 0, entry)\n return newEntries\n },\n executedLookups: (existingExecutedLookups) => {\n if (\n existingExecutedLookups !== undefined &&\n !Array.isArray(existingExecutedLookups)\n ) {\n return []\n }\n\n const newExistingExecutedLookups = [\n ...((existingExecutedLookups as ExecutedLookups[]) ??\n Array.from(Array(entries.length))),\n ]\n newExistingExecutedLookups.push({})\n return newExistingExecutedLookups\n },\n sectionState: (currentSectionState) => {\n return (\n currentSectionState?.map((section) => {\n const idPrefixPattern = new RegExp(\n `(.+)?${element.name}_entry-(.+)_(.+)`,\n )\n const entryIdPrefixMatches = section.id.match(idPrefixPattern)\n\n if (entryIdPrefixMatches) {\n const startOfId = entryIdPrefixMatches[1]\n const entryIndex = parseInt(entryIdPrefixMatches[2])\n const restOfId = entryIdPrefixMatches[3]\n\n if (entryIndex >= index) {\n const newEntryIndex = entryIndex + 1\n section.id = `${startOfId ? startOfId : ''}${element.name}_entry-${newEntryIndex}_${restOfId}`\n }\n }\n\n return section\n }, []) || []\n )\n },\n })\n setIsDirty()\n },\n [element, onChange, setIsDirty, entries.length],\n )\n\n const handleRemoveEntry = React.useCallback(\n (\n index: number,\n element: FormTypes.RepeatableSetElement,\n idPrefix?: string,\n ) => {\n const entryIdPrefix = idPrefix || ''\n\n onChange(element, {\n value: (existingEntries) => {\n const newEntries = [...(existingEntries || [])]\n newEntries.splice(index, 1)\n return newEntries\n },\n executedLookups: (existingExecutedLookups) => {\n if (!Array.isArray(existingExecutedLookups)) {\n return []\n }\n const newExistingExecutedLookups = [...existingExecutedLookups]\n\n newExistingExecutedLookups.splice(index, 1)\n return newExistingExecutedLookups\n },\n sectionState: (currentSectionState) => {\n return (\n currentSectionState?.reduce(\n (\n state: {\n id: string\n state: 'COLLAPSED' | 'EXPANDED'\n }[],\n section,\n ) => {\n const idPrefixPattern = new RegExp(\n `(.+)?${element.name}_entry-(\\\\d+)`,\n )\n const entryIdPrefixMatches =\n entryIdPrefix.match(idPrefixPattern)\n if (\n !section.id.startsWith(entryIdPrefix) &&\n entryIdPrefixMatches\n ) {\n const parentElementPath =\n entryIdPrefixMatches[1] || `${element.name}_entry`\n // only update nested sections where the parent path matches the entry that was removed\n if (section.id.startsWith(parentElementPath)) {\n // Match pattern: {elementName}_entry-{index}_\n // also yields a prefix and suffix for any match found\n const idPrefixWithFullIdPattern = new RegExp(\n `(.+)?${element.name}_entry-(\\\\d+)_(.+)`,\n )\n const match = section.id.match(idPrefixWithFullIdPattern)\n\n if (match) {\n const oldEntryIndex = parseInt(match[2], 10)\n if (oldEntryIndex > index) {\n const prefix = match[1]\n const restOfId = match[3]\n const newEntryIndex = oldEntryIndex - 1\n section.id = `${prefix ? prefix : ''}${element.name}_entry-${newEntryIndex}_${restOfId}`\n }\n }\n }\n\n state.push(section)\n }\n\n return state\n },\n [],\n ) || []\n )\n },\n })\n setIsDirty()\n },\n [onChange, setIsDirty],\n )\n\n const handleNestedChange = React.useCallback(\n (\n index: number,\n nestedElement: FormTypes.FormElement,\n {\n value,\n executedLookups,\n sectionState,\n }: Parameters<NestedFormElementValueChangeHandler>[1],\n idPrefix?: string,\n ) => {\n if (nestedElement.type === 'section') {\n // trigger onChange to update sectionState\n onChange(\n {\n ...nestedElement,\n id: idPrefix ? `${idPrefix}${nestedElement.id}` : nestedElement.id,\n },\n { executedLookups: undefined, sectionState },\n )\n }\n if (!('name' in nestedElement)) {\n return\n }\n onChange(element, {\n value: (existingEntries) => {\n const newEntries = (existingEntries || []).map((entry, i) => {\n if (i === index) {\n return {\n ...entry,\n [nestedElement.name]:\n typeof value === 'function'\n ? value(entry[nestedElement.name])\n : value,\n }\n } else {\n return entry\n }\n })\n return newEntries\n },\n executedLookups: (existingExecutedLookups) => {\n const elementExecutedLookups = existingExecutedLookups ?? []\n if (!Array.isArray(elementExecutedLookups)) {\n return elementExecutedLookups\n }\n const newExecutedLookups = elementExecutedLookups.map(\n (executedLookup, i) => {\n if (i === index) {\n const updatedExecutedLookups =\n typeof executedLookups === 'function'\n ? executedLookups(executedLookup?.[nestedElement.name])\n : executedLookups\n return {\n ...executedLookup,\n [nestedElement.name]: updatedExecutedLookups,\n }\n }\n return executedLookup\n },\n )\n return newExecutedLookups\n },\n sectionState,\n })\n },\n [element, onChange],\n )\n\n const { minSetEntries, maxSetEntries } =\n useFormElementRepeatableSetEntries(element)\n\n const repeatableSetValidation = React.useMemo(\n () =>\n !formElementValidation ||\n typeof formElementValidation === 'string' ||\n formElementValidation.type !== 'repeatableSet'\n ? undefined\n : formElementValidation,\n [formElementValidation],\n )\n\n const repeatableSetEntriesConditionallyShown =\n formElementConditionallyShown &&\n formElementConditionallyShown.type === 'repeatableSet'\n ? formElementConditionallyShown.entries\n : {}\n\n const { validationClassName } = useValidationClass({\n formElementsValid: !repeatableSetValidation,\n displayInvalidClassName: isDirty || displayValidationMessage,\n validClassName: 'ob-repeatable-set-element__valid',\n invalidClassName: 'ob-repeatable-set-element__invalid',\n })\n\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n\n const showAddButton = React.useMemo(\n () => !maxSetEntries || entries.length < maxSetEntries,\n [maxSetEntries, entries.length],\n )\n\n const repeatableSetContainerClass = React.useMemo(() => {\n const prefix = 'ob-repeatable-set-container-layout__'\n switch (element.layout) {\n case 'MULTIPLE_ADD_BUTTONS':\n return prefix + 'multiple-add-buttons'\n default:\n return 'single-add-button'\n }\n }, [element.layout])\n\n return (\n <div\n className={clsx('cypress-repeatable-set-element', validationClassName)}\n aria-labelledby={`${id}-label`}\n aria-describedby={ariaDescribedby}\n role=\"region\"\n >\n {/* */}\n <FormElementLabelContainer\n className={clsx(\n 'ob-repeatable-set',\n isEven ? 'even' : 'odd',\n repeatableSetContainerClass,\n )}\n element={element}\n id={id}\n required={!!minSetEntries && minSetEntries > 0}\n >\n {element.layout === 'MULTIPLE_ADD_BUTTONS' && showAddButton && (\n <AddButton\n onAdd={() => handleAddEntry(0)}\n element={element}\n id={id}\n classes={['ob-button-repeatable-set-layout__multiple-add-buttons']}\n />\n )}\n {entries.map((entry, index) => {\n return (\n <RepeatableSetEntry\n key={entry[ENTRY_ID_PROPERTY_NAME] as string}\n formId={formId}\n index={index}\n id={id}\n isEven={isEven}\n entry={entry}\n element={element}\n showAddButton={\n element.layout === 'MULTIPLE_ADD_BUTTONS' && showAddButton\n }\n onChange={handleNestedChange}\n onLookup={onLookup}\n onAdd={handleAddEntry}\n onRemove={handleRemoveEntry}\n formElementsConditionallyShown={\n repeatableSetEntriesConditionallyShown[index.toString()]\n }\n formElementsValidation={\n repeatableSetValidation &&\n repeatableSetValidation.entries[index.toString()]\n }\n displayValidationMessages={displayValidationMessage}\n onUpdateFormElements={onUpdateFormElements}\n sectionState={sectionState}\n />\n )\n })}\n {(!element.layout || element.layout === 'SINGLE_ADD_BUTTON') &&\n showAddButton && (\n <AddButton\n onAdd={() => handleAddEntry(entries.length)}\n element={element}\n id={id}\n />\n )}\n {(isDirty || displayValidationMessage) &&\n !!repeatableSetValidation &&\n !!repeatableSetValidation.set && (\n <FormElementValidationMessage\n message={repeatableSetValidation.set}\n />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementRepeatableSet)\n\ntype RepeatableSetEntryProps = {\n formId: number\n id: string\n index: number\n isEven: boolean\n entry: SubmissionTypes.S3SubmissionData['submission']\n element: FormTypes.RepeatableSetElement\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined\n formElementsValidation: FormElementsValidation | undefined\n displayValidationMessages: boolean\n showAddButton: boolean\n onChange: (\n index: number,\n formElement: FormTypes.FormElement,\n {\n value,\n executedLookups,\n }: Parameters<NestedFormElementValueChangeHandler>[1],\n idPrefix?: string,\n ) => void\n onLookup: FormElementLookupHandler\n onAdd: (index: number) => unknown\n onRemove: (\n index: number,\n element: FormTypes.RepeatableSetElement,\n idPrefix?: string,\n ) => unknown\n onUpdateFormElements: UpdateFormElementsHandler\n sectionState: SectionState\n}\n\nconst RepeatableSetEntry = React.memo<RepeatableSetEntryProps>(\n function RepeatableSetEntry({\n formId,\n id,\n index,\n isEven,\n entry,\n element,\n formElementsConditionallyShown,\n displayValidationMessages,\n formElementsValidation,\n onChange,\n onLookup,\n onAdd,\n onRemove,\n onUpdateFormElements,\n showAddButton,\n sectionState,\n }: RepeatableSetEntryProps) {\n const [isConfirmingRemove, confirmRemove, cancelRemove] =\n useBooleanState(false)\n const elementDOMId = React.useMemo(() => new ElementDOMId(id), [id])\n\n const handleChange: NestedFormElementValueChangeHandler = React.useCallback(\n (nestedElement, { value, executedLookups, sectionState }, idPrefix) => {\n onChange(\n index,\n nestedElement,\n {\n value,\n executedLookups,\n sectionState,\n },\n idPrefix,\n )\n },\n [index, onChange],\n )\n\n const handleLookup = React.useCallback<FormElementLookupHandler>(\n (mergeLookupResults) => {\n onLookup((currentFormSubmission) => {\n let newEntry = {}\n const entries = currentFormSubmission.submission[\n element.name\n ] as Array<SubmissionTypes.S3SubmissionData['submission']>\n const repeatableSetExecutedLookups =\n (currentFormSubmission.executedLookups?.[\n element.name\n ] as ExecutedLookups[]) ?? Array.from(Array(entries.length))\n // if the repeatable set is prefilled or has minimum entries then executed lookups exists,\n // but is an empty array\n for (let i = 0; i < entries.length; i++) {\n if (!repeatableSetExecutedLookups[index]) {\n repeatableSetExecutedLookups[index] = {}\n }\n }\n let newExecutedLookups: ExecutedLookups = {}\n const elements = currentFormSubmission.elements.map((formElement) => {\n if (\n formElement.type === 'repeatableSet' &&\n formElement.name === element.name\n ) {\n const { elements, submission, executedLookups } =\n mergeLookupResults({\n elements: formElement.elements,\n submission: entries[index],\n lastElementUpdated: currentFormSubmission.lastElementUpdated,\n executedLookups: repeatableSetExecutedLookups[index] ?? {},\n sectionState: currentFormSubmission.sectionState,\n })\n newEntry = submission\n newExecutedLookups = executedLookups as ExecutedLookups\n return {\n ...formElement,\n elements,\n }\n }\n return formElement\n })\n\n const submission = {\n ...currentFormSubmission.submission,\n [element.name]: entries.map((entry, i) => {\n if (i === index) {\n return newEntry\n }\n return entry\n }),\n }\n\n let updatedExecutedLookups = currentFormSubmission.executedLookups\n if (Array.isArray(repeatableSetExecutedLookups)) {\n updatedExecutedLookups = {\n ...currentFormSubmission.executedLookups,\n [element.name]: repeatableSetExecutedLookups.map((entry, i) => {\n if (i == index) {\n return newExecutedLookups\n }\n return entry\n }),\n }\n }\n\n return {\n elements,\n submission,\n executedLookups: updatedExecutedLookups,\n }\n })\n },\n [element.name, index, onLookup],\n )\n\n const { validationClassName } = useValidationClass({\n formElementsValid: !formElementsValidation,\n displayInvalidClassName: displayValidationMessages,\n validClassName: 'ob-repeatable-set__valid',\n invalidClassName: 'ob-repeatable-set__invalid',\n })\n\n const handleUpdateNestedFormElements =\n React.useCallback<UpdateFormElementsHandler>(\n (setter) => {\n onUpdateFormElements((formElements) => {\n return formElements.map((formElement) => {\n if (\n formElement.id === element.id &&\n formElement.type === 'repeatableSet'\n ) {\n return {\n ...formElement,\n elements: setter(formElement.elements),\n }\n }\n return formElement\n })\n })\n },\n [element.id, onUpdateFormElements],\n )\n\n const idPrefix = elementDOMId.repeatableSetEntryDOMIdPrefix(\n index.toString(),\n )\n\n return (\n <RepeatableSetEntryProvider\n index={index}\n element={element}\n idPrefix={idPrefix}\n onRemove={onRemove}\n isAnimated={element.layout === 'MULTIPLE_ADD_BUTTONS'}\n >\n {({ onRemove }) => (\n <>\n <Modal\n isOpen={isConfirmingRemove}\n className=\"cypress-repeatable-set-prompt\"\n titleClassName=\"cypress-repeatable-set-remove-entry-header\"\n title={element.removeSetEntryLabel || 'Remove Entry'}\n actions={\n <>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-cancel-repeatable-set\"\n onClick={cancelRemove}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-confirm-repeatable-set\"\n onClick={() => {\n cancelRemove()\n onRemove()\n }}\n autoFocus\n >\n Yes\n </button>\n </>\n }\n >\n Are you sure you want to remove this entry?\n </Modal>\n\n <div\n className={clsx(\n 'ob-repeatable-set__container cypress-repeatable-set-container',\n validationClassName,\n )}\n >\n {(!element.layout || element.layout === 'SINGLE_ADD_BUTTON') && (\n <RemoveButton\n onConfirmRemove={confirmRemove}\n element={element}\n className=\"ob-repeatable-set__button-remove-top\"\n index={index}\n />\n )}\n\n <OneBlinkFormElements\n formId={formId}\n idPrefix={idPrefix}\n isEven={isEven}\n formElementsValidation={formElementsValidation}\n displayValidationMessages={displayValidationMessages}\n elements={element.elements}\n onChange={handleChange}\n onLookup={handleLookup}\n model={entry}\n parentElement={element}\n formElementsConditionallyShown={formElementsConditionallyShown}\n onUpdateFormElements={handleUpdateNestedFormElements}\n sectionState={sectionState}\n />\n {element.layout === 'MULTIPLE_ADD_BUTTONS' && (\n <RemoveButton\n onConfirmRemove={confirmRemove}\n element={element}\n index={index}\n className=\"ob-repeatable-set__button-remove-bottom\"\n />\n )}\n </div>\n {showAddButton && (\n <AddButton\n onAdd={() => onAdd(index + 1)}\n element={element}\n classes={[\n 'ob-button-repeatable-set-layout__multiple-add-buttons',\n ]}\n />\n )}\n </>\n )}\n </RepeatableSetEntryProvider>\n )\n },\n)\n\nfunction AddButton({\n id,\n onAdd,\n element,\n classes,\n}: {\n id?: string\n onAdd: () => void\n element: FormTypes.RepeatableSetElement\n isPrimary?: boolean\n classes?: string[]\n}) {\n return (\n <button\n type=\"button\"\n className={clsx(\n 'button ob-button ob-button__add cypress-add-repeatable-set is-primary',\n classes,\n )}\n onClick={onAdd}\n disabled={element.readOnly}\n aria-label={element.addSetEntryLabel ? undefined : 'Add Entry'}\n id={id}\n >\n <span className=\"icon\">\n <MaterialIcon>add</MaterialIcon>\n </span>\n {!!element.addSetEntryLabel && <span>{element.addSetEntryLabel}</span>}\n </button>\n )\n}\n\nfunction RemoveButton({\n onConfirmRemove,\n element,\n className,\n index,\n}: {\n onConfirmRemove: () => void\n element: FormTypes.RepeatableSetElement\n className?: string\n index: number\n}) {\n return (\n <button\n type=\"button\"\n className={clsx(\n 'button ob-button ob-button_remove is-light cypress-remove-repeatable-set-entry',\n className,\n )}\n onClick={onConfirmRemove}\n disabled={element.readOnly}\n aria-label={`${element.removeSetEntryLabel ?? 'Remove Entry'} ${index + 1}`}\n >\n <span className=\"icon\">\n <MaterialIcon>delete_outline</MaterialIcon>\n </span>\n {!!element.removeSetEntryLabel && (\n <span>{element.removeSetEntryLabel}</span>\n )}\n </button>\n )\n}\n"]}
1
+ {"version":3,"file":"FormElementRepeatableSet.js","sourceRoot":"","sources":["../../src/form-elements/FormElementRepeatableSet.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\nimport { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport useBooleanState from '../hooks/useBooleanState'\nimport generateDefaultData, {\n ENTRY_ID_PROPERTY_NAME,\n generateNewRepeatableSetEntry,\n} from '../services/generate-default-data'\nimport OneBlinkFormElements from '../components/renderer/OneBlinkFormElements'\nimport Modal from '../components/renderer/Modal'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport useValidationClass from '../hooks/useValidationClass'\nimport {\n ExecutedLookups,\n FormElementConditionallyShown,\n FormElementLookupHandler,\n FormElementsConditionallyShown,\n FormElementsValidation,\n FormElementValidation,\n NestedFormElementValueChangeHandler,\n IsDirtyProps,\n UpdateFormElementsHandler,\n SectionState,\n} from '../types/form'\nimport useFormElementRepeatableSetEntries from '../hooks/useFormElementRepeatableSetEntries'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport MaterialIcon from '../components/MaterialIcon'\nimport ElementDOMId from '../utils/elementDOMIds'\nimport { Collapse } from '@mui/material'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\n\ntype Props = {\n formId: number\n id: string\n isEven: boolean\n element: FormTypes.RepeatableSetElement\n value: Array<SubmissionTypes.S3SubmissionData['submission']> | undefined\n onChange: NestedFormElementValueChangeHandler<\n SubmissionTypes.S3SubmissionData['submission'][]\n >\n onLookup: FormElementLookupHandler\n formElementConditionallyShown: FormElementConditionallyShown | undefined\n formElementValidation: FormElementValidation | undefined\n displayValidationMessage: boolean\n onUpdateFormElements: UpdateFormElementsHandler\n sectionState: SectionState\n} & IsDirtyProps\n\nconst RepeatableSetIndexContext = React.createContext<number>(0)\n\nfunction RepeatableSetEntryProvider({\n index,\n isAnimated,\n element,\n idPrefix,\n onRemove,\n children,\n}: {\n isAnimated: boolean\n index: number\n element: FormTypes.RepeatableSetElement\n idPrefix?: string\n onRemove: (\n index: number,\n element: FormTypes.RepeatableSetElement,\n idPrefix?: string,\n ) => void\n children: (renderProps: { onRemove: () => void }) => React.ReactNode\n}) {\n const [isExpanded, setIsExpanded] = React.useState(true)\n\n const handleRemove = React.useCallback(() => {\n if (isAnimated) {\n setIsExpanded(false)\n } else {\n onRemove(index, element, idPrefix)\n }\n }, [index, isAnimated, onRemove, element, idPrefix])\n\n const node = (\n <RepeatableSetIndexContext.Provider value={index}>\n {children({\n onRemove: handleRemove,\n })}\n </RepeatableSetIndexContext.Provider>\n )\n\n if (!isAnimated) {\n return node\n }\n\n return (\n <Collapse\n in={isExpanded}\n appear\n onExited={() => {\n onRemove(index, element, idPrefix)\n }}\n classes={{\n root: 'ob-repeatable-set__collapsible',\n wrapper: 'ob-repeatable-set__collapsible-wrapper',\n wrapperInner: 'ob-repeatable-set__collapsible-wrapper-inner',\n }}\n >\n {node}\n </Collapse>\n )\n}\n\nexport function useRepeatableSetIndexText(text: string) {\n const index = React.useContext(RepeatableSetIndexContext)\n return React.useMemo(\n () => text.replace('{INDEX}', (index + 1).toString()),\n [index, text],\n )\n}\n\nfunction FormElementRepeatableSet({\n formId,\n element,\n value,\n formElementValidation,\n id,\n isEven,\n displayValidationMessage,\n formElementConditionallyShown,\n onChange,\n onLookup,\n onUpdateFormElements,\n isDirty,\n setIsDirty,\n sectionState,\n}: Props) {\n const entries = React.useMemo(\n () => (Array.isArray(value) ? value : []),\n [value],\n )\n\n const handleAddEntry = React.useCallback(\n (index: number) => {\n onChange(element, {\n value: (existingEntries) => {\n const newEntries = [...(existingEntries || [])]\n const entry = generateDefaultData(\n element.elements,\n generateNewRepeatableSetEntry(),\n )\n\n newEntries.splice(index, 0, entry)\n return newEntries\n },\n executedLookups: (existingExecutedLookups) => {\n if (\n existingExecutedLookups !== undefined &&\n !Array.isArray(existingExecutedLookups)\n ) {\n return []\n }\n\n const newExistingExecutedLookups = [\n ...((existingExecutedLookups as ExecutedLookups[]) ??\n Array.from(Array(entries.length))),\n ]\n newExistingExecutedLookups.push({})\n return newExistingExecutedLookups\n },\n sectionState: (currentSectionState) => {\n return (\n currentSectionState?.map((section) => {\n const idPrefixPattern = new RegExp(\n `(.+)?${element.name}_entry-(.+)_(.+)`,\n )\n const entryIdPrefixMatches = section.id.match(idPrefixPattern)\n\n if (entryIdPrefixMatches) {\n const startOfId = entryIdPrefixMatches[1]\n const entryIndex = parseInt(entryIdPrefixMatches[2])\n const restOfId = entryIdPrefixMatches[3]\n\n if (entryIndex >= index) {\n const newEntryIndex = entryIndex + 1\n section.id = `${startOfId ? startOfId : ''}${element.name}_entry-${newEntryIndex}_${restOfId}`\n }\n }\n\n return section\n }, []) || []\n )\n },\n })\n setIsDirty()\n },\n [element, onChange, setIsDirty, entries.length],\n )\n\n const handleRemoveEntry = React.useCallback(\n (\n index: number,\n element: FormTypes.RepeatableSetElement,\n idPrefix?: string,\n ) => {\n const entryIdPrefix = idPrefix || ''\n\n onChange(element, {\n value: (existingEntries) => {\n const newEntries = [...(existingEntries || [])]\n newEntries.splice(index, 1)\n return newEntries\n },\n executedLookups: (existingExecutedLookups) => {\n if (!Array.isArray(existingExecutedLookups)) {\n return []\n }\n const newExistingExecutedLookups = [...existingExecutedLookups]\n\n newExistingExecutedLookups.splice(index, 1)\n return newExistingExecutedLookups\n },\n sectionState: (currentSectionState) => {\n return (\n currentSectionState?.reduce(\n (\n state: {\n id: string\n state: 'COLLAPSED' | 'EXPANDED'\n }[],\n section,\n ) => {\n const idPrefixPattern = new RegExp(\n `(.+)?${element.name}_entry-(\\\\d+)`,\n )\n const entryIdPrefixMatches =\n entryIdPrefix.match(idPrefixPattern)\n if (\n !section.id.startsWith(entryIdPrefix) &&\n entryIdPrefixMatches\n ) {\n const parentElementPath =\n entryIdPrefixMatches[1] || `${element.name}_entry`\n // only update nested sections where the parent path matches the entry that was removed\n if (section.id.startsWith(parentElementPath)) {\n // Match pattern: {elementName}_entry-{index}_\n // also yields a prefix and suffix for any match found\n const idPrefixWithFullIdPattern = new RegExp(\n `(.+)?${element.name}_entry-(\\\\d+)_(.+)`,\n )\n const match = section.id.match(idPrefixWithFullIdPattern)\n\n if (match) {\n const oldEntryIndex = parseInt(match[2], 10)\n if (oldEntryIndex > index) {\n const prefix = match[1]\n const restOfId = match[3]\n const newEntryIndex = oldEntryIndex - 1\n section.id = `${prefix ? prefix : ''}${element.name}_entry-${newEntryIndex}_${restOfId}`\n }\n }\n }\n\n state.push(section)\n }\n\n return state\n },\n [],\n ) || []\n )\n },\n })\n setIsDirty()\n },\n [onChange, setIsDirty],\n )\n\n const handleNestedChange = React.useCallback(\n (\n index: number,\n nestedElement: FormTypes.FormElement,\n {\n value,\n executedLookups,\n sectionState,\n }: Parameters<NestedFormElementValueChangeHandler>[1],\n idPrefix?: string,\n ) => {\n if (nestedElement.type === 'section') {\n // trigger onChange to update sectionState\n onChange(\n {\n ...nestedElement,\n id: idPrefix ? `${idPrefix}${nestedElement.id}` : nestedElement.id,\n },\n { executedLookups: undefined, sectionState },\n )\n }\n if (!('name' in nestedElement)) {\n return\n }\n onChange(element, {\n value: (existingEntries) => {\n const newEntries = (existingEntries || []).map((entry, i) => {\n if (i === index) {\n return {\n ...entry,\n [nestedElement.name]:\n typeof value === 'function'\n ? value(entry[nestedElement.name])\n : value,\n }\n } else {\n return entry\n }\n })\n return newEntries\n },\n executedLookups: (existingExecutedLookups) => {\n const elementExecutedLookups = existingExecutedLookups ?? []\n if (!Array.isArray(elementExecutedLookups)) {\n return elementExecutedLookups\n }\n const newExecutedLookups = elementExecutedLookups.map(\n (executedLookup, i) => {\n if (i === index) {\n const updatedExecutedLookups =\n typeof executedLookups === 'function'\n ? executedLookups(executedLookup?.[nestedElement.name])\n : executedLookups\n return {\n ...executedLookup,\n [nestedElement.name]: updatedExecutedLookups,\n }\n }\n return executedLookup\n },\n )\n return newExecutedLookups\n },\n sectionState,\n })\n },\n [element, onChange],\n )\n\n const { minSetEntries, maxSetEntries } =\n useFormElementRepeatableSetEntries(element)\n\n const repeatableSetValidation = React.useMemo(\n () =>\n !formElementValidation ||\n typeof formElementValidation === 'string' ||\n formElementValidation.type !== 'repeatableSet'\n ? undefined\n : formElementValidation,\n [formElementValidation],\n )\n\n const repeatableSetEntriesConditionallyShown =\n formElementConditionallyShown &&\n formElementConditionallyShown.type === 'repeatableSet'\n ? formElementConditionallyShown.entries\n : {}\n\n const { validationClassName } = useValidationClass({\n formElementsValid: !repeatableSetValidation,\n displayInvalidClassName: isDirty || displayValidationMessage,\n validClassName: 'ob-repeatable-set-element__valid',\n invalidClassName: 'ob-repeatable-set-element__invalid',\n })\n\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n\n const showAddButton = React.useMemo(\n () => !maxSetEntries || entries.length < maxSetEntries,\n [maxSetEntries, entries.length],\n )\n\n const repeatableSetContainerClass = React.useMemo(() => {\n const prefix = 'ob-repeatable-set-container-layout__'\n switch (element.layout) {\n case 'MULTIPLE_ADD_BUTTONS':\n return prefix + 'multiple-add-buttons'\n default:\n return 'single-add-button'\n }\n }, [element.layout])\n\n return (\n <div\n className={clsx('cypress-repeatable-set-element', validationClassName)}\n aria-labelledby={`${id}-label`}\n aria-describedby={ariaDescribedby}\n role=\"region\"\n >\n {/* */}\n <FormElementLabelContainer\n className={clsx(\n 'ob-repeatable-set',\n isEven ? 'even' : 'odd',\n repeatableSetContainerClass,\n )}\n element={element}\n id={id}\n required={!!minSetEntries && minSetEntries > 0}\n associateLabelWithInput={false}\n >\n {element.layout === 'MULTIPLE_ADD_BUTTONS' && showAddButton && (\n <AddButton\n onAdd={() => handleAddEntry(0)}\n element={element}\n classes={['ob-button-repeatable-set-layout__multiple-add-buttons']}\n />\n )}\n {entries.map((entry, index) => {\n return (\n <RepeatableSetEntry\n key={entry[ENTRY_ID_PROPERTY_NAME] as string}\n formId={formId}\n index={index}\n id={id}\n isEven={isEven}\n entry={entry}\n element={element}\n showAddButton={\n element.layout === 'MULTIPLE_ADD_BUTTONS' && showAddButton\n }\n onChange={handleNestedChange}\n onLookup={onLookup}\n onAdd={handleAddEntry}\n onRemove={handleRemoveEntry}\n formElementsConditionallyShown={\n repeatableSetEntriesConditionallyShown[index.toString()]\n }\n formElementsValidation={\n repeatableSetValidation &&\n repeatableSetValidation.entries[index.toString()]\n }\n displayValidationMessages={displayValidationMessage}\n onUpdateFormElements={onUpdateFormElements}\n sectionState={sectionState}\n />\n )\n })}\n {(!element.layout || element.layout === 'SINGLE_ADD_BUTTON') &&\n showAddButton && (\n <AddButton\n onAdd={() => handleAddEntry(entries.length)}\n element={element}\n />\n )}\n {(isDirty || displayValidationMessage) &&\n !!repeatableSetValidation &&\n !!repeatableSetValidation.set && (\n <FormElementValidationMessage\n message={repeatableSetValidation.set}\n />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementRepeatableSet)\n\ntype RepeatableSetEntryProps = {\n formId: number\n id: string\n index: number\n isEven: boolean\n entry: SubmissionTypes.S3SubmissionData['submission']\n element: FormTypes.RepeatableSetElement\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined\n formElementsValidation: FormElementsValidation | undefined\n displayValidationMessages: boolean\n showAddButton: boolean\n onChange: (\n index: number,\n formElement: FormTypes.FormElement,\n {\n value,\n executedLookups,\n }: Parameters<NestedFormElementValueChangeHandler>[1],\n idPrefix?: string,\n ) => void\n onLookup: FormElementLookupHandler\n onAdd: (index: number) => unknown\n onRemove: (\n index: number,\n element: FormTypes.RepeatableSetElement,\n idPrefix?: string,\n ) => unknown\n onUpdateFormElements: UpdateFormElementsHandler\n sectionState: SectionState\n}\n\nconst RepeatableSetEntry = React.memo<RepeatableSetEntryProps>(\n function RepeatableSetEntry({\n formId,\n id,\n index,\n isEven,\n entry,\n element,\n formElementsConditionallyShown,\n displayValidationMessages,\n formElementsValidation,\n onChange,\n onLookup,\n onAdd,\n onRemove,\n onUpdateFormElements,\n showAddButton,\n sectionState,\n }: RepeatableSetEntryProps) {\n const [isConfirmingRemove, confirmRemove, cancelRemove] =\n useBooleanState(false)\n const elementDOMId = React.useMemo(() => new ElementDOMId(id), [id])\n\n const handleChange: NestedFormElementValueChangeHandler = React.useCallback(\n (nestedElement, { value, executedLookups, sectionState }, idPrefix) => {\n onChange(\n index,\n nestedElement,\n {\n value,\n executedLookups,\n sectionState,\n },\n idPrefix,\n )\n },\n [index, onChange],\n )\n\n const handleLookup = React.useCallback<FormElementLookupHandler>(\n (mergeLookupResults) => {\n onLookup((currentFormSubmission) => {\n let newEntry = {}\n const entries = currentFormSubmission.submission[\n element.name\n ] as Array<SubmissionTypes.S3SubmissionData['submission']>\n const repeatableSetExecutedLookups =\n (currentFormSubmission.executedLookups?.[\n element.name\n ] as ExecutedLookups[]) ?? Array.from(Array(entries.length))\n // if the repeatable set is prefilled or has minimum entries then executed lookups exists,\n // but is an empty array\n for (let i = 0; i < entries.length; i++) {\n if (!repeatableSetExecutedLookups[index]) {\n repeatableSetExecutedLookups[index] = {}\n }\n }\n let newExecutedLookups: ExecutedLookups = {}\n const elements = currentFormSubmission.elements.map((formElement) => {\n if (\n formElement.type === 'repeatableSet' &&\n formElement.name === element.name\n ) {\n const { elements, submission, executedLookups } =\n mergeLookupResults({\n elements: formElement.elements,\n submission: entries[index],\n lastElementUpdated: currentFormSubmission.lastElementUpdated,\n executedLookups: repeatableSetExecutedLookups[index] ?? {},\n sectionState: currentFormSubmission.sectionState,\n })\n newEntry = submission\n newExecutedLookups = executedLookups as ExecutedLookups\n return {\n ...formElement,\n elements,\n }\n }\n return formElement\n })\n\n const submission = {\n ...currentFormSubmission.submission,\n [element.name]: entries.map((entry, i) => {\n if (i === index) {\n return newEntry\n }\n return entry\n }),\n }\n\n let updatedExecutedLookups = currentFormSubmission.executedLookups\n if (Array.isArray(repeatableSetExecutedLookups)) {\n updatedExecutedLookups = {\n ...currentFormSubmission.executedLookups,\n [element.name]: repeatableSetExecutedLookups.map((entry, i) => {\n if (i == index) {\n return newExecutedLookups\n }\n return entry\n }),\n }\n }\n\n return {\n elements,\n submission,\n executedLookups: updatedExecutedLookups,\n }\n })\n },\n [element.name, index, onLookup],\n )\n\n const { validationClassName } = useValidationClass({\n formElementsValid: !formElementsValidation,\n displayInvalidClassName: displayValidationMessages,\n validClassName: 'ob-repeatable-set__valid',\n invalidClassName: 'ob-repeatable-set__invalid',\n })\n\n const handleUpdateNestedFormElements =\n React.useCallback<UpdateFormElementsHandler>(\n (setter) => {\n onUpdateFormElements((formElements) => {\n return formElements.map((formElement) => {\n if (\n formElement.id === element.id &&\n formElement.type === 'repeatableSet'\n ) {\n return {\n ...formElement,\n elements: setter(formElement.elements),\n }\n }\n return formElement\n })\n })\n },\n [element.id, onUpdateFormElements],\n )\n\n const idPrefix = elementDOMId.repeatableSetEntryDOMIdPrefix(\n index.toString(),\n )\n\n return (\n <RepeatableSetEntryProvider\n index={index}\n element={element}\n idPrefix={idPrefix}\n onRemove={onRemove}\n isAnimated={element.layout === 'MULTIPLE_ADD_BUTTONS'}\n >\n {({ onRemove }) => (\n <>\n <Modal\n isOpen={isConfirmingRemove}\n className=\"cypress-repeatable-set-prompt\"\n titleClassName=\"cypress-repeatable-set-remove-entry-header\"\n title={element.removeSetEntryLabel || 'Remove Entry'}\n actions={\n <>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-cancel-repeatable-set\"\n onClick={cancelRemove}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-confirm-repeatable-set\"\n onClick={() => {\n cancelRemove()\n onRemove()\n }}\n autoFocus\n >\n Yes\n </button>\n </>\n }\n >\n Are you sure you want to remove this entry?\n </Modal>\n\n <div\n className={clsx(\n 'ob-repeatable-set__container cypress-repeatable-set-container',\n validationClassName,\n )}\n >\n {(!element.layout || element.layout === 'SINGLE_ADD_BUTTON') && (\n <RemoveButton\n onConfirmRemove={confirmRemove}\n element={element}\n className=\"ob-repeatable-set__button-remove-top\"\n index={index}\n />\n )}\n\n <OneBlinkFormElements\n formId={formId}\n idPrefix={idPrefix}\n isEven={isEven}\n formElementsValidation={formElementsValidation}\n displayValidationMessages={displayValidationMessages}\n elements={element.elements}\n onChange={handleChange}\n onLookup={handleLookup}\n model={entry}\n parentElement={element}\n formElementsConditionallyShown={formElementsConditionallyShown}\n onUpdateFormElements={handleUpdateNestedFormElements}\n sectionState={sectionState}\n />\n {element.layout === 'MULTIPLE_ADD_BUTTONS' && (\n <RemoveButton\n onConfirmRemove={confirmRemove}\n element={element}\n index={index}\n className=\"ob-repeatable-set__button-remove-bottom\"\n />\n )}\n </div>\n {showAddButton && (\n <AddButton\n onAdd={() => onAdd(index + 1)}\n element={element}\n classes={[\n 'ob-button-repeatable-set-layout__multiple-add-buttons',\n ]}\n />\n )}\n </>\n )}\n </RepeatableSetEntryProvider>\n )\n },\n)\n\nfunction AddButton({\n id,\n onAdd,\n element,\n classes,\n}: {\n id?: string\n onAdd: () => void\n element: FormTypes.RepeatableSetElement\n isPrimary?: boolean\n classes?: string[]\n}) {\n return (\n <button\n type=\"button\"\n className={clsx(\n 'button ob-button ob-button__add cypress-add-repeatable-set is-primary',\n classes,\n )}\n onClick={onAdd}\n disabled={element.readOnly}\n aria-label={element.addSetEntryLabel ? undefined : 'Add Entry'}\n id={id}\n >\n <span className=\"icon\">\n <MaterialIcon>add</MaterialIcon>\n </span>\n {!!element.addSetEntryLabel && <span>{element.addSetEntryLabel}</span>}\n </button>\n )\n}\n\nfunction RemoveButton({\n onConfirmRemove,\n element,\n className,\n index,\n}: {\n onConfirmRemove: () => void\n element: FormTypes.RepeatableSetElement\n className?: string\n index: number\n}) {\n return (\n <button\n type=\"button\"\n className={clsx(\n 'button ob-button ob-button_remove is-light cypress-remove-repeatable-set-entry',\n className,\n )}\n onClick={onConfirmRemove}\n disabled={element.readOnly}\n aria-label={`${element.removeSetEntryLabel ?? 'Remove Entry'} ${index + 1}`}\n >\n <span className=\"icon\">\n <MaterialIcon>delete_outline</MaterialIcon>\n </span>\n {!!element.removeSetEntryLabel && (\n <span>{element.removeSetEntryLabel}</span>\n )}\n </button>\n )\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneblink/apps-react",
3
3
  "description": "Helper functions for OneBlink apps in ReactJS.",
4
- "version": "10.0.1-alpha.1",
4
+ "version": "10.1.0-beta.2",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"
@@ -13,7 +13,7 @@
13
13
  "@emotion/styled": "^11.14.1",
14
14
  "@nylas/react": "^3.1.2",
15
15
  "@oneblink/sdk-core": "^9.1.0-beta.3",
16
- "@oneblink/storage": "^6.0.0-beta.1",
16
+ "@oneblink/storage": "^6.1.0-beta.1",
17
17
  "@react-google-maps/api": "^2.20.8",
18
18
  "@react-input/mask": "^2.0.4",
19
19
  "@sentry/browser": "^10.38.0",