diff --git a/src/replaceCustomValues.ts b/src/replaceCustomValues.ts index c8a198ba..e8974cd7 100644 --- a/src/replaceCustomValues.ts +++ b/src/replaceCustomValues.ts @@ -38,7 +38,7 @@ export type ReplaceInjectablesOptions = ReplaceInjectablesBaseOptions & { previousApprovalId: string | undefined } -const CUSTOM_VALUES = [ +const SUBMISSION_VALUES = [ { string: '{INFO_PAGE_ID}', value: ({ form }: ReplaceInjectablesOptions) => form.id.toString(), @@ -85,18 +85,27 @@ const CUSTOM_VALUES = [ value: ({ previousApprovalId }: ReplaceInjectablesOptions) => previousApprovalId || '', }, +] + +const ELEMENT_VALUES: Array<{ + string: string + value: (options: ReplaceInjectablesBaseOptions) => string +}> = [ + { + string: '{USER:email}', + value: ({ userProfile }) => userProfile?.email || '', + }, { string: '{TASK_NAME}', - value: ({ task }: ReplaceInjectablesOptions) => task?.name || '', + value: ({ task }) => task?.name || '', }, { string: '{TASK_GROUP_NAME}', - value: ({ taskGroup }: ReplaceInjectablesOptions) => taskGroup?.name || '', + value: ({ taskGroup }) => taskGroup?.name || '', }, { string: '{TASK_GROUP_INSTANCE_LABEL}', - value: ({ taskGroupInstance }: ReplaceInjectablesOptions) => - taskGroupInstance?.label || '', + value: ({ taskGroupInstance }) => taskGroupInstance?.label || '', }, ] @@ -328,15 +337,9 @@ export function replaceInjectablesWithElementValues( formElements: FormTypes.FormElement[] } & ReplaceInjectablesBaseOptions, ): string { - const keys: Array = ['email'] - // User based values should be replaced with an empty string if - // there is no user profile or if the property does not have a value - keys.forEach((key) => { - text = text.replaceAll( - `{USER:${key}}`, - options.userProfile?.[key]?.toString() || '', - ) - }) + text = ELEMENT_VALUES.reduce((newString, customValue) => { + return newString.replaceAll(customValue.string, customValue.value(options)) + }, text) const matchesElement = text.match(ElementWYSIWYGRegex) if (!matchesElement) { @@ -416,57 +419,13 @@ export function replaceInjectablesWithElementValues( */ export function replaceInjectablesWithSubmissionValues( text: string, - { - form, - submission, - externalId, - submissionId, - submissionTimestamp, - formatDate, - formatDateTime, - formatTime, - formatNumber, - formatCurrency, - previousApprovalId, - userProfile, - task, - taskGroup, - taskGroupInstance, - }: ReplaceInjectablesOptions, + options: ReplaceInjectablesOptions, ): string { const string = replaceInjectablesWithElementValues(text, { - formElements: form.elements, - submission, - formatDate, - formatDateTime, - formatTime, - formatNumber, - formatCurrency, - userProfile, - task, - taskGroup, - taskGroupInstance, + formElements: options.form.elements, + ...options, }) - return CUSTOM_VALUES.reduce((newString, customValue) => { - return newString.replaceAll( - customValue.string, - customValue.value({ - form, - submissionTimestamp, - externalId, - submissionId, - formatDate, - formatDateTime, - formatTime, - formatNumber, - formatCurrency, - previousApprovalId, - submission, - userProfile, - task, - taskGroup, - taskGroupInstance, - }), - ) + return SUBMISSION_VALUES.reduce((newString, customValue) => { + return newString.replaceAll(customValue.string, customValue.value(options)) }, string) } diff --git a/tests/submissionService.test.ts b/tests/submissionService.test.ts index d9d32b10..6d539b89 100644 --- a/tests/submissionService.test.ts +++ b/tests/submissionService.test.ts @@ -1,7 +1,41 @@ -import { FormTypes } from '@oneblink/types' -import { replaceInjectablesWithSubmissionValues } from '../src/submissionService' +import { FormTypes, ScheduledTasksTypes } from '@oneblink/types' +import { + replaceInjectablesWithElementValues, + replaceInjectablesWithSubmissionValues, +} from '../src/submissionService' describe('replaceInjectablesWithSubmissionValues()', () => { + const task: ScheduledTasksTypes.Task = { + id: 1, + name: 'Replace the food', + formsAppEnvironmentId: 1, + organisationId: 'string', + schedule: { + startDate: new Date().toISOString(), + endDate: new Date().toISOString(), + recurrence: { + interval: 'DAY', + }, + }, + actionIds: [], + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + } + const taskGroup: ScheduledTasksTypes.TaskGroup = { + id: 1, + name: 'Cage', + taskIds: [task.id], + formsAppEnvironmentId: task.formsAppEnvironmentId, + organisationId: task.organisationId, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + } + const taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance = { + taskGroupId: taskGroup.id, + taskGroupInstanceId: 'taskGroupInstanceId', + label: 'Snake Cage', + createdAt: new Date().toISOString(), + } const form: FormTypes.Form = { id: 1, name: 'string', @@ -84,6 +118,9 @@ describe('replaceInjectablesWithSubmissionValues()', () => { username: 'person1', email: 'person@email.com', }, + task, + taskGroup, + taskGroupInstance, } describe('Form redirect URL', () => { test('should replace all instances of {ELEMENT} with correct property value', () => { @@ -205,4 +242,30 @@ describe('replaceInjectablesWithSubmissionValues()', () => { 'person@email.com;autre_person@email.com;person@email.com', ) }) + + describe('task based props', () => { + const text = + 'Task: {TASK_NAME} | Task Group: {TASK_GROUP_NAME} | Task Group Instance: {TASK_GROUP_INSTANCE_LABEL}' + const expected = + 'Task: Replace the food | Task Group: Cage | Task Group Instance: Snake Cage' + + test('should be replaced for element values', () => { + const result = replaceInjectablesWithElementValues(text, { + ...baseOptions, + formElements: baseOptions.form.elements, + submission: {}, + }) + + expect(result).toEqual(expected) + }) + + test('should replace task based props', () => { + const result = replaceInjectablesWithSubmissionValues(text, { + ...baseOptions, + submission: {}, + }) + + expect(result).toEqual(expected) + }) + }) })