@openforis/arena-core 2.3.40 → 2.3.41
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/auth/authorizer.d.ts +3 -3
- package/dist/auth/authorizer.js.map +1 -1
- package/dist/esm/auth/authorizer.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node/factory.js.map +1 -1
- package/dist/esm/node/index.js.map +1 -1
- package/dist/esm/node/node.js.map +1 -1
- package/dist/esm/node/nodePointer.js.map +1 -1
- package/dist/esm/node/nodeValueFormatter.js.map +1 -1
- package/dist/esm/node/nodeValues.js.map +1 -1
- package/dist/esm/node/nodes.js +1 -1
- package/dist/esm/node/nodes.js.map +1 -1
- package/dist/esm/node/service.js.map +1 -1
- package/dist/esm/nodeDefExpressionEvaluator/functions.js.map +1 -1
- package/dist/esm/record/_records/recordCompletion.js.map +1 -1
- package/dist/esm/record/_records/recordGetters.js.map +1 -1
- package/dist/esm/record/_records/recordNodesIndexUpdater.js.map +1 -1
- package/dist/esm/record/_records/recordPagesValidation.js.map +1 -1
- package/dist/esm/record/_records/recordUpdater.js.map +1 -1
- package/dist/esm/record/_records/recordUtils.js.map +1 -1
- package/dist/esm/record/factory.js.map +1 -1
- package/dist/esm/record/index.js.map +1 -1
- package/dist/esm/record/nodePointers.js.map +1 -1
- package/dist/esm/record/record.js.map +1 -1
- package/dist/esm/record/recordCloner.js.map +1 -1
- package/dist/esm/record/recordExpressionEvaluator/context.js.map +1 -1
- package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
- package/dist/esm/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
- package/dist/esm/record/recordExpressionEvaluator/nodeValueExtractor.js.map +1 -1
- package/dist/esm/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
- package/dist/esm/record/recordFixer.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsUpdateParams.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodesCreator.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordUpdateResult.js.map +1 -1
- package/dist/esm/record/recordPrettyPrinter.js.map +1 -1
- package/dist/esm/record/recordUpdater.js.map +1 -1
- package/dist/esm/record/recordValidator/attributeKeyValidator.js.map +1 -1
- package/dist/esm/record/recordValidator/attributeTypeValidator.js.map +1 -1
- package/dist/esm/record/recordValidator/attributeUniqueValidator.js.map +1 -1
- package/dist/esm/record/recordValidator/attributeValidator.js.map +1 -1
- package/dist/esm/record/recordValidator/countVaildator.js.map +1 -1
- package/dist/esm/record/recordValidator/recordValidator.js.map +1 -1
- package/dist/esm/record/service.js.map +1 -1
- package/dist/esm/tests/builder/recordBuilder/attributeBuilder.js.map +1 -1
- package/dist/esm/tests/builder/recordBuilder/entityBuilder.js.map +1 -1
- package/dist/esm/tests/builder/recordBuilder/nodeBuilder.js.map +1 -1
- package/dist/esm/tests/builder/recordBuilder/recordBuilder.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/node/factory.d.ts +4 -4
- package/dist/node/factory.js.map +1 -1
- package/dist/node/index.d.ts +1 -2
- package/dist/node/index.js.map +1 -1
- package/dist/node/node.d.ts +7 -2
- package/dist/node/node.js.map +1 -1
- package/dist/node/nodePointer.d.ts +2 -2
- package/dist/node/nodePointer.js.map +1 -1
- package/dist/node/nodeValueFormatter.d.ts +2 -2
- package/dist/node/nodeValueFormatter.js.map +1 -1
- package/dist/node/nodeValues.d.ts +21 -21
- package/dist/node/nodeValues.js.map +1 -1
- package/dist/node/nodes.d.ts +31 -31
- package/dist/node/nodes.js +1 -1
- package/dist/node/nodes.js.map +1 -1
- package/dist/node/service.d.ts +6 -6
- package/dist/node/service.js.map +1 -1
- package/dist/nodeDefExpressionEvaluator/functions.js.map +1 -1
- package/dist/record/_records/recordCompletion.d.ts +9 -9
- package/dist/record/_records/recordCompletion.js.map +1 -1
- package/dist/record/_records/recordGetters.d.ts +69 -69
- package/dist/record/_records/recordGetters.js.map +1 -1
- package/dist/record/_records/recordNodesIndexUpdater.d.ts +9 -9
- package/dist/record/_records/recordNodesIndexUpdater.js.map +1 -1
- package/dist/record/_records/recordPagesValidation.d.ts +11 -11
- package/dist/record/_records/recordPagesValidation.js.map +1 -1
- package/dist/record/_records/recordUpdater.d.ts +5 -5
- package/dist/record/_records/recordUpdater.js.map +1 -1
- package/dist/record/_records/recordUtils.d.ts +6 -6
- package/dist/record/_records/recordUtils.js.map +1 -1
- package/dist/record/factory.d.ts +2 -2
- package/dist/record/factory.js.map +1 -1
- package/dist/record/index.d.ts +1 -2
- package/dist/record/index.js.map +1 -1
- package/dist/record/nodePointers.d.ts +6 -6
- package/dist/record/nodePointers.js.map +1 -1
- package/dist/record/record.d.ts +8 -5
- package/dist/record/record.js.map +1 -1
- package/dist/record/recordCloner.d.ts +3 -3
- package/dist/record/recordCloner.js.map +1 -1
- package/dist/record/recordExpressionEvaluator/context.d.ts +6 -6
- package/dist/record/recordExpressionEvaluator/context.js.map +1 -1
- package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
- package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.d.ts +5 -5
- package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
- package/dist/record/recordExpressionEvaluator/nodeValueExtractor.d.ts +2 -2
- package/dist/record/recordExpressionEvaluator/nodeValueExtractor.js.map +1 -1
- package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.d.ts +4 -4
- package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
- package/dist/record/recordFixer.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.d.ts +4 -4
- package/dist/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordExpressionValueConverter.d.ts +4 -4
- package/dist/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.d.ts +3 -3
- package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.d.ts +2 -2
- package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.d.ts +2 -2
- package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsUpdateParams.d.ts +2 -2
- package/dist/record/recordNodesUpdater/recordNodeDependentsUpdateParams.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodesCreator.d.ts +4 -4
- package/dist/record/recordNodesUpdater/recordNodesCreator.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodesDeleter.d.ts +3 -3
- package/dist/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.d.ts +4 -4
- package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodesUpdater.d.ts +2 -2
- package/dist/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordUpdateResult.d.ts +6 -6
- package/dist/record/recordNodesUpdater/recordUpdateResult.js.map +1 -1
- package/dist/record/recordPrettyPrinter.d.ts +7 -7
- package/dist/record/recordPrettyPrinter.js.map +1 -1
- package/dist/record/recordUpdater.js.map +1 -1
- package/dist/record/recordValidator/attributeKeyValidator.d.ts +4 -4
- package/dist/record/recordValidator/attributeKeyValidator.js.map +1 -1
- package/dist/record/recordValidator/attributeTypeValidator.d.ts +4 -4
- package/dist/record/recordValidator/attributeTypeValidator.js.map +1 -1
- package/dist/record/recordValidator/attributeUniqueValidator.d.ts +4 -4
- package/dist/record/recordValidator/attributeUniqueValidator.js.map +1 -1
- package/dist/record/recordValidator/attributeValidator.d.ts +6 -6
- package/dist/record/recordValidator/attributeValidator.js.map +1 -1
- package/dist/record/recordValidator/countVaildator.d.ts +7 -7
- package/dist/record/recordValidator/countVaildator.js.map +1 -1
- package/dist/record/recordValidator/recordValidator.js.map +1 -1
- package/dist/record/records.d.ts +6 -6
- package/dist/record/service.d.ts +8 -8
- package/dist/record/service.js.map +1 -1
- package/dist/tests/builder/recordBuilder/attributeBuilder.d.ts +5 -5
- package/dist/tests/builder/recordBuilder/attributeBuilder.js.map +1 -1
- package/dist/tests/builder/recordBuilder/entityBuilder.d.ts +5 -5
- package/dist/tests/builder/recordBuilder/entityBuilder.js.map +1 -1
- package/dist/tests/builder/recordBuilder/nodeBuilder.d.ts +5 -5
- package/dist/tests/builder/recordBuilder/nodeBuilder.js.map +1 -1
- package/dist/tests/builder/recordBuilder/recordBuilder.d.ts +2 -2
- package/dist/tests/builder/recordBuilder/recordBuilder.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ArenaRecordNode } from '../../../../node';
|
|
2
2
|
import { NodeDef } from '../../../../nodeDef';
|
|
3
|
-
import {
|
|
3
|
+
import { ArenaRecord } from '../../../record';
|
|
4
4
|
import { Survey } from '../../../../survey';
|
|
5
5
|
declare const findDescendants: (params: {
|
|
6
6
|
survey: Survey;
|
|
7
|
-
record:
|
|
8
|
-
nodeContext:
|
|
7
|
+
record: ArenaRecord;
|
|
8
|
+
nodeContext: ArenaRecordNode;
|
|
9
9
|
nodeDefReferenced: NodeDef<any>;
|
|
10
|
-
}) =>
|
|
10
|
+
}) => ArenaRecordNode[];
|
|
11
11
|
export declare const NodesFinder: {
|
|
12
12
|
findDescendants: typeof findDescendants;
|
|
13
13
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodesFinder.js","sourceRoot":"","sources":["../../../../../src/record/recordExpressionEvaluator/node/identifier/nodesFinder.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"nodesFinder.js","sourceRoot":"","sources":["../../../../../src/record/recordExpressionEvaluator/node/identifier/nodesFinder.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, Nodes } from '../../../../node'\nimport { NodeDef, NodeDefType } from '../../../../nodeDef'\nimport { ArenaRecord } from '../../../record'\nimport { Records } from '../../../records'\nimport { Survey, Surveys } from '../../../../survey'\nimport { Arrays } from '../../../../utils'\n\nconst getCommonAncestor = (params: {\n record: ArenaRecord\n nodeCtxHierarchy: string[]\n nodeDefCtx: NodeDef<any>\n nodeDefReferenced: NodeDef<any>\n}): ArenaRecordNode | undefined => {\n const { record, nodeCtxHierarchy, nodeDefCtx, nodeDefReferenced } = params\n if (!nodeDefCtx.parentUuid) {\n return Records.getRoot(record)\n }\n const nodeDefReferencedH = nodeDefReferenced.meta.h\n // meta.h contains only ancestors (excluding the node itself); include nodeDefCtx.uuid so that\n // the context nodeDef can be treated as the common ancestor when nodeDefReferenced is a descendant of nodeDefCtx\n const nodeDefCtxHierarchyToConsider = [...nodeDefCtx.meta.h, nodeDefCtx.uuid]\n const nodeDefCommonH = Arrays.intersection(nodeDefReferencedH, nodeDefCtxHierarchyToConsider)\n if (nodeDefCommonH.length === 1) {\n return Records.getRoot(record)\n }\n if (nodeDefCommonH.length > 1) {\n const nodeCommonAncestorUuid = nodeCtxHierarchy[nodeDefCommonH.length - 1]\n return record.nodes?.[nodeCommonAncestorUuid]\n }\n return undefined\n}\n\nconst getReferencedNodesParent = (params: {\n survey: Survey\n record: ArenaRecord\n nodeContext: ArenaRecordNode\n nodeDefReferenced: NodeDef<any>\n}): ArenaRecordNode | undefined => {\n const { survey, record, nodeContext, nodeDefReferenced } = params\n\n // Referenced node is a child of the context node\n if (nodeDefReferenced.parentUuid === nodeContext.nodeDefUuid) {\n return nodeContext\n }\n\n const nodeDefCtx = Surveys.getNodeDefByUuid({ survey, uuid: nodeContext.nodeDefUuid })\n\n const nodeCtxH = Nodes.getHierarchy(nodeContext)\n if (nodeDefCtx.type === NodeDefType.entity) {\n // When nodeDefCtx is entity, expression is type applicableIf (and context always starts from parent)\n nodeCtxH.push(nodeContext.uuid)\n }\n\n if (Surveys.isNodeDefAncestor({ nodeDefAncestor: nodeDefReferenced, nodeDefDescendant: nodeDefCtx })) {\n const nodeDefReferencedH = nodeDefReferenced.meta.h\n const nodeReferencedParentUuid = nodeCtxH[nodeDefReferencedH.length - 1]\n const nodeReferencedParent = record.nodes?.[nodeReferencedParentUuid]\n if (!nodeReferencedParent) {\n throw new Error(`Cannot find parent node of ${nodeDefReferenced.props.name} from ${nodeDefCtx.props.name}`)\n }\n return nodeReferencedParent\n }\n\n const nodeCommonAncestor = getCommonAncestor({\n record,\n nodeCtxHierarchy: nodeCtxH,\n nodeDefCtx,\n nodeDefReferenced,\n })\n if (!nodeCommonAncestor) return undefined\n\n const nodeDefReferencedParent = Surveys.getNodeDefParent({ survey, nodeDef: nodeDefReferenced })\n if (!nodeDefReferencedParent) return undefined\n\n return Records.getDescendant({ record, node: nodeCommonAncestor, nodeDefDescendant: nodeDefReferencedParent })\n}\n\n// Get reachable nodes, i.e. the children of the node's ancestors.\n// NOTE: The root node is excluded, but it _should_ be an entity, so that is fine.\nconst findDescendants = (params: {\n survey: Survey\n record: ArenaRecord\n nodeContext: ArenaRecordNode\n nodeDefReferenced: NodeDef<any>\n}): ArenaRecordNode[] => {\n const { survey, record, nodeContext, nodeDefReferenced } = params\n const nodeReferencedParent = getReferencedNodesParent({ survey, record, nodeContext, nodeDefReferenced })\n\n if (nodeReferencedParent) {\n return Records.getChildren(nodeReferencedParent, nodeDefReferenced.uuid)(record)\n }\n return []\n}\n\nexport const NodesFinder = {\n findDescendants,\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Survey } from '../../survey';
|
|
2
2
|
import { NodeDef } from '../../nodeDef';
|
|
3
|
-
import {
|
|
3
|
+
import { ArenaRecordNode } from '../../node';
|
|
4
4
|
declare const getNodeValue: (params: {
|
|
5
5
|
survey: Survey;
|
|
6
|
-
node:
|
|
6
|
+
node: ArenaRecordNode;
|
|
7
7
|
nodeDef: NodeDef<any>;
|
|
8
8
|
}) => any;
|
|
9
9
|
export declare const NodeValueExtractor: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeValueExtractor.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/nodeValueExtractor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nodeValueExtractor.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/nodeValueExtractor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Survey, Surveys } from '../../survey'\nimport { NodeDef, NodeDefType } from '../../nodeDef'\nimport { ArenaRecordNode } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { Dates, Objects } from '../../utils'\nimport { CategoryItem } from '../../category'\nimport { Taxon } from '../../taxonomy'\n\ninterface ExtractorParams {\n survey: Survey\n node: ArenaRecordNode\n}\n\ntype Extractor = (params: ExtractorParams) => any\n\nconst extractCategoryItem = (params: ExtractorParams): CategoryItem | undefined => {\n const { survey, node } = params\n const item = node.refData?.categoryItem\n if (item) return item\n const itemUuid = NodeValues.getItemUuid(node)\n return itemUuid ? Surveys.getCategoryItemByUuid({ survey, itemUuid }) : undefined\n}\n\nconst extractTaxon = (params: ExtractorParams): Taxon | undefined => {\n const { survey, node } = params\n const taxon = node.refData?.taxon\n if (taxon) return taxon\n const taxonUuid = NodeValues.getTaxonUuid(node)\n return taxonUuid ? Surveys.getTaxonByUuid({ survey, taxonUuid }) : undefined\n}\n\nconst extractorsByNodeDefType: { [key in NodeDefType]?: Extractor } = {\n [NodeDefType.boolean]: (params: ExtractorParams) => {\n const { node } = params\n return node.value === 'true'\n },\n [NodeDefType.code]: (params: ExtractorParams) => {\n const item = extractCategoryItem(params)\n return item ? item.props.code : null\n },\n [NodeDefType.coordinate]: (params: ExtractorParams) => params.node.value,\n [NodeDefType.date]: (params: ExtractorParams) => {\n const { node } = params\n const [year, month, day] = [\n NodeValues.getDateYear(node),\n NodeValues.getDateMonth(node),\n NodeValues.getDateDay(node),\n ]\n if (Dates.isValidDate(year, month, day)) {\n return node.value\n }\n return null\n },\n [NodeDefType.decimal]: (params: ExtractorParams) => {\n const { node } = params\n return Number(node.value)\n },\n [NodeDefType.entity]: (_params: ExtractorParams) => null,\n [NodeDefType.file]: (params: ExtractorParams) => params.node.value,\n [NodeDefType.integer]: (params: ExtractorParams) => {\n const { node } = params\n return Number(node.value)\n },\n [NodeDefType.taxon]: (params: ExtractorParams) => {\n const taxon = extractTaxon(params)\n return taxon ? taxon.props.code : null\n },\n [NodeDefType.text]: (params: ExtractorParams) => params.node.value,\n [NodeDefType.time]: (params: ExtractorParams) => {\n const { node } = params\n const [hour, minute, seconds] = [\n NodeValues.getTimeHour(node),\n NodeValues.getTimeMinute(node),\n NodeValues.getTimeSeconds(node),\n ]\n if (Dates.isValidTime(hour, minute, seconds)) {\n return node.value\n }\n return null\n },\n}\n\nconst getNodeValue = (params: { survey: Survey; node: ArenaRecordNode; nodeDef: NodeDef<any> }) => {\n const { node, nodeDef, survey } = params\n\n if (Objects.isEmpty(node.value)) {\n return null\n }\n const extractor = extractorsByNodeDefType[nodeDef.type as NodeDefType]\n return extractor?.({ survey, node })\n}\n\nexport const NodeValueExtractor = {\n getNodeValue,\n}\n"]}
|
|
@@ -3,7 +3,7 @@ import { User } from '../../auth';
|
|
|
3
3
|
import { CategoryItem } from '../../category';
|
|
4
4
|
import { JavascriptExpressionEvaluator } from '../../expression';
|
|
5
5
|
import { LanguageCode } from '../../language';
|
|
6
|
-
import {
|
|
6
|
+
import { ArenaRecordNode } from '../../node';
|
|
7
7
|
import { NodeDefExpression } from '../../nodeDef';
|
|
8
8
|
import { Survey } from '../../survey';
|
|
9
9
|
import { Taxon } from '../../taxonomy';
|
|
@@ -19,13 +19,13 @@ type ExpressionEvaluateParams = {
|
|
|
19
19
|
export declare class RecordExpressionEvaluator extends JavascriptExpressionEvaluator<RecordExpressionContext> {
|
|
20
20
|
constructor();
|
|
21
21
|
evalExpression(params: ExpressionEvaluateParams & {
|
|
22
|
-
node:
|
|
22
|
+
node: ArenaRecordNode;
|
|
23
23
|
query: string;
|
|
24
24
|
item?: CategoryItem | Taxon;
|
|
25
25
|
}): Promise<any>;
|
|
26
26
|
private _getApplicableExpressions;
|
|
27
27
|
evalApplicableExpressions(params: ExpressionEvaluateParams & {
|
|
28
|
-
nodeCtx:
|
|
28
|
+
nodeCtx: ArenaRecordNode;
|
|
29
29
|
expressions: NodeDefExpression[];
|
|
30
30
|
stopAtFirstFound?: boolean;
|
|
31
31
|
}): Promise<{
|
|
@@ -33,7 +33,7 @@ export declare class RecordExpressionEvaluator extends JavascriptExpressionEvalu
|
|
|
33
33
|
value: any;
|
|
34
34
|
}[]>;
|
|
35
35
|
evalApplicableExpression(params: ExpressionEvaluateParams & {
|
|
36
|
-
nodeCtx:
|
|
36
|
+
nodeCtx: ArenaRecordNode;
|
|
37
37
|
expressions: NodeDefExpression[];
|
|
38
38
|
}): Promise<{
|
|
39
39
|
expression: NodeDefExpression;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordExpressionEvaluator.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/recordExpressionEvaluator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,iDAAoF;AAGpF,2CAA2D;AAC3D,yCAA8C;AAE9C,uCAAqC;AACrC,wCAAoC;AAEpC,2CAAuD;AACvD,kDAA6D;AAC7D,wDAA0D;AAW1D,+BAAuC,SAAQ,0CAAsD;IACnG;QACE,KAAK,CAAC,qCAAyB,EAAE;YAC/B,CAAC,+BAAkB,CAAC,UAAU,CAAC,EAAE,sCAAyB;YAC1D,CAAC,+BAAkB,CAAC,IAAI,CAAC,EAAE,mCAAmB;SAC/C,CAAC,CAAA;IACJ,CAAC;IAEK,cAAc,CAClB,MAIC;;YAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;YACpD,MAAM,OAAO,GAAG,gBAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;YAC5E,MAAM,WAAW,GAAG,kBAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;YACvF,IAAI,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAA;YAC7B,MAAM,OAAO,mCAAiC,MAAM,KAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,CAAA;YACjH,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACtC,CAAC;KAAA;IAEa,yBAAyB,CACrC,MAIC;;YAED,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;YACjE,MAAM,qBAAqB,GAAwB,EAAE,CAAA;YAErD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAA;gBAEtC,IACE,eAAO,CAAC,OAAO,CAAC,WAAW,CAAC;oBAC5B,CAAC,MAAM,IAAI,CAAC,cAAc,iCAAM,MAAM,KAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,EAAE,IAAG,CAAC,EACnF,CAAC;oBACD,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;oBAEtC,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAK;oBACP,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,qBAAqB,CAAA;QAC9B,CAAC;KAAA;IAEK,yBAAyB,CAC7B,MAIC;;YAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;YAC1B,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAA;YAE1E,OAAO,OAAO,CAAC,GAAG,CAChB,qBAAqB,CAAC,GAAG,CAAC,CAAO,UAAU,EAAE,EAAE,+DAAC,CAAC;gBAC/C,UAAU;gBACV,KAAK,EAAE,MAAM,IAAI,CAAC,cAAc,iCAAM,MAAM,KAAE,IAAI,EAAE,OAAO,EAAE,KAAK,QAAE,UAAU,CAAC,UAAU,mCAAI,EAAE,IAAG;aACnG,CAAC,IAAA,CAAC,CACJ,CAAA;QACH,CAAC;KAAA;IAEK,wBAAwB,CAC5B,MAGC;;;YAED,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,yBAAyB,iCAAM,MAAM,KAAE,gBAAgB,EAAE,IAAI,IAAG,CAAA;YACxG,aAAO,oBAAoB,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAA;QACxC,CAAC;KAAA;CACF","sourcesContent":["import type { ArenaRecord } from '../record'\nimport { User } from '../../auth'\nimport { CategoryItem } from '../../category'\nimport { ExpressionNodeType, JavascriptExpressionEvaluator } from '../../expression'\nimport { LanguageCode } from '../../language'\nimport {
|
|
1
|
+
{"version":3,"file":"recordExpressionEvaluator.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/recordExpressionEvaluator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,iDAAoF;AAGpF,2CAA2D;AAC3D,yCAA8C;AAE9C,uCAAqC;AACrC,wCAAoC;AAEpC,2CAAuD;AACvD,kDAA6D;AAC7D,wDAA0D;AAW1D,+BAAuC,SAAQ,0CAAsD;IACnG;QACE,KAAK,CAAC,qCAAyB,EAAE;YAC/B,CAAC,+BAAkB,CAAC,UAAU,CAAC,EAAE,sCAAyB;YAC1D,CAAC,+BAAkB,CAAC,IAAI,CAAC,EAAE,mCAAmB;SAC/C,CAAC,CAAA;IACJ,CAAC;IAEK,cAAc,CAClB,MAIC;;YAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;YACpD,MAAM,OAAO,GAAG,gBAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;YAC5E,MAAM,WAAW,GAAG,kBAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;YACvF,IAAI,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAA;YAC7B,MAAM,OAAO,mCAAiC,MAAM,KAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,CAAA;YACjH,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACtC,CAAC;KAAA;IAEa,yBAAyB,CACrC,MAIC;;YAED,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;YACjE,MAAM,qBAAqB,GAAwB,EAAE,CAAA;YAErD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAA;gBAEtC,IACE,eAAO,CAAC,OAAO,CAAC,WAAW,CAAC;oBAC5B,CAAC,MAAM,IAAI,CAAC,cAAc,iCAAM,MAAM,KAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,EAAE,IAAG,CAAC,EACnF,CAAC;oBACD,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;oBAEtC,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAK;oBACP,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,qBAAqB,CAAA;QAC9B,CAAC;KAAA;IAEK,yBAAyB,CAC7B,MAIC;;YAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;YAC1B,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAA;YAE1E,OAAO,OAAO,CAAC,GAAG,CAChB,qBAAqB,CAAC,GAAG,CAAC,CAAO,UAAU,EAAE,EAAE,+DAAC,CAAC;gBAC/C,UAAU;gBACV,KAAK,EAAE,MAAM,IAAI,CAAC,cAAc,iCAAM,MAAM,KAAE,IAAI,EAAE,OAAO,EAAE,KAAK,QAAE,UAAU,CAAC,UAAU,mCAAI,EAAE,IAAG;aACnG,CAAC,IAAA,CAAC,CACJ,CAAA;QACH,CAAC;KAAA;IAEK,wBAAwB,CAC5B,MAGC;;;YAED,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,yBAAyB,iCAAM,MAAM,KAAE,gBAAgB,EAAE,IAAI,IAAG,CAAA;YACxG,aAAO,oBAAoB,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAA;QACxC,CAAC;KAAA;CACF","sourcesContent":["import type { ArenaRecord } from '../record'\nimport { User } from '../../auth'\nimport { CategoryItem } from '../../category'\nimport { ExpressionNodeType, JavascriptExpressionEvaluator } from '../../expression'\nimport { LanguageCode } from '../../language'\nimport { ArenaRecordNode } from '../../node'\nimport { NodeDefExpression, NodeDefs } from '../../nodeDef'\nimport { Survey, Surveys } from '../../survey'\nimport { Taxon } from '../../taxonomy'\nimport { Objects } from '../../utils'\nimport { Records } from '../records'\nimport { RecordExpressionContext } from './context'\nimport { recordExpressionFunctions } from './functions'\nimport { RecordIdentifierEvaluator } from './node/identifier'\nimport { RecordThisEvaluator } from './node/thisEvaluator'\n\ntype ExpressionEvaluateParams = {\n user: User\n survey: Survey\n record: ArenaRecord\n prevCycleRecord?: ArenaRecord\n timezoneOffset?: number\n lang?: LanguageCode\n}\n\nexport class RecordExpressionEvaluator extends JavascriptExpressionEvaluator<RecordExpressionContext> {\n constructor() {\n super(recordExpressionFunctions, {\n [ExpressionNodeType.Identifier]: RecordIdentifierEvaluator,\n [ExpressionNodeType.This]: RecordThisEvaluator,\n })\n }\n\n async evalExpression(\n params: ExpressionEvaluateParams & {\n node: ArenaRecordNode\n query: string\n item?: CategoryItem | Taxon\n }\n ): Promise<any> {\n const { survey, record, node, query, item } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n const nodeContext = NodeDefs.isEntity(nodeDef) ? node : Records.getParent(node)(record)\n if (!nodeContext) return null\n const context: RecordExpressionContext = { ...params, nodeContext, nodeCurrent: node, object: nodeContext, item }\n return this.evaluate(query, context)\n }\n\n private async _getApplicableExpressions(\n params: ExpressionEvaluateParams & {\n nodeCtx: ArenaRecordNode\n expressions: NodeDefExpression[]\n stopAtFirstFound?: boolean\n }\n ): Promise<NodeDefExpression[]> {\n const { nodeCtx, expressions, stopAtFirstFound = false } = params\n const applicableExpressions: NodeDefExpression[] = []\n\n for (const expression of expressions) {\n const applyIfExpr = expression.applyIf\n\n if (\n Objects.isEmpty(applyIfExpr) ||\n (await this.evalExpression({ ...params, node: nodeCtx, query: applyIfExpr ?? '' }))\n ) {\n applicableExpressions.push(expression)\n\n if (stopAtFirstFound) {\n break\n }\n }\n }\n return applicableExpressions\n }\n\n async evalApplicableExpressions(\n params: ExpressionEvaluateParams & {\n nodeCtx: ArenaRecordNode\n expressions: NodeDefExpression[]\n stopAtFirstFound?: boolean\n }\n ): Promise<{ expression: NodeDefExpression; value: any }[]> {\n const { nodeCtx } = params\n const applicableExpressions = await this._getApplicableExpressions(params)\n\n return Promise.all(\n applicableExpressions.map(async (expression) => ({\n expression,\n value: await this.evalExpression({ ...params, node: nodeCtx, query: expression.expression ?? '' }),\n }))\n )\n }\n\n async evalApplicableExpression(\n params: ExpressionEvaluateParams & {\n nodeCtx: ArenaRecordNode\n expressions: NodeDefExpression[]\n }\n ): Promise<{ expression: NodeDefExpression; value: any } | null> {\n const expressionsEvaluated = await this.evalApplicableExpressions({ ...params, stopAtFirstFound: true })\n return expressionsEvaluated[0] ?? null\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordFixer.js","sourceRoot":"","sources":["../../src/record/recordFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeFactory, Nodes } from '../node'\nimport { NodeDef, NodeDefCode, NodeDefs, NodeDefType } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Objects } from '../utils'\nimport type { ArenaRecord, ArenaRecordNode } from './record'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { Records } from './records'\n\nconst fixCodeAttribute = (params: {\n survey: Survey\n nodeDef: NodeDefCode\n record: ArenaRecord\n node: ArenaRecordNode\n sideEffect: boolean\n}): ArenaRecordNode => {\n const { survey, nodeDef, record, node, sideEffect } = params\n if (!NodeDefs.getParentCodeDefUuid(nodeDef) || Objects.isNotEmpty(Nodes.getHierarchyCode(node))) {\n // nodeDef is not a code attribute or meta.hCode already populated: do nothing\n return node\n }\n const parentNode = Records.getParent(node)(record)\n if (!parentNode) {\n // missing parent node; node parentUuid could be invalid\n return node\n }\n // populate meta.hCode with ancestor code attribute node uuids\n const hCode: string[] = []\n let currentCodeDef: NodeDefCode = nodeDef\n let currentParentCodeAttribute = Records.getParentCodeAttribute({ parentNode, nodeDef: currentCodeDef })(record)\n while (currentParentCodeAttribute) {\n hCode.unshift(currentParentCodeAttribute.uuid)\n currentCodeDef = Surveys.getNodeDefByUuid({ survey, uuid: currentParentCodeAttribute.nodeDefUuid }) as NodeDefCode\n currentParentCodeAttribute = Records.getParentCodeAttribute({ parentNode, nodeDef: currentCodeDef })(record)\n }\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.meta = { ...nodeUpdated.meta, hCode }\n return nodeUpdated\n}\n\nconst insertMissingSingleNode = (params: {\n survey: Survey\n nodeDef: NodeDef<any>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n sideEffect: boolean\n}): RecordUpdateResult | null => {\n const { survey, nodeDef, record, parentNode, sideEffect } = params\n if (!NodeDefs.isSingle(nodeDef)) {\n // multiple node: don't insert it\n return null\n }\n const nodeDefUuid = nodeDef.uuid\n const children = Records.getChildren(parentNode, nodeDef.uuid)(record)\n if (!Objects.isEmpty(children)) {\n // single node already inserted\n return null\n }\n // insert missing single node\n const recordUuid = record.uuid\n let node = NodeFactory.createInstance({ nodeDefUuid, recordUuid, parentNode })\n\n if (nodeDef.type === NodeDefType.code) {\n node = fixCodeAttribute({ survey, nodeDef: nodeDef as NodeDefCode, record, node, sideEffect })\n }\n\n const recordUpdated = Records.addNode(node, { sideEffect })(record)\n return new RecordUpdateResult({ record: recordUpdated, nodes: { [node.uuid]: node } })\n}\n\nconst insertMissingSingleNodes = (params: {\n survey: Survey\n record: ArenaRecord\n sideEffect: boolean\n}): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n Surveys.visitNodeDefs({\n survey,\n visitor: (nodeDef) => {\n const parentDefUuid = nodeDef.parentUuid\n if (parentDefUuid) {\n const parentNodes = Records.getNodesByDefUuid(parentDefUuid)(updateResult.record)\n for (const parentNode of parentNodes) {\n const partialUpdateResult = insertMissingSingleNode({\n survey,\n nodeDef,\n record: updateResult.record,\n parentNode,\n sideEffect,\n })\n if (partialUpdateResult) {\n updateResult.merge(partialUpdateResult)\n }\n }\n }\n },\n })\n return updateResult\n}\n\nconst deleteNodesByDefUuid = (params: { record: ArenaRecord; nodeDefUuid: string; sideEffect: boolean }) => {\n const { record, nodeDefUuid, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n\n const recordUpdateOptions = { sideEffect }\n\n const nodesToDelete = Records.getNodesByDefUuid(nodeDefUuid)(updateResult.record)\n for (const nodeToDelete of nodesToDelete) {\n // cleanup child applicability\n const parentNode = Records.getParent(nodeToDelete)(updateResult.record)\n if (parentNode && !Nodes.isChildApplicable(parentNode, nodeDefUuid)) {\n const parentNodeUpdated = Nodes.dissocChildApplicability(parentNode, nodeDefUuid)\n const recordWithParentNodeUpdated = Records.addNode(parentNodeUpdated, recordUpdateOptions)(updateResult.record)\n updateResult.merge(new RecordUpdateResult({ record: recordWithParentNodeUpdated }))\n }\n }\n const nodeUuidsToDelete = nodesToDelete.map((node) => node.uuid)\n const nodesDeleteUpdateResult = Records.deleteNodes(nodeUuidsToDelete, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdateResult)\n\n return updateResult\n}\n\n/**\n * Fix a record by:\n * - inserting missing single nodes\n * - deleting nodes with non existing node defs\n * - removing status flags (created, deleted, updated) from all nodes\n */\nconst fixRecord = (params: { survey: Survey; record: ArenaRecord; sideEffect?: boolean }): RecordUpdateResult => {\n const { survey, record, sideEffect = false } = params\n const result = new RecordUpdateResult({ record })\n\n // 1. delete nodes with non existing node defs (and their descendants), once per missing node def\n const missingNodeDefUuids = new Set<string>()\n for (const { nodeDefUuid } of Records.getNodesArray(record)) {\n if (!Surveys.findNodeDefByUuid({ survey, uuid: nodeDefUuid })) {\n missingNodeDefUuids.add(nodeDefUuid)\n }\n }\n for (const nodeDefUuid of missingNodeDefUuids) {\n result.merge(deleteNodesByDefUuid({ record: result.record, nodeDefUuid, sideEffect }))\n }\n\n // 2. fix the remaining nodes (read from the updated record, without the deleted nodes); add them all at once\n const nodesUpdated: { [key: string]: ArenaRecordNode } = {}\n for (const node of Records.getNodesArray(result.record)) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n // remove status flags\n let nodeUpdated = Nodes.removeStatusFlags({ node, sideEffect })\n\n if (nodeDef.type === NodeDefType.code) {\n nodeUpdated = fixCodeAttribute({\n survey,\n nodeDef: nodeDef as NodeDefCode,\n record: result.record,\n node: nodeUpdated,\n sideEffect,\n })\n }\n nodesUpdated[nodeUpdated.uuid] = nodeUpdated\n }\n const recordWithNodesUpdated = Records.addNodes(nodesUpdated, { sideEffect })(result.record)\n result.merge(new RecordUpdateResult({ record: recordWithNodesUpdated, nodes: nodesUpdated }))\n\n const missingNodesUpdateResult = insertMissingSingleNodes({ survey, record: result.record, sideEffect })\n result.merge(missingNodesUpdateResult)\n return result\n}\n\nexport const RecordFixer = {\n fixRecord,\n insertMissingSingleNodes,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"recordFixer.js","sourceRoot":"","sources":["../../src/record/recordFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodeFactory, Nodes } from '../node'\nimport { NodeDef, NodeDefCode, NodeDefs, NodeDefType } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Objects } from '../utils'\nimport type { ArenaRecord } from './record'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { Records } from './records'\n\nconst fixCodeAttribute = (params: {\n survey: Survey\n nodeDef: NodeDefCode\n record: ArenaRecord\n node: ArenaRecordNode\n sideEffect: boolean\n}): ArenaRecordNode => {\n const { survey, nodeDef, record, node, sideEffect } = params\n if (!NodeDefs.getParentCodeDefUuid(nodeDef) || Objects.isNotEmpty(Nodes.getHierarchyCode(node))) {\n // nodeDef is not a code attribute or meta.hCode already populated: do nothing\n return node\n }\n const parentNode = Records.getParent(node)(record)\n if (!parentNode) {\n // missing parent node; node parentUuid could be invalid\n return node\n }\n // populate meta.hCode with ancestor code attribute node uuids\n const hCode: string[] = []\n let currentCodeDef: NodeDefCode = nodeDef\n let currentParentCodeAttribute = Records.getParentCodeAttribute({ parentNode, nodeDef: currentCodeDef })(record)\n while (currentParentCodeAttribute) {\n hCode.unshift(currentParentCodeAttribute.uuid)\n currentCodeDef = Surveys.getNodeDefByUuid({ survey, uuid: currentParentCodeAttribute.nodeDefUuid }) as NodeDefCode\n currentParentCodeAttribute = Records.getParentCodeAttribute({ parentNode, nodeDef: currentCodeDef })(record)\n }\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.meta = { ...nodeUpdated.meta, hCode }\n return nodeUpdated\n}\n\nconst insertMissingSingleNode = (params: {\n survey: Survey\n nodeDef: NodeDef<any>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n sideEffect: boolean\n}): RecordUpdateResult | null => {\n const { survey, nodeDef, record, parentNode, sideEffect } = params\n if (!NodeDefs.isSingle(nodeDef)) {\n // multiple node: don't insert it\n return null\n }\n const nodeDefUuid = nodeDef.uuid\n const children = Records.getChildren(parentNode, nodeDef.uuid)(record)\n if (!Objects.isEmpty(children)) {\n // single node already inserted\n return null\n }\n // insert missing single node\n const recordUuid = record.uuid\n let node = NodeFactory.createInstance({ nodeDefUuid, recordUuid, parentNode })\n\n if (nodeDef.type === NodeDefType.code) {\n node = fixCodeAttribute({ survey, nodeDef: nodeDef as NodeDefCode, record, node, sideEffect })\n }\n\n const recordUpdated = Records.addNode(node, { sideEffect })(record)\n return new RecordUpdateResult({ record: recordUpdated, nodes: { [node.uuid]: node } })\n}\n\nconst insertMissingSingleNodes = (params: {\n survey: Survey\n record: ArenaRecord\n sideEffect: boolean\n}): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n Surveys.visitNodeDefs({\n survey,\n visitor: (nodeDef) => {\n const parentDefUuid = nodeDef.parentUuid\n if (parentDefUuid) {\n const parentNodes = Records.getNodesByDefUuid(parentDefUuid)(updateResult.record)\n for (const parentNode of parentNodes) {\n const partialUpdateResult = insertMissingSingleNode({\n survey,\n nodeDef,\n record: updateResult.record,\n parentNode,\n sideEffect,\n })\n if (partialUpdateResult) {\n updateResult.merge(partialUpdateResult)\n }\n }\n }\n },\n })\n return updateResult\n}\n\nconst deleteNodesByDefUuid = (params: { record: ArenaRecord; nodeDefUuid: string; sideEffect: boolean }) => {\n const { record, nodeDefUuid, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n\n const recordUpdateOptions = { sideEffect }\n\n const nodesToDelete = Records.getNodesByDefUuid(nodeDefUuid)(updateResult.record)\n for (const nodeToDelete of nodesToDelete) {\n // cleanup child applicability\n const parentNode = Records.getParent(nodeToDelete)(updateResult.record)\n if (parentNode && !Nodes.isChildApplicable(parentNode, nodeDefUuid)) {\n const parentNodeUpdated = Nodes.dissocChildApplicability(parentNode, nodeDefUuid)\n const recordWithParentNodeUpdated = Records.addNode(parentNodeUpdated, recordUpdateOptions)(updateResult.record)\n updateResult.merge(new RecordUpdateResult({ record: recordWithParentNodeUpdated }))\n }\n }\n const nodeUuidsToDelete = nodesToDelete.map((node) => node.uuid)\n const nodesDeleteUpdateResult = Records.deleteNodes(nodeUuidsToDelete, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdateResult)\n\n return updateResult\n}\n\n/**\n * Fix a record by:\n * - inserting missing single nodes\n * - deleting nodes with non existing node defs\n * - removing status flags (created, deleted, updated) from all nodes\n */\nconst fixRecord = (params: { survey: Survey; record: ArenaRecord; sideEffect?: boolean }): RecordUpdateResult => {\n const { survey, record, sideEffect = false } = params\n const result = new RecordUpdateResult({ record })\n\n // 1. delete nodes with non existing node defs (and their descendants), once per missing node def\n const missingNodeDefUuids = new Set<string>()\n for (const { nodeDefUuid } of Records.getNodesArray(record)) {\n if (!Surveys.findNodeDefByUuid({ survey, uuid: nodeDefUuid })) {\n missingNodeDefUuids.add(nodeDefUuid)\n }\n }\n for (const nodeDefUuid of missingNodeDefUuids) {\n result.merge(deleteNodesByDefUuid({ record: result.record, nodeDefUuid, sideEffect }))\n }\n\n // 2. fix the remaining nodes (read from the updated record, without the deleted nodes); add them all at once\n const nodesUpdated: { [key: string]: ArenaRecordNode } = {}\n for (const node of Records.getNodesArray(result.record)) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n // remove status flags\n let nodeUpdated = Nodes.removeStatusFlags({ node, sideEffect })\n\n if (nodeDef.type === NodeDefType.code) {\n nodeUpdated = fixCodeAttribute({\n survey,\n nodeDef: nodeDef as NodeDefCode,\n record: result.record,\n node: nodeUpdated,\n sideEffect,\n })\n }\n nodesUpdated[nodeUpdated.uuid] = nodeUpdated\n }\n const recordWithNodesUpdated = Records.addNodes(nodesUpdated, { sideEffect })(result.record)\n result.merge(new RecordUpdateResult({ record: recordWithNodesUpdated, nodes: nodesUpdated }))\n\n const missingNodesUpdateResult = insertMissingSingleNodes({ survey, record: result.record, sideEffect })\n result.merge(missingNodesUpdateResult)\n return result\n}\n\nexport const RecordFixer = {\n fixRecord,\n insertMissingSingleNodes,\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { User } from '../../auth';
|
|
2
|
-
import {
|
|
2
|
+
import { ArenaRecordNode } from '../../node';
|
|
3
3
|
import { NodeDefEntity } from '../../nodeDef';
|
|
4
4
|
import { Survey } from '../../survey';
|
|
5
|
-
import {
|
|
5
|
+
import { ArenaRecord } from '../record';
|
|
6
6
|
/**
|
|
7
7
|
* Evaluates the entity's enumeratingItemsExpression and returns the allowed category item codes.
|
|
8
8
|
*
|
|
@@ -12,7 +12,7 @@ import { Record } from '../record';
|
|
|
12
12
|
export declare const getEnumeratingItemsAllowedCodes: (params: {
|
|
13
13
|
survey: Survey;
|
|
14
14
|
user: User;
|
|
15
|
-
record:
|
|
15
|
+
record: ArenaRecord;
|
|
16
16
|
entityDef: NodeDefEntity;
|
|
17
|
-
parentNode:
|
|
17
|
+
parentNode: ArenaRecordNode;
|
|
18
18
|
}) => Promise<Set<string> | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordEnumeratingItemsExpressionEvaluator.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,2CAAuD;AAGvD,4EAAwE;AAExE,MAAM,mBAAmB,GAAG,IAAI,qDAAyB,EAAE,CAAA;AAE3D;;;;;GAKG;AACI,MAAM,+BAA+B,GAAG,CAAO,MAMrD,EAAoC,EAAE;IACrC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAC9D,MAAM,UAAU,GAAG,kBAAQ,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAA;IACpE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IAEjC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,cAAc,CAAC;QACtD,IAAI;QACJ,MAAM;QACN,MAAM;QACN,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,GAAG,EAAU,CAAA;IAC/D,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AAC7G,CAAC,CAAA,CAAA;AArBY,QAAA,+BAA+B,GAA/B,+BAA+B,CAqB3C","sourcesContent":["import { User } from '../../auth'\nimport {
|
|
1
|
+
{"version":3,"file":"recordEnumeratingItemsExpressionEvaluator.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,2CAAuD;AAGvD,4EAAwE;AAExE,MAAM,mBAAmB,GAAG,IAAI,qDAAyB,EAAE,CAAA;AAE3D;;;;;GAKG;AACI,MAAM,+BAA+B,GAAG,CAAO,MAMrD,EAAoC,EAAE;IACrC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAC9D,MAAM,UAAU,GAAG,kBAAQ,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAA;IACpE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IAEjC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,cAAc,CAAC;QACtD,IAAI;QACJ,MAAM;QACN,MAAM;QACN,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,GAAG,EAAU,CAAA;IAC/D,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AAC7G,CAAC,CAAA,CAAA;AArBY,QAAA,+BAA+B,GAA/B,+BAA+B,CAqB3C","sourcesContent":["import { User } from '../../auth'\nimport { ArenaRecordNode } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Survey } from '../../survey'\nimport { ArenaRecord } from '../record'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\n/**\n * Evaluates the entity's enumeratingItemsExpression and returns the allowed category item codes.\n *\n * @param params - Evaluation context parameters.\n * @returns Allowed category item codes, or undefined when no expression is configured.\n */\nexport const getEnumeratingItemsAllowedCodes = async (params: {\n survey: Survey\n user: User\n record: ArenaRecord\n entityDef: NodeDefEntity\n parentNode: ArenaRecordNode\n}): Promise<Set<string> | undefined> => {\n const { survey, user, record, entityDef, parentNode } = params\n const expression = NodeDefs.getEnumeratingItemsExpression(entityDef)\n if (!expression) return undefined\n\n const result = await expressionEvaluator.evalExpression({\n user,\n survey,\n record,\n node: parentNode,\n query: expression,\n })\n\n if (!result || !Array.isArray(result)) return new Set<string>()\n return new Set(result.filter((value) => value !== null && value !== undefined && value !== '').map(String))\n}\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ArenaRecordNode } from '../../node';
|
|
2
2
|
import { Survey } from '../../survey';
|
|
3
|
-
import {
|
|
3
|
+
import { ArenaRecord } from '../record';
|
|
4
4
|
import { NodeDef } from '../../nodeDef';
|
|
5
5
|
import { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider';
|
|
6
6
|
import { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider';
|
|
7
7
|
interface ToNodeValueParams {
|
|
8
8
|
survey: Survey;
|
|
9
|
-
record:
|
|
10
|
-
nodeParent:
|
|
9
|
+
record: ArenaRecord;
|
|
10
|
+
nodeParent: ArenaRecordNode;
|
|
11
11
|
nodeDef: NodeDef<any>;
|
|
12
12
|
valueExpr: string;
|
|
13
13
|
timezoneOffset?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordExpressionValueConverter.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordExpressionValueConverter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point, Points } from '../../geo'\nimport { Node, NodeValueCode, NodeValueTaxon } from '../../node'\nimport { Survey, Surveys } from '../../survey'\nimport { Record } from '../record'\nimport { Records } from '../records'\nimport { NodeDef, NodeDefType, NodeDefs, NodeDefCodeProps, NodeDefTaxon, NodeDefCode } from '../../nodeDef'\nimport { Dates, DateFormats, Objects } from '../../utils'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\n\ninterface ToNodeValueParams {\n survey: Survey\n record: Record\n nodeParent: Node\n nodeDef: NodeDef<any>\n valueExpr: string\n timezoneOffset?: number\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n}\n\nconst _toPrimitive = (TypeTo: any) => (params: ToNodeValueParams) => {\n const { valueExpr: val } = params\n return TypeTo(val)\n}\n\nconst _toBoolean = (params: ToNodeValueParams) => {\n const { valueExpr } = params\n if (['true', 'false'].includes(String(valueExpr))) return String(valueExpr)\n return null\n}\n\nconst _findCategoryItemUuidByCode = async (params: {\n survey: Survey\n record: Record\n nodeDef: NodeDefCode\n nodeParent: Node\n code: string\n categoryItemProvider?: CategoryItemProvider\n}): Promise<string | undefined> => {\n const { survey, record, nodeDef, nodeParent, code, categoryItemProvider } = params\n const codeNodeDef = nodeDef as NodeDef<NodeDefType.code, NodeDefCodeProps>\n\n const categoryItemUuid = Records.getCategoryItemUuid({\n survey,\n record,\n nodeDef: codeNodeDef,\n parentNode: nodeParent,\n code,\n })\n if (categoryItemUuid) return categoryItemUuid\n if (!categoryItemProvider) return undefined\n\n const categoryUuid = NodeDefs.getCategoryUuid(nodeDef)\n if (!categoryUuid) return undefined\n const codePaths = [...Records.getAncestorCodePath({ survey, record, parentNode: nodeParent, nodeDef }), code]\n const draft = !!record.preview\n const item = await categoryItemProvider.getItemByCodePaths({ survey, categoryUuid, codePaths, draft })\n return item?.uuid\n}\n\nconst _toCode = async (params: ToNodeValueParams): Promise<NodeValueCode | null> => {\n const { survey, record, nodeDef, nodeParent, valueExpr, categoryItemProvider } = params\n\n if (!nodeParent) return null\n\n // ValueExpr is the code of a category item\n const code = String(valueExpr)\n\n const categoryItemUuid = await _findCategoryItemUuidByCode({\n survey,\n record,\n nodeDef: nodeDef as NodeDefCode,\n nodeParent,\n code,\n categoryItemProvider,\n })\n\n return categoryItemUuid ? { itemUuid: categoryItemUuid } : null\n}\n\nconst _toCoordinate = (params: ToNodeValueParams): Point | null => {\n const { valueExpr } = params\n return Points.parse(valueExpr)\n}\n\nconst _toDateTime = (params: {\n valueExpr: any\n format: DateFormats\n formatsFrom: DateFormats[]\n timezoneOffset?: number\n}): string | null => {\n const { valueExpr, format, formatsFrom = [DateFormats.datetimeDefault], timezoneOffset } = params\n const formatFrom = formatsFrom.find((formt) => Dates.isValidDateInFormat(valueExpr, formt))\n if (!formatFrom) return null\n\n const date = Dates.parse(valueExpr, formatFrom)\n if (!date) return null\n\n // `date` encodes the parsed digits as if they were UTC (see Dates.parse/parseZone), so shift by the\n // client's offset (if any) and read the result back out in UTC - never in this machine's local time zone,\n // which would otherwise silently reintroduce the server's own timezone into the result.\n const dateWithTimezoneOffset = timezoneOffset ? new Date(date.getTime() - timezoneOffset * 60000) : date\n return Dates.formatUTC(dateWithTimezoneOffset, format)\n}\n\nconst findTaxonByCode = async (params: {\n survey: Survey\n nodeDef: NodeDefTaxon\n taxonCode: string\n draft: boolean\n taxonProvider?: TaxonProvider\n}) => {\n const { survey, nodeDef, taxonCode, taxonProvider, draft } = params\n const taxonomyUuid = NodeDefs.getTaxonomyUuid(nodeDef)!\n const taxon = Surveys.getTaxonByCode({ survey, taxonomyUuid, taxonCode })\n if (taxon) return taxon\n if (!taxonProvider) return null\n return taxonProvider.getTaxonByCode({ survey, taxonomyUuid, taxonCode, draft })\n}\n\nconst _toTaxon = async (params: ToNodeValueParams): Promise<NodeValueTaxon | null> => {\n const { survey, record, nodeDef, valueExpr, taxonProvider } = params\n\n // ValueExpr is the code of a taxon\n const taxonCode = String(valueExpr)\n\n const taxonNodeDef = nodeDef as NodeDefTaxon\n const draft = !!record.preview\n const taxon = await findTaxonByCode({ survey, nodeDef: taxonNodeDef, taxonCode, taxonProvider, draft })\n return taxon ? { taxonUuid: taxon.uuid } : null\n}\n\nconst _valueExprToValueNodeFns: { [key in NodeDefType]?: (params: ToNodeValueParams) => any } = {\n [NodeDefType.boolean]: _toBoolean,\n [NodeDefType.code]: _toCode,\n [NodeDefType.coordinate]: _toCoordinate,\n [NodeDefType.date]: (params: { valueExpr: any; timezoneOffset?: number }) => {\n const { valueExpr, timezoneOffset } = params\n return _toDateTime({\n valueExpr,\n format: DateFormats.dateStorage,\n formatsFrom: [DateFormats.datetimeStorage, DateFormats.datetimeDefault, DateFormats.dateStorage],\n timezoneOffset,\n })\n },\n [NodeDefType.decimal]: _toPrimitive(Number),\n [NodeDefType.geo]: (params: { valueExpr: any }) => {\n const { valueExpr } = params\n return typeof valueExpr === 'string' ? JSON.parse(valueExpr) : valueExpr\n },\n [NodeDefType.integer]: _toPrimitive(Number),\n [NodeDefType.taxon]: _toTaxon,\n [NodeDefType.text]: _toPrimitive(String),\n [NodeDefType.time]: (params: { nodeDef: NodeDef<any>; valueExpr: any; timezoneOffset?: number }) => {\n const { nodeDef, valueExpr, timezoneOffset } = params\n return _toDateTime({\n valueExpr,\n format: NodeDefs.isSecondsIncluded(nodeDef) ? DateFormats.timeWithSeconds : DateFormats.timeStorage,\n formatsFrom: [\n DateFormats.datetimeStorage,\n DateFormats.datetimeDefault,\n DateFormats.timeWithSeconds,\n DateFormats.timeStorage,\n ],\n timezoneOffset,\n })\n },\n}\n\nconst toNodeValue = (params: ToNodeValueParams): Promise<any> => {\n const { nodeDef, valueExpr } = params\n if (Objects.isEmpty(valueExpr)) return Promise.resolve(null)\n\n const fn = _valueExprToValueNodeFns[NodeDefs.getType(nodeDef)]\n return Promise.resolve(fn?.(params))\n}\n\nexport const RecordExpressionValueConverter = {\n toNodeValue,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"recordExpressionValueConverter.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordExpressionValueConverter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point, Points } from '../../geo'\nimport { ArenaRecordNode, NodeValueCode, NodeValueTaxon } from '../../node'\nimport { Survey, Surveys } from '../../survey'\nimport { ArenaRecord } from '../record'\nimport { Records } from '../records'\nimport { NodeDef, NodeDefType, NodeDefs, NodeDefCodeProps, NodeDefTaxon, NodeDefCode } from '../../nodeDef'\nimport { Dates, DateFormats, Objects } from '../../utils'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\n\ninterface ToNodeValueParams {\n survey: Survey\n record: ArenaRecord\n nodeParent: ArenaRecordNode\n nodeDef: NodeDef<any>\n valueExpr: string\n timezoneOffset?: number\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n}\n\nconst _toPrimitive = (TypeTo: any) => (params: ToNodeValueParams) => {\n const { valueExpr: val } = params\n return TypeTo(val)\n}\n\nconst _toBoolean = (params: ToNodeValueParams) => {\n const { valueExpr } = params\n if (['true', 'false'].includes(String(valueExpr))) return String(valueExpr)\n return null\n}\n\nconst _findCategoryItemUuidByCode = async (params: {\n survey: Survey\n record: ArenaRecord\n nodeDef: NodeDefCode\n nodeParent: ArenaRecordNode\n code: string\n categoryItemProvider?: CategoryItemProvider\n}): Promise<string | undefined> => {\n const { survey, record, nodeDef, nodeParent, code, categoryItemProvider } = params\n const codeNodeDef = nodeDef as NodeDef<NodeDefType.code, NodeDefCodeProps>\n\n const categoryItemUuid = Records.getCategoryItemUuid({\n survey,\n record,\n nodeDef: codeNodeDef,\n parentNode: nodeParent,\n code,\n })\n if (categoryItemUuid) return categoryItemUuid\n if (!categoryItemProvider) return undefined\n\n const categoryUuid = NodeDefs.getCategoryUuid(nodeDef)\n if (!categoryUuid) return undefined\n const codePaths = [...Records.getAncestorCodePath({ survey, record, parentNode: nodeParent, nodeDef }), code]\n const draft = !!record.preview\n const item = await categoryItemProvider.getItemByCodePaths({ survey, categoryUuid, codePaths, draft })\n return item?.uuid\n}\n\nconst _toCode = async (params: ToNodeValueParams): Promise<NodeValueCode | null> => {\n const { survey, record, nodeDef, nodeParent, valueExpr, categoryItemProvider } = params\n\n if (!nodeParent) return null\n\n // ValueExpr is the code of a category item\n const code = String(valueExpr)\n\n const categoryItemUuid = await _findCategoryItemUuidByCode({\n survey,\n record,\n nodeDef: nodeDef as NodeDefCode,\n nodeParent,\n code,\n categoryItemProvider,\n })\n\n return categoryItemUuid ? { itemUuid: categoryItemUuid } : null\n}\n\nconst _toCoordinate = (params: ToNodeValueParams): Point | null => {\n const { valueExpr } = params\n return Points.parse(valueExpr)\n}\n\nconst _toDateTime = (params: {\n valueExpr: any\n format: DateFormats\n formatsFrom: DateFormats[]\n timezoneOffset?: number\n}): string | null => {\n const { valueExpr, format, formatsFrom = [DateFormats.datetimeDefault], timezoneOffset } = params\n const formatFrom = formatsFrom.find((formt) => Dates.isValidDateInFormat(valueExpr, formt))\n if (!formatFrom) return null\n\n const date = Dates.parse(valueExpr, formatFrom)\n if (!date) return null\n\n // `date` encodes the parsed digits as if they were UTC (see Dates.parse/parseZone), so shift by the\n // client's offset (if any) and read the result back out in UTC - never in this machine's local time zone,\n // which would otherwise silently reintroduce the server's own timezone into the result.\n const dateWithTimezoneOffset = timezoneOffset ? new Date(date.getTime() - timezoneOffset * 60000) : date\n return Dates.formatUTC(dateWithTimezoneOffset, format)\n}\n\nconst findTaxonByCode = async (params: {\n survey: Survey\n nodeDef: NodeDefTaxon\n taxonCode: string\n draft: boolean\n taxonProvider?: TaxonProvider\n}) => {\n const { survey, nodeDef, taxonCode, taxonProvider, draft } = params\n const taxonomyUuid = NodeDefs.getTaxonomyUuid(nodeDef)!\n const taxon = Surveys.getTaxonByCode({ survey, taxonomyUuid, taxonCode })\n if (taxon) return taxon\n if (!taxonProvider) return null\n return taxonProvider.getTaxonByCode({ survey, taxonomyUuid, taxonCode, draft })\n}\n\nconst _toTaxon = async (params: ToNodeValueParams): Promise<NodeValueTaxon | null> => {\n const { survey, record, nodeDef, valueExpr, taxonProvider } = params\n\n // ValueExpr is the code of a taxon\n const taxonCode = String(valueExpr)\n\n const taxonNodeDef = nodeDef as NodeDefTaxon\n const draft = !!record.preview\n const taxon = await findTaxonByCode({ survey, nodeDef: taxonNodeDef, taxonCode, taxonProvider, draft })\n return taxon ? { taxonUuid: taxon.uuid } : null\n}\n\nconst _valueExprToValueNodeFns: { [key in NodeDefType]?: (params: ToNodeValueParams) => any } = {\n [NodeDefType.boolean]: _toBoolean,\n [NodeDefType.code]: _toCode,\n [NodeDefType.coordinate]: _toCoordinate,\n [NodeDefType.date]: (params: { valueExpr: any; timezoneOffset?: number }) => {\n const { valueExpr, timezoneOffset } = params\n return _toDateTime({\n valueExpr,\n format: DateFormats.dateStorage,\n formatsFrom: [DateFormats.datetimeStorage, DateFormats.datetimeDefault, DateFormats.dateStorage],\n timezoneOffset,\n })\n },\n [NodeDefType.decimal]: _toPrimitive(Number),\n [NodeDefType.geo]: (params: { valueExpr: any }) => {\n const { valueExpr } = params\n return typeof valueExpr === 'string' ? JSON.parse(valueExpr) : valueExpr\n },\n [NodeDefType.integer]: _toPrimitive(Number),\n [NodeDefType.taxon]: _toTaxon,\n [NodeDefType.text]: _toPrimitive(String),\n [NodeDefType.time]: (params: { nodeDef: NodeDef<any>; valueExpr: any; timezoneOffset?: number }) => {\n const { nodeDef, valueExpr, timezoneOffset } = params\n return _toDateTime({\n valueExpr,\n format: NodeDefs.isSecondsIncluded(nodeDef) ? DateFormats.timeWithSeconds : DateFormats.timeStorage,\n formatsFrom: [\n DateFormats.datetimeStorage,\n DateFormats.datetimeDefault,\n DateFormats.timeWithSeconds,\n DateFormats.timeStorage,\n ],\n timezoneOffset,\n })\n },\n}\n\nconst toNodeValue = (params: ToNodeValueParams): Promise<any> => {\n const { nodeDef, valueExpr } = params\n if (Objects.isEmpty(valueExpr)) return Promise.resolve(null)\n\n const fn = _valueExprToValueNodeFns[NodeDefs.getType(nodeDef)]\n return Promise.resolve(fn?.(params))\n}\n\nexport const RecordExpressionValueConverter = {\n toNodeValue,\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordNodeDependentsApplicableUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { Node, NodePointer, Nodes } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { Record } from '../record'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\nimport { Records, RecordUpdateOptions } from '../records'\nimport { createOrDeleteEnumeratedEntities } from './recordNodeDependentsEnumeratedEntitiesUpdater'\nimport { syncEnumeratingItemsEntities } from './recordNodeDependentsEnumeratingItemsUpdater'\nimport { createNodeAndDescendants } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { getDependentNodePointersByType } from './recordNodesDependentsUpdaterCommons'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\nconst extractNodePointersToUpdate = (params: { survey: Survey; record: Record; node: Node }) => {\n const { survey, record, node } = params\n\n const nodePointersToUpdate = getDependentNodePointersByType({\n survey,\n record,\n node,\n dependencyType: SurveyDependencyType.applicable,\n includeSelfWhenSourceIsAttribute: true,\n includeNewEntityChildPointers: true,\n })\n return nodePointersToUpdate\n}\n\nconst calculateApplicableNext = async ({\n params,\n updateResult,\n nodePointer,\n nodeCtx,\n}: {\n params: RecordNodeDependentsUpdateParams\n updateResult: RecordUpdateResult\n nodePointer: NodePointer\n nodeCtx: Node\n}): Promise<boolean | undefined> => {\n const { nodeDef: nodeDefNodePointer } = nodePointer\n\n const { uuid: nodeDefUuid } = nodeDefNodePointer\n\n const applicablePrev = Nodes.isChildApplicable(nodeCtx, nodeDefUuid)\n const expressionsToEvaluate = NodeDefs.getApplicable(nodeDefNodePointer)\n if (expressionsToEvaluate.length === 0) {\n if (applicablePrev) {\n // skip nodes that were already applicable and have no applicable expression, as they will remain applicable\n return undefined\n } else {\n // used during survey publishing: node def could have had applicable expression(s) that were removed,\n // and node could have been not applicable, but now it should be applicable, as there are no more applicable expressions\n return true\n }\n } else {\n // 3. evaluate applicable expression\n const exprEval = await expressionEvaluator.evalApplicableExpression({\n ...params,\n record: updateResult.record,\n nodeCtx,\n expressions: expressionsToEvaluate,\n })\n return exprEval?.value || false\n }\n}\n\nconst updateDescendantsApplicability = ({\n updateResult,\n nodeCtxChild,\n applicable,\n params,\n recordUpdateOptions,\n}: {\n updateResult: RecordUpdateResult\n nodeCtxChild: Node\n applicable: boolean\n params: RecordNodeDependentsUpdateParams\n recordUpdateOptions: RecordUpdateOptions\n}): void => {\n const { survey, sideEffect = false, clearNonApplicableValues = false } = params\n\n // only values entered by the user are reported as cleared (they need a confirmation)\n let userValuesCleared = false\n\n Records.visitDescendantsAndSelf({\n record: updateResult.record,\n node: nodeCtxChild,\n visitor: (nodeDescendant): boolean => {\n const nodeDescendantCleared = clearNonApplicableValues && !applicable && Nodes.isValueNotBlank(nodeDescendant)\n // values set by expressions (default values, read only attributes) are applied again when applicable: not reported\n // (evaluated before clearing the value: with sideEffect the node is modified in place)\n const nodeDescendantDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDescendant.nodeDefUuid })\n const userValueCleared =\n nodeDescendantCleared && !NodeDefs.isReadOnly(nodeDescendantDef) && Nodes.hasUserInputValue(nodeDescendant)\n // Clear value if becoming non-applicable and parameter is enabled\n const nodeDescendantUpdated = nodeDescendantCleared\n ? Nodes.assocValue(nodeDescendant, null, sideEffect)\n : nodeDescendant\n updateResult.addNode(nodeDescendantUpdated, recordUpdateOptions)\n if (userValueCleared) {\n updateResult.addClearedDefUuid(nodeDescendant.nodeDefUuid)\n userValuesCleared = true\n }\n return false\n },\n })\n\n // if a multiple entity became not applicable and it's empty, delete it instead of just marking descendants as not applicable\n if (!applicable && clearNonApplicableValues) {\n const { uuid: nodeCtxChildUuid, nodeDefUuid: nodeCtxChildDefUuid } = nodeCtxChild\n const nodeCtxChildDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeCtxChildDefUuid })\n if (NodeDefs.isMultipleEntity(nodeCtxChildDef) && Records.isNodeEmpty(nodeCtxChild)(updateResult.record)) {\n const deleteResult = deleteNodes([nodeCtxChildUuid], recordUpdateOptions)(updateResult.record)\n updateResult.merge(deleteResult)\n if (userValuesCleared) {\n updateResult.addClearedDefUuid(nodeCtxChildDefUuid)\n }\n }\n }\n}\n\nconst createMissingApplicableMultipleEntities = async ({\n params,\n updateResult,\n parentNode,\n nodeDef,\n}: {\n params: RecordNodeDependentsUpdateParams\n updateResult: RecordUpdateResult\n parentNode: Node\n nodeDef: NodeDefEntity\n}): Promise<void> => {\n if (!NodeDefs.isAutoCreateMinCountItems(nodeDef)) return\n\n const minCount = Nodes.getChildrenMinCount({ parentNode, nodeDef })\n if (Number.isNaN(minCount) || minCount <= 0) return\n\n const existingChildren = Records.getChildren(parentNode, nodeDef.uuid)(updateResult.record)\n const missingCount = Math.max(0, minCount - existingChildren.length)\n\n for (let index = 0; index < missingCount; index++) {\n const createParams = { ...params, record: updateResult.record, parentNode, nodeDef }\n // create nodes sequentially: every iteration works on the record updated by the previous one\n const childUpdateResult = await createNodeAndDescendants(createParams) // NOSONAR\n updateResult.merge(childUpdateResult)\n }\n}\n\nconst updateNodePointerApplicability = async ({\n params,\n updateResult,\n nodePointer,\n recordUpdateOptions,\n}: {\n params: RecordNodeDependentsUpdateParams\n updateResult: RecordUpdateResult\n nodePointer: NodePointer\n recordUpdateOptions: RecordUpdateOptions\n}): Promise<void> => {\n const { nodeCtx: nodeCtxNodePointer, nodeDef: nodeDefNodePointer } = nodePointer\n\n const nodeCtxUuid = nodeCtxNodePointer.uuid\n const nodeDefUuid = nodeDefNodePointer.uuid\n\n // nodeCtx could have been updated in a previous iteration\n const nodeCtx = updateResult.getNodeByUuid(nodeCtxUuid) ?? nodeCtxNodePointer\n\n const applicablePrev = Nodes.isChildApplicable(nodeCtx, nodeDefUuid)\n const applicable = await calculateApplicableNext({\n params,\n updateResult,\n nodePointer,\n nodeCtx,\n })\n if (applicable === undefined) {\n return\n }\n\n if (applicable && NodeDefs.isMultipleEntity(nodeDefNodePointer)) {\n await createMissingApplicableMultipleEntities({\n params,\n updateResult,\n parentNode: nodeCtx,\n nodeDef: nodeDefNodePointer as NodeDefEntity,\n })\n }\n\n // 4. persist updated applicability if changed, and return updated nodes\n if (applicablePrev === applicable) {\n return\n }\n // Applicability changed\n\n // update node and add it to nodes updated\n const nodeCtxUpdated = Nodes.assocChildApplicability(nodeCtx, nodeDefUuid, applicable)\n updateResult.addNode(nodeCtxUpdated, recordUpdateOptions)\n\n let nodeCtxChildren = Records.getChildren(nodeCtx, nodeDefUuid)(updateResult.record)\n\n if (NodeDefs.isMultipleEntity(nodeDefNodePointer) && NodeDefs.isEnumerate(nodeDefNodePointer as NodeDefEntity)) {\n const entityDef = nodeDefNodePointer as NodeDefEntity\n if (NodeDefs.getEnumeratingItemsExpression(entityDef)) {\n await syncEnumeratingItemsEntities({\n ...params,\n parentNode: nodeCtxUpdated,\n entityDef,\n updateResult,\n })\n } else {\n await createOrDeleteEnumeratedEntities({\n ...params,\n parentNode: nodeCtxUpdated,\n entityDef,\n updateResult,\n })\n }\n nodeCtxChildren = Records.getChildren(nodeCtx, nodeDefUuid)(updateResult.record)\n }\n for (const nodeCtxChild of nodeCtxChildren) {\n // add nodeCtxChild and its descendants to nodesUpdated\n updateDescendantsApplicability({\n updateResult,\n nodeCtxChild,\n applicable,\n params,\n recordUpdateOptions,\n })\n }\n}\n\nexport const updateSelfAndDependentsApplicable = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node, sideEffect = false } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n const recordUpdateOptions: RecordUpdateOptions = { sideEffect }\n\n // 1. fetch dependent nodes\n const nodePointersToUpdate = extractNodePointersToUpdate({ survey, record, node })\n\n // 2. update expr to node and dependent nodes\n // NOTE: don't do it in parallel, same nodeCtx metadata could be overwritten\n for (const nodePointer of nodePointersToUpdate) {\n await updateNodePointerApplicability({ params, updateResult, nodePointer, recordUpdateOptions }) // NOSONAR\n }\n return updateResult\n}\n"]}
|
|
1
|
+
{"version":3,"file":"recordNodeDependentsApplicableUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodePointer, Nodes } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { ArenaRecord } from '../record'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\nimport { Records, RecordUpdateOptions } from '../records'\nimport { createOrDeleteEnumeratedEntities } from './recordNodeDependentsEnumeratedEntitiesUpdater'\nimport { syncEnumeratingItemsEntities } from './recordNodeDependentsEnumeratingItemsUpdater'\nimport { createNodeAndDescendants } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { getDependentNodePointersByType } from './recordNodesDependentsUpdaterCommons'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\nconst extractNodePointersToUpdate = (params: { survey: Survey; record: ArenaRecord; node: ArenaRecordNode }) => {\n const { survey, record, node } = params\n\n const nodePointersToUpdate = getDependentNodePointersByType({\n survey,\n record,\n node,\n dependencyType: SurveyDependencyType.applicable,\n includeSelfWhenSourceIsAttribute: true,\n includeNewEntityChildPointers: true,\n })\n return nodePointersToUpdate\n}\n\nconst calculateApplicableNext = async ({\n params,\n updateResult,\n nodePointer,\n nodeCtx,\n}: {\n params: RecordNodeDependentsUpdateParams\n updateResult: RecordUpdateResult\n nodePointer: NodePointer\n nodeCtx: ArenaRecordNode\n}): Promise<boolean | undefined> => {\n const { nodeDef: nodeDefNodePointer } = nodePointer\n\n const { uuid: nodeDefUuid } = nodeDefNodePointer\n\n const applicablePrev = Nodes.isChildApplicable(nodeCtx, nodeDefUuid)\n const expressionsToEvaluate = NodeDefs.getApplicable(nodeDefNodePointer)\n if (expressionsToEvaluate.length === 0) {\n if (applicablePrev) {\n // skip nodes that were already applicable and have no applicable expression, as they will remain applicable\n return undefined\n } else {\n // used during survey publishing: node def could have had applicable expression(s) that were removed,\n // and node could have been not applicable, but now it should be applicable, as there are no more applicable expressions\n return true\n }\n } else {\n // 3. evaluate applicable expression\n const exprEval = await expressionEvaluator.evalApplicableExpression({\n ...params,\n record: updateResult.record,\n nodeCtx,\n expressions: expressionsToEvaluate,\n })\n return exprEval?.value || false\n }\n}\n\nconst updateDescendantsApplicability = ({\n updateResult,\n nodeCtxChild,\n applicable,\n params,\n recordUpdateOptions,\n}: {\n updateResult: RecordUpdateResult\n nodeCtxChild: ArenaRecordNode\n applicable: boolean\n params: RecordNodeDependentsUpdateParams\n recordUpdateOptions: RecordUpdateOptions\n}): void => {\n const { survey, sideEffect = false, clearNonApplicableValues = false } = params\n\n // only values entered by the user are reported as cleared (they need a confirmation)\n let userValuesCleared = false\n\n Records.visitDescendantsAndSelf({\n record: updateResult.record,\n node: nodeCtxChild,\n visitor: (nodeDescendant): boolean => {\n const nodeDescendantCleared = clearNonApplicableValues && !applicable && Nodes.isValueNotBlank(nodeDescendant)\n // values set by expressions (default values, read only attributes) are applied again when applicable: not reported\n // (evaluated before clearing the value: with sideEffect the node is modified in place)\n const nodeDescendantDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDescendant.nodeDefUuid })\n const userValueCleared =\n nodeDescendantCleared && !NodeDefs.isReadOnly(nodeDescendantDef) && Nodes.hasUserInputValue(nodeDescendant)\n // Clear value if becoming non-applicable and parameter is enabled\n const nodeDescendantUpdated = nodeDescendantCleared\n ? Nodes.assocValue(nodeDescendant, null, sideEffect)\n : nodeDescendant\n updateResult.addNode(nodeDescendantUpdated, recordUpdateOptions)\n if (userValueCleared) {\n updateResult.addClearedDefUuid(nodeDescendant.nodeDefUuid)\n userValuesCleared = true\n }\n return false\n },\n })\n\n // if a multiple entity became not applicable and it's empty, delete it instead of just marking descendants as not applicable\n if (!applicable && clearNonApplicableValues) {\n const { uuid: nodeCtxChildUuid, nodeDefUuid: nodeCtxChildDefUuid } = nodeCtxChild\n const nodeCtxChildDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeCtxChildDefUuid })\n if (NodeDefs.isMultipleEntity(nodeCtxChildDef) && Records.isNodeEmpty(nodeCtxChild)(updateResult.record)) {\n const deleteResult = deleteNodes([nodeCtxChildUuid], recordUpdateOptions)(updateResult.record)\n updateResult.merge(deleteResult)\n if (userValuesCleared) {\n updateResult.addClearedDefUuid(nodeCtxChildDefUuid)\n }\n }\n }\n}\n\nconst createMissingApplicableMultipleEntities = async ({\n params,\n updateResult,\n parentNode,\n nodeDef,\n}: {\n params: RecordNodeDependentsUpdateParams\n updateResult: RecordUpdateResult\n parentNode: ArenaRecordNode\n nodeDef: NodeDefEntity\n}): Promise<void> => {\n if (!NodeDefs.isAutoCreateMinCountItems(nodeDef)) return\n\n const minCount = Nodes.getChildrenMinCount({ parentNode, nodeDef })\n if (Number.isNaN(minCount) || minCount <= 0) return\n\n const existingChildren = Records.getChildren(parentNode, nodeDef.uuid)(updateResult.record)\n const missingCount = Math.max(0, minCount - existingChildren.length)\n\n for (let index = 0; index < missingCount; index++) {\n const createParams = { ...params, record: updateResult.record, parentNode, nodeDef }\n // create nodes sequentially: every iteration works on the record updated by the previous one\n const childUpdateResult = await createNodeAndDescendants(createParams) // NOSONAR\n updateResult.merge(childUpdateResult)\n }\n}\n\nconst updateNodePointerApplicability = async ({\n params,\n updateResult,\n nodePointer,\n recordUpdateOptions,\n}: {\n params: RecordNodeDependentsUpdateParams\n updateResult: RecordUpdateResult\n nodePointer: NodePointer\n recordUpdateOptions: RecordUpdateOptions\n}): Promise<void> => {\n const { nodeCtx: nodeCtxNodePointer, nodeDef: nodeDefNodePointer } = nodePointer\n\n const nodeCtxUuid = nodeCtxNodePointer.uuid\n const nodeDefUuid = nodeDefNodePointer.uuid\n\n // nodeCtx could have been updated in a previous iteration\n const nodeCtx = updateResult.getNodeByUuid(nodeCtxUuid) ?? nodeCtxNodePointer\n\n const applicablePrev = Nodes.isChildApplicable(nodeCtx, nodeDefUuid)\n const applicable = await calculateApplicableNext({\n params,\n updateResult,\n nodePointer,\n nodeCtx,\n })\n if (applicable === undefined) {\n return\n }\n\n if (applicable && NodeDefs.isMultipleEntity(nodeDefNodePointer)) {\n await createMissingApplicableMultipleEntities({\n params,\n updateResult,\n parentNode: nodeCtx,\n nodeDef: nodeDefNodePointer as NodeDefEntity,\n })\n }\n\n // 4. persist updated applicability if changed, and return updated nodes\n if (applicablePrev === applicable) {\n return\n }\n // Applicability changed\n\n // update node and add it to nodes updated\n const nodeCtxUpdated = Nodes.assocChildApplicability(nodeCtx, nodeDefUuid, applicable)\n updateResult.addNode(nodeCtxUpdated, recordUpdateOptions)\n\n let nodeCtxChildren = Records.getChildren(nodeCtx, nodeDefUuid)(updateResult.record)\n\n if (NodeDefs.isMultipleEntity(nodeDefNodePointer) && NodeDefs.isEnumerate(nodeDefNodePointer as NodeDefEntity)) {\n const entityDef = nodeDefNodePointer as NodeDefEntity\n if (NodeDefs.getEnumeratingItemsExpression(entityDef)) {\n await syncEnumeratingItemsEntities({\n ...params,\n parentNode: nodeCtxUpdated,\n entityDef,\n updateResult,\n })\n } else {\n await createOrDeleteEnumeratedEntities({\n ...params,\n parentNode: nodeCtxUpdated,\n entityDef,\n updateResult,\n })\n }\n nodeCtxChildren = Records.getChildren(nodeCtx, nodeDefUuid)(updateResult.record)\n }\n for (const nodeCtxChild of nodeCtxChildren) {\n // add nodeCtxChild and its descendants to nodesUpdated\n updateDescendantsApplicability({\n updateResult,\n nodeCtxChild,\n applicable,\n params,\n recordUpdateOptions,\n })\n }\n}\n\nexport const updateSelfAndDependentsApplicable = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node, sideEffect = false } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n const recordUpdateOptions: RecordUpdateOptions = { sideEffect }\n\n // 1. fetch dependent nodes\n const nodePointersToUpdate = extractNodePointersToUpdate({ survey, record, node })\n\n // 2. update expr to node and dependent nodes\n // NOTE: don't do it in parallel, same nodeCtx metadata could be overwritten\n for (const nodePointer of nodePointersToUpdate) {\n await updateNodePointerApplicability({ params, updateResult, nodePointer, recordUpdateOptions }) // NOSONAR\n }\n return updateResult\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ArenaRecordNode, NodePointer } from '../../node';
|
|
2
2
|
import { NodeDefExpression } from '../../nodeDef';
|
|
3
3
|
import { SurveyDependencyType } from '../../survey/survey';
|
|
4
4
|
import { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams';
|
|
@@ -7,8 +7,8 @@ type UpdateSelfAndDependentsBooleanParams = {
|
|
|
7
7
|
params: RecordNodeDependentsUpdateParams;
|
|
8
8
|
dependencyType: SurveyDependencyType;
|
|
9
9
|
getExpressions: (nodePointer: NodePointer) => NodeDefExpression[];
|
|
10
|
-
getValuePrev: (nodeCtx:
|
|
11
|
-
assocValue: (nodeCtx:
|
|
10
|
+
getValuePrev: (nodeCtx: ArenaRecordNode, nodeDefUuid: string) => boolean;
|
|
11
|
+
assocValue: (nodeCtx: ArenaRecordNode, nodeDefUuid: string, value: boolean, sideEffect: boolean) => ArenaRecordNode;
|
|
12
12
|
includeNewEntitySelf?: boolean;
|
|
13
13
|
};
|
|
14
14
|
export declare const updateSelfAndDependentsBoolean: ({ params, dependencyType, getExpressions, getValuePrev, assocValue, includeNewEntitySelf, }: UpdateSelfAndDependentsBooleanParams) => Promise<RecordUpdateResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordNodeDependentsBooleanUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,4EAAwE;AACxE,+FAAsF;AAEtF,6DAAyD;AAEzD,MAAM,mBAAmB,GAAG,IAAI,qDAAyB,EAAE,CAAA;AAW3D,MAAM,yBAAyB,GAAG,KAcD,EAAE,4CAdM,EACvC,MAAM,EACN,YAAY,EACZ,WAAW,EACX,OAAO,EACP,cAAc,EACd,YAAY,GAQb;IACC,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAA;IACnD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAA;IAEhD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACpD,MAAM,qBAAqB,GAAG,cAAc,CAAC,WAAW,CAAC,CAAA;IACzD,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,wBAAwB,iCAC9D,MAAM,KACT,MAAM,EAAE,YAAY,CAAC,MAAM,EAC3B,OAAO,EACP,WAAW,EAAE,qBAAqB,IAClC,CAAA;IACF,OAAO,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,KAAI,KAAK,CAAA;AACjC,CAAC,CAAA,CAAA;AAEM,MAAM,8BAA8B,GAAG,KAOwB,EAAE,4CAPnB,EACnD,MAAM,EACN,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACV,oBAAoB,GAAG,IAAI,GACU;;IACrC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;IAC3D,MAAM,YAAY,GAAG,IAAI,uCAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEvD,MAAM,oBAAoB,GAAG,IAAA,oEAA8B,EAAC;QAC1D,MAAM;QACN,MAAM;QACN,IAAI;QACJ,cAAc;QACd,gCAAgC,EAAE,IAAI;QACtC,oBAAoB;QACpB,6BAA6B,EAAE,IAAI;KACpC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,KAAK,MAAM,WAAW,IAAI,oBAAoB,EAAE,CAAC;QAC/C,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAA;QAEhF,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAA;QAC3C,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAA;QAE3C,MAAM,OAAO,SAAG,YAAY,CAAC,aAAa,CAAC,WAAW,CAAC,mCAAI,kBAAkB,CAAA;QAE7E,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACpD,MAAM,eAAe,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAA;QACpG,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,eAAe,CAAC,CAAA,CAAC,UAAU;QAEzE,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YAC/C,SAAQ;QACV,CAAC;QAED,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAC1E,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA,CAAA;AA3CY,QAAA,8BAA8B,GAA9B,8BAA8B,CA2C1C","sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"recordNodeDependentsBooleanUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,4EAAwE;AACxE,+FAAsF;AAEtF,6DAAyD;AAEzD,MAAM,mBAAmB,GAAG,IAAI,qDAAyB,EAAE,CAAA;AAW3D,MAAM,yBAAyB,GAAG,KAcD,EAAE,4CAdM,EACvC,MAAM,EACN,YAAY,EACZ,WAAW,EACX,OAAO,EACP,cAAc,EACd,YAAY,GAQb;IACC,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAA;IACnD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAA;IAEhD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACpD,MAAM,qBAAqB,GAAG,cAAc,CAAC,WAAW,CAAC,CAAA;IACzD,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,wBAAwB,iCAC9D,MAAM,KACT,MAAM,EAAE,YAAY,CAAC,MAAM,EAC3B,OAAO,EACP,WAAW,EAAE,qBAAqB,IAClC,CAAA;IACF,OAAO,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,KAAI,KAAK,CAAA;AACjC,CAAC,CAAA,CAAA;AAEM,MAAM,8BAA8B,GAAG,KAOwB,EAAE,4CAPnB,EACnD,MAAM,EACN,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACV,oBAAoB,GAAG,IAAI,GACU;;IACrC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;IAC3D,MAAM,YAAY,GAAG,IAAI,uCAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEvD,MAAM,oBAAoB,GAAG,IAAA,oEAA8B,EAAC;QAC1D,MAAM;QACN,MAAM;QACN,IAAI;QACJ,cAAc;QACd,gCAAgC,EAAE,IAAI;QACtC,oBAAoB;QACpB,6BAA6B,EAAE,IAAI;KACpC,CAAC,CAAA;IAEF,4EAA4E;IAC5E,KAAK,MAAM,WAAW,IAAI,oBAAoB,EAAE,CAAC;QAC/C,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAA;QAEhF,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAA;QAC3C,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAA;QAE3C,MAAM,OAAO,SAAG,YAAY,CAAC,aAAa,CAAC,WAAW,CAAC,mCAAI,kBAAkB,CAAA;QAE7E,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACpD,MAAM,eAAe,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAA;QACpG,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,eAAe,CAAC,CAAA,CAAC,UAAU;QAEzE,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YAC/C,SAAQ;QACV,CAAC;QAED,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAC1E,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA,CAAA;AA3CY,QAAA,8BAA8B,GAA9B,8BAA8B,CA2C1C","sourcesContent":["import { ArenaRecordNode, NodePointer } from '../../node'\nimport { NodeDefExpression } from '../../nodeDef'\nimport { SurveyDependencyType } from '../../survey/survey'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\nimport { getDependentNodePointersByType } from './recordNodesDependentsUpdaterCommons'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\ntype UpdateSelfAndDependentsBooleanParams = {\n params: RecordNodeDependentsUpdateParams\n dependencyType: SurveyDependencyType\n getExpressions: (nodePointer: NodePointer) => NodeDefExpression[]\n getValuePrev: (nodeCtx: ArenaRecordNode, nodeDefUuid: string) => boolean\n assocValue: (nodeCtx: ArenaRecordNode, nodeDefUuid: string, value: boolean, sideEffect: boolean) => ArenaRecordNode\n includeNewEntitySelf?: boolean\n}\n\nconst calculateBooleanValueNext = async ({\n params,\n updateResult,\n nodePointer,\n nodeCtx,\n getExpressions,\n getValuePrev,\n}: {\n params: RecordNodeDependentsUpdateParams\n updateResult: RecordUpdateResult\n nodePointer: NodePointer\n nodeCtx: ArenaRecordNode\n getExpressions: (nodePointer: NodePointer) => NodeDefExpression[]\n getValuePrev: (nodeCtx: ArenaRecordNode, nodeDefUuid: string) => boolean\n}): Promise<boolean | undefined> => {\n const { nodeDef: nodeDefNodePointer } = nodePointer\n const { uuid: nodeDefUuid } = nodeDefNodePointer\n\n const valuePrev = getValuePrev(nodeCtx, nodeDefUuid)\n const expressionsToEvaluate = getExpressions(nodePointer)\n if (expressionsToEvaluate.length === 0) {\n if (valuePrev) {\n return undefined\n }\n return true\n }\n\n const exprEval = await expressionEvaluator.evalApplicableExpression({\n ...params,\n record: updateResult.record,\n nodeCtx,\n expressions: expressionsToEvaluate,\n })\n return exprEval?.value || false\n}\n\nexport const updateSelfAndDependentsBoolean = async ({\n params,\n dependencyType,\n getExpressions,\n getValuePrev,\n assocValue,\n includeNewEntitySelf = true,\n}: UpdateSelfAndDependentsBooleanParams): Promise<RecordUpdateResult> => {\n const { survey, record, node, sideEffect = false } = params\n const updateResult = new RecordUpdateResult({ record })\n\n const nodePointersToUpdate = getDependentNodePointersByType({\n survey,\n record,\n node,\n dependencyType,\n includeSelfWhenSourceIsAttribute: true,\n includeNewEntitySelf,\n includeNewEntityChildPointers: true,\n })\n\n // NOTE: don't do it in parallel, same nodeCtx metadata could be overwritten\n for (const nodePointer of nodePointersToUpdate) {\n const { nodeCtx: nodeCtxNodePointer, nodeDef: nodeDefNodePointer } = nodePointer\n\n const nodeCtxUuid = nodeCtxNodePointer.uuid\n const nodeDefUuid = nodeDefNodePointer.uuid\n\n const nodeCtx = updateResult.getNodeByUuid(nodeCtxUuid) ?? nodeCtxNodePointer\n\n const valuePrev = getValuePrev(nodeCtx, nodeDefUuid)\n const calculateParams = { params, updateResult, nodePointer, nodeCtx, getExpressions, getValuePrev }\n const value = await calculateBooleanValueNext(calculateParams) // NOSONAR\n\n if (value === undefined || valuePrev === value) {\n continue\n }\n\n const nodeCtxUpdated = assocValue(nodeCtx, nodeDefUuid, value, sideEffect)\n updateResult.addNode(nodeCtxUpdated, { sideEffect })\n }\n\n return updateResult\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordNodeDependentsCodeAttributesUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"recordNodeDependentsCodeAttributesUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodeValues, Nodes } from '../../node'\nimport { NodeDefCode, NodeDefs } from '../../nodeDef'\nimport { Surveys } from '../../survey'\nimport { Dates } from '../../utils'\nimport { Records } from '../records'\nimport type { ArenaRecord } from '../record'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\n// A dependent code attribute's stored item is still valid as long as its category item's parent is the\n// (possibly unchanged) item currently selected on the parent code attribute node - so this single check\n// covers both \"did the parent's value change\" and \"is the dependent's value still valid\": if the parent's\n// item didn't change, the dependent's item still has the same parent and is left alone.\n//\n// The dependent's item may belong to a \"big\" category whose items aren't loaded into the survey's\n// in-memory ref data index (e.g. an externally-referenced category) - Surveys.getCategoryItemByUuid only\n// ever looks there, so it falls back to the async categoryItemProvider (same pattern as attribute value\n// validation) before concluding the item doesn't exist.\nconst isDependentCodeAttributeValueStillValid = async (\n params: Pick<RecordNodeDependentsUpdateParams, 'survey' | 'categoryItemProvider'> & {\n parentItemUuid?: string\n dependentCodeAttribute: ArenaRecordNode\n dependentCodeAttributeDef: NodeDefCode\n record: ArenaRecord\n }\n): Promise<boolean> => {\n const { survey, parentItemUuid, dependentCodeAttribute, dependentCodeAttributeDef, record, categoryItemProvider } =\n params\n if (!parentItemUuid) return false\n\n const dependentItemUuid = NodeValues.getItemUuid(dependentCodeAttribute)\n if (!dependentItemUuid) return false\n\n let dependentItem = Surveys.getCategoryItemByUuid({ survey, itemUuid: dependentItemUuid })\n if (!dependentItem && categoryItemProvider) {\n const categoryUuid = NodeDefs.getCategoryUuid(dependentCodeAttributeDef)\n if (categoryUuid) {\n const draft = !!record.preview\n dependentItem = await categoryItemProvider.getItemByUuid({\n survey,\n categoryUuid,\n itemUuid: dependentItemUuid,\n draft,\n })\n }\n }\n return dependentItem?.parentUuid === parentItemUuid\n}\n\nexport const updateDependentCodeAttributes = async (params: RecordNodeDependentsUpdateParams) => {\n const { survey, record, node, categoryItemProvider, sideEffect = false } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n const recordUpdateOptions = { sideEffect }\n\n // 1. get dependent code attributes\n const dependentCodeAttributes = Records.getDependentCodeAttributes(node)(record)\n if (dependentCodeAttributes.length === 0) return updateResult\n\n const parentItemUuid = NodeValues.getItemUuid(node)\n\n // 2. clear dependent code attributes' values that are no longer valid children of the parent's current item\n for (const dependentCodeAttribute of dependentCodeAttributes) {\n const dependentCodeAttributeDef = Surveys.getNodeDefByUuid({\n survey,\n uuid: dependentCodeAttribute.nodeDefUuid,\n }) as NodeDefCode\n if (NodeDefs.isReadOnly(dependentCodeAttributeDef) || !Nodes.hasUserInputValue(dependentCodeAttribute)) continue\n\n const validityCheckParams = {\n survey,\n parentItemUuid,\n dependentCodeAttribute,\n dependentCodeAttributeDef,\n record,\n categoryItemProvider,\n }\n // check attributes sequentially: invalid values are cleared in the record at every iteration\n const stillValid = await isDependentCodeAttributeValueStillValid(validityCheckParams) // NOSONAR\n if (stillValid) continue\n\n const nodeUpdated: ArenaRecordNode = {\n ...dependentCodeAttribute,\n value: null,\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n }\n updateResult.addNode(nodeUpdated, recordUpdateOptions)\n updateResult.addClearedDefUuid(nodeUpdated.nodeDefUuid)\n }\n\n return updateResult\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordNodeDependentsDefaultValuesUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { Node, NodePointer, Nodes } from '../../node'\nimport { NodeDef, NodeDefs } from '../../nodeDef'\nimport { Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { Dates, Objects } from '../../utils'\nimport { NodePointers } from '../nodePointers'\nimport { Record } from '../record'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\nimport { Records } from '../records'\nimport { RecordExpressionValueConverter } from './recordExpressionValueConverter'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { throwError } from './recordNodesDependentsUpdaterCommons'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\n/**\n * Default value should be reset when a node becomes not applicable, but only if the default value was applied or if the node def is read only (therefore the value can only be set by default value expression)\n */\nconst shouldResetDefaultValue = (params: { survey: Survey; record: Record; node: Node }): boolean => {\n const { survey, record, node } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n return (\n !Records.isNodeApplicable({ record, node }) &&\n !Nodes.isValueBlank(node) &&\n (Nodes.isDefaultValueApplied(node) || NodeDefs.isReadOnly(nodeDef))\n )\n}\n\nconst canApplyDefaultValue = (params: { record: Record; node: Node; nodeDef: NodeDef<any> }): boolean => {\n const { record, node, nodeDef } = params\n return (\n Records.isNodeApplicable({ record, node }) &&\n (Nodes.isValueBlank(node) ||\n (!NodeDefs.isDefaultValueEvaluatedOneTime(nodeDef) &&\n (Nodes.isDefaultValueApplied(node) || NodeDefs.isReadOnly(nodeDef))))\n )\n}\n\nconst updateDefaultValueInNode = (params: {\n survey: Survey\n updateResult: RecordUpdateResult\n nodeToUpdate: Node\n nodeDef: NodeDef<any>\n exprValue: any\n sideEffect: boolean\n}): void => {\n const { survey, updateResult, nodeToUpdate, nodeDef, exprValue, sideEffect } = params\n if (shouldResetDefaultValue({ survey, record: updateResult.record, node: nodeToUpdate })) {\n const nodeUpdated = Nodes.mergeNodes(nodeToUpdate, {\n value: null,\n meta: { defaultValueApplied: false },\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n })\n updateResult.addNode(nodeUpdated, { sideEffect })\n return\n }\n if (!canApplyDefaultValue({ record: updateResult.record, nodeDef, node: nodeToUpdate })) {\n return\n }\n\n // 2. if node value is not changed, do nothing\n if (Objects.isEqual(nodeToUpdate.value, exprValue)) {\n return\n }\n\n // 3. update node value and meta\n const defaultValueApplied = !Objects.isEmpty(exprValue)\n\n const nodeUpdated = Nodes.mergeNodes(nodeToUpdate, {\n value: exprValue,\n meta: { defaultValueApplied },\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n })\n updateResult.addNode(nodeUpdated, { sideEffect })\n}\n\nconst updateDefaultValuesInNodes = async (\n params: RecordNodeDependentsUpdateParams & {\n nodePointer: NodePointer\n updateResult: RecordUpdateResult\n }\n): Promise<void> => {\n const { survey, nodePointer, updateResult, timezoneOffset, categoryItemProvider, sideEffect = false } = params\n\n const { nodeCtx, nodeDef } = nodePointer\n\n if (nodeCtx.deleted) return\n\n const { record } = updateResult\n\n let nodesToUpdate: Node[] = []\n const dependentNodes = NodePointers.getNodesFromNodePointers({ record, nodePointers: [nodePointer] })\n let exprValue: any = null\n const expressionsToEvaluate = NodeDefs.getDefaultValues(nodeDef)\n if (expressionsToEvaluate.length === 0) {\n if (Surveys.isNodeDefEnumerator({ survey, nodeDef })) {\n // if node def is enumerator, its default value is generated using the category items, not with default value expressions\n // so the default value should not be reset or updated using default value expressions\n return\n }\n // no default expressions to evaluate; check if there are dependent nodes with default value applied, as their default value should be removed\n nodesToUpdate = dependentNodes.filter(Nodes.isDefaultValueApplied)\n if (nodesToUpdate.length === 0) {\n // no default expressions to evaluate and no nodes with default value applied, therefore no update needed\n return\n }\n } else {\n // if there are default value expressions, all dependent nodes should be evaluated, as their default value could change\n nodesToUpdate = dependentNodes\n try {\n // 1. evaluate applicable default value expression\n const exprEval = await expressionEvaluator.evalApplicableExpression({\n ...params,\n record,\n nodeCtx,\n expressions: expressionsToEvaluate,\n })\n\n const exprEvalValue = exprEval?.value\n exprValue = Objects.isEmpty(exprEvalValue)\n ? null\n : await RecordExpressionValueConverter.toNodeValue({\n survey,\n record,\n nodeDef,\n nodeParent: nodeCtx,\n valueExpr: exprEvalValue,\n timezoneOffset,\n categoryItemProvider,\n })\n } catch (error) {\n throwError({\n error,\n errorKey: 'record.updateSelfAndDependentsDefaultValues',\n expressionType: SurveyDependencyType.defaultValues,\n survey,\n nodeDef,\n expressionsToEvaluate,\n })\n }\n }\n for (const nodeToUpdate of nodesToUpdate) {\n updateDefaultValueInNode({ survey, updateResult, nodeToUpdate, nodeDef, exprValue, sideEffect })\n }\n}\n\nexport const updateSelfAndDependentsDefaultValues = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node, sideEffect = false } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n // 1. get dependent node pointers\n\n // filter nodes to update including itself and (attributes with empty values or with default values applied)\n // therefore attributes with user defined values are excluded\n const nodePointersFilterFn = (nodePointer: NodePointer): boolean => {\n const { nodeDef } = nodePointer\n if (!NodeDefs.isAttribute(nodeDef)) return false\n\n const referencedNodes = NodePointers.getNodesFromNodePointers({\n record: updateResult.record,\n nodePointers: [nodePointer],\n })\n return referencedNodes.some(\n (referencedNode) =>\n shouldResetDefaultValue({ survey, record: updateResult.record, node: referencedNode }) ||\n canApplyDefaultValue({ record: updateResult.record, node: referencedNode, nodeDef })\n )\n }\n\n const nodePointersToUpdate = Records.getDependentNodePointers({\n survey,\n record,\n node,\n dependencyType: SurveyDependencyType.defaultValues,\n includeSelf: true,\n filterFn: nodePointersFilterFn,\n })\n\n // 2. update expr to node and dependent nodes\n for (const nodePointer of nodePointersToUpdate) {\n // sequential: each iteration updates the record\n await updateDefaultValuesInNodes({ ...params, nodePointer, updateResult, sideEffect }) // NOSONAR\n }\n return updateResult\n}\n"]}
|
|
1
|
+
{"version":3,"file":"recordNodeDependentsDefaultValuesUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAgE;AAChE,2CAAiD;AACjD,yCAAsC;AACtC,gDAAkE;AAClE,uCAA4C;AAC5C,kDAA8C;AAE9C,4EAAwE;AACxE,wCAAoC;AACpC,qFAAiF;AAEjF,+FAAkE;AAClE,6DAAyD;AAEzD,MAAM,mBAAmB,GAAG,IAAI,qDAAyB,EAAE,CAAA;AAE3D;;GAEG;AACH,MAAM,uBAAuB,GAAG,CAAC,MAAsE,EAAW,EAAE;IAClH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IACvC,MAAM,OAAO,GAAG,gBAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IAC5E,OAAO,CACL,CAAC,iBAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3C,CAAC,YAAK,CAAC,YAAY,CAAC,IAAI,CAAC;QACzB,CAAC,YAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,kBAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CACpE,CAAA;AACH,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,CAAC,MAI7B,EAAW,EAAE;IACZ,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IACxC,OAAO,CACL,iBAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC,YAAK,CAAC,YAAY,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,kBAAQ,CAAC,8BAA8B,CAAC,OAAO,CAAC;gBAChD,CAAC,YAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,kBAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAC1E,CAAA;AACH,CAAC,CAAA;AAED,MAAM,wBAAwB,GAAG,CAAC,MAOjC,EAAQ,EAAE;IACT,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IACrF,IAAI,uBAAuB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QACzF,MAAM,WAAW,GAAG,YAAK,CAAC,UAAU,CAAC,YAAY,EAAE;YACjD,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE;YACpC,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,aAAK,CAAC,sBAAsB,EAAE;SAC7C,CAAC,CAAA;QACF,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;QACjD,OAAM;IACR,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QACxF,OAAM;IACR,CAAC;IAED,8CAA8C;IAC9C,IAAI,eAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;QACnD,OAAM;IACR,CAAC;IAED,gCAAgC;IAChC,MAAM,mBAAmB,GAAG,CAAC,eAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAEvD,MAAM,WAAW,GAAG,YAAK,CAAC,UAAU,CAAC,YAAY,EAAE;QACjD,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,EAAE,mBAAmB,EAAE;QAC7B,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,aAAK,CAAC,sBAAsB,EAAE;KAC7C,CAAC,CAAA;IACF,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;AACnD,CAAC,CAAA;AAED,MAAM,0BAA0B,GAAG,CACjC,MAGC,EACc,EAAE;IACjB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;IAE9G,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,WAAW,CAAA;IAExC,IAAI,OAAO,CAAC,OAAO;QAAE,OAAM;IAE3B,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAA;IAE/B,IAAI,aAAa,GAAsB,EAAE,CAAA;IACzC,MAAM,cAAc,GAAG,2BAAY,CAAC,wBAAwB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IACrG,IAAI,SAAS,GAAQ,IAAI,CAAA;IACzB,MAAM,qBAAqB,GAAG,kBAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAChE,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,IAAI,gBAAO,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACrD,yHAAyH;YACzH,sFAAsF;YACtF,OAAM;QACR,CAAC;QACD,8IAA8I;QAC9I,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,YAAK,CAAC,qBAAqB,CAAC,CAAA;QAClE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,yGAAyG;YACzG,OAAM;QACR,CAAC;IACH,CAAC;SAAM,CAAC;QACN,uHAAuH;QACvH,aAAa,GAAG,cAAc,CAAA;QAC9B,IAAI,CAAC;YACH,kDAAkD;YAClD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,wBAAwB,iCAC9D,MAAM,KACT,MAAM;gBACN,OAAO,EACP,WAAW,EAAE,qBAAqB,IAClC,CAAA;YAEF,MAAM,aAAa,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,CAAA;YACrC,SAAS,GAAG,eAAO,CAAC,OAAO,CAAC,aAAa,CAAC;gBACxC,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,MAAM,+DAA8B,CAAC,WAAW,CAAC;oBAC/C,MAAM;oBACN,MAAM;oBACN,OAAO;oBACP,UAAU,EAAE,OAAO;oBACnB,SAAS,EAAE,aAAa;oBACxB,cAAc;oBACd,oBAAoB;iBACrB,CAAC,CAAA;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,gDAAU,EAAC;gBACT,KAAK;gBACL,QAAQ,EAAE,6CAA6C;gBACvD,cAAc,EAAE,6BAAoB,CAAC,aAAa;gBAClD,MAAM;gBACN,OAAO;gBACP,qBAAqB;aACtB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,wBAAwB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAA;IAClG,CAAC;AACH,CAAC,CAAA,CAAA;AAEM,MAAM,oCAAoC,GAAG,CAClD,MAAwC,EACX,EAAE;IAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;IAE3D,MAAM,YAAY,GAAG,IAAI,uCAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEvD,iCAAiC;IAEjC,4GAA4G;IAC5G,6DAA6D;IAC7D,MAAM,oBAAoB,GAAG,CAAC,WAAwB,EAAW,EAAE;QACjE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,kBAAQ,CAAC,WAAW,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAA;QAEhD,MAAM,eAAe,GAAG,2BAAY,CAAC,wBAAwB,CAAC;YAC5D,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,YAAY,EAAE,CAAC,WAAW,CAAC;SAC5B,CAAC,CAAA;QACF,OAAO,eAAe,CAAC,IAAI,CACzB,CAAC,cAAc,EAAE,EAAE,CACjB,uBAAuB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;YACtF,oBAAoB,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CACvF,CAAA;IACH,CAAC,CAAA;IAED,MAAM,oBAAoB,GAAG,iBAAO,CAAC,wBAAwB,CAAC;QAC5D,MAAM;QACN,MAAM;QACN,IAAI;QACJ,cAAc,EAAE,6BAAoB,CAAC,aAAa;QAClD,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,oBAAoB;KAC/B,CAAC,CAAA;IAEF,6CAA6C;IAC7C,KAAK,MAAM,WAAW,IAAI,oBAAoB,EAAE,CAAC;QAC/C,gDAAgD;QAChD,MAAM,0BAA0B,iCAAM,MAAM,KAAE,WAAW,EAAE,YAAY,EAAE,UAAU,IAAG,CAAA,CAAC,UAAU;IACnG,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA,CAAA;AAzCY,QAAA,oCAAoC,GAApC,oCAAoC,CAyChD","sourcesContent":["import { ArenaRecordNode, NodePointer, Nodes } from '../../node'\nimport { NodeDef, NodeDefs } from '../../nodeDef'\nimport { Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { Dates, Objects } from '../../utils'\nimport { NodePointers } from '../nodePointers'\nimport { ArenaRecord } from '../record'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\nimport { Records } from '../records'\nimport { RecordExpressionValueConverter } from './recordExpressionValueConverter'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { throwError } from './recordNodesDependentsUpdaterCommons'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\n/**\n * Default value should be reset when a node becomes not applicable, but only if the default value was applied or if the node def is read only (therefore the value can only be set by default value expression)\n */\nconst shouldResetDefaultValue = (params: { survey: Survey; record: ArenaRecord; node: ArenaRecordNode }): boolean => {\n const { survey, record, node } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n return (\n !Records.isNodeApplicable({ record, node }) &&\n !Nodes.isValueBlank(node) &&\n (Nodes.isDefaultValueApplied(node) || NodeDefs.isReadOnly(nodeDef))\n )\n}\n\nconst canApplyDefaultValue = (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDef: NodeDef<any>\n}): boolean => {\n const { record, node, nodeDef } = params\n return (\n Records.isNodeApplicable({ record, node }) &&\n (Nodes.isValueBlank(node) ||\n (!NodeDefs.isDefaultValueEvaluatedOneTime(nodeDef) &&\n (Nodes.isDefaultValueApplied(node) || NodeDefs.isReadOnly(nodeDef))))\n )\n}\n\nconst updateDefaultValueInNode = (params: {\n survey: Survey\n updateResult: RecordUpdateResult\n nodeToUpdate: ArenaRecordNode\n nodeDef: NodeDef<any>\n exprValue: any\n sideEffect: boolean\n}): void => {\n const { survey, updateResult, nodeToUpdate, nodeDef, exprValue, sideEffect } = params\n if (shouldResetDefaultValue({ survey, record: updateResult.record, node: nodeToUpdate })) {\n const nodeUpdated = Nodes.mergeNodes(nodeToUpdate, {\n value: null,\n meta: { defaultValueApplied: false },\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n })\n updateResult.addNode(nodeUpdated, { sideEffect })\n return\n }\n if (!canApplyDefaultValue({ record: updateResult.record, nodeDef, node: nodeToUpdate })) {\n return\n }\n\n // 2. if node value is not changed, do nothing\n if (Objects.isEqual(nodeToUpdate.value, exprValue)) {\n return\n }\n\n // 3. update node value and meta\n const defaultValueApplied = !Objects.isEmpty(exprValue)\n\n const nodeUpdated = Nodes.mergeNodes(nodeToUpdate, {\n value: exprValue,\n meta: { defaultValueApplied },\n updated: true,\n dateModified: Dates.nowFormattedForStorage(),\n })\n updateResult.addNode(nodeUpdated, { sideEffect })\n}\n\nconst updateDefaultValuesInNodes = async (\n params: RecordNodeDependentsUpdateParams & {\n nodePointer: NodePointer\n updateResult: RecordUpdateResult\n }\n): Promise<void> => {\n const { survey, nodePointer, updateResult, timezoneOffset, categoryItemProvider, sideEffect = false } = params\n\n const { nodeCtx, nodeDef } = nodePointer\n\n if (nodeCtx.deleted) return\n\n const { record } = updateResult\n\n let nodesToUpdate: ArenaRecordNode[] = []\n const dependentNodes = NodePointers.getNodesFromNodePointers({ record, nodePointers: [nodePointer] })\n let exprValue: any = null\n const expressionsToEvaluate = NodeDefs.getDefaultValues(nodeDef)\n if (expressionsToEvaluate.length === 0) {\n if (Surveys.isNodeDefEnumerator({ survey, nodeDef })) {\n // if node def is enumerator, its default value is generated using the category items, not with default value expressions\n // so the default value should not be reset or updated using default value expressions\n return\n }\n // no default expressions to evaluate; check if there are dependent nodes with default value applied, as their default value should be removed\n nodesToUpdate = dependentNodes.filter(Nodes.isDefaultValueApplied)\n if (nodesToUpdate.length === 0) {\n // no default expressions to evaluate and no nodes with default value applied, therefore no update needed\n return\n }\n } else {\n // if there are default value expressions, all dependent nodes should be evaluated, as their default value could change\n nodesToUpdate = dependentNodes\n try {\n // 1. evaluate applicable default value expression\n const exprEval = await expressionEvaluator.evalApplicableExpression({\n ...params,\n record,\n nodeCtx,\n expressions: expressionsToEvaluate,\n })\n\n const exprEvalValue = exprEval?.value\n exprValue = Objects.isEmpty(exprEvalValue)\n ? null\n : await RecordExpressionValueConverter.toNodeValue({\n survey,\n record,\n nodeDef,\n nodeParent: nodeCtx,\n valueExpr: exprEvalValue,\n timezoneOffset,\n categoryItemProvider,\n })\n } catch (error) {\n throwError({\n error,\n errorKey: 'record.updateSelfAndDependentsDefaultValues',\n expressionType: SurveyDependencyType.defaultValues,\n survey,\n nodeDef,\n expressionsToEvaluate,\n })\n }\n }\n for (const nodeToUpdate of nodesToUpdate) {\n updateDefaultValueInNode({ survey, updateResult, nodeToUpdate, nodeDef, exprValue, sideEffect })\n }\n}\n\nexport const updateSelfAndDependentsDefaultValues = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node, sideEffect = false } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n // 1. get dependent node pointers\n\n // filter nodes to update including itself and (attributes with empty values or with default values applied)\n // therefore attributes with user defined values are excluded\n const nodePointersFilterFn = (nodePointer: NodePointer): boolean => {\n const { nodeDef } = nodePointer\n if (!NodeDefs.isAttribute(nodeDef)) return false\n\n const referencedNodes = NodePointers.getNodesFromNodePointers({\n record: updateResult.record,\n nodePointers: [nodePointer],\n })\n return referencedNodes.some(\n (referencedNode) =>\n shouldResetDefaultValue({ survey, record: updateResult.record, node: referencedNode }) ||\n canApplyDefaultValue({ record: updateResult.record, node: referencedNode, nodeDef })\n )\n }\n\n const nodePointersToUpdate = Records.getDependentNodePointers({\n survey,\n record,\n node,\n dependencyType: SurveyDependencyType.defaultValues,\n includeSelf: true,\n filterFn: nodePointersFilterFn,\n })\n\n // 2. update expr to node and dependent nodes\n for (const nodePointer of nodePointersToUpdate) {\n // sequential: each iteration updates the record\n await updateDefaultValuesInNodes({ ...params, nodePointer, updateResult, sideEffect }) // NOSONAR\n }\n return updateResult\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ArenaRecordNode } from '../../node';
|
|
2
2
|
import { NodeDefEntity } from '../../nodeDef';
|
|
3
3
|
import { RecordExpressionEvaluationContext } from './recordExpressionEvaluationContext';
|
|
4
4
|
import { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams';
|
|
5
5
|
import { RecordUpdateResult } from './recordUpdateResult';
|
|
6
6
|
export declare const createOrDeleteEnumeratedEntities: (params: RecordExpressionEvaluationContext & {
|
|
7
|
-
parentNode:
|
|
7
|
+
parentNode: ArenaRecordNode;
|
|
8
8
|
entityDef: NodeDefEntity;
|
|
9
9
|
updateResult: RecordUpdateResult;
|
|
10
10
|
}) => Promise<void>;
|