@oneblink/sdk-core 8.4.0-beta.2 → 8.5.0-beta.1
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.
|
@@ -11,6 +11,19 @@ export declare const RootElementRegex: RegExp;
|
|
|
11
11
|
* `"{ELEMENT:Parent_Name}"` and `"{ELEMENT:Children|Name}"`.
|
|
12
12
|
*/
|
|
13
13
|
export declare const NestedElementRegex: RegExp;
|
|
14
|
+
/**
|
|
15
|
+
* The regex used for matching `{ELEMENT_VALUE:<elementName>}` tags in the OneBlink
|
|
16
|
+
* platform. Ignores nested elements based on the '|' character. Will match
|
|
17
|
+
* `"{ELEMENT_VALUE:Parent_Name}"` but will NOT match `"{ELEMENT_VALUE:Children|Name}"`.
|
|
18
|
+
*/
|
|
19
|
+
export declare const RootSubmissionValueElementRegex: RegExp;
|
|
20
|
+
/**
|
|
21
|
+
* The regex used for matching `{ELEMENT_VALUE:<elementName>|<nestedElementName>}`
|
|
22
|
+
* tags in the OneBlink platform. Includes nested elements based on the '|'
|
|
23
|
+
* character. {ELEMENT_VALUE:Children|Name} would be matched. Will match
|
|
24
|
+
* `"{ELEMENT_VALUE:Parent_Name}"` and `"{ELEMENT_VALUE:Children|Name}"`.
|
|
25
|
+
*/
|
|
26
|
+
export declare const NestedSubmissionValueElementRegex: RegExp;
|
|
14
27
|
/**
|
|
15
28
|
* Takes a string and calls a provided handler function for each found instance
|
|
16
29
|
* of `{ELEMENT:<elementName>}` in the string. Used to replace values in
|
|
@@ -59,6 +72,8 @@ export declare function matchElementsTagRegex(options: string | {
|
|
|
59
72
|
* `{ELEMENT:Children|Name}`.
|
|
60
73
|
*/
|
|
61
74
|
excludeNestedElements: boolean;
|
|
75
|
+
/** Use the submission value instead of labels for elements with optionsets */
|
|
76
|
+
useSubmissionValue?: boolean;
|
|
62
77
|
}, matchHandler: (options: {
|
|
63
78
|
elementName: string;
|
|
64
79
|
elementMatch: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NestedElementRegex = exports.RootElementRegex = void 0;
|
|
3
|
+
exports.NestedSubmissionValueElementRegex = exports.RootSubmissionValueElementRegex = exports.NestedElementRegex = exports.RootElementRegex = void 0;
|
|
4
4
|
exports.matchElementsTagRegex = matchElementsTagRegex;
|
|
5
5
|
/**
|
|
6
6
|
* The regex used for matching `{ELEMENT:<elementName>}` tags in the OneBlink
|
|
@@ -15,6 +15,19 @@ exports.RootElementRegex = /({ELEMENT:)([^|}]+)(})/g;
|
|
|
15
15
|
* `"{ELEMENT:Parent_Name}"` and `"{ELEMENT:Children|Name}"`.
|
|
16
16
|
*/
|
|
17
17
|
exports.NestedElementRegex = /({ELEMENT:)([^}]+)(})/g;
|
|
18
|
+
/**
|
|
19
|
+
* The regex used for matching `{ELEMENT_VALUE:<elementName>}` tags in the OneBlink
|
|
20
|
+
* platform. Ignores nested elements based on the '|' character. Will match
|
|
21
|
+
* `"{ELEMENT_VALUE:Parent_Name}"` but will NOT match `"{ELEMENT_VALUE:Children|Name}"`.
|
|
22
|
+
*/
|
|
23
|
+
exports.RootSubmissionValueElementRegex = /({ELEMENT_VALUE:)([^|}]+)(})/g;
|
|
24
|
+
/**
|
|
25
|
+
* The regex used for matching `{ELEMENT_VALUE:<elementName>|<nestedElementName>}`
|
|
26
|
+
* tags in the OneBlink platform. Includes nested elements based on the '|'
|
|
27
|
+
* character. {ELEMENT_VALUE:Children|Name} would be matched. Will match
|
|
28
|
+
* `"{ELEMENT_VALUE:Parent_Name}"` and `"{ELEMENT_VALUE:Children|Name}"`.
|
|
29
|
+
*/
|
|
30
|
+
exports.NestedSubmissionValueElementRegex = /({ELEMENT_VALUE:)([^}]+)(})/g;
|
|
18
31
|
/**
|
|
19
32
|
* Takes a string and calls a provided handler function for each found instance
|
|
20
33
|
* of `{ELEMENT:<elementName>}` in the string. Used to replace values in
|
|
@@ -54,8 +67,16 @@ exports.NestedElementRegex = /({ELEMENT:)([^}]+)(})/g;
|
|
|
54
67
|
function matchElementsTagRegex(options, matchHandler) {
|
|
55
68
|
const text = typeof options === 'string' ? options : options.text;
|
|
56
69
|
const excludeNestedElements = typeof options !== 'string' && !!options.excludeNestedElements;
|
|
70
|
+
const useSubmissionValue = typeof options !== 'string' && !!options.useSubmissionValue;
|
|
57
71
|
let matches;
|
|
58
|
-
|
|
72
|
+
const rootRegex = useSubmissionValue
|
|
73
|
+
? exports.RootSubmissionValueElementRegex
|
|
74
|
+
: exports.RootElementRegex;
|
|
75
|
+
const nestedRegex = useSubmissionValue
|
|
76
|
+
? exports.NestedSubmissionValueElementRegex
|
|
77
|
+
: exports.NestedElementRegex;
|
|
78
|
+
while ((matches = (excludeNestedElements ? rootRegex : nestedRegex).exec(text)) !==
|
|
79
|
+
null) {
|
|
59
80
|
if ((matches === null || matches === void 0 ? void 0 : matches.length) < 3)
|
|
60
81
|
continue;
|
|
61
82
|
const elementName = matches[2];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-elements-regex.js","sourceRoot":"","sources":["../src/form-elements-regex.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"form-elements-regex.js","sourceRoot":"","sources":["../src/form-elements-regex.ts"],"names":[],"mappings":";;;AAgEA,sDA4CC;AA5GD;;;;GAIG;AACU,QAAA,gBAAgB,GAAG,yBAAyB,CAAA;AACzD;;;;;GAKG;AACU,QAAA,kBAAkB,GAAG,wBAAwB,CAAA;AAE1D;;;;GAIG;AACU,QAAA,+BAA+B,GAAG,+BAA+B,CAAA;AAC9E;;;;;GAKG;AACU,QAAA,iCAAiC,GAAG,8BAA8B,CAAA;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,SAAgB,qBAAqB,CACnC,OAgBK,EACL,YAGU;IAEV,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAA;IACjE,MAAM,qBAAqB,GACzB,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAA;IAChE,MAAM,kBAAkB,GACtB,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAA;IAC7D,IAAI,OAAO,CAAA;IACX,MAAM,SAAS,GAAG,kBAAkB;QAClC,CAAC,CAAC,uCAA+B;QACjC,CAAC,CAAC,wBAAgB,CAAA;IACpB,MAAM,WAAW,GAAG,kBAAkB;QACpC,CAAC,CAAC,yCAAiC;QACnC,CAAC,CAAC,0BAAkB,CAAA;IACtB,OACE,CAAC,OAAO,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,EACJ,CAAC;QACD,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,IAAG,CAAC;YAAE,SAAQ;QAEjC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QAC9B,YAAY,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACzD,CAAC;AACH,CAAC","sourcesContent":["/**\n * The regex used for matching `{ELEMENT:<elementName>}` tags in the OneBlink\n * platform. Ignores nested elements based on the '|' character. Will match\n * `\"{ELEMENT:Parent_Name}\"` but will NOT match `\"{ELEMENT:Children|Name}\"`.\n */\nexport const RootElementRegex = /({ELEMENT:)([^|}]+)(})/g\n/**\n * The regex used for matching `{ELEMENT:<elementName>|<nestedElementName>}`\n * tags in the OneBlink platform. Includes nested elements based on the '|'\n * character. {ELEMENT:Children|Name} would be matched. Will match\n * `\"{ELEMENT:Parent_Name}\"` and `\"{ELEMENT:Children|Name}\"`.\n */\nexport const NestedElementRegex = /({ELEMENT:)([^}]+)(})/g\n\n/**\n * The regex used for matching `{ELEMENT_VALUE:<elementName>}` tags in the OneBlink\n * platform. Ignores nested elements based on the '|' character. Will match\n * `\"{ELEMENT_VALUE:Parent_Name}\"` but will NOT match `\"{ELEMENT_VALUE:Children|Name}\"`.\n */\nexport const RootSubmissionValueElementRegex = /({ELEMENT_VALUE:)([^|}]+)(})/g\n/**\n * The regex used for matching `{ELEMENT_VALUE:<elementName>|<nestedElementName>}`\n * tags in the OneBlink platform. Includes nested elements based on the '|'\n * character. {ELEMENT_VALUE:Children|Name} would be matched. Will match\n * `\"{ELEMENT_VALUE:Parent_Name}\"` and `\"{ELEMENT_VALUE:Children|Name}\"`.\n */\nexport const NestedSubmissionValueElementRegex = /({ELEMENT_VALUE:)([^}]+)(})/g\n\n/**\n * Takes a string and calls a provided handler function for each found instance\n * of `{ELEMENT:<elementName>}` in the string. Used to replace values in\n * OneBlink calculation and info (HTML) elements.\n *\n * #### Example\n *\n * ```js\n * formElementsService.matchElementsTagRegex(\n * myString,\n * ({ elementName, elementMatch }) => {\n * const v = submission[elementName]\n * myString = myString.replace(elementMatch, v)\n * },\n * )\n * ```\n *\n * Or\n *\n * ```js\n * formElementsService.matchElementsTagRegex(\n * {\n * text: myString,\n * excludeNestedElements: true,\n * },\n * ({ elementName, elementMatch }) => {\n * const v = submission[elementName]\n * myString = myString.replace(elementMatch, v)\n * },\n * )\n * ```\n *\n * @param options\n * @param handler\n * @returns\n */\nexport function matchElementsTagRegex(\n options:\n | string\n | {\n text: string\n /**\n * Determine if only root level elements should be matched.\n *\n * `false` will match `\"{ELEMENT:Parent_Name}\"` and\n * `\"{ELEMENT:Children|Name}\"`.\n *\n * `true` will match `\"{ELEMENT:Parent_Name}\"` but will NOT replace\n * `{ELEMENT:Children|Name}`.\n */\n excludeNestedElements: boolean\n /** Use the submission value instead of labels for elements with optionsets */\n useSubmissionValue?: boolean\n },\n matchHandler: (options: {\n elementName: string\n elementMatch: string\n }) => void,\n) {\n const text = typeof options === 'string' ? options : options.text\n const excludeNestedElements =\n typeof options !== 'string' && !!options.excludeNestedElements\n const useSubmissionValue =\n typeof options !== 'string' && !!options.useSubmissionValue\n let matches\n const rootRegex = useSubmissionValue\n ? RootSubmissionValueElementRegex\n : RootElementRegex\n const nestedRegex = useSubmissionValue\n ? NestedSubmissionValueElementRegex\n : NestedElementRegex\n while (\n (matches = (excludeNestedElements ? rootRegex : nestedRegex).exec(text)) !==\n null\n ) {\n if (matches?.length < 3) continue\n\n const elementName = matches[2]\n matchHandler({ elementName, elementMatch: matches[0] })\n }\n}\n"]}
|
|
@@ -72,18 +72,20 @@ export type ReplaceInjectablesOptions = ReplaceInjectablesBaseOptions & {
|
|
|
72
72
|
* @param options
|
|
73
73
|
* @returns
|
|
74
74
|
*/
|
|
75
|
-
export declare function getElementSubmissionValue({ propertyName, submission, formElements, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, }: {
|
|
75
|
+
export declare function getElementSubmissionValue({ propertyName, submission, formElements, useSubmissionValue, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, }: {
|
|
76
76
|
propertyName: string;
|
|
77
77
|
formElements: FormTypes.FormElement[];
|
|
78
78
|
submission: SubmissionTypes.S3SubmissionData['submission'];
|
|
79
|
+
useSubmissionValue?: boolean;
|
|
79
80
|
} & ReplaceInjectablesFormatters): {
|
|
80
81
|
element: FormTypes.FormElement | undefined;
|
|
81
82
|
value: unknown;
|
|
82
83
|
} | undefined;
|
|
83
|
-
export declare function getElementSubmissionValue({ elementId, submission, formElements, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, }: {
|
|
84
|
+
export declare function getElementSubmissionValue({ elementId, submission, formElements, useSubmissionValue, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, }: {
|
|
84
85
|
elementId: string;
|
|
85
86
|
formElements: FormTypes.FormElement[];
|
|
86
87
|
submission: SubmissionTypes.S3SubmissionData['submission'];
|
|
88
|
+
useSubmissionValue?: boolean;
|
|
87
89
|
} & ReplaceInjectablesFormatters): {
|
|
88
90
|
element: FormTypes.FormElement | undefined;
|
|
89
91
|
value: unknown;
|
|
@@ -72,7 +72,7 @@ const ELEMENT_VALUES = [
|
|
|
72
72
|
value: ({ taskGroupInstance }) => taskGroupInstance === null || taskGroupInstance === void 0 ? void 0 : taskGroupInstance.label,
|
|
73
73
|
},
|
|
74
74
|
];
|
|
75
|
-
function getElementSubmissionValue({ elementId, propertyName, submission, formElements, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, }) {
|
|
75
|
+
function getElementSubmissionValue({ elementId, propertyName, submission, formElements, useSubmissionValue, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, }) {
|
|
76
76
|
if (elementId === undefined && propertyName === undefined) {
|
|
77
77
|
return undefined;
|
|
78
78
|
}
|
|
@@ -97,6 +97,7 @@ function getElementSubmissionValue({ elementId, propertyName, submission, formEl
|
|
|
97
97
|
return formatValue({
|
|
98
98
|
element: result.formElement,
|
|
99
99
|
unknownValue: result.unknownValue,
|
|
100
|
+
useSubmissionValue,
|
|
100
101
|
formatDate,
|
|
101
102
|
formatTime,
|
|
102
103
|
formatDateTime,
|
|
@@ -150,7 +151,7 @@ function getElementSubmissionValueById({ elementId, formElements, submission, })
|
|
|
150
151
|
}
|
|
151
152
|
return { unknownValue: unknown, formElement };
|
|
152
153
|
}
|
|
153
|
-
function formatValue({ element, unknownValue, formatDate, formatTime, formatDateTime, formatCurrency, formatNumber, }) {
|
|
154
|
+
function formatValue({ element, unknownValue, useSubmissionValue, formatDate, formatTime, formatDateTime, formatCurrency, formatNumber, }) {
|
|
154
155
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
155
156
|
switch (element === null || element === void 0 ? void 0 : element.type) {
|
|
156
157
|
case 'datetime': {
|
|
@@ -168,11 +169,17 @@ function formatValue({ element, unknownValue, formatDate, formatTime, formatDate
|
|
|
168
169
|
case 'radio':
|
|
169
170
|
case 'autocomplete': {
|
|
170
171
|
const value = unknownValue;
|
|
172
|
+
if (useSubmissionValue) {
|
|
173
|
+
return { element: element, value: value };
|
|
174
|
+
}
|
|
171
175
|
const option = (_a = element.options) === null || _a === void 0 ? void 0 : _a.find((opt) => opt.value === value);
|
|
172
176
|
return { element: element, value: (option === null || option === void 0 ? void 0 : option.label) || value };
|
|
173
177
|
}
|
|
174
178
|
case 'checkboxes': {
|
|
175
179
|
const value = unknownValue;
|
|
180
|
+
if (useSubmissionValue) {
|
|
181
|
+
return { element: element, value: value };
|
|
182
|
+
}
|
|
176
183
|
const options = element.options;
|
|
177
184
|
const selectedOptionLabels = value.reduce((labels, selectedOption) => {
|
|
178
185
|
const foundOption = options === null || options === void 0 ? void 0 : options.find((o) => o.value === selectedOption);
|
|
@@ -187,6 +194,9 @@ function formatValue({ element, unknownValue, formatDate, formatTime, formatDate
|
|
|
187
194
|
}
|
|
188
195
|
case 'compliance': {
|
|
189
196
|
const value = unknownValue;
|
|
197
|
+
if (useSubmissionValue) {
|
|
198
|
+
return { element: element, value: value.value };
|
|
199
|
+
}
|
|
190
200
|
const option = (element.options || []).find((option) => option.value === value.value);
|
|
191
201
|
return {
|
|
192
202
|
element: element,
|
|
@@ -199,6 +209,9 @@ function formatValue({ element, unknownValue, formatDate, formatTime, formatDate
|
|
|
199
209
|
case 'select': {
|
|
200
210
|
if (element.multi) {
|
|
201
211
|
const value = unknownValue;
|
|
212
|
+
if (useSubmissionValue) {
|
|
213
|
+
return { element: element, value: value };
|
|
214
|
+
}
|
|
202
215
|
const options = element.options;
|
|
203
216
|
const selectedOptionLabels = value.reduce((labels, selectedOption) => {
|
|
204
217
|
const foundOption = options === null || options === void 0 ? void 0 : options.find((o) => o.value === selectedOption);
|
|
@@ -213,6 +226,9 @@ function formatValue({ element, unknownValue, formatDate, formatTime, formatDate
|
|
|
213
226
|
}
|
|
214
227
|
else {
|
|
215
228
|
const value = unknownValue;
|
|
229
|
+
if (useSubmissionValue) {
|
|
230
|
+
return { element: element, value: value };
|
|
231
|
+
}
|
|
216
232
|
const option = (_b = element.options) === null || _b === void 0 ? void 0 : _b.find((opt) => opt.value === value);
|
|
217
233
|
return { element: element, value: option === null || option === void 0 ? void 0 : option.label };
|
|
218
234
|
}
|
|
@@ -370,6 +386,27 @@ function replaceInjectablesWithElementValues(text, options) {
|
|
|
370
386
|
text = text.replace(elementMatch, hasNoValue ? '' : result.value);
|
|
371
387
|
});
|
|
372
388
|
}
|
|
389
|
+
const valueMatchesElement = text.match(options.excludeNestedElements
|
|
390
|
+
? form_elements_regex_1.RootSubmissionValueElementRegex
|
|
391
|
+
: form_elements_regex_1.NestedSubmissionValueElementRegex);
|
|
392
|
+
if (valueMatchesElement) {
|
|
393
|
+
(0, form_elements_regex_1.matchElementsTagRegex)({
|
|
394
|
+
text,
|
|
395
|
+
excludeNestedElements: !!options.excludeNestedElements,
|
|
396
|
+
useSubmissionValue: true,
|
|
397
|
+
}, ({ elementName, elementMatch }) => {
|
|
398
|
+
const result = getElementSubmissionValue({
|
|
399
|
+
propertyName: elementName,
|
|
400
|
+
...options,
|
|
401
|
+
useSubmissionValue: true,
|
|
402
|
+
});
|
|
403
|
+
const hasNoValue = result === undefined || result.value === undefined;
|
|
404
|
+
if (hasNoValue) {
|
|
405
|
+
hadAllInjectablesReplaced = false;
|
|
406
|
+
}
|
|
407
|
+
text = text.replace(elementMatch, hasNoValue ? '' : result.value);
|
|
408
|
+
});
|
|
409
|
+
}
|
|
373
410
|
return {
|
|
374
411
|
text,
|
|
375
412
|
hadAllInjectablesReplaced,
|
|
@@ -579,7 +616,54 @@ function processInjectablesInCustomResource({ resource, submission, formElements
|
|
|
579
616
|
}
|
|
580
617
|
});
|
|
581
618
|
}
|
|
582
|
-
|
|
619
|
+
// Find nested form elements using ELEMENT_VALUE:
|
|
620
|
+
const valueMatches = new Map();
|
|
621
|
+
(0, form_elements_regex_1.matchElementsTagRegex)({
|
|
622
|
+
text,
|
|
623
|
+
excludeNestedElements: false,
|
|
624
|
+
useSubmissionValue: true,
|
|
625
|
+
}, ({ elementName }) => {
|
|
626
|
+
const [repeatableSetElementName, ...elementNames] = elementName.split('|');
|
|
627
|
+
valueMatches.set(repeatableSetElementName, !!elementNames.length);
|
|
628
|
+
});
|
|
629
|
+
if (valueMatches.size) {
|
|
630
|
+
valueMatches.forEach((hasNestedFormElements, repeatableSetElementName) => {
|
|
631
|
+
if (hasNestedFormElements) {
|
|
632
|
+
// Attempt to create a new resource for each entry in the repeatable set.
|
|
633
|
+
const entries = submission === null || submission === void 0 ? void 0 : submission[repeatableSetElementName];
|
|
634
|
+
if (Array.isArray(entries)) {
|
|
635
|
+
const repeatableSetElement = (0, formElementsService_1.findFormElement)(formElements, (formElement) => {
|
|
636
|
+
return ('name' in formElement &&
|
|
637
|
+
formElement.name === repeatableSetElementName);
|
|
638
|
+
});
|
|
639
|
+
if (repeatableSetElement &&
|
|
640
|
+
'elements' in repeatableSetElement &&
|
|
641
|
+
Array.isArray(repeatableSetElement.elements)) {
|
|
642
|
+
for (const entry of entries) {
|
|
643
|
+
const replacedResource = prepareNestedInjectables(newResource, (resourceText) => {
|
|
644
|
+
return resourceText.replaceAll(`{ELEMENT_VALUE:${repeatableSetElementName}|`, '{ELEMENT_VALUE:');
|
|
645
|
+
});
|
|
646
|
+
const nestedResources = processInjectablesInCustomResource({
|
|
647
|
+
resource: replacedResource,
|
|
648
|
+
submission: entry,
|
|
649
|
+
formElements: repeatableSetElement.elements,
|
|
650
|
+
replaceRootInjectables,
|
|
651
|
+
prepareNestedInjectables,
|
|
652
|
+
});
|
|
653
|
+
if (nestedResources.size) {
|
|
654
|
+
nestedResources.forEach((nestedResource, nestedResourceKey) => {
|
|
655
|
+
if (!newResources.has(nestedResourceKey)) {
|
|
656
|
+
newResources.set(nestedResourceKey, nestedResource);
|
|
657
|
+
}
|
|
658
|
+
});
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
if (!matches.size && !valueMatches.size) {
|
|
583
667
|
newResources.set(resourceKey, newResource);
|
|
584
668
|
}
|
|
585
669
|
return newResources;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replaceCustomValues.js","sourceRoot":"","sources":["../src/replaceCustomValues.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n APINSWTypes,\n CivicaTypes,\n FormTypes,\n GeoscapeTypes,\n GoogleTypes,\n MiscTypes,\n PointTypes,\n ScheduledTasksTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport { getABNNumberFromABNRecord } from './abnService'\nimport {\n RootElementRegex,\n NestedElementRegex,\n matchElementsTagRegex,\n} from './form-elements-regex'\nimport { findFormElement, flattenFormElements } from './formElementsService'\n\nexport type ReplaceInjectablesFormatters = {\n /** A function to format any date/times. */\n formatDateTime: (value: string) => string\n /** A function to format any dates. */\n formatDate: (value: string) => string\n /** A function to format any times. */\n formatTime: (value: string) => string\n /** A function to format any numbers. */\n formatNumber: (value: number) => string\n /** A function to format any numbers as currency. */\n formatCurrency: (value: number) => string\n}\n\nexport type ReplaceInjectablesBaseOptions = ReplaceInjectablesFormatters & {\n submission: SubmissionTypes.S3SubmissionData['submission']\n userProfile: MiscTypes.UserProfile | undefined\n task: ScheduledTasksTypes.Task | undefined\n taskGroup: ScheduledTasksTypes.TaskGroup | undefined\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance | undefined\n /**\n * Determine if only root level elements should be replaced.\n *\n * `false` will replace `\"{ELEMENT:Parent_Name}\"` and\n * `\"{ELEMENT:Children|Name}\"`.\n *\n * `true` will replace `\"{ELEMENT:Parent_Name}\"` but will NOT replace\n * `{ELEMENT:Children|Name}`.\n */\n excludeNestedElements?: boolean\n}\n\nexport type ReplaceInjectablesOptions = ReplaceInjectablesBaseOptions & {\n form: FormTypes.Form\n submissionId: string\n submissionTimestamp: string\n externalId: string | undefined\n previousApprovalId: string | undefined\n}\n\nconst SUBMISSION_VALUES: Array<{\n string: string\n value: (options: ReplaceInjectablesOptions) => string | undefined\n}> = [\n {\n string: '{INFO_PAGE_ID}',\n value: ({ form }: ReplaceInjectablesOptions) => form.id.toString(),\n },\n {\n string: '{INFO_PAGE_NAME}',\n value: ({ form }: ReplaceInjectablesOptions) => form.name,\n },\n {\n string: '{FORM_ID}',\n value: ({ form }: ReplaceInjectablesOptions) => form.id.toString(),\n },\n {\n string: '{FORM_NAME}',\n value: ({ form }: ReplaceInjectablesOptions) => form.name,\n },\n {\n string: '{DATE}',\n value: ({\n submissionTimestamp,\n formatDateTime,\n }: ReplaceInjectablesOptions) => {\n if (!submissionTimestamp) {\n return undefined\n }\n return formatDateTime(submissionTimestamp)\n },\n },\n {\n string: '{TIMESTAMP}',\n value: ({ submissionTimestamp }: ReplaceInjectablesOptions) =>\n submissionTimestamp,\n },\n {\n string: '{SUBMISSION_ID}',\n value: ({ submissionId }: ReplaceInjectablesOptions) => submissionId,\n },\n {\n string: '{EXTERNAL_ID}',\n value: ({ externalId }: ReplaceInjectablesOptions) => externalId,\n },\n {\n string: '{PREVIOUS_APPROVAL_ID}',\n value: ({ previousApprovalId }: ReplaceInjectablesOptions) =>\n previousApprovalId,\n },\n]\n\nconst ELEMENT_VALUES: Array<{\n string: string\n value: (options: ReplaceInjectablesBaseOptions) => string | undefined\n}> = [\n {\n string: '{USER:email}',\n value: ({ userProfile }) => userProfile?.email,\n },\n {\n string: '{USER:username}',\n value: ({ userProfile }) => userProfile?.username,\n },\n {\n string: '{TASK_NAME}',\n value: ({ task }) => task?.name,\n },\n {\n string: '{TASK_GROUP_NAME}',\n value: ({ taskGroup }) => taskGroup?.name,\n },\n {\n string: '{TASK_GROUP_INSTANCE_LABEL}',\n value: ({ taskGroupInstance }) => taskGroupInstance?.label,\n },\n]\n\n/**\n * Function to get the display value of a property in submission, if elementId\n * is provided propertyName will be ignored\n *\n * #### Example\n *\n * ```typescript\n * const result = submissionService.getElementSubmissionValue({\n * propertyName: 'search',\n * submission: {\n * search: 'Entered By User',\n * },\n * formElements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * formatNumber: (value) => Number(value).toString(),\n * formatCurrency: (value) => Number(value).toFixed(2),\n * })\n * ```\n *\n * @param options\n * @returns\n */\nexport function getElementSubmissionValue({\n propertyName,\n submission,\n formElements,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n propertyName: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n} & ReplaceInjectablesFormatters):\n | {\n element: FormTypes.FormElement | undefined\n value: unknown\n }\n | undefined\nexport function getElementSubmissionValue({\n elementId,\n submission,\n formElements,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n elementId: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n} & ReplaceInjectablesFormatters):\n | {\n element: FormTypes.FormElement | undefined\n value: unknown\n }\n | undefined\nexport function getElementSubmissionValue({\n elementId,\n propertyName,\n submission,\n formElements,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n elementId?: string\n propertyName?: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n} & ReplaceInjectablesFormatters) {\n if (elementId === undefined && propertyName === undefined) {\n return undefined\n }\n\n let result: ReturnType<typeof getElementSubmissionValueByName> | undefined =\n undefined\n\n if (elementId) {\n result = getElementSubmissionValueById({\n elementId,\n formElements,\n submission,\n })\n } else if (propertyName) {\n result = getElementSubmissionValueByName({\n propertyName,\n formElements,\n submission,\n })\n }\n\n if (!result) {\n return\n }\n return formatValue({\n element: result.formElement,\n unknownValue: result.unknownValue,\n formatDate,\n formatTime,\n formatDateTime,\n formatCurrency,\n formatNumber,\n })\n}\n\nfunction getElementSubmissionValueByName({\n propertyName,\n formElements,\n submission,\n}: {\n propertyName: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n}):\n | { formElement: FormTypes.FormElement | undefined; unknownValue: unknown }\n | undefined {\n const unknownValue = submission[propertyName]\n if (unknownValue === undefined || unknownValue === null) {\n return undefined\n }\n\n const formElement = findFormElement(\n formElements,\n (element) =>\n element.type !== 'page' &&\n element.type !== 'section' &&\n element.name === propertyName,\n )\n\n return { formElement, unknownValue }\n}\n\nfunction getElementSubmissionValueById({\n elementId,\n formElements,\n submission,\n}: {\n elementId: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n}): { formElement: FormTypes.FormElement; unknownValue: unknown } | undefined {\n // make sure submission is an object\n if (Object(submission) !== submission) {\n return undefined\n }\n\n const flattenedElements = flattenFormElements(formElements)\n\n let unknown: unknown = undefined\n let formElement: FormTypes.FormElement | undefined = undefined\n\n for (const element of flattenedElements) {\n if (elementId === element.id) {\n if ('name' in element) {\n unknown = submission[element.name]\n formElement = element\n }\n break\n }\n if (element.type === 'form') {\n const newSubmissionData = submission[element.name]\n\n const result = getElementSubmissionValueById({\n elementId,\n formElements: element.elements ?? [],\n submission:\n newSubmissionData as SubmissionTypes.S3SubmissionData['submission'],\n })\n if (result) {\n unknown = result.unknownValue\n formElement = result.formElement\n break\n }\n }\n }\n\n if (unknown === undefined || unknown === null || formElement === undefined) {\n return undefined\n }\n\n return { unknownValue: unknown, formElement }\n}\n\nfunction formatValue({\n element,\n unknownValue,\n formatDate,\n formatTime,\n formatDateTime,\n formatCurrency,\n formatNumber,\n}: {\n element: FormTypes.FormElement | undefined\n unknownValue: unknown\n} & ReplaceInjectablesFormatters) {\n switch (element?.type) {\n case 'datetime': {\n const value = unknownValue as string\n return { element: element, value: formatDateTime(value) }\n }\n case 'date': {\n const value = unknownValue as string\n return { element: element, value: formatDate(value) }\n }\n case 'time': {\n const value = unknownValue as string\n return { element: element, value: formatTime(value) }\n }\n case 'radio':\n case 'autocomplete': {\n const value = unknownValue as string\n const option = element.options?.find((opt) => opt.value === value)\n return { element: element, value: option?.label || value }\n }\n\n case 'checkboxes': {\n const value = unknownValue as string[]\n const options = element.options\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = options?.find((o) => o.value === selectedOption)\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return {\n element: element,\n value: selectedOptionLabels.length ? selectedOptionLabels : undefined,\n }\n }\n case 'compliance': {\n const value = unknownValue as {\n value?: string\n }\n const option = (element.options || []).find(\n (option: FormTypes.ChoiceElementOption) => option.value === value.value,\n )\n return {\n element: element,\n value: {\n ...value,\n value: option?.label || value.value,\n },\n }\n }\n case 'select': {\n if (element.multi) {\n const value = unknownValue as string[]\n const options = element.options\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = options?.find((o) => o.value === selectedOption)\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return {\n element: element,\n value: selectedOptionLabels.length ? selectedOptionLabels : undefined,\n }\n } else {\n const value = unknownValue as string\n const option = element.options?.find((opt) => opt.value === value)\n return { element: element, value: option?.label }\n }\n }\n case 'boolean': {\n const value = unknownValue as boolean\n return { element: element, value: value ? 'Yes' : 'No' }\n }\n case 'calculation':\n case 'number': {\n const getValue = (value: number) => {\n if (element.displayAsCurrency) {\n return formatCurrency(value)\n }\n if (element.type === 'calculation') {\n return formatNumber(value)\n }\n return value\n }\n\n const value = unknownValue as number\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n const formattedValue = getValue(value)\n return { element, value: formattedValue }\n }\n return undefined\n }\n case 'pointCadastralParcel': {\n const value = unknownValue as PointTypes.PointCadastralParcelResponse\n return {\n element: element,\n value: value?.parcelBundle?.[0]?.parcelId,\n }\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n const value = unknownValue as\n | PointTypes.PointAddress\n | GeoscapeTypes.GeoscapeAddress\n return {\n element: element,\n value: value?.addressDetails?.formattedAddress || value?.addressId,\n }\n }\n case 'googleAddress': {\n const value = unknownValue as GoogleTypes.GoogleMapsAddress\n return {\n element: element,\n value: value.formatted_address || value.place_id,\n }\n }\n case 'civicaStreetName': {\n const value = unknownValue as CivicaTypes.CivicaStreetName\n return { element: element, value: value?.formattedStreet }\n }\n case 'civicaNameRecord': {\n const value = unknownValue as CivicaTypes.CivicaNameRecord\n return {\n element: element,\n value:\n [value?.title, value?.givenName1, value?.familyName]\n .filter((t) => t)\n .join(' ') || value?.emailAddress,\n }\n }\n case 'abn': {\n const value = unknownValue as MiscTypes.ABNRecord\n return {\n element: element,\n value: value ? getABNNumberFromABNRecord(value) : undefined,\n }\n }\n case 'apiNSWLiquorLicence': {\n const value = unknownValue as APINSWTypes.LiquorLicenceDetails | undefined\n return {\n element: element,\n value:\n `${value?.licenceDetail?.licenceNumber} | ${value?.licenceDetail?.licenceName}`.trim(),\n }\n }\n default: {\n return { element: element, value: unknownValue }\n }\n }\n}\n\n/**\n * Replace the `{ELEMENT:<elementName>}` values in text while a form is being\n * filled out. The replacements are suppose to be user friendly and for display\n * purposes, e.g. dates should be displayed in the user's desired format and\n * timezone.\n *\n * #### Example\n *\n * ```js\n * const { text: url } =\n * submissionService.replaceInjectablesWithElementValues(\n * 'https://example.com/path?search{ELEMENT:search}',\n * {\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * formatNumber: (value) => Number(value).toString(),\n * formatCurrency: (value) => Number(value).toFixed(2),\n * submission: {\n * search: 'Entered By User',\n * },\n * elements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * userProfile: {\n * userId: 'abc123',\n * username: 'john-user',\n * email: 'john.user@domain.com',\n * },\n * },\n * )\n * ```\n *\n * @param text\n * @param options\n * @returns\n */\nexport function replaceInjectablesWithElementValues(\n text: string,\n options: {\n formElements: FormTypes.FormElement[]\n } & ReplaceInjectablesBaseOptions,\n): {\n /**\n * The text passed in with all injectables replaced with their corresponding\n * values or empty strings.\n */\n text: string\n /**\n * Determine if replaceable strings could all be replaced. The `text` property\n * returned will replace all injectable with empty strings if the value cannot\n * be found. Use this boolean to either use the replaced string with missing\n * data or implement some other logic to handle missing injectables.\n */\n hadAllInjectablesReplaced: boolean\n} {\n let hadAllInjectablesReplaced = true\n text = ELEMENT_VALUES.reduce((newString, customValue) => {\n if (!newString.includes(customValue.string)) {\n return newString\n }\n const replacedValue = customValue.value(options)\n if (!replacedValue) {\n hadAllInjectablesReplaced = false\n }\n return newString.replaceAll(customValue.string, replacedValue || '')\n }, text)\n\n const matchesElement = text.match(\n options.excludeNestedElements ? RootElementRegex : NestedElementRegex,\n )\n if (matchesElement) {\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: !!options.excludeNestedElements,\n },\n ({ elementName, elementMatch }) => {\n const result = getElementSubmissionValue({\n propertyName: elementName,\n ...options,\n })\n\n const hasNoValue = result === undefined || result.value === undefined\n if (hasNoValue) {\n hadAllInjectablesReplaced = false\n }\n\n text = text.replace(\n elementMatch,\n hasNoValue ? '' : (result.value as string),\n )\n },\n )\n }\n\n return {\n text,\n hadAllInjectablesReplaced,\n }\n}\n\n/**\n * Replace the `{ELEMENT:<elementName>}` values in text after a successful form\n * submission as well as other replaceable parameters e.g. `submissionId`. The\n * replacements are suppose to be user friendly and for display purposes, e.g.\n * dates should be displayed in the user's desired format and timezone.\n *\n * #### Example\n *\n * ```js\n * const result = submissionService.replaceInjectablesWithSubmissionValues(\n * 'https://example.com/path?submissionId={SUBMISSION_ID}&externalId={EXTERNAL_ID}&search{ELEMENT:search}',\n * {\n * submissionId: 'abc-123',\n * submissionTimestamp: '2021-07-02T02:19:13.670Z',\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * submission: {\n * search: 'Entered By User',\n * },\n * form: {\n * id: 1,\n * name: 'Form',\n * organisationId: '',\n * formsAppEnvironmentId: 1,\n * formsAppIds: [],\n * isAuthenticated: false,\n * isMultiPage: false,\n * isInfoPage: false,\n * postSubmissionAction: 'FORMS_LIBRARY',\n * cancelAction: 'FORMS_LIBRARY',\n * submissionEvents: [],\n * tags: [],\n * elements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * },\n * },\n * )\n * ```\n *\n * @param text\n * @param options\n * @returns\n */\nexport function replaceInjectablesWithSubmissionValues(\n text: string,\n options: ReplaceInjectablesOptions,\n): {\n /**\n * The text passed in with all injectables replaced with their corresponding\n * values or empty strings.\n */\n text: string\n /**\n * Determine if replaceable strings could all be replaced. The `text` property\n * returned will replace all injectable with empty strings if the value cannot\n * be found. Use this boolean to either use the replaced string with missing\n * data or implement some other logic to handle missing injectables.\n */\n hadAllInjectablesReplaced: boolean\n} {\n const result = replaceInjectablesWithElementValues(text, {\n formElements: options.form.elements,\n ...options,\n })\n let hadAllInjectablesReplaced = result.hadAllInjectablesReplaced\n const replacedText = SUBMISSION_VALUES.reduce((newString, customValue) => {\n if (!newString.includes(customValue.string)) {\n return newString\n }\n const replacedValue = customValue.value(options)\n if (!replacedValue) {\n hadAllInjectablesReplaced = false\n }\n return newString.replaceAll(customValue.string, replacedValue || '')\n }, result.text)\n\n return {\n text: replacedText,\n hadAllInjectablesReplaced,\n }\n}\n\n/**\n * Process a resource with injectable element values to turn a single resource\n * (could be a single) into multiple resources. e.g.\n * `\"{ELEMENT:Children|Child_Name} {ELEMENT:Family_Name}\"` with the following\n * submission data:\n *\n * ```json\n * {\n * \"Family_Name\": \"Smith\",\n * \"Children\": [\n * {\n * \"Child_Name\": \"John\"\n * },\n * {\n * \"Child_Name\": \"Jane\"\n * }\n * ]\n * }\n * ```\n *\n * Would result in the following resources:\n *\n * - `\"John Smith\"`\n * - `\"Jane Smith\"`\n *\n * #### Example\n *\n * ```js\n * const emailAddresses = processInjectablesInCustomResource({\n * resource: '{ELEMENT:People|Email_Address}',\n * submission: {\n * People: [\n * {\n * Email_Address: 'user@oneblink.io',\n * },\n * {\n * Email_Address: 'admin@oneblink.io',\n * },\n * ],\n * },\n * formElements: [\n * {\n * id: '18dcd3e0-6e2f-462e-803b-e24562d9fa6d',\n * type: 'repeatableSet',\n * name: 'People',\n * label: 'People',\n * elements: [\n * {\n * id: 'd0902113-3f77-4070-adbd-ca3ae95ce091',\n * type: 'email',\n * name: 'Email_Address',\n * label: 'Email_Address',\n * },\n * ],\n * },\n * ],\n * replaceRootInjectables: (resource, submission, formElements) => {\n * const { text } = replaceInjectablesWithElementValues(resource, {\n * submission,\n * formElements,\n * excludeNestedElements: true,\n * // other options\n * })\n * return text\n * },\n * })\n * // emailAddresses === [\"user@oneblink.io\", \"admin@oneblink.io\"]\n * ```\n *\n * @param options\n * @returns\n */\nexport function processInjectablesInCustomResource<T>({\n resource,\n submission,\n formElements,\n replaceRootInjectables,\n prepareNestedInjectables = (resource, prepare) =>\n prepare(String(resource)) as T,\n}: {\n /** The resource that contains properties that support injection or a string */\n resource: T\n /** The form submission data to process */\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** The form elements to process */\n formElements: FormTypes.FormElement[]\n /**\n * A function to inject values, this allows custom formatters to be used.\n * Return `undefined` to prevent the injection from recursively continuing.\n *\n * @param resource The current resource that contains properties that support\n * injection or a string\n * @param submission The current form submission data to process (may be an\n * entry in a repeatable set)\n * @param formElements The current form elements to process (may be the\n * elements from a repeatable set)\n * @returns\n */\n replaceRootInjectables: (\n resource: T,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n formElements: FormTypes.FormElement[],\n ) =>\n | [injectedText: string, resourceKey: string, newResource: T]\n | string\n | undefined\n /**\n * An optional function to replace nested injectables when creating multiple\n * resources from repeatable sets. Only required if the `resource` param is\n * not a `string`.\n *\n * @param resource The current resource that contains properties that support\n * injection or a string\n * @param prepare A function to prepare the resource string(s) for another\n * iteration\n * @returns\n */\n prepareNestedInjectables?: (\n resource: T,\n preparer: (resourceText: string) => string,\n ) => T\n}): Map<string, T> {\n const newResources: Map<string, T> = new Map<string, T>()\n\n const injectorResult = replaceRootInjectables(\n resource,\n submission,\n formElements,\n )\n if (!injectorResult) {\n return newResources\n }\n\n const [text, resourceKey, newResource] =\n typeof injectorResult === 'string'\n ? [injectorResult, injectorResult, injectorResult as T]\n : injectorResult\n\n // Find nested form elements\n const matches: Map<string, boolean> = new Map()\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: false,\n },\n ({ elementName }) => {\n const [repeatableSetElementName, ...elementNames] = elementName.split('|')\n matches.set(repeatableSetElementName, !!elementNames.length)\n },\n )\n\n if (matches.size) {\n matches.forEach((hasNestedFormElements, repeatableSetElementName) => {\n if (hasNestedFormElements) {\n // Attempt to create a new resource for each entry in the repeatable set.\n const entries = submission?.[repeatableSetElementName]\n if (Array.isArray(entries)) {\n const repeatableSetElement = findFormElement(\n formElements,\n (formElement) => {\n return (\n 'name' in formElement &&\n formElement.name === repeatableSetElementName\n )\n },\n )\n if (\n repeatableSetElement &&\n 'elements' in repeatableSetElement &&\n Array.isArray(repeatableSetElement.elements)\n ) {\n for (const entry of entries) {\n const replacedResource = prepareNestedInjectables(\n newResource,\n (resourceText) => {\n return resourceText.replaceAll(\n `{ELEMENT:${repeatableSetElementName}|`,\n '{ELEMENT:',\n )\n },\n )\n const nestedResources = processInjectablesInCustomResource<T>({\n resource: replacedResource,\n submission: entry,\n formElements: repeatableSetElement.elements,\n replaceRootInjectables,\n prepareNestedInjectables,\n })\n if (nestedResources.size) {\n nestedResources.forEach((nestedResource, nestedResourceKey) => {\n if (!newResources.has(nestedResourceKey)) {\n newResources.set(nestedResourceKey, nestedResource)\n }\n })\n }\n }\n }\n }\n }\n })\n } else {\n newResources.set(resourceKey, newResource)\n }\n\n return newResources\n}\n"]}
|
|
1
|
+
{"version":3,"file":"replaceCustomValues.js","sourceRoot":"","sources":["../src/replaceCustomValues.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n APINSWTypes,\n CivicaTypes,\n FormTypes,\n GeoscapeTypes,\n GoogleTypes,\n MiscTypes,\n PointTypes,\n ScheduledTasksTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport { getABNNumberFromABNRecord } from './abnService'\nimport {\n RootElementRegex,\n NestedElementRegex,\n matchElementsTagRegex,\n RootSubmissionValueElementRegex,\n NestedSubmissionValueElementRegex,\n} from './form-elements-regex'\nimport { findFormElement, flattenFormElements } from './formElementsService'\n\nexport type ReplaceInjectablesFormatters = {\n /** A function to format any date/times. */\n formatDateTime: (value: string) => string\n /** A function to format any dates. */\n formatDate: (value: string) => string\n /** A function to format any times. */\n formatTime: (value: string) => string\n /** A function to format any numbers. */\n formatNumber: (value: number) => string\n /** A function to format any numbers as currency. */\n formatCurrency: (value: number) => string\n}\n\nexport type ReplaceInjectablesBaseOptions = ReplaceInjectablesFormatters & {\n submission: SubmissionTypes.S3SubmissionData['submission']\n userProfile: MiscTypes.UserProfile | undefined\n task: ScheduledTasksTypes.Task | undefined\n taskGroup: ScheduledTasksTypes.TaskGroup | undefined\n taskGroupInstance: ScheduledTasksTypes.TaskGroupInstance | undefined\n /**\n * Determine if only root level elements should be replaced.\n *\n * `false` will replace `\"{ELEMENT:Parent_Name}\"` and\n * `\"{ELEMENT:Children|Name}\"`.\n *\n * `true` will replace `\"{ELEMENT:Parent_Name}\"` but will NOT replace\n * `{ELEMENT:Children|Name}`.\n */\n excludeNestedElements?: boolean\n}\n\nexport type ReplaceInjectablesOptions = ReplaceInjectablesBaseOptions & {\n form: FormTypes.Form\n submissionId: string\n submissionTimestamp: string\n externalId: string | undefined\n previousApprovalId: string | undefined\n}\n\nconst SUBMISSION_VALUES: Array<{\n string: string\n value: (options: ReplaceInjectablesOptions) => string | undefined\n}> = [\n {\n string: '{INFO_PAGE_ID}',\n value: ({ form }: ReplaceInjectablesOptions) => form.id.toString(),\n },\n {\n string: '{INFO_PAGE_NAME}',\n value: ({ form }: ReplaceInjectablesOptions) => form.name,\n },\n {\n string: '{FORM_ID}',\n value: ({ form }: ReplaceInjectablesOptions) => form.id.toString(),\n },\n {\n string: '{FORM_NAME}',\n value: ({ form }: ReplaceInjectablesOptions) => form.name,\n },\n {\n string: '{DATE}',\n value: ({\n submissionTimestamp,\n formatDateTime,\n }: ReplaceInjectablesOptions) => {\n if (!submissionTimestamp) {\n return undefined\n }\n return formatDateTime(submissionTimestamp)\n },\n },\n {\n string: '{TIMESTAMP}',\n value: ({ submissionTimestamp }: ReplaceInjectablesOptions) =>\n submissionTimestamp,\n },\n {\n string: '{SUBMISSION_ID}',\n value: ({ submissionId }: ReplaceInjectablesOptions) => submissionId,\n },\n {\n string: '{EXTERNAL_ID}',\n value: ({ externalId }: ReplaceInjectablesOptions) => externalId,\n },\n {\n string: '{PREVIOUS_APPROVAL_ID}',\n value: ({ previousApprovalId }: ReplaceInjectablesOptions) =>\n previousApprovalId,\n },\n]\n\nconst ELEMENT_VALUES: Array<{\n string: string\n value: (options: ReplaceInjectablesBaseOptions) => string | undefined\n}> = [\n {\n string: '{USER:email}',\n value: ({ userProfile }) => userProfile?.email,\n },\n {\n string: '{USER:username}',\n value: ({ userProfile }) => userProfile?.username,\n },\n {\n string: '{TASK_NAME}',\n value: ({ task }) => task?.name,\n },\n {\n string: '{TASK_GROUP_NAME}',\n value: ({ taskGroup }) => taskGroup?.name,\n },\n {\n string: '{TASK_GROUP_INSTANCE_LABEL}',\n value: ({ taskGroupInstance }) => taskGroupInstance?.label,\n },\n]\n\n/**\n * Function to get the display value of a property in submission, if elementId\n * is provided propertyName will be ignored\n *\n * #### Example\n *\n * ```typescript\n * const result = submissionService.getElementSubmissionValue({\n * propertyName: 'search',\n * submission: {\n * search: 'Entered By User',\n * },\n * formElements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * formatNumber: (value) => Number(value).toString(),\n * formatCurrency: (value) => Number(value).toFixed(2),\n * })\n * ```\n *\n * @param options\n * @returns\n */\nexport function getElementSubmissionValue({\n propertyName,\n submission,\n formElements,\n useSubmissionValue,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n propertyName: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n useSubmissionValue?: boolean\n} & ReplaceInjectablesFormatters):\n | {\n element: FormTypes.FormElement | undefined\n value: unknown\n }\n | undefined\nexport function getElementSubmissionValue({\n elementId,\n submission,\n formElements,\n useSubmissionValue,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n elementId: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n useSubmissionValue?: boolean\n} & ReplaceInjectablesFormatters):\n | {\n element: FormTypes.FormElement | undefined\n value: unknown\n }\n | undefined\nexport function getElementSubmissionValue({\n elementId,\n propertyName,\n submission,\n formElements,\n useSubmissionValue,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n}: {\n elementId?: string\n propertyName?: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n useSubmissionValue?: boolean\n} & ReplaceInjectablesFormatters) {\n if (elementId === undefined && propertyName === undefined) {\n return undefined\n }\n\n let result: ReturnType<typeof getElementSubmissionValueByName> | undefined =\n undefined\n if (elementId) {\n result = getElementSubmissionValueById({\n elementId,\n formElements,\n submission,\n })\n } else if (propertyName) {\n result = getElementSubmissionValueByName({\n propertyName,\n formElements,\n submission,\n })\n }\n if (!result) {\n return\n }\n return formatValue({\n element: result.formElement,\n unknownValue: result.unknownValue,\n useSubmissionValue,\n formatDate,\n formatTime,\n formatDateTime,\n formatCurrency,\n formatNumber,\n })\n}\n\nfunction getElementSubmissionValueByName({\n propertyName,\n formElements,\n submission,\n}: {\n propertyName: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n}):\n | { formElement: FormTypes.FormElement | undefined; unknownValue: unknown }\n | undefined {\n const unknownValue = submission[propertyName]\n if (unknownValue === undefined || unknownValue === null) {\n return undefined\n }\n\n const formElement = findFormElement(\n formElements,\n (element) =>\n element.type !== 'page' &&\n element.type !== 'section' &&\n element.name === propertyName,\n )\n\n return { formElement, unknownValue }\n}\n\nfunction getElementSubmissionValueById({\n elementId,\n formElements,\n submission,\n}: {\n elementId: string\n formElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n}): { formElement: FormTypes.FormElement; unknownValue: unknown } | undefined {\n // make sure submission is an object\n if (Object(submission) !== submission) {\n return undefined\n }\n const flattenedElements = flattenFormElements(formElements)\n\n let unknown: unknown = undefined\n let formElement: FormTypes.FormElement | undefined = undefined\n for (const element of flattenedElements) {\n if (elementId === element.id) {\n if ('name' in element) {\n unknown = submission[element.name]\n formElement = element\n }\n break\n }\n if (element.type === 'form') {\n const newSubmissionData = submission[element.name]\n\n const result = getElementSubmissionValueById({\n elementId,\n formElements: element.elements ?? [],\n submission:\n newSubmissionData as SubmissionTypes.S3SubmissionData['submission'],\n })\n if (result) {\n unknown = result.unknownValue\n formElement = result.formElement\n break\n }\n }\n }\n if (unknown === undefined || unknown === null || formElement === undefined) {\n return undefined\n }\n\n return { unknownValue: unknown, formElement }\n}\n\nfunction formatValue({\n element,\n unknownValue,\n useSubmissionValue,\n formatDate,\n formatTime,\n formatDateTime,\n formatCurrency,\n formatNumber,\n}: {\n element: FormTypes.FormElement | undefined\n unknownValue: unknown\n useSubmissionValue?: boolean\n} & ReplaceInjectablesFormatters) {\n switch (element?.type) {\n case 'datetime': {\n const value = unknownValue as string\n return { element: element, value: formatDateTime(value) }\n }\n case 'date': {\n const value = unknownValue as string\n return { element: element, value: formatDate(value) }\n }\n case 'time': {\n const value = unknownValue as string\n return { element: element, value: formatTime(value) }\n }\n case 'radio':\n case 'autocomplete': {\n const value = unknownValue as string\n if (useSubmissionValue) {\n return { element: element, value: value }\n }\n const option = element.options?.find((opt) => opt.value === value)\n return { element: element, value: option?.label || value }\n }\n\n case 'checkboxes': {\n const value = unknownValue as string[]\n if (useSubmissionValue) {\n return { element: element, value: value }\n }\n const options = element.options\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = options?.find((o) => o.value === selectedOption)\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return {\n element: element,\n value: selectedOptionLabels.length ? selectedOptionLabels : undefined,\n }\n }\n case 'compliance': {\n const value = unknownValue as {\n value?: string\n }\n if (useSubmissionValue) {\n return { element: element, value: value.value }\n }\n const option = (element.options || []).find(\n (option: FormTypes.ChoiceElementOption) => option.value === value.value,\n )\n return {\n element: element,\n value: {\n ...value,\n value: option?.label || value.value,\n },\n }\n }\n case 'select': {\n if (element.multi) {\n const value = unknownValue as string[]\n if (useSubmissionValue) {\n return { element: element, value: value }\n }\n const options = element.options\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = options?.find((o) => o.value === selectedOption)\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return {\n element: element,\n value: selectedOptionLabels.length ? selectedOptionLabels : undefined,\n }\n } else {\n const value = unknownValue as string\n if (useSubmissionValue) {\n return { element: element, value: value }\n }\n const option = element.options?.find((opt) => opt.value === value)\n return { element: element, value: option?.label }\n }\n }\n case 'boolean': {\n const value = unknownValue as boolean\n return { element: element, value: value ? 'Yes' : 'No' }\n }\n case 'calculation':\n case 'number': {\n const getValue = (value: number) => {\n if (element.displayAsCurrency) {\n return formatCurrency(value)\n }\n if (element.type === 'calculation') {\n return formatNumber(value)\n }\n return value\n }\n\n const value = unknownValue as number\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n const formattedValue = getValue(value)\n return { element, value: formattedValue }\n }\n return undefined\n }\n case 'pointCadastralParcel': {\n const value = unknownValue as PointTypes.PointCadastralParcelResponse\n return {\n element: element,\n value: value?.parcelBundle?.[0]?.parcelId,\n }\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n const value = unknownValue as\n | PointTypes.PointAddress\n | GeoscapeTypes.GeoscapeAddress\n return {\n element: element,\n value: value?.addressDetails?.formattedAddress || value?.addressId,\n }\n }\n case 'googleAddress': {\n const value = unknownValue as GoogleTypes.GoogleMapsAddress\n return {\n element: element,\n value: value.formatted_address || value.place_id,\n }\n }\n case 'civicaStreetName': {\n const value = unknownValue as CivicaTypes.CivicaStreetName\n return { element: element, value: value?.formattedStreet }\n }\n case 'civicaNameRecord': {\n const value = unknownValue as CivicaTypes.CivicaNameRecord\n return {\n element: element,\n value:\n [value?.title, value?.givenName1, value?.familyName]\n .filter((t) => t)\n .join(' ') || value?.emailAddress,\n }\n }\n case 'abn': {\n const value = unknownValue as MiscTypes.ABNRecord\n return {\n element: element,\n value: value ? getABNNumberFromABNRecord(value) : undefined,\n }\n }\n case 'apiNSWLiquorLicence': {\n const value = unknownValue as APINSWTypes.LiquorLicenceDetails | undefined\n return {\n element: element,\n value:\n `${value?.licenceDetail?.licenceNumber} | ${value?.licenceDetail?.licenceName}`.trim(),\n }\n }\n default: {\n return { element: element, value: unknownValue }\n }\n }\n}\n\n/**\n * Replace the `{ELEMENT:<elementName>}` values in text while a form is being\n * filled out. The replacements are suppose to be user friendly and for display\n * purposes, e.g. dates should be displayed in the user's desired format and\n * timezone.\n *\n * #### Example\n *\n * ```js\n * const { text: url } =\n * submissionService.replaceInjectablesWithElementValues(\n * 'https://example.com/path?search{ELEMENT:search}',\n * {\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * formatNumber: (value) => Number(value).toString(),\n * formatCurrency: (value) => Number(value).toFixed(2),\n * submission: {\n * search: 'Entered By User',\n * },\n * elements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * userProfile: {\n * userId: 'abc123',\n * username: 'john-user',\n * email: 'john.user@domain.com',\n * },\n * },\n * )\n * ```\n *\n * @param text\n * @param options\n * @returns\n */\nexport function replaceInjectablesWithElementValues(\n text: string,\n options: {\n formElements: FormTypes.FormElement[]\n } & ReplaceInjectablesBaseOptions,\n): {\n /**\n * The text passed in with all injectables replaced with their corresponding\n * values or empty strings.\n */\n text: string\n /**\n * Determine if replaceable strings could all be replaced. The `text` property\n * returned will replace all injectable with empty strings if the value cannot\n * be found. Use this boolean to either use the replaced string with missing\n * data or implement some other logic to handle missing injectables.\n */\n hadAllInjectablesReplaced: boolean\n} {\n let hadAllInjectablesReplaced = true\n text = ELEMENT_VALUES.reduce((newString, customValue) => {\n if (!newString.includes(customValue.string)) {\n return newString\n }\n const replacedValue = customValue.value(options)\n if (!replacedValue) {\n hadAllInjectablesReplaced = false\n }\n return newString.replaceAll(customValue.string, replacedValue || '')\n }, text)\n\n const matchesElement = text.match(\n options.excludeNestedElements ? RootElementRegex : NestedElementRegex,\n )\n if (matchesElement) {\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: !!options.excludeNestedElements,\n },\n ({ elementName, elementMatch }) => {\n const result = getElementSubmissionValue({\n propertyName: elementName,\n ...options,\n })\n\n const hasNoValue = result === undefined || result.value === undefined\n if (hasNoValue) {\n hadAllInjectablesReplaced = false\n }\n\n text = text.replace(\n elementMatch,\n hasNoValue ? '' : (result.value as string),\n )\n },\n )\n }\n\n const valueMatchesElement = text.match(\n options.excludeNestedElements\n ? RootSubmissionValueElementRegex\n : NestedSubmissionValueElementRegex,\n )\n if (valueMatchesElement) {\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: !!options.excludeNestedElements,\n useSubmissionValue: true,\n },\n ({ elementName, elementMatch }) => {\n const result = getElementSubmissionValue({\n propertyName: elementName,\n ...options,\n useSubmissionValue: true,\n })\n const hasNoValue = result === undefined || result.value === undefined\n if (hasNoValue) {\n hadAllInjectablesReplaced = false\n }\n\n text = text.replace(\n elementMatch,\n hasNoValue ? '' : (result.value as string),\n )\n },\n )\n }\n\n return {\n text,\n hadAllInjectablesReplaced,\n }\n}\n\n/**\n * Replace the `{ELEMENT:<elementName>}` values in text after a successful form\n * submission as well as other replaceable parameters e.g. `submissionId`. The\n * replacements are suppose to be user friendly and for display purposes, e.g.\n * dates should be displayed in the user's desired format and timezone.\n *\n * #### Example\n *\n * ```js\n * const result = submissionService.replaceInjectablesWithSubmissionValues(\n * 'https://example.com/path?submissionId={SUBMISSION_ID}&externalId={EXTERNAL_ID}&search{ELEMENT:search}',\n * {\n * submissionId: 'abc-123',\n * submissionTimestamp: '2021-07-02T02:19:13.670Z',\n * formatDate: (value) => new Date(value).toDateString(),\n * formatDateTime: (value) => new Date(value).toString(),\n * formatTime: (value) => new Date(value).toTimeString(),\n * submission: {\n * search: 'Entered By User',\n * },\n * form: {\n * id: 1,\n * name: 'Form',\n * organisationId: '',\n * formsAppEnvironmentId: 1,\n * formsAppIds: [],\n * isAuthenticated: false,\n * isMultiPage: false,\n * isInfoPage: false,\n * postSubmissionAction: 'FORMS_LIBRARY',\n * cancelAction: 'FORMS_LIBRARY',\n * submissionEvents: [],\n * tags: [],\n * elements: [\n * {\n * id: 'd4135b47-9004-4d75-aeb3-d2f6232da111',\n * name: 'search',\n * type: 'text',\n * label: 'Search',\n * readOnly: false,\n * required: false,\n * conditionallyShow: false,\n * requiresAllConditionallyShowPredicates: false,\n * isElementLookup: false,\n * isDataLookup: false,\n * },\n * ],\n * },\n * },\n * )\n * ```\n *\n * @param text\n * @param options\n * @returns\n */\nexport function replaceInjectablesWithSubmissionValues(\n text: string,\n options: ReplaceInjectablesOptions,\n): {\n /**\n * The text passed in with all injectables replaced with their corresponding\n * values or empty strings.\n */\n text: string\n /**\n * Determine if replaceable strings could all be replaced. The `text` property\n * returned will replace all injectable with empty strings if the value cannot\n * be found. Use this boolean to either use the replaced string with missing\n * data or implement some other logic to handle missing injectables.\n */\n hadAllInjectablesReplaced: boolean\n} {\n const result = replaceInjectablesWithElementValues(text, {\n formElements: options.form.elements,\n ...options,\n })\n let hadAllInjectablesReplaced = result.hadAllInjectablesReplaced\n const replacedText = SUBMISSION_VALUES.reduce((newString, customValue) => {\n if (!newString.includes(customValue.string)) {\n return newString\n }\n const replacedValue = customValue.value(options)\n if (!replacedValue) {\n hadAllInjectablesReplaced = false\n }\n return newString.replaceAll(customValue.string, replacedValue || '')\n }, result.text)\n\n return {\n text: replacedText,\n hadAllInjectablesReplaced,\n }\n}\n\n/**\n * Process a resource with injectable element values to turn a single resource\n * (could be a single) into multiple resources. e.g.\n * `\"{ELEMENT:Children|Child_Name} {ELEMENT:Family_Name}\"` with the following\n * submission data:\n *\n * ```json\n * {\n * \"Family_Name\": \"Smith\",\n * \"Children\": [\n * {\n * \"Child_Name\": \"John\"\n * },\n * {\n * \"Child_Name\": \"Jane\"\n * }\n * ]\n * }\n * ```\n *\n * Would result in the following resources:\n *\n * - `\"John Smith\"`\n * - `\"Jane Smith\"`\n *\n * #### Example\n *\n * ```js\n * const emailAddresses = processInjectablesInCustomResource({\n * resource: '{ELEMENT:People|Email_Address}',\n * submission: {\n * People: [\n * {\n * Email_Address: 'user@oneblink.io',\n * },\n * {\n * Email_Address: 'admin@oneblink.io',\n * },\n * ],\n * },\n * formElements: [\n * {\n * id: '18dcd3e0-6e2f-462e-803b-e24562d9fa6d',\n * type: 'repeatableSet',\n * name: 'People',\n * label: 'People',\n * elements: [\n * {\n * id: 'd0902113-3f77-4070-adbd-ca3ae95ce091',\n * type: 'email',\n * name: 'Email_Address',\n * label: 'Email_Address',\n * },\n * ],\n * },\n * ],\n * replaceRootInjectables: (resource, submission, formElements) => {\n * const { text } = replaceInjectablesWithElementValues(resource, {\n * submission,\n * formElements,\n * excludeNestedElements: true,\n * // other options\n * })\n * return text\n * },\n * })\n * // emailAddresses === [\"user@oneblink.io\", \"admin@oneblink.io\"]\n * ```\n *\n * @param options\n * @returns\n */\nexport function processInjectablesInCustomResource<T>({\n resource,\n submission,\n formElements,\n replaceRootInjectables,\n prepareNestedInjectables = (resource, prepare) =>\n prepare(String(resource)) as T,\n}: {\n /** The resource that contains properties that support injection or a string */\n resource: T\n /** The form submission data to process */\n submission: SubmissionTypes.S3SubmissionData['submission']\n /** The form elements to process */\n formElements: FormTypes.FormElement[]\n /**\n * A function to inject values, this allows custom formatters to be used.\n * Return `undefined` to prevent the injection from recursively continuing.\n *\n * @param resource The current resource that contains properties that support\n * injection or a string\n * @param submission The current form submission data to process (may be an\n * entry in a repeatable set)\n * @param formElements The current form elements to process (may be the\n * elements from a repeatable set)\n * @returns\n */\n replaceRootInjectables: (\n resource: T,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n formElements: FormTypes.FormElement[],\n ) =>\n | [injectedText: string, resourceKey: string, newResource: T]\n | string\n | undefined\n /**\n * An optional function to replace nested injectables when creating multiple\n * resources from repeatable sets. Only required if the `resource` param is\n * not a `string`.\n *\n * @param resource The current resource that contains properties that support\n * injection or a string\n * @param prepare A function to prepare the resource string(s) for another\n * iteration\n * @returns\n */\n prepareNestedInjectables?: (\n resource: T,\n preparer: (resourceText: string) => string,\n ) => T\n}): Map<string, T> {\n const newResources: Map<string, T> = new Map<string, T>()\n\n const injectorResult = replaceRootInjectables(\n resource,\n submission,\n formElements,\n )\n if (!injectorResult) {\n return newResources\n }\n\n const [text, resourceKey, newResource] =\n typeof injectorResult === 'string'\n ? [injectorResult, injectorResult, injectorResult as T]\n : injectorResult\n\n // Find nested form elements\n const matches: Map<string, boolean> = new Map()\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: false,\n },\n ({ elementName }) => {\n const [repeatableSetElementName, ...elementNames] = elementName.split('|')\n matches.set(repeatableSetElementName, !!elementNames.length)\n },\n )\n\n if (matches.size) {\n matches.forEach((hasNestedFormElements, repeatableSetElementName) => {\n if (hasNestedFormElements) {\n // Attempt to create a new resource for each entry in the repeatable set.\n const entries = submission?.[repeatableSetElementName]\n if (Array.isArray(entries)) {\n const repeatableSetElement = findFormElement(\n formElements,\n (formElement) => {\n return (\n 'name' in formElement &&\n formElement.name === repeatableSetElementName\n )\n },\n )\n if (\n repeatableSetElement &&\n 'elements' in repeatableSetElement &&\n Array.isArray(repeatableSetElement.elements)\n ) {\n for (const entry of entries) {\n const replacedResource = prepareNestedInjectables(\n newResource,\n (resourceText) => {\n return resourceText.replaceAll(\n `{ELEMENT:${repeatableSetElementName}|`,\n '{ELEMENT:',\n )\n },\n )\n const nestedResources = processInjectablesInCustomResource<T>({\n resource: replacedResource,\n submission: entry,\n formElements: repeatableSetElement.elements,\n replaceRootInjectables,\n prepareNestedInjectables,\n })\n if (nestedResources.size) {\n nestedResources.forEach((nestedResource, nestedResourceKey) => {\n if (!newResources.has(nestedResourceKey)) {\n newResources.set(nestedResourceKey, nestedResource)\n }\n })\n }\n }\n }\n }\n }\n })\n }\n\n // Find nested form elements using ELEMENT_VALUE:\n const valueMatches: Map<string, boolean> = new Map()\n matchElementsTagRegex(\n {\n text,\n excludeNestedElements: false,\n useSubmissionValue: true,\n },\n ({ elementName }) => {\n const [repeatableSetElementName, ...elementNames] = elementName.split('|')\n valueMatches.set(repeatableSetElementName, !!elementNames.length)\n },\n )\n\n if (valueMatches.size) {\n valueMatches.forEach((hasNestedFormElements, repeatableSetElementName) => {\n if (hasNestedFormElements) {\n // Attempt to create a new resource for each entry in the repeatable set.\n const entries = submission?.[repeatableSetElementName]\n if (Array.isArray(entries)) {\n const repeatableSetElement = findFormElement(\n formElements,\n (formElement) => {\n return (\n 'name' in formElement &&\n formElement.name === repeatableSetElementName\n )\n },\n )\n if (\n repeatableSetElement &&\n 'elements' in repeatableSetElement &&\n Array.isArray(repeatableSetElement.elements)\n ) {\n for (const entry of entries) {\n const replacedResource = prepareNestedInjectables(\n newResource,\n (resourceText) => {\n return resourceText.replaceAll(\n `{ELEMENT_VALUE:${repeatableSetElementName}|`,\n '{ELEMENT_VALUE:',\n )\n },\n )\n const nestedResources = processInjectablesInCustomResource<T>({\n resource: replacedResource,\n submission: entry,\n formElements: repeatableSetElement.elements,\n replaceRootInjectables,\n prepareNestedInjectables,\n })\n if (nestedResources.size) {\n nestedResources.forEach((nestedResource, nestedResourceKey) => {\n if (!newResources.has(nestedResourceKey)) {\n newResources.set(nestedResourceKey, nestedResource)\n }\n })\n }\n }\n }\n }\n }\n })\n }\n\n if (!matches.size && !valueMatches.size) {\n newResources.set(resourceKey, newResource)\n }\n\n return newResources\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oneblink/sdk-core",
|
|
3
3
|
"description": "OneBlink SDK for JavaScript (works in Browsers and NodeJS)",
|
|
4
|
-
"version": "8.
|
|
4
|
+
"version": "8.5.0-beta.1",
|
|
5
5
|
"author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/oneblink/sdk-core-js/issues"
|