@oneblink/sdk-core 2.0.1-beta.1 → 2.0.1-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abnService.js +3 -4
- package/dist/abnService.js.map +1 -1
- package/dist/conditionalLogicService/conditionallyShowOption.js +1 -2
- package/dist/conditionalLogicService/conditionallyShowOption.js.map +1 -1
- package/dist/conditionalLogicService/evaluateConditionalOptionsPredicate.js +1 -2
- package/dist/conditionalLogicService/evaluateConditionalOptionsPredicate.js.map +1 -1
- package/dist/formElementsService.d.ts +8 -4
- package/dist/formElementsService.js +11 -7
- package/dist/formElementsService.js.map +1 -1
- package/dist/replaceCustomValues.d.ts +11 -3
- package/dist/replaceCustomValues.js +31 -20
- package/dist/replaceCustomValues.js.map +1 -1
- package/dist/userService.js +3 -4
- package/dist/userService.js.map +1 -1
- package/package.json +2 -2
package/dist/abnService.js
CHANGED
|
@@ -28,16 +28,15 @@ const createLegalName = ({ familyName, givenName, otherGivenName, }) => {
|
|
|
28
28
|
* @returns
|
|
29
29
|
*/
|
|
30
30
|
const getBusinessNameFromABNRecord = (abnRecord) => {
|
|
31
|
-
var _a, _b;
|
|
32
31
|
if (abnRecord.entityType.entityTypeCode === 'IND' && abnRecord.legalName) {
|
|
33
32
|
const legalName = createLegalName(abnRecord.legalName);
|
|
34
33
|
if (legalName)
|
|
35
34
|
return legalName.trim();
|
|
36
35
|
}
|
|
37
|
-
if (
|
|
36
|
+
if (abnRecord.mainName?.organisationName) {
|
|
38
37
|
return abnRecord.mainName.organisationName;
|
|
39
38
|
}
|
|
40
|
-
if (
|
|
39
|
+
if (abnRecord.mainTradingName?.organisationName) {
|
|
41
40
|
return abnRecord.mainTradingName.organisationName;
|
|
42
41
|
}
|
|
43
42
|
if (abnRecord.legalName) {
|
|
@@ -84,7 +83,7 @@ const getABNNumberFromABNRecord = (abnRecord) => {
|
|
|
84
83
|
return;
|
|
85
84
|
if (Array.isArray(abnRecord.ABN)) {
|
|
86
85
|
const relevantABN = abnRecord.ABN.find((abn) => abn.isCurrentIndicator === 'Y');
|
|
87
|
-
return relevantABN
|
|
86
|
+
return relevantABN?.identifierValue;
|
|
88
87
|
}
|
|
89
88
|
return abnRecord.ABN.identifierValue;
|
|
90
89
|
};
|
package/dist/abnService.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abnService.js","sourceRoot":"","sources":["../src/abnService.ts"],"names":[],"mappings":";;;AAEA,MAAM,eAAe,GAAG,CAAC,EACvB,UAAU,EACV,SAAS,EACT,cAAc,GACsB,EAAE,EAAE;IACxC,IAAI,SAAS,GAAG,EAAE,CAAA;IAClB,mBAAmB;IACnB,IAAI,UAAU;QAAE,SAAS,IAAI,GAAG,UAAU,IAAI,CAAA;IAC9C,oBAAoB;IACpB,IAAI,SAAS;QAAE,SAAS,IAAI,GAAG,SAAS,GAAG,CAAA;IAC3C,qBAAqB;IACrB,IAAI,cAAc;QAAE,SAAS,IAAI,GAAG,cAAc,EAAE,CAAA;IAEpD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED;;;;;;;;;;;;GAYG;AACI,MAAM,4BAA4B,GAAG,CAC1C,SAAoB,EACA,EAAE
|
|
1
|
+
{"version":3,"file":"abnService.js","sourceRoot":"","sources":["../src/abnService.ts"],"names":[],"mappings":";;;AAEA,MAAM,eAAe,GAAG,CAAC,EACvB,UAAU,EACV,SAAS,EACT,cAAc,GACsB,EAAE,EAAE;IACxC,IAAI,SAAS,GAAG,EAAE,CAAA;IAClB,mBAAmB;IACnB,IAAI,UAAU;QAAE,SAAS,IAAI,GAAG,UAAU,IAAI,CAAA;IAC9C,oBAAoB;IACpB,IAAI,SAAS;QAAE,SAAS,IAAI,GAAG,SAAS,GAAG,CAAA;IAC3C,qBAAqB;IACrB,IAAI,cAAc;QAAE,SAAS,IAAI,GAAG,cAAc,EAAE,CAAA;IAEpD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED;;;;;;;;;;;;GAYG;AACI,MAAM,4BAA4B,GAAG,CAC1C,SAAoB,EACA,EAAE;IACtB,IAAI,SAAS,CAAC,UAAU,CAAC,cAAc,KAAK,KAAK,IAAI,SAAS,CAAC,SAAS,EAAE;QACxE,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACtD,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC,IAAI,EAAE,CAAA;KACvC;IAED,IAAI,SAAS,CAAC,QAAQ,EAAE,gBAAgB,EAAE;QACxC,OAAO,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAA;KAC3C;IACD,IAAI,SAAS,CAAC,eAAe,EAAE,gBAAgB,EAAE;QAC/C,OAAO,SAAS,CAAC,eAAe,CAAC,gBAAgB,CAAA;KAClD;IACD,IAAI,SAAS,CAAC,SAAS,EAAE;QACvB,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACtD,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC,IAAI,EAAE,CAAA;KACvC;AACH,CAAC,CAAA;AAlBY,QAAA,4BAA4B,gCAkBxC;AAED;;;;;;;;;;;;;GAaG;AACI,MAAM,gCAAgC,GAAG,CAC9C,SAAoB,EACZ,EAAE;IACV,MAAM,YAAY,GAAG,IAAA,oCAA4B,EAAC,SAAS,CAAC,CAAA;IAC5D,OAAO,YAAY,IAAI,wBAAwB,CAAA;AACjD,CAAC,CAAA;AALY,QAAA,gCAAgC,oCAK5C;AAED;;;;;;;;;;;;GAYG;AACI,MAAM,yBAAyB,GAAG,CACvC,SAAoB,EACA,EAAE;IACtB,IAAI,CAAC,SAAS,CAAC,GAAG;QAAE,OAAM;IAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;QAChC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CACpC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG,CACxC,CAAA;QACD,OAAO,WAAW,EAAE,eAAe,CAAA;KACpC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,eAAe,CAAA;AACtC,CAAC,CAAA;AAXY,QAAA,yBAAyB,6BAWrC;AAED;;;;;;;;;;;;GAYG;AACI,MAAM,6BAA6B,GAAG,CAAC,SAAoB,EAAU,EAAE;IAC5E,MAAM,SAAS,GAAG,IAAA,iCAAyB,EAAC,SAAS,CAAC,CAAA;IACtD,OAAO,SAAS,IAAI,oBAAoB,CAAA;AAC1C,CAAC,CAAA;AAHY,QAAA,6BAA6B,iCAGzC","sourcesContent":["import { ABNRecord } from '@oneblink/types/typescript/misc'\n\nconst createLegalName = ({\n familyName,\n givenName,\n otherGivenName,\n}: NonNullable<ABNRecord['legalName']>) => {\n let legalName = ''\n // Concat last name\n if (familyName) legalName += `${familyName}, `\n // Concat first name\n if (givenName) legalName += `${givenName} `\n // Concat middle name\n if (otherGivenName) legalName += `${otherGivenName}`\n\n return legalName\n}\n\n/**\n * Attempts to get the most relevant business name from the data returned in an\n * `ABNRecord`. Will return `undefined` if a suitable name is not found.\n *\n * #### Example\n *\n * ```js\n * const businessName = abnService.getBusinessNameFromABNRecord(abnRecord)\n * ```\n *\n * @param abnRecord\n * @returns\n */\nexport const getBusinessNameFromABNRecord = (\n abnRecord: ABNRecord,\n): string | undefined => {\n if (abnRecord.entityType.entityTypeCode === 'IND' && abnRecord.legalName) {\n const legalName = createLegalName(abnRecord.legalName)\n if (legalName) return legalName.trim()\n }\n\n if (abnRecord.mainName?.organisationName) {\n return abnRecord.mainName.organisationName\n }\n if (abnRecord.mainTradingName?.organisationName) {\n return abnRecord.mainTradingName.organisationName\n }\n if (abnRecord.legalName) {\n const legalName = createLegalName(abnRecord.legalName)\n if (legalName) return legalName.trim()\n }\n}\n\n/**\n * Get the most relevant business name from the data returned in an `ABNRecord`.\n * Will return \"Unknown Business Name\" if a suitable name is not found.\n *\n * #### Example\n *\n * ```js\n * const businessName =\n * abnService.displayBusinessNameFromABNRecord(abnRecord)\n * ```\n *\n * @param abnRecord\n * @returns\n */\nexport const displayBusinessNameFromABNRecord = (\n abnRecord: ABNRecord,\n): string => {\n const businessName = getBusinessNameFromABNRecord(abnRecord)\n return businessName || 'ABN Details Suppressed'\n}\n\n/**\n * Attempts to get the most recent ABN number from the data returned in an\n * `ABNRecord`. Will return `undefined` if an ABN is not found.\n *\n * #### Example\n *\n * ```js\n * const ABN = abnService.getABNNumberFromABNRecord(abnRecord)\n * ```\n *\n * @param abnRecord\n * @returns\n */\nexport const getABNNumberFromABNRecord = (\n abnRecord: ABNRecord,\n): string | undefined => {\n if (!abnRecord.ABN) return\n if (Array.isArray(abnRecord.ABN)) {\n const relevantABN = abnRecord.ABN.find(\n (abn) => abn.isCurrentIndicator === 'Y',\n )\n return relevantABN?.identifierValue\n }\n return abnRecord.ABN.identifierValue\n}\n\n/**\n * Attempts to get the most recent ABN number from the data returned in an\n * `ABNRecord`. Will return \"Unknown ABN Number\" if an ABN is not found.\n *\n * #### Example\n *\n * ```js\n * const ABN = abnService.displayABNNumberFromABNRecord(abnRecord)\n * ```\n *\n * @param abnRecord\n * @returns\n */\nexport const displayABNNumberFromABNRecord = (abnRecord: ABNRecord): string => {\n const abnNumber = getABNNumberFromABNRecord(abnRecord)\n return abnNumber || 'Unknown ABN Number'\n}\n"]}
|
|
@@ -67,8 +67,7 @@ const conditionallyShowOptionByPredicate = (formElementsCtrl, predicate, element
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
const everyOptionIsShowing = predicate.optionIds.every((id) => {
|
|
70
|
-
|
|
71
|
-
const predicateOption = (_a = optionsPredicateElement.options) === null || _a === void 0 ? void 0 : _a.find((o) => o.id === id);
|
|
70
|
+
const predicateOption = optionsPredicateElement.options?.find((o) => o.id === id);
|
|
72
71
|
if (!predicateOption)
|
|
73
72
|
return 'HIDE';
|
|
74
73
|
return conditionallyShowOption({ model: formElementsCtrl.model, flattenedElements: [] }, optionsPredicateElement, predicateOption, elementsEvaluated);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditionallyShowOption.js","sourceRoot":"","sources":["../../src/conditionalLogicService/conditionallyShowOption.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport evaluateConditionalOptionsPredicate from './evaluateConditionalOptionsPredicate'\nimport { FormElementsCtrl } from '../types'\nimport { typeCastService } from '..'\nimport conditionallyShowElement from './conditionallyShowElement'\n\nexport type ShouldShowOption =\n | 'SHOW'\n | 'HIDE'\n | 'LOADING_DYNAMIC_DEPENDENCY'\n | 'LOADING_STATIC_DEPENDENCY'\n\nconst handleAttributePredicate = (\n predicate: FormTypes.ChoiceElementOptionAttribute,\n model: SubmissionTypes.S3SubmissionData['submission'],\n predicateElement: FormTypes.FormElementWithOptions,\n) => {\n const values = model[predicateElement.name]\n if (!values) return true\n\n if (\n Array.isArray(values) &&\n (!values.length ||\n !values.filter((value) => typeof value !== 'undefined').length)\n ) {\n return true\n }\n\n return evaluateConditionalOptionsPredicate({\n predicate: {\n type: 'OPTIONS',\n elementId: predicate.elementId,\n optionIds: predicate.optionIds,\n },\n predicateValue: values,\n predicateElement,\n })\n}\n\nconst conditionallyShowOptionByPredicate = (\n formElementsCtrl: FormElementsCtrl,\n predicate: FormTypes.ChoiceElementOptionAttribute,\n elementsEvaluated: string[],\n): ShouldShowOption => {\n // Validate the predicate data, if it is invalid,\n // we will always show the field\n if (\n !predicate ||\n !predicate.elementId ||\n !predicate.optionIds ||\n !predicate.optionIds.length\n ) {\n return 'SHOW'\n }\n const predicateElement = formElementsCtrl.flattenedElements.find(\n (element) => {\n return element.id === predicate.elementId\n },\n )\n\n // If we cant find the element used for the predicate,\n // we can check to see if the element being evaluated\n // is in a repeatable set and the predicate element is\n // in a parent list of elements.\n if (!predicateElement) {\n if (formElementsCtrl.parentFormElementsCtrl) {\n return conditionallyShowOptionByPredicate(\n formElementsCtrl.parentFormElementsCtrl,\n predicate,\n elementsEvaluated,\n )\n } else {\n return 'HIDE'\n }\n }\n\n const optionsPredicateElement =\n typeCastService.formElements.toOptionsElement(predicateElement)\n if (!optionsPredicateElement) {\n return 'HIDE'\n }\n // If the predicate element does not have any options to evaluate,\n // we will show the element.\n // Unless the predicate element has dynamic options and\n // options have not been fetched yet.\n const isLoadingPredicateElementsOptions = !Array.isArray(\n optionsPredicateElement.options,\n )\n if (isLoadingPredicateElementsOptions) {\n if (optionsPredicateElement.optionsType === 'DYNAMIC') {\n return 'LOADING_DYNAMIC_DEPENDENCY'\n } else {\n return 'LOADING_STATIC_DEPENDENCY'\n }\n }\n\n const everyOptionIsShowing = predicate.optionIds.every((id) => {\n const predicateOption = optionsPredicateElement.options?.find(\n (o) => o.id === id,\n )\n if (!predicateOption) return 'HIDE'\n\n return conditionallyShowOption(\n { model: formElementsCtrl.model, flattenedElements: [] },\n optionsPredicateElement,\n predicateOption,\n elementsEvaluated,\n )\n })\n\n if (!everyOptionIsShowing) {\n return 'HIDE'\n }\n\n // Check to see if the model has one of the valid values to show the element\n const shouldShow = handleAttributePredicate(\n predicate,\n formElementsCtrl.model,\n optionsPredicateElement,\n )\n return shouldShow ? 'SHOW' : 'HIDE'\n}\n\nconst isAttributeFilterValid = (\n formElementsCtrl: FormElementsCtrl,\n predicate: FormTypes.ChoiceElementOptionAttribute,\n elementsEvaluated: string[],\n): boolean => {\n const predicateElement = formElementsCtrl.flattenedElements.find(\n (element) => {\n return element.id === predicate.elementId\n },\n )\n\n // If we cant find the element used for the predicate,\n // we can check to see if the element being evaluated\n // is in a repeatable set and the predicate element is\n // in a parent list of elements.\n if (!predicateElement) {\n if (formElementsCtrl.parentFormElementsCtrl) {\n return isAttributeFilterValid(\n formElementsCtrl.parentFormElementsCtrl,\n predicate,\n elementsEvaluated,\n )\n } else {\n return false\n }\n }\n\n // now we have the model and predicate element, verify that the predicate element\n // is not hidden\n if (\n // Will never be a page, just making typescript happy :)\n predicateElement.type === 'page' ||\n predicateElement.type === 'section' ||\n !conditionallyShowElement(formElementsCtrl, predicateElement, [])\n ) {\n return false\n }\n\n // verify that at least one option is selected\n const values = formElementsCtrl.model[predicateElement.name]\n if (!values) return false\n // if the model value is an array, verify that it has a selection\n if (\n Array.isArray(values) &&\n (!values.length ||\n !values.filter((value) => typeof value !== 'undefined').length)\n ) {\n return false\n }\n\n return true\n}\n\nexport default function conditionallyShowOption(\n formElementsCtrl: FormElementsCtrl,\n elementToEvaluate: FormTypes.FormElementWithOptions,\n optionToEvaluate: FormTypes.ChoiceElementOption,\n optionsEvaluated: string[],\n): ShouldShowOption {\n // If the element does not have the `conditionallyShow` flag set,\n // we can always show the element.\n\n if (\n !elementToEvaluate.conditionallyShowOptions ||\n !optionToEvaluate ||\n !optionToEvaluate.attributes ||\n !Array.isArray(optionToEvaluate.attributes) ||\n !optionToEvaluate.attributes.length\n ) {\n return 'SHOW'\n }\n\n // Check to see if this element has already been used to evaluate\n // if the element should be shown based on parent element conditional logic\n if (optionsEvaluated.some((optionId) => optionId === optionToEvaluate.id)) {\n throw new Error(\n 'Your conditional logic has caused an infinite loop. Check the following Fields to ensure element A does not rely on element B if element B also relies on element A.',\n )\n } else {\n optionsEvaluated.push(optionToEvaluate.id)\n }\n const validPredicates = (optionToEvaluate.attributes || []).filter(\n (predicate) => {\n return isAttributeFilterValid(\n formElementsCtrl,\n predicate,\n optionsEvaluated,\n )\n },\n )\n if (!validPredicates.length) return 'SHOW'\n\n let isLoadingDynamicDEPENDENCY = false\n let isLoadingStaticDEPENDENCY = false\n for (const predicate of validPredicates) {\n const predicateResult = conditionallyShowOptionByPredicate(\n formElementsCtrl,\n predicate,\n optionsEvaluated,\n )\n switch (predicateResult) {\n case 'SHOW': {\n return 'SHOW'\n }\n case 'LOADING_DYNAMIC_DEPENDENCY': {\n isLoadingDynamicDEPENDENCY = true\n break\n }\n case 'LOADING_STATIC_DEPENDENCY': {\n isLoadingStaticDEPENDENCY = true\n break\n }\n }\n }\n if (isLoadingDynamicDEPENDENCY) {\n return 'LOADING_DYNAMIC_DEPENDENCY'\n } else if (isLoadingStaticDEPENDENCY) {\n return 'LOADING_STATIC_DEPENDENCY'\n } else {\n return 'HIDE'\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"conditionallyShowOption.js","sourceRoot":"","sources":["../../src/conditionalLogicService/conditionallyShowOption.ts"],"names":[],"mappings":";;;;;AACA,gHAAuF;AAEvF,0BAAoC;AACpC,0FAAiE;AAQjE,MAAM,wBAAwB,GAAG,CAC/B,SAAiD,EACjD,KAAqD,EACrD,gBAAkD,EAClD,EAAE;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAExB,IACE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACrB,CAAC,CAAC,MAAM,CAAC,MAAM;YACb,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC,EACjE;QACA,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,IAAA,6CAAmC,EAAC;QACzC,SAAS,EAAE;YACT,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,SAAS,EAAE,SAAS,CAAC,SAAS;SAC/B;QACD,cAAc,EAAE,MAAM;QACtB,gBAAgB;KACjB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,kCAAkC,GAAG,CACzC,gBAAkC,EAClC,SAAiD,EACjD,iBAA2B,EACT,EAAE;IACpB,iDAAiD;IACjD,gCAAgC;IAChC,IACE,CAAC,SAAS;QACV,CAAC,SAAS,CAAC,SAAS;QACpB,CAAC,SAAS,CAAC,SAAS;QACpB,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAC3B;QACA,OAAO,MAAM,CAAA;KACd;IACD,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAC9D,CAAC,OAAO,EAAE,EAAE;QACV,OAAO,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,SAAS,CAAA;IAC3C,CAAC,CACF,CAAA;IAED,sDAAsD;IACtD,qDAAqD;IACrD,sDAAsD;IACtD,gCAAgC;IAChC,IAAI,CAAC,gBAAgB,EAAE;QACrB,IAAI,gBAAgB,CAAC,sBAAsB,EAAE;YAC3C,OAAO,kCAAkC,CACvC,gBAAgB,CAAC,sBAAsB,EACvC,SAAS,EACT,iBAAiB,CAClB,CAAA;SACF;aAAM;YACL,OAAO,MAAM,CAAA;SACd;KACF;IAED,MAAM,uBAAuB,GAC3B,mBAAe,CAAC,YAAY,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAA;IACjE,IAAI,CAAC,uBAAuB,EAAE;QAC5B,OAAO,MAAM,CAAA;KACd;IACD,kEAAkE;IAClE,4BAA4B;IAC5B,uDAAuD;IACvD,qCAAqC;IACrC,MAAM,iCAAiC,GAAG,CAAC,KAAK,CAAC,OAAO,CACtD,uBAAuB,CAAC,OAAO,CAChC,CAAA;IACD,IAAI,iCAAiC,EAAE;QACrC,IAAI,uBAAuB,CAAC,WAAW,KAAK,SAAS,EAAE;YACrD,OAAO,4BAA4B,CAAA;SACpC;aAAM;YACL,OAAO,2BAA2B,CAAA;SACnC;KACF;IAED,MAAM,oBAAoB,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;QAC5D,MAAM,eAAe,GAAG,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CACnB,CAAA;QACD,IAAI,CAAC,eAAe;YAAE,OAAO,MAAM,CAAA;QAEnC,OAAO,uBAAuB,CAC5B,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,EACxD,uBAAuB,EACvB,eAAe,EACf,iBAAiB,CAClB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,MAAM,CAAA;KACd;IAED,4EAA4E;IAC5E,MAAM,UAAU,GAAG,wBAAwB,CACzC,SAAS,EACT,gBAAgB,CAAC,KAAK,EACtB,uBAAuB,CACxB,CAAA;IACD,OAAO,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;AACrC,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,CAC7B,gBAAkC,EAClC,SAAiD,EACjD,iBAA2B,EAClB,EAAE;IACX,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAC9D,CAAC,OAAO,EAAE,EAAE;QACV,OAAO,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,SAAS,CAAA;IAC3C,CAAC,CACF,CAAA;IAED,sDAAsD;IACtD,qDAAqD;IACrD,sDAAsD;IACtD,gCAAgC;IAChC,IAAI,CAAC,gBAAgB,EAAE;QACrB,IAAI,gBAAgB,CAAC,sBAAsB,EAAE;YAC3C,OAAO,sBAAsB,CAC3B,gBAAgB,CAAC,sBAAsB,EACvC,SAAS,EACT,iBAAiB,CAClB,CAAA;SACF;aAAM;YACL,OAAO,KAAK,CAAA;SACb;KACF;IAED,iFAAiF;IACjF,gBAAgB;IAChB;IACE,wDAAwD;IACxD,gBAAgB,CAAC,IAAI,KAAK,MAAM;QAChC,gBAAgB,CAAC,IAAI,KAAK,SAAS;QACnC,CAAC,IAAA,kCAAwB,EAAC,gBAAgB,EAAE,gBAAgB,EAAE,EAAE,CAAC,EACjE;QACA,OAAO,KAAK,CAAA;KACb;IAED,8CAA8C;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAC5D,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACzB,iEAAiE;IACjE,IACE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACrB,CAAC,CAAC,MAAM,CAAC,MAAM;YACb,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC,EACjE;QACA,OAAO,KAAK,CAAA;KACb;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,SAAwB,uBAAuB,CAC7C,gBAAkC,EAClC,iBAAmD,EACnD,gBAA+C,EAC/C,gBAA0B;IAE1B,iEAAiE;IACjE,kCAAkC;IAElC,IACE,CAAC,iBAAiB,CAAC,wBAAwB;QAC3C,CAAC,gBAAgB;QACjB,CAAC,gBAAgB,CAAC,UAAU;QAC5B,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAC3C,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,EACnC;QACA,OAAO,MAAM,CAAA;KACd;IAED,iEAAiE;IACjE,2EAA2E;IAC3E,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,gBAAgB,CAAC,EAAE,CAAC,EAAE;QACzE,MAAM,IAAI,KAAK,CACb,sKAAsK,CACvK,CAAA;KACF;SAAM;QACL,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;KAC3C;IACD,MAAM,eAAe,GAAG,CAAC,gBAAgB,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CAChE,CAAC,SAAS,EAAE,EAAE;QACZ,OAAO,sBAAsB,CAC3B,gBAAgB,EAChB,SAAS,EACT,gBAAgB,CACjB,CAAA;IACH,CAAC,CACF,CAAA;IACD,IAAI,CAAC,eAAe,CAAC,MAAM;QAAE,OAAO,MAAM,CAAA;IAE1C,IAAI,0BAA0B,GAAG,KAAK,CAAA;IACtC,IAAI,yBAAyB,GAAG,KAAK,CAAA;IACrC,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE;QACvC,MAAM,eAAe,GAAG,kCAAkC,CACxD,gBAAgB,EAChB,SAAS,EACT,gBAAgB,CACjB,CAAA;QACD,QAAQ,eAAe,EAAE;YACvB,KAAK,MAAM,CAAC,CAAC;gBACX,OAAO,MAAM,CAAA;aACd;YACD,KAAK,4BAA4B,CAAC,CAAC;gBACjC,0BAA0B,GAAG,IAAI,CAAA;gBACjC,MAAK;aACN;YACD,KAAK,2BAA2B,CAAC,CAAC;gBAChC,yBAAyB,GAAG,IAAI,CAAA;gBAChC,MAAK;aACN;SACF;KACF;IACD,IAAI,0BAA0B,EAAE;QAC9B,OAAO,4BAA4B,CAAA;KACpC;SAAM,IAAI,yBAAyB,EAAE;QACpC,OAAO,2BAA2B,CAAA;KACnC;SAAM;QACL,OAAO,MAAM,CAAA;KACd;AACH,CAAC;AApED,0CAoEC","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport evaluateConditionalOptionsPredicate from './evaluateConditionalOptionsPredicate'\nimport { FormElementsCtrl } from '../types'\nimport { typeCastService } from '..'\nimport conditionallyShowElement from './conditionallyShowElement'\n\nexport type ShouldShowOption =\n | 'SHOW'\n | 'HIDE'\n | 'LOADING_DYNAMIC_DEPENDENCY'\n | 'LOADING_STATIC_DEPENDENCY'\n\nconst handleAttributePredicate = (\n predicate: FormTypes.ChoiceElementOptionAttribute,\n model: SubmissionTypes.S3SubmissionData['submission'],\n predicateElement: FormTypes.FormElementWithOptions,\n) => {\n const values = model[predicateElement.name]\n if (!values) return true\n\n if (\n Array.isArray(values) &&\n (!values.length ||\n !values.filter((value) => typeof value !== 'undefined').length)\n ) {\n return true\n }\n\n return evaluateConditionalOptionsPredicate({\n predicate: {\n type: 'OPTIONS',\n elementId: predicate.elementId,\n optionIds: predicate.optionIds,\n },\n predicateValue: values,\n predicateElement,\n })\n}\n\nconst conditionallyShowOptionByPredicate = (\n formElementsCtrl: FormElementsCtrl,\n predicate: FormTypes.ChoiceElementOptionAttribute,\n elementsEvaluated: string[],\n): ShouldShowOption => {\n // Validate the predicate data, if it is invalid,\n // we will always show the field\n if (\n !predicate ||\n !predicate.elementId ||\n !predicate.optionIds ||\n !predicate.optionIds.length\n ) {\n return 'SHOW'\n }\n const predicateElement = formElementsCtrl.flattenedElements.find(\n (element) => {\n return element.id === predicate.elementId\n },\n )\n\n // If we cant find the element used for the predicate,\n // we can check to see if the element being evaluated\n // is in a repeatable set and the predicate element is\n // in a parent list of elements.\n if (!predicateElement) {\n if (formElementsCtrl.parentFormElementsCtrl) {\n return conditionallyShowOptionByPredicate(\n formElementsCtrl.parentFormElementsCtrl,\n predicate,\n elementsEvaluated,\n )\n } else {\n return 'HIDE'\n }\n }\n\n const optionsPredicateElement =\n typeCastService.formElements.toOptionsElement(predicateElement)\n if (!optionsPredicateElement) {\n return 'HIDE'\n }\n // If the predicate element does not have any options to evaluate,\n // we will show the element.\n // Unless the predicate element has dynamic options and\n // options have not been fetched yet.\n const isLoadingPredicateElementsOptions = !Array.isArray(\n optionsPredicateElement.options,\n )\n if (isLoadingPredicateElementsOptions) {\n if (optionsPredicateElement.optionsType === 'DYNAMIC') {\n return 'LOADING_DYNAMIC_DEPENDENCY'\n } else {\n return 'LOADING_STATIC_DEPENDENCY'\n }\n }\n\n const everyOptionIsShowing = predicate.optionIds.every((id) => {\n const predicateOption = optionsPredicateElement.options?.find(\n (o) => o.id === id,\n )\n if (!predicateOption) return 'HIDE'\n\n return conditionallyShowOption(\n { model: formElementsCtrl.model, flattenedElements: [] },\n optionsPredicateElement,\n predicateOption,\n elementsEvaluated,\n )\n })\n\n if (!everyOptionIsShowing) {\n return 'HIDE'\n }\n\n // Check to see if the model has one of the valid values to show the element\n const shouldShow = handleAttributePredicate(\n predicate,\n formElementsCtrl.model,\n optionsPredicateElement,\n )\n return shouldShow ? 'SHOW' : 'HIDE'\n}\n\nconst isAttributeFilterValid = (\n formElementsCtrl: FormElementsCtrl,\n predicate: FormTypes.ChoiceElementOptionAttribute,\n elementsEvaluated: string[],\n): boolean => {\n const predicateElement = formElementsCtrl.flattenedElements.find(\n (element) => {\n return element.id === predicate.elementId\n },\n )\n\n // If we cant find the element used for the predicate,\n // we can check to see if the element being evaluated\n // is in a repeatable set and the predicate element is\n // in a parent list of elements.\n if (!predicateElement) {\n if (formElementsCtrl.parentFormElementsCtrl) {\n return isAttributeFilterValid(\n formElementsCtrl.parentFormElementsCtrl,\n predicate,\n elementsEvaluated,\n )\n } else {\n return false\n }\n }\n\n // now we have the model and predicate element, verify that the predicate element\n // is not hidden\n if (\n // Will never be a page, just making typescript happy :)\n predicateElement.type === 'page' ||\n predicateElement.type === 'section' ||\n !conditionallyShowElement(formElementsCtrl, predicateElement, [])\n ) {\n return false\n }\n\n // verify that at least one option is selected\n const values = formElementsCtrl.model[predicateElement.name]\n if (!values) return false\n // if the model value is an array, verify that it has a selection\n if (\n Array.isArray(values) &&\n (!values.length ||\n !values.filter((value) => typeof value !== 'undefined').length)\n ) {\n return false\n }\n\n return true\n}\n\nexport default function conditionallyShowOption(\n formElementsCtrl: FormElementsCtrl,\n elementToEvaluate: FormTypes.FormElementWithOptions,\n optionToEvaluate: FormTypes.ChoiceElementOption,\n optionsEvaluated: string[],\n): ShouldShowOption {\n // If the element does not have the `conditionallyShow` flag set,\n // we can always show the element.\n\n if (\n !elementToEvaluate.conditionallyShowOptions ||\n !optionToEvaluate ||\n !optionToEvaluate.attributes ||\n !Array.isArray(optionToEvaluate.attributes) ||\n !optionToEvaluate.attributes.length\n ) {\n return 'SHOW'\n }\n\n // Check to see if this element has already been used to evaluate\n // if the element should be shown based on parent element conditional logic\n if (optionsEvaluated.some((optionId) => optionId === optionToEvaluate.id)) {\n throw new Error(\n 'Your conditional logic has caused an infinite loop. Check the following Fields to ensure element A does not rely on element B if element B also relies on element A.',\n )\n } else {\n optionsEvaluated.push(optionToEvaluate.id)\n }\n const validPredicates = (optionToEvaluate.attributes || []).filter(\n (predicate) => {\n return isAttributeFilterValid(\n formElementsCtrl,\n predicate,\n optionsEvaluated,\n )\n },\n )\n if (!validPredicates.length) return 'SHOW'\n\n let isLoadingDynamicDEPENDENCY = false\n let isLoadingStaticDEPENDENCY = false\n for (const predicate of validPredicates) {\n const predicateResult = conditionallyShowOptionByPredicate(\n formElementsCtrl,\n predicate,\n optionsEvaluated,\n )\n switch (predicateResult) {\n case 'SHOW': {\n return 'SHOW'\n }\n case 'LOADING_DYNAMIC_DEPENDENCY': {\n isLoadingDynamicDEPENDENCY = true\n break\n }\n case 'LOADING_STATIC_DEPENDENCY': {\n isLoadingStaticDEPENDENCY = true\n break\n }\n }\n }\n if (isLoadingDynamicDEPENDENCY) {\n return 'LOADING_DYNAMIC_DEPENDENCY'\n } else if (isLoadingStaticDEPENDENCY) {\n return 'LOADING_STATIC_DEPENDENCY'\n } else {\n return 'HIDE'\n }\n}\n"]}
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
function evaluateConditionalOptionsPredicate({ predicate, predicateElement, predicateValue: value, }) {
|
|
4
4
|
return predicate.optionIds.some((optionId) => {
|
|
5
|
-
|
|
6
|
-
const option = (_a = predicateElement.options) === null || _a === void 0 ? void 0 : _a.find((o) => o.id === optionId);
|
|
5
|
+
const option = predicateElement.options?.find((o) => o.id === optionId);
|
|
7
6
|
if (option) {
|
|
8
7
|
if (Array.isArray(value)) {
|
|
9
8
|
return value.some((modelValue) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluateConditionalOptionsPredicate.js","sourceRoot":"","sources":["../../src/conditionalLogicService/evaluateConditionalOptionsPredicate.ts"],"names":[],"mappings":";;AAEA,SAAwB,mCAAmC,CAAC,EAC1D,SAAS,EACT,gBAAgB,EAChB,cAAc,EAAE,KAAK,GAKtB;IACC,OAAO,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE
|
|
1
|
+
{"version":3,"file":"evaluateConditionalOptionsPredicate.js","sourceRoot":"","sources":["../../src/conditionalLogicService/evaluateConditionalOptionsPredicate.ts"],"names":[],"mappings":";;AAEA,SAAwB,mCAAmC,CAAC,EAC1D,SAAS,EACT,gBAAgB,EAChB,cAAc,EAAE,KAAK,GAKtB;IACC,OAAO,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC3C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QACvE,IAAI,MAAM,EAAE;YACV,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACxB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;oBAC/B,OAAO,UAAU,KAAK,MAAM,CAAC,KAAK,CAAA;gBACpC,CAAC,CAAC,CAAA;aACH;iBAAM,IAAI,gBAAgB,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,EAAE;gBAC1D,OAAO,MAAM,CAAC,KAAK,KAAM,KAA4B,CAAC,KAAK,CAAA;aAC5D;iBAAM;gBACL,OAAO,MAAM,CAAC,KAAK,KAAK,KAAK,CAAA;aAC9B;SACF;aAAM;YACL,OAAO,KAAK,CAAA;SACb;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAzBD,sDAyBC","sourcesContent":["import { FormTypes, ConditionTypes } from '@oneblink/types'\n\nexport default function evaluateConditionalOptionsPredicate({\n predicate,\n predicateElement,\n predicateValue: value,\n}: {\n predicate: ConditionTypes.ConditionalPredicateOptions\n predicateValue: unknown\n predicateElement: FormTypes.FormElementWithOptions\n}): boolean {\n return predicate.optionIds.some((optionId) => {\n const option = predicateElement.options?.find((o) => o.id === optionId)\n if (option) {\n if (Array.isArray(value)) {\n return value.some((modelValue) => {\n return modelValue === option.value\n })\n } else if (predicateElement.type === 'compliance' && value) {\n return option.value === (value as { value: unknown }).value\n } else {\n return option.value === value\n }\n } else {\n return false\n }\n })\n}\n"]}
|
|
@@ -72,7 +72,8 @@ declare function findFormElement(elements: FormTypes.FormElement[], predicate: (
|
|
|
72
72
|
*/
|
|
73
73
|
declare function parseFormElementOptionsSet(data: unknown): FormTypes.ChoiceElementOption[];
|
|
74
74
|
/**
|
|
75
|
-
* Takes the nested definition structure and returns all form elements as 1d
|
|
75
|
+
* Takes the nested definition structure and returns all form elements as 1d
|
|
76
|
+
* array.
|
|
76
77
|
*
|
|
77
78
|
* #### Example
|
|
78
79
|
*
|
|
@@ -86,8 +87,11 @@ declare function parseFormElementOptionsSet(data: unknown): FormTypes.ChoiceElem
|
|
|
86
87
|
* @returns
|
|
87
88
|
*/
|
|
88
89
|
declare function flattenFormElements(elements: FormTypes.FormElement[]): FormTypes.FormElement[];
|
|
89
|
-
/**
|
|
90
|
-
|
|
90
|
+
/**
|
|
91
|
+
* The regex used for matching `{ELEMENT:<elementName>}` tags in the OneBlink
|
|
92
|
+
* platform.
|
|
93
|
+
*/
|
|
94
|
+
declare const ElementWYSIWYGRegex: RegExp;
|
|
91
95
|
/**
|
|
92
96
|
* Takes a string and calls a provided handler function for each found instance
|
|
93
97
|
* of `{ELEMENT:<elementName>}` in the string. Used to replace values in
|
|
@@ -113,4 +117,4 @@ declare const matchElementsTagRegex: (data: string, matchHandler: (options: {
|
|
|
113
117
|
elementName: string;
|
|
114
118
|
elementMatch: string;
|
|
115
119
|
}) => void) => void;
|
|
116
|
-
export { forEachFormElement, forEachFormElementWithOptions, findFormElement, parseFormElementOptionsSet, flattenFormElements,
|
|
120
|
+
export { forEachFormElement, forEachFormElementWithOptions, findFormElement, parseFormElementOptionsSet, flattenFormElements, ElementWYSIWYGRegex, matchElementsTagRegex, };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.matchElementsTagRegex = exports.
|
|
3
|
+
exports.matchElementsTagRegex = exports.ElementWYSIWYGRegex = exports.flattenFormElements = exports.parseFormElementOptionsSet = exports.findFormElement = exports.forEachFormElementWithOptions = exports.forEachFormElement = void 0;
|
|
4
4
|
const _1 = require(".");
|
|
5
5
|
/**
|
|
6
6
|
* Iterate over all form elements, also iterating over nested form element (e.g.
|
|
@@ -146,7 +146,8 @@ function parseFormElementOptionsSet(data) {
|
|
|
146
146
|
}
|
|
147
147
|
exports.parseFormElementOptionsSet = parseFormElementOptionsSet;
|
|
148
148
|
/**
|
|
149
|
-
* Takes the nested definition structure and returns all form elements as 1d
|
|
149
|
+
* Takes the nested definition structure and returns all form elements as 1d
|
|
150
|
+
* array.
|
|
150
151
|
*
|
|
151
152
|
* #### Example
|
|
152
153
|
*
|
|
@@ -172,9 +173,12 @@ function flattenFormElements(elements) {
|
|
|
172
173
|
}, []);
|
|
173
174
|
}
|
|
174
175
|
exports.flattenFormElements = flattenFormElements;
|
|
175
|
-
/**
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
/**
|
|
177
|
+
* The regex used for matching `{ELEMENT:<elementName>}` tags in the OneBlink
|
|
178
|
+
* platform.
|
|
179
|
+
*/
|
|
180
|
+
const ElementWYSIWYGRegex = /({ELEMENT:)([^}]+)(})/g;
|
|
181
|
+
exports.ElementWYSIWYGRegex = ElementWYSIWYGRegex;
|
|
178
182
|
/**
|
|
179
183
|
* Takes a string and calls a provided handler function for each found instance
|
|
180
184
|
* of `{ELEMENT:<elementName>}` in the string. Used to replace values in
|
|
@@ -198,8 +202,8 @@ exports.WYSIWYGRegex = WYSIWYGRegex;
|
|
|
198
202
|
*/
|
|
199
203
|
const matchElementsTagRegex = (data, matchHandler) => {
|
|
200
204
|
let matches;
|
|
201
|
-
while ((matches =
|
|
202
|
-
if (
|
|
205
|
+
while ((matches = ElementWYSIWYGRegex.exec(data)) !== null) {
|
|
206
|
+
if (matches?.length < 3)
|
|
203
207
|
continue;
|
|
204
208
|
const elementName = matches[2];
|
|
205
209
|
matchHandler({ elementName, elementMatch: matches[0] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formElementsService.js","sourceRoot":"","sources":["../src/formElementsService.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport { typeCastService } from '.'\n\n/**\n * Iterate over all form elements, also iterating over nested form element (e.g.\n * page elements).\n *\n * #### Example\n *\n * ```js\n * formElementsService.forEachFormElement(form.elements, (formElement) => {\n * // do something with formElement\n * })\n * ```\n *\n * @param elements The form elements to iterate over\n * @param forEach Function to execute on each form element\n */\nfunction forEachFormElement(\n elements: FormTypes.FormElement[],\n forEach: (\n element: FormTypes.FormElement,\n elements: FormTypes.FormElement[],\n ) => void,\n): void {\n findFormElement(elements, (formElement, parentElements) => {\n forEach(formElement, parentElements)\n return false\n })\n}\n\n/**\n * Iterate over all form elements that have options (e.g. `'select'` type\n * elements), also iterating over nested form element (e.g. page elements).\n *\n * #### Example\n *\n * ```js\n * formElementsService.forEachFormElementWithOptions(\n * form.elements,\n * (formElementWithOptions) => {\n * // do something with formElementWithOptions\n * },\n * )\n * ```\n *\n * @param elements The form elements to iterate over\n * @param forEach Function to execute on each form element with options\n */\nfunction forEachFormElementWithOptions(\n elements: FormTypes.FormElement[],\n forEach: (\n elementWithOptions: FormTypes.FormElementWithOptions,\n elements: FormTypes.FormElement[],\n ) => void,\n): void {\n findFormElement(elements, (formElement, parentElements) => {\n const optionsFormElement =\n typeCastService.formElements.toOptionsElement(formElement)\n if (optionsFormElement) {\n forEach(optionsFormElement, parentElements)\n }\n return false\n })\n}\n\n/**\n * Iterate over all form elements and return an element that matches a\n * predicate, also iterating over nested form element (e.g. page elements). Will\n * return `undefined` if no matching element is found.\n *\n * #### Example\n *\n * ```js\n * const formElement = formElementsService.findFormElement(\n * form.elements,\n * (formElement) => {\n * return formElement.id === '123-abc'\n * },\n * )\n * ```\n *\n * @param elements The form elements to iterate over\n * @param predicate Predicate function to execute on each form element\n * @param parentElements\n * @returns\n */\nfunction findFormElement(\n elements: FormTypes.FormElement[],\n predicate: (\n element: FormTypes.FormElement,\n elements: FormTypes.FormElement[],\n ) => boolean,\n parentElements: FormTypes.FormElement[] = [],\n): FormTypes.FormElement | void {\n for (const element of elements) {\n if (predicate(element, parentElements)) {\n return element\n }\n\n if (\n (element.type === 'repeatableSet' ||\n element.type === 'page' ||\n element.type === 'form' ||\n element.type === 'infoPage' ||\n element.type === 'section') &&\n Array.isArray(element.elements)\n ) {\n const nestedElement = findFormElement(element.elements, predicate, [\n ...parentElements,\n element,\n ])\n\n if (nestedElement) {\n return nestedElement\n }\n }\n }\n}\n\n/**\n * Parse unknown data as valid options for a forms element. This will always\n * return an Array of valid options.\n *\n * #### Example\n *\n * ```js\n * const options = formElementsService.parseFormElementOptionsSet(data)\n * // \"options\" are valid for a form element\n * ```\n *\n * @param data\n * @returns\n */\nfunction parseFormElementOptionsSet(\n data: unknown,\n): FormTypes.ChoiceElementOption[] {\n if (!Array.isArray(data)) {\n return []\n }\n return data.reduce(\n (\n options: FormTypes.ChoiceElementOption[],\n record: unknown,\n index: number,\n ) => {\n if (typeof record === 'string') {\n options.push({\n id: index.toString(),\n value: record,\n label: record,\n })\n } else if (typeof record === 'object') {\n const option = record as Record<string, unknown>\n const value =\n typeof option.value === 'string' && option.value\n ? option.value\n : index.toString()\n const id =\n typeof option.id === 'string' && option.id ? option.id : value\n const label =\n typeof option.label === 'string' && option.label\n ? option.label\n : value\n const colour =\n typeof option.colour === 'string' && option.colour\n ? option.colour\n : undefined\n options.push({\n ...option,\n id,\n value,\n label,\n colour,\n })\n }\n return options\n },\n [],\n )\n}\n\n/**\n * Takes the nested definition structure and returns all form elements as 1d array.\n *\n * #### Example\n *\n * ```js\n * const flattenedElements = formElementsService.flattenFormElements(\n * form.elements,\n * )\n * ```\n *\n * @param elements\n * @returns\n */\nfunction flattenFormElements(\n elements: FormTypes.FormElement[],\n): FormTypes.FormElement[] {\n return elements.reduce<FormTypes.FormElement[]>(\n (flattenedElements, element) => {\n flattenedElements.push(element)\n switch (element.type) {\n case 'section':\n case 'page': {\n flattenedElements.push(...flattenFormElements(element.elements))\n }\n }\n return flattenedElements\n },\n [],\n )\n}\n\n/** The regex used for matching `{ELEMENT:<elementName>}` tags in the OneBlink platform. */\nconst WYSIWYGRegex = /({ELEMENT:)([^}]+)(})/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 * @param data\n * @param handler\n * @returns\n */\nconst matchElementsTagRegex = (\n data: string,\n matchHandler: (options: {\n elementName: string\n elementMatch: string\n }) => void,\n) => {\n let matches\n while ((matches = WYSIWYGRegex.exec(data)) !== null) {\n if (matches?.length < 3) continue\n\n const elementName = matches[2]\n matchHandler({ elementName, elementMatch: matches[0] })\n }\n}\n\nexport {\n forEachFormElement,\n forEachFormElementWithOptions,\n findFormElement,\n parseFormElementOptionsSet,\n flattenFormElements,\n WYSIWYGRegex,\n matchElementsTagRegex,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"formElementsService.js","sourceRoot":"","sources":["../src/formElementsService.ts"],"names":[],"mappings":";;;AACA,wBAAmC;AAEnC;;;;;;;;;;;;;;GAcG;AACH,SAAS,kBAAkB,CACzB,QAAiC,EACjC,OAGS;IAET,eAAe,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE;QACxD,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;QACpC,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAsOC,gDAAkB;AApOpB;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,6BAA6B,CACpC,QAAiC,EACjC,OAGS;IAET,eAAe,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE;QACxD,MAAM,kBAAkB,GACtB,kBAAe,CAAC,YAAY,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAA;QAC5D,IAAI,kBAAkB,EAAE;YACtB,OAAO,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAA;SAC5C;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAoMC,sEAA6B;AAlM/B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAS,eAAe,CACtB,QAAiC,EACjC,SAGY,EACZ,iBAA0C,EAAE;IAE5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,IAAI,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE;YACtC,OAAO,OAAO,CAAA;SACf;QAED,IACE,CAAC,OAAO,CAAC,IAAI,KAAK,eAAe;YAC/B,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,UAAU;YAC3B,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;YAC7B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC/B;YACA,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE;gBACjE,GAAG,cAAc;gBACjB,OAAO;aACR,CAAC,CAAA;YAEF,IAAI,aAAa,EAAE;gBACjB,OAAO,aAAa,CAAA;aACrB;SACF;KACF;AACH,CAAC;AA+IC,0CAAe;AA7IjB;;;;;;;;;;;;;GAaG;AACH,SAAS,0BAA0B,CACjC,IAAa;IAEb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACxB,OAAO,EAAE,CAAA;KACV;IACD,OAAO,IAAI,CAAC,MAAM,CAChB,CACE,OAAwC,EACxC,MAAe,EACf,KAAa,EACb,EAAE;QACF,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;YAC9B,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE;gBACpB,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,MAAM;aACd,CAAC,CAAA;SACH;aAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;YACrC,MAAM,MAAM,GAAG,MAAiC,CAAA;YAChD,MAAM,KAAK,GACT,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK;gBAC9C,CAAC,CAAC,MAAM,CAAC,KAAK;gBACd,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAA;YACtB,MAAM,EAAE,GACN,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;YAChE,MAAM,KAAK,GACT,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK;gBAC9C,CAAC,CAAC,MAAM,CAAC,KAAK;gBACd,CAAC,CAAC,KAAK,CAAA;YACX,MAAM,MAAM,GACV,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM;gBAChD,CAAC,CAAC,MAAM,CAAC,MAAM;gBACf,CAAC,CAAC,SAAS,CAAA;YACf,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG,MAAM;gBACT,EAAE;gBACF,KAAK;gBACL,KAAK;gBACL,MAAM;aACP,CAAC,CAAA;SACH;QACD,OAAO,OAAO,CAAA;IAChB,CAAC,EACD,EAAE,CACH,CAAA;AACH,CAAC;AAkFC,gEAA0B;AAhF5B;;;;;;;;;;;;;;GAcG;AACH,SAAS,mBAAmB,CAC1B,QAAiC;IAEjC,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,iBAAiB,EAAE,OAAO,EAAE,EAAE;QAC7B,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,QAAQ,OAAO,CAAC,IAAI,EAAE;YACpB,KAAK,SAAS,CAAC;YACf,KAAK,MAAM,CAAC,CAAC;gBACX,iBAAiB,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;aACjE;SACF;QACD,OAAO,iBAAiB,CAAA;IAC1B,CAAC,EACD,EAAE,CACH,CAAA;AACH,CAAC;AAkDC,kDAAmB;AAhDrB;;;GAGG;AACH,MAAM,mBAAmB,GAAG,wBAAwB,CAAA;AA6ClD,kDAAmB;AA3CrB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,qBAAqB,GAAG,CAC5B,IAAY,EACZ,YAGU,EACV,EAAE;IACF,IAAI,OAAO,CAAA;IACX,OAAO,CAAC,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;QAC1D,IAAI,OAAO,EAAE,MAAM,GAAG,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;KACxD;AACH,CAAC,CAAA;AASC,sDAAqB","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport { typeCastService } from '.'\n\n/**\n * Iterate over all form elements, also iterating over nested form element (e.g.\n * page elements).\n *\n * #### Example\n *\n * ```js\n * formElementsService.forEachFormElement(form.elements, (formElement) => {\n * // do something with formElement\n * })\n * ```\n *\n * @param elements The form elements to iterate over\n * @param forEach Function to execute on each form element\n */\nfunction forEachFormElement(\n elements: FormTypes.FormElement[],\n forEach: (\n element: FormTypes.FormElement,\n elements: FormTypes.FormElement[],\n ) => void,\n): void {\n findFormElement(elements, (formElement, parentElements) => {\n forEach(formElement, parentElements)\n return false\n })\n}\n\n/**\n * Iterate over all form elements that have options (e.g. `'select'` type\n * elements), also iterating over nested form element (e.g. page elements).\n *\n * #### Example\n *\n * ```js\n * formElementsService.forEachFormElementWithOptions(\n * form.elements,\n * (formElementWithOptions) => {\n * // do something with formElementWithOptions\n * },\n * )\n * ```\n *\n * @param elements The form elements to iterate over\n * @param forEach Function to execute on each form element with options\n */\nfunction forEachFormElementWithOptions(\n elements: FormTypes.FormElement[],\n forEach: (\n elementWithOptions: FormTypes.FormElementWithOptions,\n elements: FormTypes.FormElement[],\n ) => void,\n): void {\n findFormElement(elements, (formElement, parentElements) => {\n const optionsFormElement =\n typeCastService.formElements.toOptionsElement(formElement)\n if (optionsFormElement) {\n forEach(optionsFormElement, parentElements)\n }\n return false\n })\n}\n\n/**\n * Iterate over all form elements and return an element that matches a\n * predicate, also iterating over nested form element (e.g. page elements). Will\n * return `undefined` if no matching element is found.\n *\n * #### Example\n *\n * ```js\n * const formElement = formElementsService.findFormElement(\n * form.elements,\n * (formElement) => {\n * return formElement.id === '123-abc'\n * },\n * )\n * ```\n *\n * @param elements The form elements to iterate over\n * @param predicate Predicate function to execute on each form element\n * @param parentElements\n * @returns\n */\nfunction findFormElement(\n elements: FormTypes.FormElement[],\n predicate: (\n element: FormTypes.FormElement,\n elements: FormTypes.FormElement[],\n ) => boolean,\n parentElements: FormTypes.FormElement[] = [],\n): FormTypes.FormElement | void {\n for (const element of elements) {\n if (predicate(element, parentElements)) {\n return element\n }\n\n if (\n (element.type === 'repeatableSet' ||\n element.type === 'page' ||\n element.type === 'form' ||\n element.type === 'infoPage' ||\n element.type === 'section') &&\n Array.isArray(element.elements)\n ) {\n const nestedElement = findFormElement(element.elements, predicate, [\n ...parentElements,\n element,\n ])\n\n if (nestedElement) {\n return nestedElement\n }\n }\n }\n}\n\n/**\n * Parse unknown data as valid options for a forms element. This will always\n * return an Array of valid options.\n *\n * #### Example\n *\n * ```js\n * const options = formElementsService.parseFormElementOptionsSet(data)\n * // \"options\" are valid for a form element\n * ```\n *\n * @param data\n * @returns\n */\nfunction parseFormElementOptionsSet(\n data: unknown,\n): FormTypes.ChoiceElementOption[] {\n if (!Array.isArray(data)) {\n return []\n }\n return data.reduce(\n (\n options: FormTypes.ChoiceElementOption[],\n record: unknown,\n index: number,\n ) => {\n if (typeof record === 'string') {\n options.push({\n id: index.toString(),\n value: record,\n label: record,\n })\n } else if (typeof record === 'object') {\n const option = record as Record<string, unknown>\n const value =\n typeof option.value === 'string' && option.value\n ? option.value\n : index.toString()\n const id =\n typeof option.id === 'string' && option.id ? option.id : value\n const label =\n typeof option.label === 'string' && option.label\n ? option.label\n : value\n const colour =\n typeof option.colour === 'string' && option.colour\n ? option.colour\n : undefined\n options.push({\n ...option,\n id,\n value,\n label,\n colour,\n })\n }\n return options\n },\n [],\n )\n}\n\n/**\n * Takes the nested definition structure and returns all form elements as 1d\n * array.\n *\n * #### Example\n *\n * ```js\n * const flattenedElements = formElementsService.flattenFormElements(\n * form.elements,\n * )\n * ```\n *\n * @param elements\n * @returns\n */\nfunction flattenFormElements(\n elements: FormTypes.FormElement[],\n): FormTypes.FormElement[] {\n return elements.reduce<FormTypes.FormElement[]>(\n (flattenedElements, element) => {\n flattenedElements.push(element)\n switch (element.type) {\n case 'section':\n case 'page': {\n flattenedElements.push(...flattenFormElements(element.elements))\n }\n }\n return flattenedElements\n },\n [],\n )\n}\n\n/**\n * The regex used for matching `{ELEMENT:<elementName>}` tags in the OneBlink\n * platform.\n */\nconst ElementWYSIWYGRegex = /({ELEMENT:)([^}]+)(})/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 * @param data\n * @param handler\n * @returns\n */\nconst matchElementsTagRegex = (\n data: string,\n matchHandler: (options: {\n elementName: string\n elementMatch: string\n }) => void,\n) => {\n let matches\n while ((matches = ElementWYSIWYGRegex.exec(data)) !== null) {\n if (matches?.length < 3) continue\n\n const elementName = matches[2]\n matchHandler({ elementName, elementMatch: matches[0] })\n }\n}\n\nexport {\n forEachFormElement,\n forEachFormElementWithOptions,\n findFormElement,\n parseFormElementOptionsSet,\n flattenFormElements,\n ElementWYSIWYGRegex,\n matchElementsTagRegex,\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FormTypes, SubmissionTypes } from '@oneblink/types';
|
|
1
|
+
import { FormTypes, MiscTypes, SubmissionTypes } from '@oneblink/types';
|
|
2
2
|
export type ReplaceInjectablesFormatters = {
|
|
3
3
|
formatDateTime: (value: string) => string;
|
|
4
4
|
formatDate: (value: string) => string;
|
|
@@ -13,6 +13,7 @@ export type ReplaceInjectablesOptions = ReplaceInjectablesFormatters & {
|
|
|
13
13
|
externalId: string | undefined;
|
|
14
14
|
previousApprovalId: string | undefined;
|
|
15
15
|
submission: SubmissionTypes.S3SubmissionData['submission'];
|
|
16
|
+
userProfile: MiscTypes.UserProfile | undefined;
|
|
16
17
|
};
|
|
17
18
|
/**
|
|
18
19
|
* Function to get the display value of a property in submission
|
|
@@ -58,7 +59,8 @@ export declare function getElementSubmissionValue({ propertyName, submission, fo
|
|
|
58
59
|
/**
|
|
59
60
|
* Replace the `{ELEMENT:<elementName>}` values in text while a form is being
|
|
60
61
|
* filled out. The replacements are suppose to be user friendly and for display
|
|
61
|
-
* purposes, e.g. dates should be displayed in the user's desired format and
|
|
62
|
+
* purposes, e.g. dates should be displayed in the user's desired format and
|
|
63
|
+
* timezone.
|
|
62
64
|
*
|
|
63
65
|
* #### Example
|
|
64
66
|
*
|
|
@@ -88,6 +90,11 @@ export declare function getElementSubmissionValue({ propertyName, submission, fo
|
|
|
88
90
|
* isDataLookup: false,
|
|
89
91
|
* },
|
|
90
92
|
* ],
|
|
93
|
+
* userProfile: {
|
|
94
|
+
* userId: 'abc123',
|
|
95
|
+
* username: 'john-user',
|
|
96
|
+
* email: 'john.user@domain.com',
|
|
97
|
+
* },
|
|
91
98
|
* },
|
|
92
99
|
* )
|
|
93
100
|
* ```
|
|
@@ -99,6 +106,7 @@ export declare function getElementSubmissionValue({ propertyName, submission, fo
|
|
|
99
106
|
export declare function replaceInjectablesWithElementValues(text: string, options: {
|
|
100
107
|
formElements: FormTypes.FormElement[];
|
|
101
108
|
submission: SubmissionTypes.S3SubmissionData['submission'];
|
|
109
|
+
userProfile: MiscTypes.UserProfile | undefined;
|
|
102
110
|
} & ReplaceInjectablesFormatters): string;
|
|
103
111
|
/**
|
|
104
112
|
* Replace the `{ELEMENT:<elementName>}` values in text after a successful form
|
|
@@ -156,4 +164,4 @@ export declare function replaceInjectablesWithElementValues(text: string, option
|
|
|
156
164
|
* @param options
|
|
157
165
|
* @returns
|
|
158
166
|
*/
|
|
159
|
-
export declare function replaceInjectablesWithSubmissionValues(text: string, { form, submission, externalId, submissionId, submissionTimestamp, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, previousApprovalId, }: ReplaceInjectablesOptions): string;
|
|
167
|
+
export declare function replaceInjectablesWithSubmissionValues(text: string, { form, submission, externalId, submissionId, submissionTimestamp, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, previousApprovalId, userProfile, }: ReplaceInjectablesOptions): string;
|
|
@@ -83,7 +83,6 @@ const CUSTOM_VALUES = [
|
|
|
83
83
|
* @returns
|
|
84
84
|
*/
|
|
85
85
|
function getElementSubmissionValue({ propertyName, submission, formElements, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, }) {
|
|
86
|
-
var _a, _b, _c;
|
|
87
86
|
const formElement = (0, formElementsService_1.findFormElement)(formElements, (element) => element.type !== 'page' &&
|
|
88
87
|
element.type !== 'section' &&
|
|
89
88
|
element.name === propertyName);
|
|
@@ -91,7 +90,7 @@ function getElementSubmissionValue({ propertyName, submission, formElements, for
|
|
|
91
90
|
if (unknown === undefined || unknown === null) {
|
|
92
91
|
return undefined;
|
|
93
92
|
}
|
|
94
|
-
switch (formElement
|
|
93
|
+
switch (formElement?.type) {
|
|
95
94
|
case 'datetime': {
|
|
96
95
|
const value = unknown;
|
|
97
96
|
return formatDateTime(value);
|
|
@@ -107,14 +106,13 @@ function getElementSubmissionValue({ propertyName, submission, formElements, for
|
|
|
107
106
|
case 'radio':
|
|
108
107
|
case 'autocomplete': {
|
|
109
108
|
const value = unknown;
|
|
110
|
-
const option =
|
|
111
|
-
return
|
|
109
|
+
const option = formElement.options?.find((opt) => opt.value === value);
|
|
110
|
+
return option?.label || value;
|
|
112
111
|
}
|
|
113
112
|
case 'checkboxes': {
|
|
114
113
|
const value = unknown;
|
|
115
114
|
const selectedOptionLabels = value.reduce((labels, selectedOption) => {
|
|
116
|
-
|
|
117
|
-
const foundOption = (_a = formElement.options) === null || _a === void 0 ? void 0 : _a.find((o) => o.value === selectedOption);
|
|
115
|
+
const foundOption = formElement.options?.find((o) => o.value === selectedOption);
|
|
118
116
|
if (foundOption)
|
|
119
117
|
labels.push(foundOption.label);
|
|
120
118
|
return labels;
|
|
@@ -126,15 +124,14 @@ function getElementSubmissionValue({ propertyName, submission, formElements, for
|
|
|
126
124
|
const option = (formElement.options || []).find((option) => option.value === value.value);
|
|
127
125
|
return {
|
|
128
126
|
...value,
|
|
129
|
-
value:
|
|
127
|
+
value: option?.label || value.value,
|
|
130
128
|
};
|
|
131
129
|
}
|
|
132
130
|
case 'select': {
|
|
133
131
|
if (formElement.multi) {
|
|
134
132
|
const value = unknown;
|
|
135
133
|
const selectedOptionLabels = value.reduce((labels, selectedOption) => {
|
|
136
|
-
|
|
137
|
-
const foundOption = (_a = formElement.options) === null || _a === void 0 ? void 0 : _a.find((o) => o.value === selectedOption);
|
|
134
|
+
const foundOption = formElement.options?.find((o) => o.value === selectedOption);
|
|
138
135
|
if (foundOption)
|
|
139
136
|
labels.push(foundOption.label);
|
|
140
137
|
return labels;
|
|
@@ -143,8 +140,8 @@ function getElementSubmissionValue({ propertyName, submission, formElements, for
|
|
|
143
140
|
}
|
|
144
141
|
else {
|
|
145
142
|
const value = unknown;
|
|
146
|
-
const option =
|
|
147
|
-
return
|
|
143
|
+
const option = formElement.options?.find((opt) => opt.value === value);
|
|
144
|
+
return option?.label || '';
|
|
148
145
|
}
|
|
149
146
|
}
|
|
150
147
|
case 'boolean': {
|
|
@@ -168,17 +165,17 @@ function getElementSubmissionValue({ propertyName, submission, formElements, for
|
|
|
168
165
|
case 'pointAddress':
|
|
169
166
|
case 'geoscapeAddress': {
|
|
170
167
|
const value = unknown;
|
|
171
|
-
return
|
|
168
|
+
return value?.addressDetails?.formattedAddress || value?.addressId;
|
|
172
169
|
}
|
|
173
170
|
case 'civicaStreetName': {
|
|
174
171
|
const value = unknown;
|
|
175
|
-
return value
|
|
172
|
+
return value?.formattedStreet;
|
|
176
173
|
}
|
|
177
174
|
case 'civicaNameRecord': {
|
|
178
175
|
const value = unknown;
|
|
179
|
-
return ([value
|
|
176
|
+
return ([value?.title, value?.givenName1, value?.familyName]
|
|
180
177
|
.filter((t) => t)
|
|
181
|
-
.join(' ') ||
|
|
178
|
+
.join(' ') || value?.emailAddress);
|
|
182
179
|
}
|
|
183
180
|
case 'abn': {
|
|
184
181
|
const value = unknown;
|
|
@@ -193,7 +190,8 @@ exports.getElementSubmissionValue = getElementSubmissionValue;
|
|
|
193
190
|
/**
|
|
194
191
|
* Replace the `{ELEMENT:<elementName>}` values in text while a form is being
|
|
195
192
|
* filled out. The replacements are suppose to be user friendly and for display
|
|
196
|
-
* purposes, e.g. dates should be displayed in the user's desired format and
|
|
193
|
+
* purposes, e.g. dates should be displayed in the user's desired format and
|
|
194
|
+
* timezone.
|
|
197
195
|
*
|
|
198
196
|
* #### Example
|
|
199
197
|
*
|
|
@@ -223,6 +221,11 @@ exports.getElementSubmissionValue = getElementSubmissionValue;
|
|
|
223
221
|
* isDataLookup: false,
|
|
224
222
|
* },
|
|
225
223
|
* ],
|
|
224
|
+
* userProfile: {
|
|
225
|
+
* userId: 'abc123',
|
|
226
|
+
* username: 'john-user',
|
|
227
|
+
* email: 'john.user@domain.com',
|
|
228
|
+
* },
|
|
226
229
|
* },
|
|
227
230
|
* )
|
|
228
231
|
* ```
|
|
@@ -232,8 +235,14 @@ exports.getElementSubmissionValue = getElementSubmissionValue;
|
|
|
232
235
|
* @returns
|
|
233
236
|
*/
|
|
234
237
|
function replaceInjectablesWithElementValues(text, options) {
|
|
235
|
-
const
|
|
236
|
-
|
|
238
|
+
const keys = ['email'];
|
|
239
|
+
// User based values should be replaced with an empty string if
|
|
240
|
+
// there is no user profile or if the property does not have a value
|
|
241
|
+
keys.forEach((key) => {
|
|
242
|
+
text = text.replaceAll(`{USER:${key}}`, options.userProfile?.[key]?.toString() || '');
|
|
243
|
+
});
|
|
244
|
+
const matchesElement = text.match(formElementsService_1.ElementWYSIWYGRegex);
|
|
245
|
+
if (!matchesElement) {
|
|
237
246
|
return text;
|
|
238
247
|
}
|
|
239
248
|
(0, formElementsService_1.matchElementsTagRegex)(text, ({ elementName, elementMatch }) => {
|
|
@@ -302,7 +311,7 @@ exports.replaceInjectablesWithElementValues = replaceInjectablesWithElementValue
|
|
|
302
311
|
* @param options
|
|
303
312
|
* @returns
|
|
304
313
|
*/
|
|
305
|
-
function replaceInjectablesWithSubmissionValues(text, { form, submission, externalId, submissionId, submissionTimestamp, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, previousApprovalId, }) {
|
|
314
|
+
function replaceInjectablesWithSubmissionValues(text, { form, submission, externalId, submissionId, submissionTimestamp, formatDate, formatDateTime, formatTime, formatNumber, formatCurrency, previousApprovalId, userProfile, }) {
|
|
306
315
|
const string = replaceInjectablesWithElementValues(text, {
|
|
307
316
|
formElements: form.elements,
|
|
308
317
|
submission,
|
|
@@ -311,9 +320,10 @@ function replaceInjectablesWithSubmissionValues(text, { form, submission, extern
|
|
|
311
320
|
formatTime,
|
|
312
321
|
formatNumber,
|
|
313
322
|
formatCurrency,
|
|
323
|
+
userProfile,
|
|
314
324
|
});
|
|
315
325
|
return CUSTOM_VALUES.reduce((newString, customValue) => {
|
|
316
|
-
return newString.
|
|
326
|
+
return newString.replaceAll(customValue.string, customValue.value({
|
|
317
327
|
form,
|
|
318
328
|
submissionTimestamp,
|
|
319
329
|
externalId,
|
|
@@ -325,6 +335,7 @@ function replaceInjectablesWithSubmissionValues(text, { form, submission, extern
|
|
|
325
335
|
formatCurrency,
|
|
326
336
|
previousApprovalId,
|
|
327
337
|
submission,
|
|
338
|
+
userProfile,
|
|
328
339
|
}));
|
|
329
340
|
}, string);
|
|
330
341
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replaceCustomValues.js","sourceRoot":"","sources":["../src/replaceCustomValues.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CivicaTypes,\n FormTypes,\n GeoscapeTypes,\n MiscTypes,\n PointTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport {\n findFormElement,\n matchElementsTagRegex,\n WYSIWYGRegex,\n} from './formElementsService'\nimport { getABNNumberFromABNRecord } from './abnService'\n\nexport type ReplaceInjectablesFormatters = {\n formatDateTime: (value: string) => string\n formatDate: (value: string) => string\n formatTime: (value: string) => string\n formatNumber: (value: number) => string\n formatCurrency: (value: number) => string\n}\n\nexport type ReplaceInjectablesOptions = ReplaceInjectablesFormatters & {\n form: FormTypes.Form\n submissionId: string\n submissionTimestamp: string\n externalId: string | undefined\n previousApprovalId: string | undefined\n submission: SubmissionTypes.S3SubmissionData['submission']\n}\n\nconst CUSTOM_VALUES = [\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 ''\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\n/**\n * Function to get the display value of a property in submission\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): unknown {\n const formElement = findFormElement(\n formElements,\n (element) =>\n element.type !== 'page' &&\n element.type !== 'section' &&\n element.name === propertyName,\n )\n\n const unknown = submission[propertyName]\n if (unknown === undefined || unknown === null) {\n return undefined\n }\n\n switch (formElement?.type) {\n case 'datetime': {\n const value = unknown as string\n return formatDateTime(value)\n }\n case 'date': {\n const value = unknown as string\n return formatDate(value)\n }\n case 'time': {\n const value = unknown as string\n return formatTime(value)\n }\n case 'radio':\n case 'autocomplete': {\n const value = unknown as string\n const option = formElement.options?.find((opt) => opt.value === value)\n return option?.label || value\n }\n\n case 'checkboxes': {\n const value = unknown as string[]\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = formElement.options?.find(\n (o) => o.value === selectedOption,\n )\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return selectedOptionLabels.length ? selectedOptionLabels : undefined\n }\n case 'compliance': {\n const value = unknown as {\n value?: string\n }\n const option = (formElement.options || []).find(\n (option: FormTypes.ChoiceElementOption) => option.value === value.value,\n )\n return {\n ...value,\n value: option?.label || value.value,\n }\n }\n case 'select': {\n if (formElement.multi) {\n const value = unknown as string[]\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = formElement.options?.find(\n (o) => o.value === selectedOption,\n )\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return selectedOptionLabels.length ? selectedOptionLabels : undefined\n } else {\n const value = unknown as string\n const option = formElement.options?.find((opt) => opt.value === value)\n return option?.label || ''\n }\n }\n case 'boolean': {\n const value = unknown as boolean\n return value ? 'Yes' : 'No'\n }\n case 'calculation': {\n const value = unknown as number\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n let text\n if (formElement.displayAsCurrency) {\n text = formatCurrency(value)\n } else {\n text = formatNumber(value)\n }\n return text\n }\n return undefined\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n const value = unknown as\n | PointTypes.PointAddress\n | GeoscapeTypes.GeoscapeAddress\n return value?.addressDetails?.formattedAddress || value?.addressId\n }\n case 'civicaStreetName': {\n const value = unknown as CivicaTypes.CivicaStreetName\n return value?.formattedStreet\n }\n case 'civicaNameRecord': {\n const value = unknown as CivicaTypes.CivicaNameRecord\n return (\n [value?.title, value?.givenName1, value?.familyName]\n .filter((t) => t)\n .join(' ') || value?.emailAddress\n )\n }\n case 'abn': {\n const value = unknown as MiscTypes.ABNRecord\n return value ? getABNNumberFromABNRecord(value) : undefined\n }\n default: {\n return unknown\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 timezone.\n *\n * #### Example\n *\n * ```js\n * const result = 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 * },\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 submission: SubmissionTypes.S3SubmissionData['submission']\n } & ReplaceInjectablesFormatters,\n): string {\n const matches = text.match(WYSIWYGRegex)\n if (!matches) {\n return text\n }\n\n matchElementsTagRegex(text, ({ elementName, elementMatch }) => {\n const value = getElementSubmissionValue({\n propertyName: elementName,\n ...options,\n })\n\n text = text.replace(\n elementMatch,\n value === undefined ? '' : (value as string),\n )\n })\n return text\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 {\n form,\n submission,\n externalId,\n submissionId,\n submissionTimestamp,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n previousApprovalId,\n }: ReplaceInjectablesOptions,\n): string {\n const string = replaceInjectablesWithElementValues(text, {\n formElements: form.elements,\n submission,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n })\n return CUSTOM_VALUES.reduce((newString, customValue) => {\n return newString.replace(\n new RegExp(customValue.string, 'g'),\n customValue.value({\n form,\n submissionTimestamp,\n externalId,\n submissionId,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n previousApprovalId,\n submission,\n }),\n )\n }, string)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"replaceCustomValues.js","sourceRoot":"","sources":["../src/replaceCustomValues.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CivicaTypes,\n FormTypes,\n GeoscapeTypes,\n MiscTypes,\n PointTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport {\n findFormElement,\n matchElementsTagRegex,\n ElementWYSIWYGRegex,\n} from './formElementsService'\nimport { getABNNumberFromABNRecord } from './abnService'\n\nexport type ReplaceInjectablesFormatters = {\n formatDateTime: (value: string) => string\n formatDate: (value: string) => string\n formatTime: (value: string) => string\n formatNumber: (value: number) => string\n formatCurrency: (value: number) => string\n}\n\nexport type ReplaceInjectablesOptions = ReplaceInjectablesFormatters & {\n form: FormTypes.Form\n submissionId: string\n submissionTimestamp: string\n externalId: string | undefined\n previousApprovalId: string | undefined\n submission: SubmissionTypes.S3SubmissionData['submission']\n userProfile: MiscTypes.UserProfile | undefined\n}\n\nconst CUSTOM_VALUES = [\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 ''\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\n/**\n * Function to get the display value of a property in submission\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): unknown {\n const formElement = findFormElement(\n formElements,\n (element) =>\n element.type !== 'page' &&\n element.type !== 'section' &&\n element.name === propertyName,\n )\n\n const unknown = submission[propertyName]\n if (unknown === undefined || unknown === null) {\n return undefined\n }\n\n switch (formElement?.type) {\n case 'datetime': {\n const value = unknown as string\n return formatDateTime(value)\n }\n case 'date': {\n const value = unknown as string\n return formatDate(value)\n }\n case 'time': {\n const value = unknown as string\n return formatTime(value)\n }\n case 'radio':\n case 'autocomplete': {\n const value = unknown as string\n const option = formElement.options?.find((opt) => opt.value === value)\n return option?.label || value\n }\n\n case 'checkboxes': {\n const value = unknown as string[]\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = formElement.options?.find(\n (o) => o.value === selectedOption,\n )\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return selectedOptionLabels.length ? selectedOptionLabels : undefined\n }\n case 'compliance': {\n const value = unknown as {\n value?: string\n }\n const option = (formElement.options || []).find(\n (option: FormTypes.ChoiceElementOption) => option.value === value.value,\n )\n return {\n ...value,\n value: option?.label || value.value,\n }\n }\n case 'select': {\n if (formElement.multi) {\n const value = unknown as string[]\n const selectedOptionLabels: string[] = value.reduce(\n (labels: string[], selectedOption: string) => {\n const foundOption = formElement.options?.find(\n (o) => o.value === selectedOption,\n )\n if (foundOption) labels.push(foundOption.label)\n return labels\n },\n [],\n )\n return selectedOptionLabels.length ? selectedOptionLabels : undefined\n } else {\n const value = unknown as string\n const option = formElement.options?.find((opt) => opt.value === value)\n return option?.label || ''\n }\n }\n case 'boolean': {\n const value = unknown as boolean\n return value ? 'Yes' : 'No'\n }\n case 'calculation': {\n const value = unknown as number\n if (!Number.isNaN(value) && Number.isFinite(value)) {\n let text\n if (formElement.displayAsCurrency) {\n text = formatCurrency(value)\n } else {\n text = formatNumber(value)\n }\n return text\n }\n return undefined\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n const value = unknown as\n | PointTypes.PointAddress\n | GeoscapeTypes.GeoscapeAddress\n return value?.addressDetails?.formattedAddress || value?.addressId\n }\n case 'civicaStreetName': {\n const value = unknown as CivicaTypes.CivicaStreetName\n return value?.formattedStreet\n }\n case 'civicaNameRecord': {\n const value = unknown as CivicaTypes.CivicaNameRecord\n return (\n [value?.title, value?.givenName1, value?.familyName]\n .filter((t) => t)\n .join(' ') || value?.emailAddress\n )\n }\n case 'abn': {\n const value = unknown as MiscTypes.ABNRecord\n return value ? getABNNumberFromABNRecord(value) : undefined\n }\n default: {\n return unknown\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 result = 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 submission: SubmissionTypes.S3SubmissionData['submission']\n userProfile: MiscTypes.UserProfile | undefined\n } & ReplaceInjectablesFormatters,\n): string {\n const keys: Array<keyof MiscTypes.UserProfile> = ['email']\n // User based values should be replaced with an empty string if\n // there is no user profile or if the property does not have a value\n keys.forEach((key) => {\n text = text.replaceAll(\n `{USER:${key}}`,\n options.userProfile?.[key]?.toString() || '',\n )\n })\n\n const matchesElement = text.match(ElementWYSIWYGRegex)\n if (!matchesElement) {\n return text\n }\n\n matchElementsTagRegex(text, ({ elementName, elementMatch }) => {\n const value = getElementSubmissionValue({\n propertyName: elementName,\n ...options,\n })\n\n text = text.replace(\n elementMatch,\n value === undefined ? '' : (value as string),\n )\n })\n\n return text\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 {\n form,\n submission,\n externalId,\n submissionId,\n submissionTimestamp,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n previousApprovalId,\n userProfile,\n }: ReplaceInjectablesOptions,\n): string {\n const string = replaceInjectablesWithElementValues(text, {\n formElements: form.elements,\n submission,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n userProfile,\n })\n return CUSTOM_VALUES.reduce((newString, customValue) => {\n return newString.replaceAll(\n customValue.string,\n customValue.value({\n form,\n submissionTimestamp,\n externalId,\n submissionId,\n formatDate,\n formatDateTime,\n formatTime,\n formatNumber,\n formatCurrency,\n previousApprovalId,\n submission,\n userProfile,\n }),\n )\n }, string)\n}\n"]}
|
package/dist/userService.js
CHANGED
|
@@ -20,7 +20,6 @@ exports.getUserFriendlyName = exports.parseUserProfile = void 0;
|
|
|
20
20
|
* @param data An object containing all parameters to be passed to the function
|
|
21
21
|
*/
|
|
22
22
|
function parseUserProfile(data) {
|
|
23
|
-
var _a, _b, _c;
|
|
24
23
|
if (typeof data !== 'object' || !data) {
|
|
25
24
|
return;
|
|
26
25
|
}
|
|
@@ -67,9 +66,9 @@ function parseUserProfile(data) {
|
|
|
67
66
|
? jwtPayload['custom:phone_number_verified']
|
|
68
67
|
: undefined,
|
|
69
68
|
};
|
|
70
|
-
if (!
|
|
71
|
-
!
|
|
72
|
-
!
|
|
69
|
+
if (!userProfile.supervisor?.fullName &&
|
|
70
|
+
!userProfile.supervisor?.email &&
|
|
71
|
+
!userProfile.supervisor?.providerUserId) {
|
|
73
72
|
userProfile.supervisor = undefined;
|
|
74
73
|
}
|
|
75
74
|
if (jwtPayload.identities &&
|
package/dist/userService.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userService.js","sourceRoot":"","sources":["../src/userService.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,gBAAgB,CAC9B,IAAa
|
|
1
|
+
{"version":3,"file":"userService.js","sourceRoot":"","sources":["../src/userService.ts"],"names":[],"mappings":"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","sourcesContent":["import { MiscTypes } from '@oneblink/types'\n\n/**\n * Parse a User Profile based on a JWT payload. Will return `undefined` if not a\n * valid JWT payload\n *\n * #### Example\n *\n * ```js\n * import jwtDecode from 'jwt-decode'\n *\n * const jwtPayload = jwtDecode('a valid token from a user')\n * const userProfile = userService.parseUserProfile(jwtPayload)\n * if (userProfile) {\n * // continue\n * }\n * ```\n *\n * @param data An object containing all parameters to be passed to the function\n */\nexport function parseUserProfile(\n data: unknown,\n): MiscTypes.UserProfile | undefined {\n if (typeof data !== 'object' || !data) {\n return\n }\n const jwtPayload = data as Record<string, unknown>\n if (typeof jwtPayload.sub !== 'string') {\n return\n }\n const userProfile: MiscTypes.UserProfile = {\n isSAMLUser: false,\n providerType: 'Cognito',\n providerUserId: jwtPayload.sub,\n userId: jwtPayload.sub,\n email: typeof jwtPayload.email === 'string' ? jwtPayload.email : undefined,\n emailVerified:\n typeof jwtPayload.email_verified === 'boolean'\n ? jwtPayload.email_verified\n : undefined,\n firstName:\n typeof jwtPayload.given_name === 'string'\n ? jwtPayload.given_name\n : undefined,\n lastName:\n typeof jwtPayload.family_name === 'string'\n ? jwtPayload.family_name\n : undefined,\n fullName: typeof jwtPayload.name === 'string' ? jwtPayload.name : undefined,\n picture:\n typeof jwtPayload.picture === 'string' ? jwtPayload.picture : undefined,\n role:\n typeof jwtPayload['custom:role'] === 'string'\n ? jwtPayload['custom:role']\n : undefined,\n username:\n typeof jwtPayload.email === 'string' ? jwtPayload.email : jwtPayload.sub,\n supervisor: {\n fullName:\n typeof jwtPayload['custom:supervisor_name'] === 'string'\n ? jwtPayload['custom:supervisor_name']\n : undefined,\n email:\n typeof jwtPayload['custom:supervisor_email'] === 'string'\n ? jwtPayload['custom:supervisor_email']\n : undefined,\n providerUserId:\n typeof jwtPayload['custom:supervisor_user_id'] === 'string'\n ? jwtPayload['custom:supervisor_user_id']\n : undefined,\n },\n phoneNumber:\n typeof jwtPayload['custom:phone_number'] === 'string'\n ? jwtPayload['custom:phone_number']\n : undefined,\n phoneNumberVerified:\n typeof jwtPayload['custom:phone_number_verified'] === 'boolean'\n ? jwtPayload['custom:phone_number_verified']\n : undefined,\n }\n\n if (\n !userProfile.supervisor?.fullName &&\n !userProfile.supervisor?.email &&\n !userProfile.supervisor?.providerUserId\n ) {\n userProfile.supervisor = undefined\n }\n\n if (\n jwtPayload.identities &&\n Array.isArray(jwtPayload.identities) &&\n jwtPayload.identities.length\n ) {\n const { providerType, userId } = jwtPayload.identities[0]\n userProfile.providerType = providerType\n userProfile.providerUserId = userId\n userProfile.isSAMLUser = providerType === 'SAML'\n if (userProfile.isSAMLUser) {\n userProfile.username = jwtPayload.preferred_username || userId\n }\n }\n\n return userProfile\n}\n\n/**\n * A friendly `string` that represents the a [User Profile](#user-profile). Uses\n * first name, last name, full name, email address or username.\n *\n * #### Example\n *\n * ```js\n * const userProfile = userService.parseUserProfile(jwtPayload)\n * const name = userService.getUserFriendlyName(userProfile)\n * if (name) {\n * // Display current user's name\n * }\n * ```\n *\n * @param userProfile\n * @returns\n */\nexport function getUserFriendlyName(\n userProfile: MiscTypes.UserProfile,\n): string {\n if (userProfile.fullName) {\n return userProfile.fullName\n }\n\n if (userProfile.firstName || userProfile.lastName) {\n return [userProfile.firstName, userProfile.lastName].join(' ').trim()\n }\n\n if (userProfile.email) {\n return userProfile.email\n }\n\n if (userProfile.username) {\n return userProfile.username\n }\n\n return userProfile.userId\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": "2.0.1-beta.
|
|
4
|
+
"version": "2.0.1-beta.3",
|
|
5
5
|
"author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/oneblink/sdk-core-js/issues"
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"doc": "docs"
|
|
31
31
|
},
|
|
32
32
|
"engines": {
|
|
33
|
-
"node": ">=
|
|
33
|
+
"node": ">=16",
|
|
34
34
|
"npm": ">=8"
|
|
35
35
|
},
|
|
36
36
|
"files": [
|