@openforis/arena-core 2.3.42 → 2.4.0

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.
Files changed (119) hide show
  1. package/dist/esm/record/_records/recordCompletion.js +3 -3
  2. package/dist/esm/record/_records/recordCompletion.js.map +1 -1
  3. package/dist/esm/record/_records/recordGetters.js +221 -143
  4. package/dist/esm/record/_records/recordGetters.js.map +1 -1
  5. package/dist/esm/record/_records/recordPagesValidation.js +5 -5
  6. package/dist/esm/record/_records/recordPagesValidation.js.map +1 -1
  7. package/dist/esm/record/_records/recordUtils.js +3 -7
  8. package/dist/esm/record/_records/recordUtils.js.map +1 -1
  9. package/dist/esm/record/nodePointers.js +1 -1
  10. package/dist/esm/record/nodePointers.js.map +1 -1
  11. package/dist/esm/record/recordCloner.js +1 -1
  12. package/dist/esm/record/recordCloner.js.map +1 -1
  13. package/dist/esm/record/recordExpressionEvaluator/functions.js +4 -5
  14. package/dist/esm/record/recordExpressionEvaluator/functions.js.map +1 -1
  15. package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js +1 -1
  16. package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
  17. package/dist/esm/record/recordExpressionEvaluator/node/identifier/nodesFinder.js +2 -2
  18. package/dist/esm/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
  19. package/dist/esm/record/recordExpressionEvaluator/recordExpressionEvaluator.js +1 -1
  20. package/dist/esm/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
  21. package/dist/esm/record/recordFixer.js +5 -5
  22. package/dist/esm/record/recordFixer.js.map +1 -1
  23. package/dist/esm/record/recordNodesUpdater/recordExpressionValueConverter.js +2 -8
  24. package/dist/esm/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
  25. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js +6 -6
  26. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
  27. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js +1 -1
  28. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
  29. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js +1 -6
  30. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js.map +1 -1
  31. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js +3 -4
  32. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
  33. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js +3 -3
  34. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
  35. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js +4 -9
  36. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
  37. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js +2 -3
  38. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
  39. package/dist/esm/record/recordNodesUpdater/recordNodesDeleter.js +1 -5
  40. package/dist/esm/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
  41. package/dist/esm/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js +2 -9
  42. package/dist/esm/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
  43. package/dist/esm/record/recordNodesUpdater/recordNodesUpdater.js +1 -1
  44. package/dist/esm/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
  45. package/dist/esm/record/recordPrettyPrinter.js +14 -12
  46. package/dist/esm/record/recordPrettyPrinter.js.map +1 -1
  47. package/dist/esm/record/recordUpdater.js +2 -2
  48. package/dist/esm/record/recordUpdater.js.map +1 -1
  49. package/dist/esm/record/recordValidator/attributeKeyValidator.js +4 -4
  50. package/dist/esm/record/recordValidator/attributeKeyValidator.js.map +1 -1
  51. package/dist/esm/record/recordValidator/attributeUniqueValidator.js +1 -1
  52. package/dist/esm/record/recordValidator/attributeUniqueValidator.js.map +1 -1
  53. package/dist/esm/record/recordValidator/attributeValidator.js +8 -10
  54. package/dist/esm/record/recordValidator/attributeValidator.js.map +1 -1
  55. package/dist/esm/record/recordValidator/countVaildator.js +2 -2
  56. package/dist/esm/record/recordValidator/countVaildator.js.map +1 -1
  57. package/dist/esm/record/recordValidator/recordValidator.js +1 -2
  58. package/dist/esm/record/recordValidator/recordValidator.js.map +1 -1
  59. package/dist/record/_records/recordCompletion.js +3 -3
  60. package/dist/record/_records/recordCompletion.js.map +1 -1
  61. package/dist/record/_records/recordGetters.d.ts +104 -51
  62. package/dist/record/_records/recordGetters.js +221 -170
  63. package/dist/record/_records/recordGetters.js.map +1 -1
  64. package/dist/record/_records/recordPagesValidation.js +5 -5
  65. package/dist/record/_records/recordPagesValidation.js.map +1 -1
  66. package/dist/record/_records/recordUtils.js +3 -7
  67. package/dist/record/_records/recordUtils.js.map +1 -1
  68. package/dist/record/nodePointers.js +1 -1
  69. package/dist/record/nodePointers.js.map +1 -1
  70. package/dist/record/recordCloner.js +1 -1
  71. package/dist/record/recordCloner.js.map +1 -1
  72. package/dist/record/recordExpressionEvaluator/functions.js +4 -5
  73. package/dist/record/recordExpressionEvaluator/functions.js.map +1 -1
  74. package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js +1 -1
  75. package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
  76. package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.js +2 -2
  77. package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
  78. package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.js +1 -1
  79. package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
  80. package/dist/record/recordFixer.js +5 -5
  81. package/dist/record/recordFixer.js.map +1 -1
  82. package/dist/record/recordNodesUpdater/recordExpressionValueConverter.js +2 -8
  83. package/dist/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
  84. package/dist/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js +6 -6
  85. package/dist/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
  86. package/dist/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js +1 -1
  87. package/dist/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
  88. package/dist/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js +1 -6
  89. package/dist/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js.map +1 -1
  90. package/dist/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js +3 -4
  91. package/dist/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
  92. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js +3 -3
  93. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
  94. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js +4 -9
  95. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
  96. package/dist/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js +2 -3
  97. package/dist/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
  98. package/dist/record/recordNodesUpdater/recordNodesDeleter.js +1 -5
  99. package/dist/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
  100. package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js +2 -9
  101. package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
  102. package/dist/record/recordNodesUpdater/recordNodesUpdater.js +1 -1
  103. package/dist/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
  104. package/dist/record/recordPrettyPrinter.js +14 -12
  105. package/dist/record/recordPrettyPrinter.js.map +1 -1
  106. package/dist/record/recordUpdater.js +2 -2
  107. package/dist/record/recordUpdater.js.map +1 -1
  108. package/dist/record/recordValidator/attributeKeyValidator.js +4 -4
  109. package/dist/record/recordValidator/attributeKeyValidator.js.map +1 -1
  110. package/dist/record/recordValidator/attributeUniqueValidator.js +1 -1
  111. package/dist/record/recordValidator/attributeUniqueValidator.js.map +1 -1
  112. package/dist/record/recordValidator/attributeValidator.js +8 -10
  113. package/dist/record/recordValidator/attributeValidator.js.map +1 -1
  114. package/dist/record/recordValidator/countVaildator.js +2 -2
  115. package/dist/record/recordValidator/countVaildator.js.map +1 -1
  116. package/dist/record/recordValidator/recordValidator.js +1 -2
  117. package/dist/record/recordValidator/recordValidator.js.map +1 -1
  118. package/dist/record/records.d.ts +340 -40
  119. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"recordGetters.js","sourceRoot":"","sources":["../../../src/record/_records/recordGetters.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary, TraverseMethod } from '../../common'\nimport { SystemError } from '../../error'\nimport { ArenaRecordNode, NodePointer, Nodes, NodesMap } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { NodeDef, NodeDefCode, NodeDefCodeProps, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { defaultCycle, Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { Arrays, Queue } from '../../utils'\nimport { ArenaRecord, RECORD_STEP_DEFAULT } from '../record'\nimport { RecordStepAnalysisCode } from '../recordStep'\nimport { RecordNodesIndexReader } from './recordNodesIndexReader'\nimport { NodeDefSelfReferences } from './nodeDefSelfReferences'\n\nexport const getCycle = (record: ArenaRecord): string => record.cycle ?? defaultCycle\n\nexport const getNodes = (record: ArenaRecord): Dictionary<ArenaRecordNode> => record.nodes ?? {}\n\nexport const getNodesArray = (record: ArenaRecord): ArenaRecordNode[] => Object.values(getNodes(record))\n\nexport const getNodeByUuid =\n (uuid: string) =>\n (record: ArenaRecord): ArenaRecordNode | undefined =>\n record.nodes?.[uuid]\n\nexport const getNodesByUuids =\n (uuids: string[]) =>\n (record: ArenaRecord): ArenaRecordNode[] =>\n uuids.map((uuid: string) => getNodeByUuid(uuid)(record)) as ArenaRecordNode[]\n\nexport const getRoot = (record: ArenaRecord): ArenaRecordNode | undefined => {\n const rootUuid = record._nodesIndex ? RecordNodesIndexReader.getNodeRootUuid(record._nodesIndex) : null\n if (rootUuid) {\n return getNodeByUuid(rootUuid)(record)\n }\n return getNodesArray(record).find((node) => !node.parentUuid)\n}\n\nexport const getChildren =\n (parentNode: ArenaRecordNode, childDefUuid?: string) =>\n (record: ArenaRecord): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const childrenUuids = childDefUuid\n ? RecordNodesIndexReader.getNodeUuidsByParentAndChildDef({\n parentNodeUuid: parentNode.uuid,\n childDefUuid,\n })(record._nodesIndex)\n : RecordNodesIndexReader.getNodeUuidsByParent(parentNode.uuid)(record._nodesIndex)\n return getNodesByUuids(childrenUuids)(record)\n }\n return getNodesArray(record).filter(\n (node) => node.parentUuid === parentNode.uuid && (!childDefUuid || node.nodeDefUuid == childDefUuid)\n )\n }\n\nexport const getChild =\n (parentNode: ArenaRecordNode, childDefUuid: string) =>\n (record: ArenaRecord): ArenaRecordNode => {\n const children = getChildren(parentNode, childDefUuid)(record)\n const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid }\n if (children.length === 1) {\n return children[0]\n }\n if (children.length > 1) {\n throw new SystemError('systemError.record.multipleNodesFound', errorParams)\n }\n throw new SystemError('systemError.record.childNotFound', errorParams)\n }\n\nexport const getParent =\n (node: ArenaRecordNode) =>\n (record: ArenaRecord): ArenaRecordNode | undefined =>\n node.parentUuid ? getNodeByUuid(node.parentUuid)(record) : undefined\n\nexport const getNodesByDefUuid =\n (nodeDefUuid: string) =>\n (record: ArenaRecord): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeUuidsByDef(nodeDefUuid)(record._nodesIndex)\n return getNodesByUuids(nodeUuids)(record)\n }\n return getNodesArray(record).filter((node) => node.nodeDefUuid === nodeDefUuid)\n }\n\nconst isNodeFlagTrue =\n (isChildFlagTrue: (parent: ArenaRecordNode, nodeDefUuid: string) => boolean) =>\n (params: { record: ArenaRecord; node: ArenaRecordNode }): boolean => {\n const { record, node } = params\n const ancestorsAndSelf = getAncestorsAndSelf({ record, node })\n for (let i = 0; i < ancestorsAndSelf.length - 1; i++) {\n const child = ancestorsAndSelf[i]\n const parent = ancestorsAndSelf[i + 1]\n if (!isChildFlagTrue(parent, child.nodeDefUuid)) return false\n }\n return true\n }\n\nexport const isNodeApplicable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildApplicable(parent, nodeDefUuid))\nexport const isNodeEditable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildEditable(parent, nodeDefUuid))\nexport const isNodeVisible = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildVisible(parent, nodeDefUuid))\n\nexport const getDependentCodeAttributes =\n (node: ArenaRecordNode) =>\n (record: ArenaRecord): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeCodeDependentUuids(node.uuid)(record._nodesIndex)\n return getNodesByUuids(nodeUuids)(record)\n }\n throw new SystemError('record.nodesIndexNotInitialized')\n }\n\nexport const getParentCodeAttribute =\n (params: { parentNode: ArenaRecordNode; nodeDef: NodeDefCode }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { parentNode, nodeDef } = params\n\n const parentCodeDefUuid = NodeDefs.getParentCodeDefUuid(nodeDef)\n if (!parentCodeDefUuid) return undefined\n\n const ancestors = getAncestorsAndSelf({ record, node: parentNode })\n for (const ancestor of ancestors) {\n const children = getChildren(ancestor, parentCodeDefUuid)(record)\n if (children.length === 1) {\n return children[0]\n }\n }\n return undefined\n }\n\n// ancestors\nexport const visitAncestorsAndSelf =\n (node: ArenaRecordNode, visitor: (node: ArenaRecordNode) => void, stopIfFn?: () => boolean) =>\n (record: ArenaRecord): void => {\n let currentNode: ArenaRecordNode | undefined = node\n while (currentNode) {\n visitor(currentNode)\n if (stopIfFn?.()) break\n currentNode = getParent(currentNode)(record)\n }\n }\n\nexport const findAncestor =\n (node: ArenaRecordNode, predicate: (node: ArenaRecordNode) => boolean) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n let result: ArenaRecordNode | undefined = undefined\n visitAncestorsAndSelf(\n node,\n (visitedNode) => {\n if (predicate(visitedNode)) {\n result = visitedNode\n }\n },\n () => !!result\n )(record)\n return result\n }\n\nexport const getAncestor = (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n ancestorDefUuid: string\n}): ArenaRecordNode | undefined => {\n const { record, node, ancestorDefUuid } = params\n if (node.nodeDefUuid === ancestorDefUuid) return node\n\n let ancestor = getParent(node)(record)\n while (ancestor && ancestor.nodeDefUuid !== ancestorDefUuid) {\n ancestor = getParent(ancestor)(record)\n }\n return ancestor\n}\n\n/**\n * Returns the list of ancestors from the given node to the root entity\n */\nexport const getAncestorsAndSelf = (params: { record: ArenaRecord; node: ArenaRecordNode }): Array<ArenaRecordNode> => {\n const { record, node } = params\n const ancestors: Array<ArenaRecordNode> = []\n visitAncestorsAndSelf(node, (currentNode) => {\n ancestors.push(currentNode)\n })(record)\n return ancestors\n}\n\n// descendants\n\nexport const getDescendantsOrSelf = (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDefDescendant: NodeDef<any>\n}): ArenaRecordNode[] => {\n const { record, node, nodeDefDescendant } = params\n\n if (nodeDefDescendant.uuid === node.nodeDefUuid) return [node]\n\n const nodeDefDescendantFullHierarchy = [...nodeDefDescendant.meta.h, nodeDefDescendant.uuid]\n\n // 1. get the descendant node defs uuids starting from node nodeDefUuid (not inclusive) down to the specified nodeDefDescendant uuid\n const descendantNodeDefUuids = nodeDefDescendantFullHierarchy.slice(\n nodeDefDescendantFullHierarchy.indexOf(node.nodeDefUuid) + 1\n )\n // 2. for every level in the hierarchy, find the children having the nodeDefUuid equal to the current one\n let currentAncestors = [node]\n let currentDescendants: ArenaRecordNode[] = []\n for (const currentDescendantDefUuid of descendantNodeDefUuids) {\n for (const currentAncestor of currentAncestors) {\n currentDescendants.push(...getChildren(currentAncestor, currentDescendantDefUuid)(record))\n }\n currentAncestors = currentDescendants\n currentDescendants = []\n }\n return currentAncestors // currentAncestors is equal to the currentDescendants of the last level\n}\n\nexport const getDescendant = (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDefDescendant: NodeDef<any>\n}): ArenaRecordNode => {\n const { record, node, nodeDefDescendant } = params\n\n return getDescendantsOrSelf({ record, node, nodeDefDescendant })[0]\n}\n\nexport const isDescendantOf = (params: { node: ArenaRecordNode; ancestor: ArenaRecordNode }): boolean => {\n const { node, ancestor } = params\n return Nodes.getHierarchy(node).includes(ancestor.uuid)\n}\n\nexport const visitDescendantsAndSelf = (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n visitor: (node: ArenaRecordNode) => boolean | void\n traverseMethod?: TraverseMethod\n}): void => {\n const { record, node, visitor, traverseMethod = TraverseMethod.bfs } = params\n\n if (traverseMethod === TraverseMethod.bfs) {\n const queue = new Queue()\n\n queue.enqueue(node)\n\n while (!queue.isEmpty()) {\n const visitedNode = queue.dequeue()\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren(visitedNode)(record)\n queue.enqueueItems(children)\n }\n } else {\n const stack = []\n\n stack.push(node)\n\n while (stack.length > 0) {\n const visitedNode = stack.pop() as ArenaRecordNode\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren(visitedNode)(record)\n\n // add children to stack in reverse order\n for (let index = children.length - 1; index >= 0; index--) {\n const child = children[index]\n stack.push(child)\n }\n }\n }\n}\n\nexport const findDescendantOrSelf =\n (node: ArenaRecordNode, predicate: (node: ArenaRecordNode) => boolean) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n let found = undefined\n\n visitDescendantsAndSelf({\n record,\n node,\n visitor: (currentNode) => {\n if (predicate(currentNode)) {\n found = currentNode\n return true\n }\n return false\n },\n })\n return found\n }\n\nconst getClosestAncestorNode = (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n dependentDef: NodeDef<NodeDefType, NodeDefProps>\n dependencyType: SurveyDependencyType\n}): ArenaRecordNode | undefined => {\n const { record, node, nodeDef, dependentDef, dependencyType } = params\n\n // 1a if dependent def is the same as node def, potentially all nodes with\n // nodeDefUuid === dependentDef.uuid in record could be dependent of nodeDef;\n // consider the root node as the closest ancestor node,\n // unless the node def references itself only among the children of its parent entity (e.g. validation \"dbh > 0\")\n if (nodeDef.uuid === dependentDef.uuid) {\n return NodeDefSelfReferences.isSelfReferenceLocal({ nodeDef, dependencyType })\n ? getParent(node)(record)\n : getRoot(record)\n }\n // 1 find common ancestor def\n const commonAncestorDefUuid = Arrays.last(Arrays.intersection(nodeDef.meta.h, dependentDef.meta.h))\n if (!commonAncestorDefUuid) return undefined\n\n // 2 get ancestor node with common parent def\n return getAncestor({ record, node, ancestorDefUuid: commonAncestorDefUuid })\n}\n\ntype EntityKeyNodesGetterParams = {\n survey: Survey\n cycle?: string\n record: ArenaRecord\n entity: ArenaRecordNode\n keyDefs?: NodeDef<NodeDefType, NodeDefProps>[]\n}\n\nexport const getEntityKeyNodesByDefUuid = (params: EntityKeyNodesGetterParams): NodesMap => {\n const { survey, cycle, record, entity, keyDefs } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: entity.nodeDefUuid })\n const nodeDefKeys = keyDefs ?? Surveys.getNodeDefKeys({ survey, cycle, nodeDef })\n return nodeDefKeys.reduce((acc: NodesMap, nodeDefKey) => {\n const nodeKey = getDescendant({ record, node: entity, nodeDefDescendant: nodeDefKey })\n acc[nodeDefKey.uuid] = nodeKey\n return acc\n }, {})\n}\n\nexport const getEntityKeyNodes = (params: EntityKeyNodesGetterParams): ArenaRecordNode[] =>\n Object.values(getEntityKeyNodesByDefUuid(params))\n\nexport const getEntityKeyValuesByDefUuid = (params: EntityKeyNodesGetterParams): Dictionary<any> => {\n const keyNodesByDefUuid = getEntityKeyNodesByDefUuid(params)\n return Object.entries(keyNodesByDefUuid).reduce((acc: Dictionary<any>, [uuid, keyNode]) => {\n acc[uuid] = keyNode?.value\n return acc\n }, {})\n}\n\nexport const getEntityKeyValues = (params: EntityKeyNodesGetterParams): any[] =>\n Object.values(getEntityKeyValuesByDefUuid(params))\n\nexport const getEntitySiblings = (params: { record: ArenaRecord; entity: ArenaRecordNode; includeSelf?: boolean }) => {\n const { record, entity, includeSelf = false } = params\n const parentEntity = getParent(entity)(record)\n if (!parentEntity) return []\n const siblingEntities = getChildren(parentEntity, entity.nodeDefUuid)(record)\n return includeSelf ? siblingEntities : siblingEntities.filter((sibling) => !Nodes.areEqual(sibling, entity))\n}\n\nexport const getAttributeSiblings = (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n}) => {\n const { record, node, nodeDef } = params\n const parentEntity = getParent(node)(record)\n if (!parentEntity) return []\n const siblingParentEntities = getEntitySiblings({ record, entity: parentEntity })\n return siblingParentEntities.reduce((siblingsAcc: ArenaRecordNode[], siblingEntity) => {\n siblingsAcc.push(...getChildren(siblingEntity, nodeDef.uuid)(record))\n return siblingsAcc\n }, [])\n}\n\nexport const getNodeIndex = (params: { record: ArenaRecord; node: ArenaRecordNode }) => {\n const { record, node } = params\n const parentEntity = getParent(node)(record)\n if (!parentEntity) return 0 // root entity\n const siblings = getChildren(parentEntity, node.nodeDefUuid)(record)\n return siblings.indexOf(node)\n}\n\nexport const findEntityByKeyValues = (params: {\n survey: Survey\n cycle: string\n record: ArenaRecord\n parentEntity: ArenaRecordNode\n entityDefUuid: string\n keyValuesByDefUuid: Dictionary<any>\n}): ArenaRecordNode | undefined => {\n const { survey, cycle, record, parentEntity, entityDefUuid, keyValuesByDefUuid } = params\n const entityDef = Surveys.getNodeDefByUuid({ survey, uuid: entityDefUuid })\n const siblingEntities = getChildren(parentEntity, entityDefUuid)(record)\n if (NodeDefs.isSingle(entityDef)) {\n return siblingEntities[0]\n }\n const keyDefs = Surveys.getNodeDefKeys({ survey, cycle, nodeDef: entityDef })\n\n return siblingEntities.find((siblingEntity) => {\n const siblingEntityKeyValuesByDefUuid = getEntityKeyValuesByDefUuid({\n survey,\n record,\n entity: siblingEntity,\n keyDefs,\n })\n return keyDefs.every((keyDef) => {\n const keyValue = siblingEntityKeyValuesByDefUuid[keyDef.uuid]\n const keyValueSearch = keyValuesByDefUuid[keyDef.uuid]\n return NodeValues.isValueEqual({\n survey,\n nodeDef: keyDef,\n value: keyValue,\n valueSearch: keyValueSearch,\n })\n })\n })\n}\n\nexport const findEntityWithSameKeysInAnotherRecord = (params: {\n survey: Survey\n cycle: string\n entityUuid: string\n record: ArenaRecord\n recordOther: ArenaRecord\n}): ArenaRecordNode | undefined => {\n const { survey, cycle, entityUuid, record, recordOther } = params\n const entity = getNodeByUuid(entityUuid)(record)\n if (!entity) return undefined\n\n let otherRecordCurrentParentEntity = getRoot(recordOther)\n if (!otherRecordCurrentParentEntity) return undefined\n\n const entityAncestorsAndSelf = getAncestorsAndSelf({\n record,\n node: entity,\n })\n const ancestorDefUuidsAndKeys = entityAncestorsAndSelf.map((ancestor) => ({\n entityDefUuid: ancestor.nodeDefUuid,\n keyValuesByDefUuid: getEntityKeyValuesByDefUuid({\n survey,\n record,\n entity: ancestor,\n }),\n }))\n\n const ancestorDefUuidsAndKeysToVisit = [...ancestorDefUuidsAndKeys].reverse()\n\n for (let index = 1; otherRecordCurrentParentEntity && index < ancestorDefUuidsAndKeysToVisit.length; index++) {\n const { entityDefUuid, keyValuesByDefUuid } = ancestorDefUuidsAndKeysToVisit[index]\n otherRecordCurrentParentEntity = findEntityByKeyValues({\n survey,\n cycle,\n record: recordOther,\n parentEntity: otherRecordCurrentParentEntity,\n entityDefUuid,\n keyValuesByDefUuid,\n })\n }\n return otherRecordCurrentParentEntity\n}\n\nexport const getDependentNodePointers = (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n dependencyType: SurveyDependencyType\n includeSelf?: boolean\n filterFn?: (nodePointer: NodePointer) => boolean\n}) => {\n const { survey, record, node, dependencyType, includeSelf = false, filterFn = null } = params\n const nodeDefUuid = node.nodeDefUuid\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n const dependentDefs = Surveys.getNodeDefDependents({ survey, nodeDefUuid, dependencyType })\n const nodePointers: Array<NodePointer> = []\n\n const addToNodePointers = (nodePointer: NodePointer): void => {\n if (filterFn === null || filterFn(nodePointer)) {\n nodePointers.push(nodePointer)\n }\n }\n\n for (const dependentDef of dependentDefs) {\n // 1 find common ancestor node\n const commonAncestorNode = getClosestAncestorNode({ record, node, nodeDef, dependentDef, dependencyType })\n if (!commonAncestorNode) continue\n\n const nodeDefDependentParent = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!nodeDefDependentParent) throw new SystemError('record.nodes.dependents.dependencyOnRootFound')\n\n // 2 find descendant nodes of common parent node with nodeDefUuid = dependentDef uuid\n const dependentContextNodes = getDescendantsOrSelf({\n record,\n node: commonAncestorNode,\n nodeDefDescendant: nodeDefDependentParent,\n })\n\n for (const dependentContextNode of dependentContextNodes) {\n addToNodePointers({\n nodeCtx: dependentContextNode,\n nodeDef: dependentDef,\n })\n }\n }\n if (includeSelf) {\n const parentNode = getParent(node)(record)\n if (parentNode) {\n addToNodePointers({\n nodeCtx: parentNode,\n nodeDef,\n })\n }\n }\n\n return nodePointers\n}\n\nexport const getAncestorCodePath = (params: {\n survey: Survey\n record: ArenaRecord\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n}): string[] => {\n const { record, parentNode, nodeDef, survey } = params\n\n const getCodeAttributeItemCode = (codeAttribute: ArenaRecordNode | undefined): string => {\n const codeItemUuid = codeAttribute ? NodeValues.getItemUuid(codeAttribute) : undefined\n if (!codeItemUuid) return ''\n const item = Surveys.getCategoryItemByUuid({ survey, itemUuid: codeItemUuid })\n return item?.props.code ?? ''\n }\n\n const codePaths = []\n let currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef })(record)\n\n while (currentParentCodeAttribute) {\n const ancestorItemCode = getCodeAttributeItemCode(currentParentCodeAttribute)\n codePaths.unshift(ancestorItemCode)\n const ancestorCodeDef = Surveys.getNodeDefByUuid({\n survey,\n uuid: currentParentCodeAttribute.nodeDefUuid,\n }) as NodeDefCode\n currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef: ancestorCodeDef })(record)\n }\n return codePaths\n}\n\nexport const getCategoryItemUuid = (params: {\n survey: Survey\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n code: string\n}): string | undefined => {\n const { survey, nodeDef, record, parentNode, code } = params\n const categoryUuid = nodeDef.props.categoryUuid\n\n const codePaths = [...getAncestorCodePath({ survey, record, parentNode, nodeDef }), code]\n\n const item = Surveys.getCategoryItemByCodePaths({ survey, categoryUuid, codePaths })\n\n return item?.uuid\n}\n\nexport const isNodeFilledByUser =\n (node: ArenaRecordNode) =>\n (record: ArenaRecord): boolean =>\n !!findDescendantOrSelf(node, (visitedNode) => Nodes.hasUserInputValue(visitedNode))(record)\n\nexport const isNodeEmpty =\n (node: ArenaRecordNode) =>\n (record: ArenaRecord): boolean =>\n !isNodeFilledByUser(node)(record)\n\nexport const isEmpty = (record: ArenaRecord): boolean => {\n const rootNode = getRoot(record)\n return rootNode ? isNodeEmpty(rootNode)(record) : true\n}\n\nexport const getStep = (record: ArenaRecord): string => record.step ?? RECORD_STEP_DEFAULT\n\nexport const isInAnalysisStep = (record: ArenaRecord): boolean => getStep(record) === RecordStepAnalysisCode\n"]}
1
+ {"version":3,"file":"recordGetters.js","sourceRoot":"","sources":["../../../src/record/_records/recordGetters.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary, TraverseMethod } from '../../common'\nimport { SystemError } from '../../error'\nimport { ArenaRecordNode, NodePointer, Nodes, NodesMap } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { NodeDef, NodeDefCode, NodeDefCodeProps, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { defaultCycle, Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { Arrays, Queue } from '../../utils'\nimport { ArenaRecord, RECORD_STEP_DEFAULT } from '../record'\nimport { RecordStepAnalysisCode } from '../recordStep'\nimport { RecordNodesIndexReader } from './recordNodesIndexReader'\nimport { NodeDefSelfReferences } from './nodeDefSelfReferences'\n\ntype RecordParams = { record: ArenaRecord }\n\n/**\n * Record getter: takes the parameters first and the record as separate (curried) parameter: `getter(params)(record)`.\n * The deprecated form, with the record inside the parameters (`getter({ record, ...params })`), is still supported.\n */\ntype RecordGetter<P extends RecordParams, R> = {\n /** @deprecated Pass the record as separate parameter: `getter(params)(record)` */\n (params: P): R\n (params: Omit<P, 'record'>): (record: ArenaRecord) => R\n}\n\nconst isRecordParams = (params: object): params is RecordParams => 'record' in params\n\nconst recordGetter = <P extends RecordParams, R>(getter: (params: P) => R): RecordGetter<P, R> =>\n ((params: P | Omit<P, 'record'>) =>\n isRecordParams(params)\n ? getter(params as P)\n : (record: ArenaRecord) => getter({ ...params, record } as P)) as RecordGetter<P, R>\n\n/**\n * Record getter (with parameters object) that also supports the deprecated form with positional parameters:\n * `getter(arg1, arg2)(record)`.\n */\ntype PositionalRecordGetter<P, A extends unknown[], R> = {\n (params: P): (record: ArenaRecord) => R\n /** @deprecated Pass the parameters as an object: `getter({ ...params })(record)` */\n (...args: A): (record: ArenaRecord) => R\n}\n\nconst positionalRecordGetter = <P, A extends unknown[], R>(params: {\n getter: (params: P & RecordParams) => R\n isPositional: (firstArg: unknown) => boolean\n toParams: (...args: A) => NoInfer<P>\n}): PositionalRecordGetter<P, A, R> => {\n const { getter, isPositional, toParams } = params\n return ((...args: unknown[]) => {\n const getterParams = isPositional(args[0]) ? toParams(...(args as A)) : (args[0] as P)\n return (record: ArenaRecord) => getter({ ...getterParams, record })\n }) as PositionalRecordGetter<P, A, R>\n}\n\nconst isRecordNode = (arg: unknown): arg is ArenaRecordNode =>\n typeof arg === 'object' && arg !== null && 'uuid' in arg && 'nodeDefUuid' in arg\nconst isString = (arg: unknown): arg is string => typeof arg === 'string'\n\nexport const getCycle = (record: ArenaRecord): string => record.cycle ?? defaultCycle\n\nexport const getNodes = (record: ArenaRecord): Dictionary<ArenaRecordNode> => record.nodes ?? {}\n\nexport const getNodesArray = (record: ArenaRecord): ArenaRecordNode[] => Object.values(getNodes(record))\n\nexport const getNodeByUuid = positionalRecordGetter({\n getter: ({ record, uuid }: RecordParams & { uuid: string }): ArenaRecordNode | undefined => record.nodes?.[uuid],\n isPositional: isString,\n toParams: (uuid: string) => ({ uuid }),\n})\n\nexport const getNodesByUuids = positionalRecordGetter({\n getter: ({ record, uuids }: RecordParams & { uuids: string[] }): ArenaRecordNode[] =>\n uuids.map((uuid: string) => record.nodes?.[uuid]) as ArenaRecordNode[],\n isPositional: Array.isArray,\n toParams: (uuids: string[]) => ({ uuids }),\n})\n\nexport const getRoot = (record: ArenaRecord): ArenaRecordNode | undefined => {\n const rootUuid = record._nodesIndex ? RecordNodesIndexReader.getNodeRootUuid(record._nodesIndex) : null\n if (rootUuid) {\n return getNodeByUuid({ uuid: rootUuid })(record)\n }\n return getNodesArray(record).find((node) => !node.parentUuid)\n}\n\nexport const getChildren = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid?: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const childrenUuids = childDefUuid\n ? RecordNodesIndexReader.getNodeUuidsByParentAndChildDef({\n parentNodeUuid: parentNode.uuid,\n childDefUuid,\n })(record._nodesIndex)\n : RecordNodesIndexReader.getNodeUuidsByParent(parentNode.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: childrenUuids })(record)\n }\n return getNodesArray(record).filter(\n (node) => node.parentUuid === parentNode.uuid && (!childDefUuid || node.nodeDefUuid == childDefUuid)\n )\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid?: string) => ({ parentNode, childDefUuid }),\n})\n\nexport const getChild = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid: string }): ArenaRecordNode => {\n const children = getChildren({ parentNode, childDefUuid })(record)\n const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid }\n if (children.length === 1) {\n return children[0]\n }\n if (children.length > 1) {\n throw new SystemError('systemError.record.multipleNodesFound', errorParams)\n }\n throw new SystemError('systemError.record.childNotFound', errorParams)\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid: string) => ({ parentNode, childDefUuid }),\n})\n\nexport const getParent = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode | undefined =>\n node.parentUuid ? getNodeByUuid({ uuid: node.parentUuid })(record) : undefined,\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getNodesByDefUuid = positionalRecordGetter({\n getter: ({ record, nodeDefUuid }: RecordParams & { nodeDefUuid: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeUuidsByDef(nodeDefUuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n return getNodesArray(record).filter((node) => node.nodeDefUuid === nodeDefUuid)\n },\n isPositional: isString,\n toParams: (nodeDefUuid: string) => ({ nodeDefUuid }),\n})\n\nconst isNodeFlagTrue = (isChildFlagTrue: (parent: ArenaRecordNode, nodeDefUuid: string) => boolean) =>\n recordGetter((params: RecordParams & { node: ArenaRecordNode }): boolean => {\n const { record, node } = params\n const ancestorsAndSelf = getAncestorsAndSelf({ node })(record)\n for (let i = 0; i < ancestorsAndSelf.length - 1; i++) {\n const child = ancestorsAndSelf[i]\n const parent = ancestorsAndSelf[i + 1]\n if (!isChildFlagTrue(parent, child.nodeDefUuid)) return false\n }\n return true\n })\n\nexport const isNodeApplicable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildApplicable(parent, nodeDefUuid))\nexport const isNodeEditable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildEditable(parent, nodeDefUuid))\nexport const isNodeVisible = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildVisible(parent, nodeDefUuid))\n\nexport const getDependentCodeAttributes = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeCodeDependentUuids(node.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n throw new SystemError('record.nodesIndexNotInitialized')\n },\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getParentCodeAttribute =\n (params: { parentNode: ArenaRecordNode; nodeDef: NodeDefCode }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { parentNode, nodeDef } = params\n\n const parentCodeDefUuid = NodeDefs.getParentCodeDefUuid(nodeDef)\n if (!parentCodeDefUuid) return undefined\n\n const ancestors = getAncestorsAndSelf({ node: parentNode })(record)\n for (const ancestor of ancestors) {\n const children = getChildren({ parentNode: ancestor, childDefUuid: parentCodeDefUuid })(record)\n if (children.length === 1) {\n return children[0]\n }\n }\n return undefined\n }\n\n// ancestors\n\n/**\n * Visits the specified node and its ancestors, from the node up to the root: the visit stops when the visitor returns true.\n */\nexport const visitAncestorsAndSelf = positionalRecordGetter({\n getter: ({\n record,\n node,\n visitor,\n }: RecordParams & { node: ArenaRecordNode; visitor: (node: ArenaRecordNode) => boolean | void }): void => {\n let currentNode: ArenaRecordNode | undefined = node\n while (currentNode) {\n if (visitor(currentNode)) return\n currentNode = getParent({ node: currentNode })(record)\n }\n },\n isPositional: isRecordNode,\n // deprecated form: the visit stops when stopIfFn returns true\n toParams: (node: ArenaRecordNode, visitor: (node: ArenaRecordNode) => void, stopIfFn?: () => boolean) => ({\n node,\n visitor: (visitedNode: ArenaRecordNode): boolean => {\n visitor(visitedNode)\n return !!stopIfFn?.()\n },\n }),\n})\n\n/**\n * Returns the first node satisfying the predicate among the specified node and its ancestors (from the node up to the root).\n */\nexport const findAncestor =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let result: ArenaRecordNode | undefined = undefined\n visitAncestorsAndSelf({\n node,\n visitor: (visitedNode) => {\n if (predicate(visitedNode)) {\n result = visitedNode\n return true\n }\n return false\n },\n })(record)\n return result\n }\n\nexport const getAncestor = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; ancestorDefUuid: string }): ArenaRecordNode | undefined => {\n const { record, node, ancestorDefUuid } = params\n if (node.nodeDefUuid === ancestorDefUuid) return node\n\n let ancestor = getParent({ node })(record)\n while (ancestor && ancestor.nodeDefUuid !== ancestorDefUuid) {\n ancestor = getParent({ node: ancestor })(record)\n }\n return ancestor\n }\n)\n\n/**\n * Returns the list of ancestors from the given node to the root entity\n */\nexport const getAncestorsAndSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode }): Array<ArenaRecordNode> => {\n const { record, node } = params\n const ancestors: Array<ArenaRecordNode> = []\n visitAncestorsAndSelf({\n node,\n visitor: (currentNode) => {\n ancestors.push(currentNode)\n },\n })(record)\n return ancestors\n }\n)\n\n// descendants\n\nexport const getDescendantsOrSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDefDescendant: NodeDef<any> }): ArenaRecordNode[] => {\n const { record, node, nodeDefDescendant } = params\n\n if (nodeDefDescendant.uuid === node.nodeDefUuid) return [node]\n\n const nodeDefDescendantFullHierarchy = [...nodeDefDescendant.meta.h, nodeDefDescendant.uuid]\n\n // 1. get the descendant node defs uuids starting from node nodeDefUuid (not inclusive) down to the specified nodeDefDescendant uuid\n const descendantNodeDefUuids = nodeDefDescendantFullHierarchy.slice(\n nodeDefDescendantFullHierarchy.indexOf(node.nodeDefUuid) + 1\n )\n // 2. for every level in the hierarchy, find the children having the nodeDefUuid equal to the current one\n let currentAncestors = [node]\n let currentDescendants: ArenaRecordNode[] = []\n for (const currentDescendantDefUuid of descendantNodeDefUuids) {\n for (const currentAncestor of currentAncestors) {\n currentDescendants.push(\n ...getChildren({ parentNode: currentAncestor, childDefUuid: currentDescendantDefUuid })(record)\n )\n }\n currentAncestors = currentDescendants\n currentDescendants = []\n }\n return currentAncestors // currentAncestors is equal to the currentDescendants of the last level\n }\n)\n\nexport const getDescendant = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDefDescendant: NodeDef<any> }): ArenaRecordNode => {\n const { record, node, nodeDefDescendant } = params\n\n return getDescendantsOrSelf({ node, nodeDefDescendant })(record)[0]\n }\n)\n\nexport const isDescendantOf = (params: { node: ArenaRecordNode; ancestor: ArenaRecordNode }): boolean => {\n const { node, ancestor } = params\n return Nodes.getHierarchy(node).includes(ancestor.uuid)\n}\n\nexport const visitDescendantsAndSelf = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n visitor: (node: ArenaRecordNode) => boolean | void\n traverseMethod?: TraverseMethod\n }): void => {\n const { record, node, visitor, traverseMethod = TraverseMethod.bfs } = params\n\n if (traverseMethod === TraverseMethod.bfs) {\n const queue = new Queue()\n\n queue.enqueue(node)\n\n while (!queue.isEmpty()) {\n const visitedNode = queue.dequeue()\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren(visitedNode)(record)\n queue.enqueueItems(children)\n }\n } else {\n const stack = []\n\n stack.push(node)\n\n while (stack.length > 0) {\n const visitedNode = stack.pop() as ArenaRecordNode\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren({ parentNode: visitedNode })(record)\n\n // add children to stack in reverse order\n for (let index = children.length - 1; index >= 0; index--) {\n const child = children[index]\n stack.push(child)\n }\n }\n }\n }\n)\n\nexport const findDescendantOrSelf =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let found = undefined\n\n visitDescendantsAndSelf({\n node,\n visitor: (currentNode) => {\n if (predicate(currentNode)) {\n found = currentNode\n return true\n }\n return false\n },\n })(record)\n return found\n }\n\nconst getClosestAncestorNode = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n dependentDef: NodeDef<NodeDefType, NodeDefProps>\n dependencyType: SurveyDependencyType\n }): ArenaRecordNode | undefined => {\n const { record, node, nodeDef, dependentDef, dependencyType } = params\n\n // 1a if dependent def is the same as node def, potentially all nodes with\n // nodeDefUuid === dependentDef.uuid in record could be dependent of nodeDef;\n // consider the root node as the closest ancestor node,\n // unless the node def references itself only among the children of its parent entity (e.g. validation \"dbh > 0\")\n if (nodeDef.uuid === dependentDef.uuid) {\n return NodeDefSelfReferences.isSelfReferenceLocal({ nodeDef, dependencyType })\n ? getParent({ node })(record)\n : getRoot(record)\n }\n // 1 find common ancestor def\n const commonAncestorDefUuid = Arrays.last(Arrays.intersection(nodeDef.meta.h, dependentDef.meta.h))\n if (!commonAncestorDefUuid) return undefined\n\n // 2 get ancestor node with common parent def\n return getAncestor({ node, ancestorDefUuid: commonAncestorDefUuid })(record)\n }\n)\n\ntype EntityKeyNodesGetterParams = {\n survey: Survey\n cycle?: string\n record: ArenaRecord\n entity: ArenaRecordNode\n keyDefs?: NodeDef<NodeDefType, NodeDefProps>[]\n}\n\nexport const getEntityKeyNodesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): NodesMap => {\n const { survey, cycle, record, entity, keyDefs } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: entity.nodeDefUuid })\n const nodeDefKeys = keyDefs ?? Surveys.getNodeDefKeys({ survey, cycle, nodeDef })\n return nodeDefKeys.reduce((acc: NodesMap, nodeDefKey) => {\n const nodeKey = getDescendant({ node: entity, nodeDefDescendant: nodeDefKey })(record)\n acc[nodeDefKey.uuid] = nodeKey\n return acc\n }, {})\n})\n\nexport const getEntityKeyNodes = recordGetter(\n ({ record, ...otherParams }: EntityKeyNodesGetterParams): ArenaRecordNode[] =>\n Object.values(getEntityKeyNodesByDefUuid(otherParams)(record))\n)\n\nexport const getEntityKeyValuesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): Dictionary<any> => {\n const { record, ...otherParams } = params\n const keyNodesByDefUuid = getEntityKeyNodesByDefUuid(otherParams)(record)\n return Object.entries(keyNodesByDefUuid).reduce((acc: Dictionary<any>, [uuid, keyNode]) => {\n acc[uuid] = keyNode?.value\n return acc\n }, {})\n})\n\nexport const getEntityKeyValues = recordGetter(({ record, ...otherParams }: EntityKeyNodesGetterParams): any[] =>\n Object.values(getEntityKeyValuesByDefUuid(otherParams)(record))\n)\n\nexport const getEntitySiblings = recordGetter(\n (params: { record: ArenaRecord; entity: ArenaRecordNode; includeSelf?: boolean }) => {\n const { record, entity, includeSelf = false } = params\n const parentEntity = getParent({ node: entity })(record)\n if (!parentEntity) return []\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entity.nodeDefUuid })(record)\n return includeSelf ? siblingEntities : siblingEntities.filter((sibling) => !Nodes.areEqual(sibling, entity))\n }\n)\n\nexport const getAttributeSiblings = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDef: NodeDef<NodeDefType, NodeDefProps> }) => {\n const { record, node, nodeDef } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return []\n const siblingParentEntities = getEntitySiblings({ entity: parentEntity })(record)\n return siblingParentEntities.reduce((siblingsAcc: ArenaRecordNode[], siblingEntity) => {\n siblingsAcc.push(...getChildren({ parentNode: siblingEntity, childDefUuid: nodeDef.uuid })(record))\n return siblingsAcc\n }, [])\n }\n)\n\nexport const getNodeIndex = recordGetter((params: { record: ArenaRecord; node: ArenaRecordNode }) => {\n const { record, node } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return 0 // root entity\n const siblings = getChildren({ parentNode: parentEntity, childDefUuid: node.nodeDefUuid })(record)\n return siblings.indexOf(node)\n})\n\nexport const findEntityByKeyValues = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n record: ArenaRecord\n parentEntity: ArenaRecordNode\n entityDefUuid: string\n keyValuesByDefUuid: Dictionary<any>\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, record, parentEntity, entityDefUuid, keyValuesByDefUuid } = params\n const entityDef = Surveys.getNodeDefByUuid({ survey, uuid: entityDefUuid })\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entityDefUuid })(record)\n if (NodeDefs.isSingle(entityDef)) {\n return siblingEntities[0]\n }\n const keyDefs = Surveys.getNodeDefKeys({ survey, cycle, nodeDef: entityDef })\n\n return siblingEntities.find((siblingEntity) => {\n const siblingEntityKeyValuesByDefUuid = getEntityKeyValuesByDefUuid({ survey, entity: siblingEntity, keyDefs })(\n record\n )\n return keyDefs.every((keyDef) => {\n const keyValue = siblingEntityKeyValuesByDefUuid[keyDef.uuid]\n const keyValueSearch = keyValuesByDefUuid[keyDef.uuid]\n return NodeValues.isValueEqual({\n survey,\n nodeDef: keyDef,\n value: keyValue,\n valueSearch: keyValueSearch,\n })\n })\n })\n }\n)\n\nexport const findEntityWithSameKeysInAnotherRecord = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n entityUuid: string\n record: ArenaRecord\n recordOther: ArenaRecord\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, entityUuid, record, recordOther } = params\n const entity = getNodeByUuid({ uuid: entityUuid })(record)\n if (!entity) return undefined\n\n let otherRecordCurrentParentEntity = getRoot(recordOther)\n if (!otherRecordCurrentParentEntity) return undefined\n\n const entityAncestorsAndSelf = getAncestorsAndSelf({ node: entity })(record)\n const ancestorDefUuidsAndKeys = entityAncestorsAndSelf.map((ancestor) => ({\n entityDefUuid: ancestor.nodeDefUuid,\n keyValuesByDefUuid: getEntityKeyValuesByDefUuid({ survey, entity: ancestor })(record),\n }))\n\n const ancestorDefUuidsAndKeysToVisit = [...ancestorDefUuidsAndKeys].reverse()\n\n for (let index = 1; otherRecordCurrentParentEntity && index < ancestorDefUuidsAndKeysToVisit.length; index++) {\n const { entityDefUuid, keyValuesByDefUuid } = ancestorDefUuidsAndKeysToVisit[index]\n otherRecordCurrentParentEntity = findEntityByKeyValues({\n survey,\n cycle,\n parentEntity: otherRecordCurrentParentEntity,\n entityDefUuid,\n keyValuesByDefUuid,\n })(recordOther)\n }\n return otherRecordCurrentParentEntity\n }\n)\n\nexport const getDependentNodePointers = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n dependencyType: SurveyDependencyType\n includeSelf?: boolean\n filterFn?: (nodePointer: NodePointer) => boolean\n }) => {\n const { survey, record, node, dependencyType, includeSelf = false, filterFn = null } = params\n const nodeDefUuid = node.nodeDefUuid\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n const dependentDefs = Surveys.getNodeDefDependents({ survey, nodeDefUuid, dependencyType })\n const nodePointers: Array<NodePointer> = []\n\n const addToNodePointers = (nodePointer: NodePointer): void => {\n if (filterFn === null || filterFn(nodePointer)) {\n nodePointers.push(nodePointer)\n }\n }\n\n for (const dependentDef of dependentDefs) {\n // 1 find common ancestor node\n const commonAncestorNode = getClosestAncestorNode({ node, nodeDef, dependentDef, dependencyType })(record)\n if (!commonAncestorNode) continue\n\n const nodeDefDependentParent = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!nodeDefDependentParent) throw new SystemError('record.nodes.dependents.dependencyOnRootFound')\n\n // 2 find descendant nodes of common parent node with nodeDefUuid = dependentDef uuid\n const dependentContextNodes = getDescendantsOrSelf({\n node: commonAncestorNode,\n nodeDefDescendant: nodeDefDependentParent,\n })(record)\n\n for (const dependentContextNode of dependentContextNodes) {\n addToNodePointers({\n nodeCtx: dependentContextNode,\n nodeDef: dependentDef,\n })\n }\n }\n if (includeSelf) {\n const parentNode = getParent({ node })(record)\n if (parentNode) {\n addToNodePointers({\n nodeCtx: parentNode,\n nodeDef,\n })\n }\n }\n\n return nodePointers\n }\n)\n\nexport const getAncestorCodePath = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n }): string[] => {\n const { record, parentNode, nodeDef, survey } = params\n\n const getCodeAttributeItemCode = (codeAttribute: ArenaRecordNode | undefined): string => {\n const codeItemUuid = codeAttribute ? NodeValues.getItemUuid(codeAttribute) : undefined\n if (!codeItemUuid) return ''\n const item = Surveys.getCategoryItemByUuid({ survey, itemUuid: codeItemUuid })\n return item?.props.code ?? ''\n }\n\n const codePaths = []\n let currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef })(record)\n\n while (currentParentCodeAttribute) {\n const ancestorItemCode = getCodeAttributeItemCode(currentParentCodeAttribute)\n codePaths.unshift(ancestorItemCode)\n const ancestorCodeDef = Surveys.getNodeDefByUuid({\n survey,\n uuid: currentParentCodeAttribute.nodeDefUuid,\n }) as NodeDefCode\n currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef: ancestorCodeDef })(record)\n }\n return codePaths\n }\n)\n\nexport const getCategoryItemUuid = recordGetter(\n (params: {\n survey: Survey\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n code: string\n }): string | undefined => {\n const { survey, nodeDef, record, parentNode, code } = params\n const categoryUuid = nodeDef.props.categoryUuid\n\n const codePaths = [...getAncestorCodePath({ survey, parentNode, nodeDef })(record), code]\n\n const item = Surveys.getCategoryItemByCodePaths({ survey, categoryUuid, codePaths })\n\n return item?.uuid\n }\n)\n\nexport const isNodeFilledByUser = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !!findDescendantOrSelf({ node, predicate: (visitedNode) => Nodes.hasUserInputValue(visitedNode) })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isNodeEmpty = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !isNodeFilledByUser({ node })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isEmpty = (record: ArenaRecord): boolean => {\n const rootNode = getRoot(record)\n return rootNode ? isNodeEmpty({ node: rootNode })(record) : true\n}\n\nexport const getStep = (record: ArenaRecord): string => record.step ?? RECORD_STEP_DEFAULT\n\nexport const isInAnalysisStep = (record: ArenaRecord): boolean => getStep(record) === RecordStepAnalysisCode\n"]}
@@ -16,7 +16,7 @@ const nodeBelongsToPage = (params) => {
16
16
  if (node.nodeDefUuid === pageNodeDefUuid)
17
17
  return true;
18
18
  return node_1.Nodes.getHierarchy(node).some((ancestorUuid) => {
19
- const ancestor = (0, recordGetters_1.getNodeByUuid)(ancestorUuid)(record);
19
+ const ancestor = (0, recordGetters_1.getNodeByUuid)({ uuid: ancestorUuid })(record);
20
20
  return (ancestor === null || ancestor === void 0 ? void 0 : ancestor.nodeDefUuid) === pageNodeDefUuid;
21
21
  });
22
22
  };
@@ -101,7 +101,7 @@ const getOwnPageFieldValidationFlags = (params) => {
101
101
  recordValidation,
102
102
  });
103
103
  }
104
- const node = (0, recordGetters_1.getNodeByUuid)(nodeUuid)(record);
104
+ const node = (0, recordGetters_1.getNodeByUuid)({ uuid: nodeUuid })(record);
105
105
  if (!node || !(0, exports.nodeBelongsToOwnPage)({ node, pageNodeDefUuid, descendantPageUuids, record }))
106
106
  return null;
107
107
  if (scopeEntityUuid && !nodeIsUnderEntity({ node, entityUuid: scopeEntityUuid }))
@@ -129,7 +129,7 @@ const getOwnPageChildrenCountValidationFlags = (params) => {
129
129
  // Sub-page entity min/max counts belong to navigation of nested pages, not this page's fields.
130
130
  if (descendantPageUuids.includes(childDefUuid))
131
131
  return null;
132
- const parentNode = (0, recordGetters_1.getNodeByUuid)(parentUuid)(record);
132
+ const parentNode = (0, recordGetters_1.getNodeByUuid)({ uuid: parentUuid })(record);
133
133
  if (!parentNode || !(0, exports.nodeBelongsToOwnPage)({ node: parentNode, pageNodeDefUuid, descendantPageUuids, record })) {
134
134
  return null;
135
135
  }
@@ -186,7 +186,7 @@ const aggregatePageValidationStatuses = (statuses) => ({
186
186
  const getEntitySubtreeStatus = (params) => {
187
187
  var _a;
188
188
  const { survey, record, entityUuid } = params;
189
- const entity = (0, recordGetters_1.getNodeByUuid)(entityUuid)(record);
189
+ const entity = (0, recordGetters_1.getNodeByUuid)({ uuid: entityUuid })(record);
190
190
  if (!entity)
191
191
  return null;
192
192
  const entityDef = survey_1.Surveys.getNodeDefByUuid({ survey, uuid: entity.nodeDefUuid });
@@ -220,7 +220,7 @@ exports.getEntitySubtreeStatus = getEntitySubtreeStatus;
220
220
  */
221
221
  const getMultiplePageEntitiesStatus = (params) => {
222
222
  const { survey, record, pageNodeDefUuid, scopeEntityUuid } = params;
223
- const instances = (0, recordGetters_1.getNodesByDefUuid)(pageNodeDefUuid)(record).filter((instance) => scopeEntityUuid ? nodeIsUnderEntity({ node: instance, entityUuid: scopeEntityUuid }) : true);
223
+ const instances = (0, recordGetters_1.getNodesByDefUuid)({ nodeDefUuid: pageNodeDefUuid })(record).filter((instance) => scopeEntityUuid ? nodeIsUnderEntity({ node: instance, entityUuid: scopeEntityUuid }) : true);
224
224
  if (instances.length === 0) {
225
225
  return { hasErrors: false, hasWarnings: false, isComplete: false };
226
226
  }
@@ -1 +1 @@
1
- {"version":3,"file":"recordPagesValidation.js","sourceRoot":"","sources":["../../../src/record/_records/recordPagesValidation.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, Nodes } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Survey, Surveys } from '../../survey'\nimport { Validations } from '../../validation'\nimport { ArenaRecord } from '../record'\nimport { RecordValidations } from '../recordValidations'\nimport { getEntityCompletionStats } from './recordCompletion'\nimport { getCycle, getNodeByUuid, getNodesByDefUuid, getRoot } from './recordGetters'\n\nexport type PageValidationStatus = {\n hasErrors: boolean\n hasWarnings: boolean\n}\n\nexport type EntitySubtreeStatus = {\n hasErrors: boolean\n hasWarnings: boolean\n isComplete: boolean\n}\n\nexport type PagesValidationProgress = {\n percent: number\n validCount: number\n totalCount: number\n}\n\n/**\n * Whether a node belongs under a page entity (itself or any descendant of that page).\n */\nexport const nodeBelongsToPage = (params: {\n node: ArenaRecordNode\n pageNodeDefUuid: string\n record: ArenaRecord\n}): boolean => {\n const { node, pageNodeDefUuid, record } = params\n if (node.nodeDefUuid === pageNodeDefUuid) return true\n return Nodes.getHierarchy(node).some((ancestorUuid) => {\n const ancestor = getNodeByUuid(ancestorUuid)(record)\n return ancestor?.nodeDefUuid === pageNodeDefUuid\n })\n}\n\n/**\n * Whether a node belongs to this page only — not to a nested descendant page entity.\n * When descendantPageUuids is empty, all nodes under the page hierarchy are included.\n */\nexport const nodeBelongsToOwnPage = (params: {\n node: ArenaRecordNode\n pageNodeDefUuid: string\n descendantPageUuids: string[]\n record: ArenaRecord\n}): boolean => {\n const { node, pageNodeDefUuid, descendantPageUuids, record } = params\n if (!nodeBelongsToPage({ node, pageNodeDefUuid, record })) return false\n if (descendantPageUuids.includes(node.nodeDefUuid)) return false\n return !descendantPageUuids.some((descendantUuid) =>\n nodeBelongsToPage({ node, pageNodeDefUuid: descendantUuid, record })\n )\n}\n\n/**\n * Child page-entity defs displayed in their own page under the given entity.\n */\nexport const getNodeDefChildrenInOwnPage = (params: {\n survey: Survey\n nodeDef: NodeDefEntity\n cycle: string\n}): NodeDefEntity[] => {\n const { survey, nodeDef, cycle } = params\n return Surveys.getNodeDefChildren({ survey, nodeDef, includeAnalysis: true }).filter(\n (child): child is NodeDefEntity => {\n if (!NodeDefs.isEntity(child)) return false\n return NodeDefs.isDisplayInOwnPage(cycle)(child as NodeDefEntity)\n }\n )\n}\n\n/**\n * Collects all page-entity node defs in the survey cycle (root + nested own-pages).\n */\nexport const getPageNodeDefs = (params: { survey: Survey; cycle: string }): NodeDefEntity[] => {\n const { survey, cycle } = params\n const root = Surveys.getNodeDefRoot({ survey }) as NodeDefEntity | undefined\n if (!root) return []\n\n const pages: NodeDefEntity[] = []\n const stack: NodeDefEntity[] = [root]\n while (stack.length > 0) {\n const current = stack.pop()\n if (!current) continue\n pages.push(current)\n stack.push(...getNodeDefChildrenInOwnPage({ survey, nodeDef: current, cycle }))\n }\n return pages\n}\n\n/**\n * Collects descendant page node def UUIDs under a page (not including the page itself).\n */\nexport const getDescendantPageNodeDefUuids = (params: {\n survey: Survey\n cycle: string\n pageNodeDef: NodeDefEntity\n}): string[] => {\n const { survey, cycle, pageNodeDef } = params\n const uuids: string[] = []\n const visit = (nodeDef: NodeDefEntity) => {\n const children = getNodeDefChildrenInOwnPage({ survey, nodeDef, cycle })\n for (const child of children) {\n uuids.push(child.uuid)\n visit(child)\n }\n }\n visit(pageNodeDef)\n return uuids\n}\n\nconst nodeIsUnderEntity = (params: { node: ArenaRecordNode; entityUuid: string }): boolean => {\n const { node, entityUuid } = params\n if (node.uuid === entityUuid) return true\n return Nodes.getHierarchy(node).includes(entityUuid)\n}\n\nconst getOwnPageFieldValidationFlags = (params: {\n nodeUuid: string\n pageNodeDefUuid: string\n descendantPageUuids: string[]\n scopeEntityUuid?: string\n record: ArenaRecord\n recordValidation: ReturnType<typeof Validations.getValidation>\n}): PageValidationStatus | null => {\n const { nodeUuid, pageNodeDefUuid, descendantPageUuids, scopeEntityUuid, record, recordValidation } = params\n\n if (RecordValidations.isValidationChildrenCountKey(nodeUuid)) {\n return getOwnPageChildrenCountValidationFlags({\n childrenCountKey: nodeUuid,\n pageNodeDefUuid,\n descendantPageUuids,\n scopeEntityUuid,\n record,\n recordValidation,\n })\n }\n\n const node = getNodeByUuid(nodeUuid)(record)\n if (!node || !nodeBelongsToOwnPage({ node, pageNodeDefUuid, descendantPageUuids, record })) return null\n if (scopeEntityUuid && !nodeIsUnderEntity({ node, entityUuid: scopeEntityUuid })) return null\n\n const nodeValidation = RecordValidations.getValidationNode({ nodeUuid })(recordValidation)\n if (!nodeValidation) return null\n\n return {\n hasErrors: Validations.hasErrors(nodeValidation),\n hasWarnings: Validations.hasWarnings(nodeValidation),\n }\n}\n\n/**\n * Children-count validations (file min count, inline multiple min/max, etc.) are keyed as\n * `childrenCount_{parentUuid}_{childDefUuid}`, not as node UUIDs.\n * Include them when the parent is on this page, but skip counts that refer to descendant\n * page entities (missing sub-page instances should not paint the parent page red).\n */\nconst getOwnPageChildrenCountValidationFlags = (params: {\n childrenCountKey: string\n pageNodeDefUuid: string\n descendantPageUuids: string[]\n scopeEntityUuid?: string\n record: ArenaRecord\n recordValidation: ReturnType<typeof Validations.getValidation>\n}): PageValidationStatus | null => {\n const { childrenCountKey, pageNodeDefUuid, descendantPageUuids, scopeEntityUuid, record, recordValidation } = params\n const parentUuid = RecordValidations.extractValidationChildrenCountKeyParentUuid(childrenCountKey)\n const childDefUuid = RecordValidations.extractValidationChildrenCountKeyNodeDefUuid(childrenCountKey)\n if (!parentUuid || !childDefUuid) return null\n\n // Sub-page entity min/max counts belong to navigation of nested pages, not this page's fields.\n if (descendantPageUuids.includes(childDefUuid)) return null\n\n const parentNode = getNodeByUuid(parentUuid)(record)\n if (!parentNode || !nodeBelongsToOwnPage({ node: parentNode, pageNodeDefUuid, descendantPageUuids, record })) {\n return null\n }\n if (scopeEntityUuid && !nodeIsUnderEntity({ node: parentNode, entityUuid: scopeEntityUuid })) return null\n\n const fieldValidation = Validations.getFieldValidation(childrenCountKey)(recordValidation)\n if (!fieldValidation) return null\n\n return {\n hasErrors: Validations.hasErrors(fieldValidation),\n hasWarnings: Validations.hasWarnings(fieldValidation),\n }\n}\n\n/**\n * Aggregates error/warning flags for a page.\n * When descendantPageUuids is non-empty, nested page entities are excluded (own-page scope).\n * When scopeEntityUuid is set, only validations for nodes under that entity instance are included.\n */\nexport const getPageValidationStatus = (params: {\n pageNodeDefUuid: string\n descendantPageUuids?: string[]\n record: ArenaRecord\n scopeEntityUuid?: string\n}): PageValidationStatus => {\n const { pageNodeDefUuid, descendantPageUuids = [], record, scopeEntityUuid } = params\n const recordValidation = Validations.getValidation(record)\n const fields = Validations.getFieldValidations(recordValidation)\n let hasErrors = false\n let hasWarnings = false\n\n for (const nodeUuid of Object.keys(fields)) {\n const flags = getOwnPageFieldValidationFlags({\n nodeUuid,\n pageNodeDefUuid,\n descendantPageUuids,\n scopeEntityUuid,\n record,\n recordValidation,\n })\n if (!flags) continue\n if (flags.hasErrors) hasErrors = true\n if (flags.hasWarnings) hasWarnings = true\n if (hasErrors && hasWarnings) break\n }\n\n return { hasErrors, hasWarnings }\n}\n\nconst aggregatePageValidationStatuses = (statuses: PageValidationStatus[]): PageValidationStatus => ({\n hasErrors: statuses.some((status) => status.hasErrors),\n hasWarnings: statuses.some((status) => status.hasWarnings),\n})\n\n/**\n * Validation and completion status for one entity instance and its descendant pages.\n * Returns null when the node is missing or is not an entity.\n */\nexport const getEntitySubtreeStatus = (params: {\n survey: Survey\n record: ArenaRecord\n entityUuid: string\n cycle?: string\n}): EntitySubtreeStatus | null => {\n const { survey, record, entityUuid } = params\n const entity = getNodeByUuid(entityUuid)(record)\n if (!entity) return null\n\n const entityDef = Surveys.getNodeDefByUuid({ survey, uuid: entity.nodeDefUuid })\n if (!NodeDefs.isEntity(entityDef)) return null\n\n const cycle = params.cycle ?? getCycle(record)\n const entityPageDef = entityDef as NodeDefEntity\n const descendantPageUuids = getDescendantPageNodeDefUuids({ survey, cycle, pageNodeDef: entityPageDef })\n const pageUuidsToCheck = [entity.nodeDefUuid, ...descendantPageUuids]\n\n const validationStatuses = pageUuidsToCheck.map((pageNodeDefUuid) => {\n const pageNodeDef = Surveys.getNodeDefByUuid({ survey, uuid: pageNodeDefUuid }) as NodeDefEntity\n const pageDescendantUuids = getDescendantPageNodeDefUuids({ survey, cycle, pageNodeDef })\n return getPageValidationStatus({\n pageNodeDefUuid,\n descendantPageUuids: pageDescendantUuids,\n record,\n scopeEntityUuid: entityUuid,\n })\n })\n\n const { hasErrors, hasWarnings } = aggregatePageValidationStatuses(validationStatuses)\n const { total, filled } = getEntityCompletionStats({ survey, record, entity })\n const isComplete = total > 0 && filled === total && !hasErrors && !hasWarnings\n\n return { hasErrors, hasWarnings, isComplete }\n}\n\n/**\n * Aggregates subtree status across instances of a multiple page entity.\n * When `scopeEntityUuid` is set, only instances under that ancestor entity are included\n * (needed for nested multiples, e.g. Tree under the currently selected Plot).\n * Empty instance lists return a non-complete status with no validation flags.\n */\nexport const getMultiplePageEntitiesStatus = (params: {\n survey: Survey\n record: ArenaRecord\n pageNodeDefUuid: string\n cycle?: string\n /** When set, only instances under this ancestor entity are aggregated. */\n scopeEntityUuid?: string\n}): EntitySubtreeStatus => {\n const { survey, record, pageNodeDefUuid, scopeEntityUuid } = params\n const instances = getNodesByDefUuid(pageNodeDefUuid)(record).filter((instance) =>\n scopeEntityUuid ? nodeIsUnderEntity({ node: instance, entityUuid: scopeEntityUuid }) : true\n )\n\n if (instances.length === 0) {\n return { hasErrors: false, hasWarnings: false, isComplete: false }\n }\n\n const instanceStatuses = instances\n .map((instance) => getEntitySubtreeStatus({ survey, record, entityUuid: instance.uuid, cycle: params.cycle }))\n .filter((status): status is EntitySubtreeStatus => status !== null)\n\n return {\n hasErrors: instanceStatuses.some((status) => status.hasErrors),\n hasWarnings: instanceStatuses.some((status) => status.hasWarnings),\n isComplete: instanceStatuses.length > 0 && instanceStatuses.every((status) => status.isComplete),\n }\n}\n\n/**\n * Whether the page has validation errors on its own fields (excluding nested page entities).\n */\nexport const pageHasOwnErrors = (params: {\n pageNodeDefUuid: string\n descendantPageUuids: string[]\n record: ArenaRecord\n}): boolean => getPageValidationStatus(params).hasErrors\n\n/**\n * Progress of pages without own-field validation errors over all survey pages.\n * Warnings do not reduce the score (matches Arena sidebar red-icon signal).\n */\nexport const getRecordPagesValidationProgress = (params: {\n survey: Survey\n record: ArenaRecord\n cycle?: string\n}): PagesValidationProgress | null => {\n const { survey, record } = params\n if (!getRoot(record)) return null\n\n const cycle = params.cycle ?? getCycle(record)\n const pageNodeDefs = getPageNodeDefs({ survey, cycle })\n const totalCount = pageNodeDefs.length\n if (totalCount === 0) return null\n\n let validCount = 0\n for (const pageNodeDef of pageNodeDefs) {\n const pageNodeDefUuid = pageNodeDef.uuid\n const descendantPageUuids = getDescendantPageNodeDefUuids({ survey, cycle, pageNodeDef })\n if (!pageHasOwnErrors({ pageNodeDefUuid, descendantPageUuids, record })) {\n validCount += 1\n }\n }\n\n const percent = Math.round((validCount / totalCount) * 100)\n return { percent, validCount, totalCount }\n}\n"]}
1
+ {"version":3,"file":"recordPagesValidation.js","sourceRoot":"","sources":["../../../src/record/_records/recordPagesValidation.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, Nodes } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Survey, Surveys } from '../../survey'\nimport { Validations } from '../../validation'\nimport { ArenaRecord } from '../record'\nimport { RecordValidations } from '../recordValidations'\nimport { getEntityCompletionStats } from './recordCompletion'\nimport { getCycle, getNodeByUuid, getNodesByDefUuid, getRoot } from './recordGetters'\n\nexport type PageValidationStatus = {\n hasErrors: boolean\n hasWarnings: boolean\n}\n\nexport type EntitySubtreeStatus = {\n hasErrors: boolean\n hasWarnings: boolean\n isComplete: boolean\n}\n\nexport type PagesValidationProgress = {\n percent: number\n validCount: number\n totalCount: number\n}\n\n/**\n * Whether a node belongs under a page entity (itself or any descendant of that page).\n */\nexport const nodeBelongsToPage = (params: {\n node: ArenaRecordNode\n pageNodeDefUuid: string\n record: ArenaRecord\n}): boolean => {\n const { node, pageNodeDefUuid, record } = params\n if (node.nodeDefUuid === pageNodeDefUuid) return true\n return Nodes.getHierarchy(node).some((ancestorUuid) => {\n const ancestor = getNodeByUuid({ uuid: ancestorUuid })(record)\n return ancestor?.nodeDefUuid === pageNodeDefUuid\n })\n}\n\n/**\n * Whether a node belongs to this page only — not to a nested descendant page entity.\n * When descendantPageUuids is empty, all nodes under the page hierarchy are included.\n */\nexport const nodeBelongsToOwnPage = (params: {\n node: ArenaRecordNode\n pageNodeDefUuid: string\n descendantPageUuids: string[]\n record: ArenaRecord\n}): boolean => {\n const { node, pageNodeDefUuid, descendantPageUuids, record } = params\n if (!nodeBelongsToPage({ node, pageNodeDefUuid, record })) return false\n if (descendantPageUuids.includes(node.nodeDefUuid)) return false\n return !descendantPageUuids.some((descendantUuid) =>\n nodeBelongsToPage({ node, pageNodeDefUuid: descendantUuid, record })\n )\n}\n\n/**\n * Child page-entity defs displayed in their own page under the given entity.\n */\nexport const getNodeDefChildrenInOwnPage = (params: {\n survey: Survey\n nodeDef: NodeDefEntity\n cycle: string\n}): NodeDefEntity[] => {\n const { survey, nodeDef, cycle } = params\n return Surveys.getNodeDefChildren({ survey, nodeDef, includeAnalysis: true }).filter(\n (child): child is NodeDefEntity => {\n if (!NodeDefs.isEntity(child)) return false\n return NodeDefs.isDisplayInOwnPage(cycle)(child as NodeDefEntity)\n }\n )\n}\n\n/**\n * Collects all page-entity node defs in the survey cycle (root + nested own-pages).\n */\nexport const getPageNodeDefs = (params: { survey: Survey; cycle: string }): NodeDefEntity[] => {\n const { survey, cycle } = params\n const root = Surveys.getNodeDefRoot({ survey }) as NodeDefEntity | undefined\n if (!root) return []\n\n const pages: NodeDefEntity[] = []\n const stack: NodeDefEntity[] = [root]\n while (stack.length > 0) {\n const current = stack.pop()\n if (!current) continue\n pages.push(current)\n stack.push(...getNodeDefChildrenInOwnPage({ survey, nodeDef: current, cycle }))\n }\n return pages\n}\n\n/**\n * Collects descendant page node def UUIDs under a page (not including the page itself).\n */\nexport const getDescendantPageNodeDefUuids = (params: {\n survey: Survey\n cycle: string\n pageNodeDef: NodeDefEntity\n}): string[] => {\n const { survey, cycle, pageNodeDef } = params\n const uuids: string[] = []\n const visit = (nodeDef: NodeDefEntity) => {\n const children = getNodeDefChildrenInOwnPage({ survey, nodeDef, cycle })\n for (const child of children) {\n uuids.push(child.uuid)\n visit(child)\n }\n }\n visit(pageNodeDef)\n return uuids\n}\n\nconst nodeIsUnderEntity = (params: { node: ArenaRecordNode; entityUuid: string }): boolean => {\n const { node, entityUuid } = params\n if (node.uuid === entityUuid) return true\n return Nodes.getHierarchy(node).includes(entityUuid)\n}\n\nconst getOwnPageFieldValidationFlags = (params: {\n nodeUuid: string\n pageNodeDefUuid: string\n descendantPageUuids: string[]\n scopeEntityUuid?: string\n record: ArenaRecord\n recordValidation: ReturnType<typeof Validations.getValidation>\n}): PageValidationStatus | null => {\n const { nodeUuid, pageNodeDefUuid, descendantPageUuids, scopeEntityUuid, record, recordValidation } = params\n\n if (RecordValidations.isValidationChildrenCountKey(nodeUuid)) {\n return getOwnPageChildrenCountValidationFlags({\n childrenCountKey: nodeUuid,\n pageNodeDefUuid,\n descendantPageUuids,\n scopeEntityUuid,\n record,\n recordValidation,\n })\n }\n\n const node = getNodeByUuid({ uuid: nodeUuid })(record)\n if (!node || !nodeBelongsToOwnPage({ node, pageNodeDefUuid, descendantPageUuids, record })) return null\n if (scopeEntityUuid && !nodeIsUnderEntity({ node, entityUuid: scopeEntityUuid })) return null\n\n const nodeValidation = RecordValidations.getValidationNode({ nodeUuid })(recordValidation)\n if (!nodeValidation) return null\n\n return {\n hasErrors: Validations.hasErrors(nodeValidation),\n hasWarnings: Validations.hasWarnings(nodeValidation),\n }\n}\n\n/**\n * Children-count validations (file min count, inline multiple min/max, etc.) are keyed as\n * `childrenCount_{parentUuid}_{childDefUuid}`, not as node UUIDs.\n * Include them when the parent is on this page, but skip counts that refer to descendant\n * page entities (missing sub-page instances should not paint the parent page red).\n */\nconst getOwnPageChildrenCountValidationFlags = (params: {\n childrenCountKey: string\n pageNodeDefUuid: string\n descendantPageUuids: string[]\n scopeEntityUuid?: string\n record: ArenaRecord\n recordValidation: ReturnType<typeof Validations.getValidation>\n}): PageValidationStatus | null => {\n const { childrenCountKey, pageNodeDefUuid, descendantPageUuids, scopeEntityUuid, record, recordValidation } = params\n const parentUuid = RecordValidations.extractValidationChildrenCountKeyParentUuid(childrenCountKey)\n const childDefUuid = RecordValidations.extractValidationChildrenCountKeyNodeDefUuid(childrenCountKey)\n if (!parentUuid || !childDefUuid) return null\n\n // Sub-page entity min/max counts belong to navigation of nested pages, not this page's fields.\n if (descendantPageUuids.includes(childDefUuid)) return null\n\n const parentNode = getNodeByUuid({ uuid: parentUuid })(record)\n if (!parentNode || !nodeBelongsToOwnPage({ node: parentNode, pageNodeDefUuid, descendantPageUuids, record })) {\n return null\n }\n if (scopeEntityUuid && !nodeIsUnderEntity({ node: parentNode, entityUuid: scopeEntityUuid })) return null\n\n const fieldValidation = Validations.getFieldValidation(childrenCountKey)(recordValidation)\n if (!fieldValidation) return null\n\n return {\n hasErrors: Validations.hasErrors(fieldValidation),\n hasWarnings: Validations.hasWarnings(fieldValidation),\n }\n}\n\n/**\n * Aggregates error/warning flags for a page.\n * When descendantPageUuids is non-empty, nested page entities are excluded (own-page scope).\n * When scopeEntityUuid is set, only validations for nodes under that entity instance are included.\n */\nexport const getPageValidationStatus = (params: {\n pageNodeDefUuid: string\n descendantPageUuids?: string[]\n record: ArenaRecord\n scopeEntityUuid?: string\n}): PageValidationStatus => {\n const { pageNodeDefUuid, descendantPageUuids = [], record, scopeEntityUuid } = params\n const recordValidation = Validations.getValidation(record)\n const fields = Validations.getFieldValidations(recordValidation)\n let hasErrors = false\n let hasWarnings = false\n\n for (const nodeUuid of Object.keys(fields)) {\n const flags = getOwnPageFieldValidationFlags({\n nodeUuid,\n pageNodeDefUuid,\n descendantPageUuids,\n scopeEntityUuid,\n record,\n recordValidation,\n })\n if (!flags) continue\n if (flags.hasErrors) hasErrors = true\n if (flags.hasWarnings) hasWarnings = true\n if (hasErrors && hasWarnings) break\n }\n\n return { hasErrors, hasWarnings }\n}\n\nconst aggregatePageValidationStatuses = (statuses: PageValidationStatus[]): PageValidationStatus => ({\n hasErrors: statuses.some((status) => status.hasErrors),\n hasWarnings: statuses.some((status) => status.hasWarnings),\n})\n\n/**\n * Validation and completion status for one entity instance and its descendant pages.\n * Returns null when the node is missing or is not an entity.\n */\nexport const getEntitySubtreeStatus = (params: {\n survey: Survey\n record: ArenaRecord\n entityUuid: string\n cycle?: string\n}): EntitySubtreeStatus | null => {\n const { survey, record, entityUuid } = params\n const entity = getNodeByUuid({ uuid: entityUuid })(record)\n if (!entity) return null\n\n const entityDef = Surveys.getNodeDefByUuid({ survey, uuid: entity.nodeDefUuid })\n if (!NodeDefs.isEntity(entityDef)) return null\n\n const cycle = params.cycle ?? getCycle(record)\n const entityPageDef = entityDef as NodeDefEntity\n const descendantPageUuids = getDescendantPageNodeDefUuids({ survey, cycle, pageNodeDef: entityPageDef })\n const pageUuidsToCheck = [entity.nodeDefUuid, ...descendantPageUuids]\n\n const validationStatuses = pageUuidsToCheck.map((pageNodeDefUuid) => {\n const pageNodeDef = Surveys.getNodeDefByUuid({ survey, uuid: pageNodeDefUuid }) as NodeDefEntity\n const pageDescendantUuids = getDescendantPageNodeDefUuids({ survey, cycle, pageNodeDef })\n return getPageValidationStatus({\n pageNodeDefUuid,\n descendantPageUuids: pageDescendantUuids,\n record,\n scopeEntityUuid: entityUuid,\n })\n })\n\n const { hasErrors, hasWarnings } = aggregatePageValidationStatuses(validationStatuses)\n const { total, filled } = getEntityCompletionStats({ survey, record, entity })\n const isComplete = total > 0 && filled === total && !hasErrors && !hasWarnings\n\n return { hasErrors, hasWarnings, isComplete }\n}\n\n/**\n * Aggregates subtree status across instances of a multiple page entity.\n * When `scopeEntityUuid` is set, only instances under that ancestor entity are included\n * (needed for nested multiples, e.g. Tree under the currently selected Plot).\n * Empty instance lists return a non-complete status with no validation flags.\n */\nexport const getMultiplePageEntitiesStatus = (params: {\n survey: Survey\n record: ArenaRecord\n pageNodeDefUuid: string\n cycle?: string\n /** When set, only instances under this ancestor entity are aggregated. */\n scopeEntityUuid?: string\n}): EntitySubtreeStatus => {\n const { survey, record, pageNodeDefUuid, scopeEntityUuid } = params\n const instances = getNodesByDefUuid({ nodeDefUuid: pageNodeDefUuid })(record).filter((instance) =>\n scopeEntityUuid ? nodeIsUnderEntity({ node: instance, entityUuid: scopeEntityUuid }) : true\n )\n\n if (instances.length === 0) {\n return { hasErrors: false, hasWarnings: false, isComplete: false }\n }\n\n const instanceStatuses = instances\n .map((instance) => getEntitySubtreeStatus({ survey, record, entityUuid: instance.uuid, cycle: params.cycle }))\n .filter((status): status is EntitySubtreeStatus => status !== null)\n\n return {\n hasErrors: instanceStatuses.some((status) => status.hasErrors),\n hasWarnings: instanceStatuses.some((status) => status.hasWarnings),\n isComplete: instanceStatuses.length > 0 && instanceStatuses.every((status) => status.isComplete),\n }\n}\n\n/**\n * Whether the page has validation errors on its own fields (excluding nested page entities).\n */\nexport const pageHasOwnErrors = (params: {\n pageNodeDefUuid: string\n descendantPageUuids: string[]\n record: ArenaRecord\n}): boolean => getPageValidationStatus(params).hasErrors\n\n/**\n * Progress of pages without own-field validation errors over all survey pages.\n * Warnings do not reduce the score (matches Arena sidebar red-icon signal).\n */\nexport const getRecordPagesValidationProgress = (params: {\n survey: Survey\n record: ArenaRecord\n cycle?: string\n}): PagesValidationProgress | null => {\n const { survey, record } = params\n if (!getRoot(record)) return null\n\n const cycle = params.cycle ?? getCycle(record)\n const pageNodeDefs = getPageNodeDefs({ survey, cycle })\n const totalCount = pageNodeDefs.length\n if (totalCount === 0) return null\n\n let validCount = 0\n for (const pageNodeDef of pageNodeDefs) {\n const pageNodeDefUuid = pageNodeDef.uuid\n const descendantPageUuids = getDescendantPageNodeDefUuids({ survey, cycle, pageNodeDef })\n if (!pageHasOwnErrors({ pageNodeDefUuid, descendantPageUuids, record })) {\n validCount += 1\n }\n }\n\n const percent = Math.round((validCount / totalCount) * 100)\n return { percent, validCount, totalCount }\n}\n"]}
@@ -25,12 +25,8 @@ const findDependentEnumeratedEntityDefs = (params) => {
25
25
  };
26
26
  const hasNodeNonEmptyDescendants = (params) => {
27
27
  const { record, parentNode, nodeDefDescendant } = params;
28
- const descendants = (0, recordGetters_1.getDescendantsOrSelf)({
29
- record,
30
- node: parentNode !== null && parentNode !== void 0 ? parentNode : (0, recordGetters_1.getRoot)(record),
31
- nodeDefDescendant,
32
- });
33
- const nonEmptyDescendants = descendants.filter((dependentEntity) => (0, recordGetters_1.getChildren)(dependentEntity)(record).some((childNode) => (0, recordGetters_1.isNodeFilledByUser)(childNode)(record)));
28
+ const descendants = (0, recordGetters_1.getDescendantsOrSelf)({ node: parentNode !== null && parentNode !== void 0 ? parentNode : (0, recordGetters_1.getRoot)(record), nodeDefDescendant })(record);
29
+ const nonEmptyDescendants = descendants.filter((dependentEntity) => (0, recordGetters_1.getChildren)({ parentNode: dependentEntity })(record).some((childNode) => (0, recordGetters_1.isNodeFilledByUser)({ node: childNode })(record)));
34
30
  return nonEmptyDescendants.length > 0;
35
31
  };
36
32
  const findDependentEnumeratedEntityDefsNotEmpty = (params) => (record) => {
@@ -38,7 +34,7 @@ const findDependentEnumeratedEntityDefsNotEmpty = (params) => (record) => {
38
34
  const dependentEnumeratedEntityDefs = findDependentEnumeratedEntityDefs({ survey, nodeDef });
39
35
  if (dependentEnumeratedEntityDefs.length === 0)
40
36
  return [];
41
- const parentNode = (0, recordGetters_1.getParent)(node)(record);
37
+ const parentNode = (0, recordGetters_1.getParent)({ node })(record);
42
38
  return dependentEnumeratedEntityDefs.filter((dependentEnumeratedEntityDef) => hasNodeNonEmptyDescendants({ record, parentNode, nodeDefDescendant: dependentEnumeratedEntityDef }));
43
39
  };
44
40
  exports.findDependentEnumeratedEntityDefsNotEmpty = findDependentEnumeratedEntityDefsNotEmpty;
@@ -1 +1 @@
1
- {"version":3,"file":"recordUtils.js","sourceRoot":"","sources":["../../../src/record/_records/recordUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { CategoryItem } from '../../category'\nimport { ArenaRecordNode, NodeValues } from '../../node'\nimport { NodeDef, NodeDefCode, NodeDefEntity, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { Survey, Surveys } from '../../survey'\nimport { ArenaRecord } from '../record'\nimport {\n getChildren,\n getDescendantsOrSelf,\n getParent,\n getParentCodeAttribute,\n getRoot,\n isNodeFilledByUser,\n} from './recordGetters'\n\nconst findDependentEnumeratedEntityDefs = (params: { survey: Survey; nodeDef: NodeDef<any> }): NodeDefEntity[] => {\n const { survey, nodeDef } = params\n const dependentEnumeratedEntityDefs =\n NodeDefs.getType(nodeDef) === NodeDefType.code\n ? Surveys.getDependentEnumeratedEntityDefs({ survey, nodeDef: nodeDef as NodeDefCode })\n : []\n\n const applicableDependentEnumeratedEntityDefs = Surveys.findApplicableDependentEnumeratedEntityDefs(nodeDef)(survey)\n dependentEnumeratedEntityDefs.push(...applicableDependentEnumeratedEntityDefs)\n\n return dependentEnumeratedEntityDefs\n}\n\nconst hasNodeNonEmptyDescendants = (params: {\n record: ArenaRecord\n parentNode: ArenaRecordNode | undefined\n nodeDefDescendant: NodeDefEntity\n}): boolean => {\n const { record, parentNode, nodeDefDescendant } = params\n const descendants = getDescendantsOrSelf({\n record,\n node: parentNode ?? getRoot(record)!,\n nodeDefDescendant,\n })\n const nonEmptyDescendants = descendants.filter((dependentEntity) =>\n getChildren(dependentEntity)(record).some((childNode) => isNodeFilledByUser(childNode)(record))\n )\n return nonEmptyDescendants.length > 0\n}\n\nexport const findDependentEnumeratedEntityDefsNotEmpty =\n (params: { survey: Survey; node: ArenaRecordNode; nodeDef: NodeDef<any> }) => (record: ArenaRecord) => {\n const { survey, node, nodeDef } = params\n const dependentEnumeratedEntityDefs = findDependentEnumeratedEntityDefs({ survey, nodeDef })\n if (dependentEnumeratedEntityDefs.length === 0) return []\n\n const parentNode = getParent(node)(record)\n\n return dependentEnumeratedEntityDefs.filter((dependentEnumeratedEntityDef) =>\n hasNodeNonEmptyDescendants({ record, parentNode, nodeDefDescendant: dependentEnumeratedEntityDef })\n )\n }\n\nexport const getEnumeratingCategoryItems =\n (params: {\n survey: Survey\n enumeratorDef: NodeDefCode\n parentNode: ArenaRecordNode\n categoryItemProvider?: CategoryItemProvider\n allowedCodes?: Set<string>\n }) =>\n async (record: ArenaRecord): Promise<CategoryItem[]> => {\n const { survey, enumeratorDef, parentNode, categoryItemProvider, allowedCodes } = params\n const categoryUuid = NodeDefs.getCategoryUuid(enumeratorDef)\n if (!categoryUuid) return []\n const category = Surveys.getCategoryByUuid({ survey, categoryUuid })\n if (!category) return []\n\n let parentItemUuid\n const parentCodeDefUuid = NodeDefs.getParentCodeDefUuid(enumeratorDef)\n if (parentCodeDefUuid) {\n const parentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef: enumeratorDef })(record)\n parentItemUuid = parentCodeAttribute ? NodeValues.getItemUuid(parentCodeAttribute) : null\n if (!parentItemUuid) return []\n }\n let items = Surveys.getEnumeratingCategoryItems({ survey, enumerator: enumeratorDef, parentItemUuid })\n if (items.length === 0 && categoryItemProvider) {\n items = await categoryItemProvider.getItems({ survey, categoryUuid, parentItemUuid, draft: !!record.preview })\n }\n if (allowedCodes) {\n items = items.filter((item) => item.props.code != null && allowedCodes.has(item.props.code))\n }\n return items\n }\n"]}
1
+ {"version":3,"file":"recordUtils.js","sourceRoot":"","sources":["../../../src/record/_records/recordUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { CategoryItem } from '../../category'\nimport { ArenaRecordNode, NodeValues } from '../../node'\nimport { NodeDef, NodeDefCode, NodeDefEntity, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { Survey, Surveys } from '../../survey'\nimport { ArenaRecord } from '../record'\nimport {\n getChildren,\n getDescendantsOrSelf,\n getParent,\n getParentCodeAttribute,\n getRoot,\n isNodeFilledByUser,\n} from './recordGetters'\n\nconst findDependentEnumeratedEntityDefs = (params: { survey: Survey; nodeDef: NodeDef<any> }): NodeDefEntity[] => {\n const { survey, nodeDef } = params\n const dependentEnumeratedEntityDefs =\n NodeDefs.getType(nodeDef) === NodeDefType.code\n ? Surveys.getDependentEnumeratedEntityDefs({ survey, nodeDef: nodeDef as NodeDefCode })\n : []\n\n const applicableDependentEnumeratedEntityDefs = Surveys.findApplicableDependentEnumeratedEntityDefs(nodeDef)(survey)\n dependentEnumeratedEntityDefs.push(...applicableDependentEnumeratedEntityDefs)\n\n return dependentEnumeratedEntityDefs\n}\n\nconst hasNodeNonEmptyDescendants = (params: {\n record: ArenaRecord\n parentNode: ArenaRecordNode | undefined\n nodeDefDescendant: NodeDefEntity\n}): boolean => {\n const { record, parentNode, nodeDefDescendant } = params\n const descendants = getDescendantsOrSelf({ node: parentNode ?? getRoot(record)!, nodeDefDescendant })(record)\n const nonEmptyDescendants = descendants.filter((dependentEntity) =>\n getChildren({ parentNode: dependentEntity })(record).some((childNode) =>\n isNodeFilledByUser({ node: childNode })(record)\n )\n )\n return nonEmptyDescendants.length > 0\n}\n\nexport const findDependentEnumeratedEntityDefsNotEmpty =\n (params: { survey: Survey; node: ArenaRecordNode; nodeDef: NodeDef<any> }) => (record: ArenaRecord) => {\n const { survey, node, nodeDef } = params\n const dependentEnumeratedEntityDefs = findDependentEnumeratedEntityDefs({ survey, nodeDef })\n if (dependentEnumeratedEntityDefs.length === 0) return []\n\n const parentNode = getParent({ node })(record)\n\n return dependentEnumeratedEntityDefs.filter((dependentEnumeratedEntityDef) =>\n hasNodeNonEmptyDescendants({ record, parentNode, nodeDefDescendant: dependentEnumeratedEntityDef })\n )\n }\n\nexport const getEnumeratingCategoryItems =\n (params: {\n survey: Survey\n enumeratorDef: NodeDefCode\n parentNode: ArenaRecordNode\n categoryItemProvider?: CategoryItemProvider\n allowedCodes?: Set<string>\n }) =>\n async (record: ArenaRecord): Promise<CategoryItem[]> => {\n const { survey, enumeratorDef, parentNode, categoryItemProvider, allowedCodes } = params\n const categoryUuid = NodeDefs.getCategoryUuid(enumeratorDef)\n if (!categoryUuid) return []\n const category = Surveys.getCategoryByUuid({ survey, categoryUuid })\n if (!category) return []\n\n let parentItemUuid\n const parentCodeDefUuid = NodeDefs.getParentCodeDefUuid(enumeratorDef)\n if (parentCodeDefUuid) {\n const parentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef: enumeratorDef })(record)\n parentItemUuid = parentCodeAttribute ? NodeValues.getItemUuid(parentCodeAttribute) : null\n if (!parentItemUuid) return []\n }\n let items = Surveys.getEnumeratingCategoryItems({ survey, enumerator: enumeratorDef, parentItemUuid })\n if (items.length === 0 && categoryItemProvider) {\n items = await categoryItemProvider.getItems({ survey, categoryUuid, parentItemUuid, draft: !!record.preview })\n }\n if (allowedCodes) {\n items = items.filter((item) => item.props.code != null && allowedCodes.has(item.props.code))\n }\n return items\n }\n"]}
@@ -4,7 +4,7 @@ exports.NodePointers = void 0;
4
4
  const records_1 = require("./records");
5
5
  const getNodesFromNodePointers = (params) => {
6
6
  const { record, nodePointers } = params;
7
- return nodePointers.flatMap((nodePointer) => records_1.Records.getChildren(nodePointer.nodeCtx, nodePointer.nodeDef.uuid)(record));
7
+ return nodePointers.flatMap((nodePointer) => records_1.Records.getChildren({ parentNode: nodePointer.nodeCtx, childDefUuid: nodePointer.nodeDef.uuid })(record));
8
8
  };
9
9
  const getNodesMapFromNodePointers = (params) => {
10
10
  const nodes = getNodesFromNodePointers(params);
@@ -1 +1 @@
1
- {"version":3,"file":"nodePointers.js","sourceRoot":"","sources":["../../src/record/nodePointers.ts"],"names":[],"mappings":";;;AAEA,uCAAmC;AAEnC,MAAM,wBAAwB,GAAG,CAAC,MAA4D,EAAqB,EAAE;IACnH,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAEvC,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAC1C,iBAAO,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAC3E,CAAA;AACH,CAAC,CAAA;AAED,MAAM,2BAA2B,GAAG,CAAC,MAGpC,EAAsC,EAAE;IACvC,MAAM,KAAK,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAuC,EAAE,CAAA;IACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC5B,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAEY,QAAA,YAAY,GAAG;IAC1B,wBAAwB;IACxB,2BAA2B;CAC5B,CAAA","sourcesContent":["import { ArenaRecordNode, NodePointer } from '../node'\nimport { ArenaRecord } from './record'\nimport { Records } from './records'\n\nconst getNodesFromNodePointers = (params: { record: ArenaRecord; nodePointers: NodePointer[] }): ArenaRecordNode[] => {\n const { record, nodePointers } = params\n\n return nodePointers.flatMap((nodePointer) =>\n Records.getChildren(nodePointer.nodeCtx, nodePointer.nodeDef.uuid)(record)\n )\n}\n\nconst getNodesMapFromNodePointers = (params: {\n record: ArenaRecord\n nodePointers: NodePointer[]\n}): { [key: string]: ArenaRecordNode } => {\n const nodes = getNodesFromNodePointers(params)\n const nodesMap: { [key: string]: ArenaRecordNode } = {}\n for (const node of nodes) {\n nodesMap[node.uuid] = node\n }\n return nodesMap\n}\n\nexport const NodePointers = {\n getNodesFromNodePointers,\n getNodesMapFromNodePointers,\n}\n"]}
1
+ {"version":3,"file":"nodePointers.js","sourceRoot":"","sources":["../../src/record/nodePointers.ts"],"names":[],"mappings":";;;AAEA,uCAAmC;AAEnC,MAAM,wBAAwB,GAAG,CAAC,MAA4D,EAAqB,EAAE;IACnH,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAEvC,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAC1C,iBAAO,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CACzG,CAAA;AACH,CAAC,CAAA;AAED,MAAM,2BAA2B,GAAG,CAAC,MAGpC,EAAsC,EAAE;IACvC,MAAM,KAAK,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAuC,EAAE,CAAA;IACvD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC5B,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAEY,QAAA,YAAY,GAAG;IAC1B,wBAAwB;IACxB,2BAA2B;CAC5B,CAAA","sourcesContent":["import { ArenaRecordNode, NodePointer } from '../node'\nimport { ArenaRecord } from './record'\nimport { Records } from './records'\n\nconst getNodesFromNodePointers = (params: { record: ArenaRecord; nodePointers: NodePointer[] }): ArenaRecordNode[] => {\n const { record, nodePointers } = params\n\n return nodePointers.flatMap((nodePointer) =>\n Records.getChildren({ parentNode: nodePointer.nodeCtx, childDefUuid: nodePointer.nodeDef.uuid })(record)\n )\n}\n\nconst getNodesMapFromNodePointers = (params: {\n record: ArenaRecord\n nodePointers: NodePointer[]\n}): { [key: string]: ArenaRecordNode } => {\n const nodes = getNodesFromNodePointers(params)\n const nodesMap: { [key: string]: ArenaRecordNode } = {}\n for (const node of nodes) {\n nodesMap[node.uuid] = node\n }\n return nodesMap\n}\n\nexport const NodePointers = {\n getNodesFromNodePointers,\n getNodesMapFromNodePointers,\n}\n"]}
@@ -131,7 +131,7 @@ const removeExcludedNodes = (params) => {
131
131
  if (!nodeDef_1.NodeDefs.isInCycle(cycle)(nodeDef) ||
132
132
  nodeDef_1.NodeDefs.isExcludedInClone(nodeDef) ||
133
133
  hasAncestorCodeDefExcludedInClone) {
134
- const nodesToDelete = records_1.Records.getNodesByDefUuid(nodeDef.uuid)(result.record);
134
+ const nodesToDelete = records_1.Records.getNodesByDefUuid({ nodeDefUuid: nodeDef.uuid })(result.record);
135
135
  if (nodesToDelete.length > 0) {
136
136
  const partialUpdateResult = records_1.Records.deleteNodes(nodesToDelete.map((node) => node.uuid), { sideEffect })(result.record);
137
137
  result.merge(partialUpdateResult);
@@ -1 +1 @@
1
- {"version":3,"file":"recordCloner.js","sourceRoot":"","sources":["../../src/record/recordCloner.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodeValues, Nodes } from '../node'\nimport { NodeKeys, NodeMetaKeys } from '../node/node'\nimport { NodeDefCode, NodeDefType, NodeDefs } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Dates, Objects, UUIDs } from '../utils'\nimport { Validation } from '../validation'\nimport { ArenaRecord } from './record'\nimport { RecordFixer } from './recordFixer'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { RecordValidations } from './recordValidations'\nimport { Records } from './records'\n\ntype OldUuidToNewUuidMap = {\n [key: string]: string\n}\n\nconst assignNewUuidsToNodes = (params: {\n record: ArenaRecord\n sideEffect: boolean\n}): { newNodeUuidsByOldUuid: OldUuidToNewUuidMap; newFileUuidsByOldUuid: OldUuidToNewUuidMap; record: ArenaRecord } => {\n const { record, sideEffect } = params\n\n // generate a new uuid for each node\n const newNodeUuidsByOldUuid: OldUuidToNewUuidMap = {}\n const newFileUuidsByOldUuid: OldUuidToNewUuidMap = {}\n\n // sort nodes before removing the id, to preserve their hierarchy (faster than comparing each meta.h property)\n const nodesArray = Records.getNodesArray(record).sort(\n (nodeA: ArenaRecordNode, nodeB: ArenaRecordNode): number =>\n Nodes.getHierarchy(nodeA).length - Nodes.getHierarchy(nodeB).length\n )\n\n const recordUpdated = sideEffect ? record : { ...record }\n\n const nodes = recordUpdated.nodes ?? {}\n const nodesUpdated = sideEffect ? nodes : { ...nodes }\n\n // update nodes recordUuid and properties (it does side effect on nodes)\n nodesArray.forEach((node) => {\n let nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.recordUuid = record.uuid\n nodeUpdated.dateCreated = nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n\n const oldUuid = node.uuid\n const newUuid = UUIDs.v4()\n newNodeUuidsByOldUuid[oldUuid] = newUuid\n\n nodeUpdated.uuid = newUuid\n // consider every node as just created node\n delete nodeUpdated.id\n nodeUpdated.created = true // this flag will be used by the RDB generator)\n\n // update internal node uuids, meta hierarchy, file uuid (if any)\n const parentUuid = node.parentUuid\n if (parentUuid) {\n nodeUpdated.parentUuid = newNodeUuidsByOldUuid[parentUuid]\n }\n const hierarchy = node.meta?.h ?? []\n if (hierarchy.length > 0) {\n const hierarchyUpdated = hierarchy.map((ancestorUuid) => newNodeUuidsByOldUuid[ancestorUuid])\n nodeUpdated = Objects.assocPath({\n obj: nodeUpdated,\n path: [NodeKeys.meta, NodeMetaKeys.h],\n value: hierarchyUpdated,\n sideEffect,\n })\n }\n // assign new file uuid (file should be cloned elsewhere)\n const fileUuid = NodeValues.getFileUuid(node)\n if (fileUuid) {\n const newFileUuid = UUIDs.v4()\n nodeUpdated = Objects.assocPath({\n obj: nodeUpdated,\n path: [NodeKeys.value, NodeValues.ValuePropsFile.fileUuid],\n value: newFileUuid,\n })\n newFileUuidsByOldUuid[fileUuid] = newFileUuid\n }\n\n delete nodesUpdated[oldUuid]\n nodesUpdated[newUuid] = nodeUpdated\n })\n\n recordUpdated.nodes = nodesUpdated\n\n return { newNodeUuidsByOldUuid, newFileUuidsByOldUuid, record: recordUpdated }\n}\n\nconst assignNewUuidsToValidation = (params: {\n validation: Validation\n newNodeUuidsByOldUuid: OldUuidToNewUuidMap\n sideEffect: boolean\n}): Validation => {\n const { validation, newNodeUuidsByOldUuid, sideEffect } = params\n\n const validationFields = validation?.fields\n if (!validationFields) return validation\n\n const validationFieldsUpdated = sideEffect ? validationFields : { ...validationFields }\n\n Object.entries(validationFields).forEach(([oldFieldKey, validationField]) => {\n let newFieldKey\n if (oldFieldKey.startsWith(RecordValidations.prefixValidationFieldChildrenCount)) {\n const oldParentUuid = oldFieldKey.substring(\n RecordValidations.prefixValidationFieldChildrenCount.length,\n oldFieldKey.lastIndexOf('_')\n )\n const newParentUuid = newNodeUuidsByOldUuid[oldParentUuid]\n newFieldKey = oldFieldKey.replace(oldParentUuid, newParentUuid)\n } else {\n newFieldKey = newNodeUuidsByOldUuid[oldFieldKey]\n }\n if (newFieldKey) {\n validationFieldsUpdated[newFieldKey] = validationField\n }\n delete validationFieldsUpdated[oldFieldKey]\n })\n return Objects.assoc({\n obj: validation,\n prop: 'fields',\n value: validationFieldsUpdated,\n sideEffect,\n })\n}\n\nconst assignNewUuids = (params: {\n record: ArenaRecord\n sideEffect: boolean\n}): { newNodeUuidsByOldUuid: OldUuidToNewUuidMap; newFileUuidsByOldUuid: OldUuidToNewUuidMap; record: ArenaRecord } => {\n const { record, sideEffect } = params\n let recordUpdated = sideEffect ? record : { ...record }\n recordUpdated.uuid = UUIDs.v4()\n\n const {\n newNodeUuidsByOldUuid,\n newFileUuidsByOldUuid,\n record: recordUpdatedUuids,\n } = assignNewUuidsToNodes({ record: recordUpdated, sideEffect })\n\n recordUpdated = recordUpdatedUuids\n\n const { validation } = recordUpdated\n if (validation) {\n const validationUpdated = assignNewUuidsToValidation({\n validation,\n newNodeUuidsByOldUuid,\n sideEffect,\n })\n recordUpdated = Objects.assoc({ obj: recordUpdated, prop: 'validation', value: validationUpdated, sideEffect })\n }\n // re-build nodes index\n const nodes = recordUpdated.nodes!\n delete recordUpdated._nodesIndex\n delete recordUpdated.nodes\n recordUpdated = Records.addNodes(nodes, { sideEffect, sortNodes: true })(recordUpdated)\n\n return { newNodeUuidsByOldUuid, newFileUuidsByOldUuid, record: recordUpdated }\n}\n\nconst removeExcludedNodes = (params: {\n survey: Survey\n record: ArenaRecord\n sideEffect: boolean\n}): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const cycle = record.cycle!\n const result = new RecordUpdateResult({ record })\n Surveys.visitDescendantsAndSelfNodeDef({\n survey,\n cycle,\n nodeDef: Surveys.getNodeDefRoot({ survey }),\n visitor: (nodeDef) => {\n const hasAncestorCodeDefExcludedInClone =\n nodeDef.type === NodeDefType.code &&\n Surveys.getNodeDefAncestorCodes({ survey, nodeDef: nodeDef as NodeDefCode }).some(NodeDefs.isExcludedInClone)\n\n if (\n !NodeDefs.isInCycle(cycle)(nodeDef) ||\n NodeDefs.isExcludedInClone(nodeDef) ||\n hasAncestorCodeDefExcludedInClone\n ) {\n const nodesToDelete = Records.getNodesByDefUuid(nodeDef.uuid)(result.record)\n if (nodesToDelete.length > 0) {\n const partialUpdateResult = Records.deleteNodes(\n nodesToDelete.map((node) => node.uuid),\n { sideEffect }\n )(result.record)\n result.merge(partialUpdateResult)\n }\n }\n },\n })\n return result\n}\n\nconst cloneRecord = (params: { survey: Survey; record: ArenaRecord; cycleTo: string; sideEffect?: boolean }) => {\n const { survey, record, cycleTo, sideEffect = false } = params\n\n const recordUpdated = sideEffect ? record : { ...record }\n recordUpdated.cycle = cycleTo\n recordUpdated.dateCreated = recordUpdated.dateModified = Dates.nowFormattedForStorage()\n delete recordUpdated.id\n\n // delete nodes not included in clone\n const updateResult = new RecordUpdateResult({ record: recordUpdated })\n updateResult.merge(removeExcludedNodes({ survey, record: updateResult.record, sideEffect }))\n updateResult.merge(RecordFixer.insertMissingSingleNodes({ survey, record: updateResult.record, sideEffect }))\n\n // assign new UUIDs with side effect on record and nodes, faster when record is big\n const {\n newNodeUuidsByOldUuid,\n newFileUuidsByOldUuid,\n record: recordUpdatedUuids,\n } = assignNewUuids({ record: updateResult.record, sideEffect })\n\n updateResult.merge(new RecordUpdateResult({ record: recordUpdatedUuids }))\n\n return { record: updateResult.record, newNodeUuidsByOldUuid, newFileUuidsByOldUuid }\n}\n\nexport const RecordCloner = {\n cloneRecord,\n}\n"]}
1
+ {"version":3,"file":"recordCloner.js","sourceRoot":"","sources":["../../src/record/recordCloner.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodeValues, Nodes } from '../node'\nimport { NodeKeys, NodeMetaKeys } from '../node/node'\nimport { NodeDefCode, NodeDefType, NodeDefs } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Dates, Objects, UUIDs } from '../utils'\nimport { Validation } from '../validation'\nimport { ArenaRecord } from './record'\nimport { RecordFixer } from './recordFixer'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { RecordValidations } from './recordValidations'\nimport { Records } from './records'\n\ntype OldUuidToNewUuidMap = {\n [key: string]: string\n}\n\nconst assignNewUuidsToNodes = (params: {\n record: ArenaRecord\n sideEffect: boolean\n}): { newNodeUuidsByOldUuid: OldUuidToNewUuidMap; newFileUuidsByOldUuid: OldUuidToNewUuidMap; record: ArenaRecord } => {\n const { record, sideEffect } = params\n\n // generate a new uuid for each node\n const newNodeUuidsByOldUuid: OldUuidToNewUuidMap = {}\n const newFileUuidsByOldUuid: OldUuidToNewUuidMap = {}\n\n // sort nodes before removing the id, to preserve their hierarchy (faster than comparing each meta.h property)\n const nodesArray = Records.getNodesArray(record).sort(\n (nodeA: ArenaRecordNode, nodeB: ArenaRecordNode): number =>\n Nodes.getHierarchy(nodeA).length - Nodes.getHierarchy(nodeB).length\n )\n\n const recordUpdated = sideEffect ? record : { ...record }\n\n const nodes = recordUpdated.nodes ?? {}\n const nodesUpdated = sideEffect ? nodes : { ...nodes }\n\n // update nodes recordUuid and properties (it does side effect on nodes)\n nodesArray.forEach((node) => {\n let nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.recordUuid = record.uuid\n nodeUpdated.dateCreated = nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n\n const oldUuid = node.uuid\n const newUuid = UUIDs.v4()\n newNodeUuidsByOldUuid[oldUuid] = newUuid\n\n nodeUpdated.uuid = newUuid\n // consider every node as just created node\n delete nodeUpdated.id\n nodeUpdated.created = true // this flag will be used by the RDB generator)\n\n // update internal node uuids, meta hierarchy, file uuid (if any)\n const parentUuid = node.parentUuid\n if (parentUuid) {\n nodeUpdated.parentUuid = newNodeUuidsByOldUuid[parentUuid]\n }\n const hierarchy = node.meta?.h ?? []\n if (hierarchy.length > 0) {\n const hierarchyUpdated = hierarchy.map((ancestorUuid) => newNodeUuidsByOldUuid[ancestorUuid])\n nodeUpdated = Objects.assocPath({\n obj: nodeUpdated,\n path: [NodeKeys.meta, NodeMetaKeys.h],\n value: hierarchyUpdated,\n sideEffect,\n })\n }\n // assign new file uuid (file should be cloned elsewhere)\n const fileUuid = NodeValues.getFileUuid(node)\n if (fileUuid) {\n const newFileUuid = UUIDs.v4()\n nodeUpdated = Objects.assocPath({\n obj: nodeUpdated,\n path: [NodeKeys.value, NodeValues.ValuePropsFile.fileUuid],\n value: newFileUuid,\n })\n newFileUuidsByOldUuid[fileUuid] = newFileUuid\n }\n\n delete nodesUpdated[oldUuid]\n nodesUpdated[newUuid] = nodeUpdated\n })\n\n recordUpdated.nodes = nodesUpdated\n\n return { newNodeUuidsByOldUuid, newFileUuidsByOldUuid, record: recordUpdated }\n}\n\nconst assignNewUuidsToValidation = (params: {\n validation: Validation\n newNodeUuidsByOldUuid: OldUuidToNewUuidMap\n sideEffect: boolean\n}): Validation => {\n const { validation, newNodeUuidsByOldUuid, sideEffect } = params\n\n const validationFields = validation?.fields\n if (!validationFields) return validation\n\n const validationFieldsUpdated = sideEffect ? validationFields : { ...validationFields }\n\n Object.entries(validationFields).forEach(([oldFieldKey, validationField]) => {\n let newFieldKey\n if (oldFieldKey.startsWith(RecordValidations.prefixValidationFieldChildrenCount)) {\n const oldParentUuid = oldFieldKey.substring(\n RecordValidations.prefixValidationFieldChildrenCount.length,\n oldFieldKey.lastIndexOf('_')\n )\n const newParentUuid = newNodeUuidsByOldUuid[oldParentUuid]\n newFieldKey = oldFieldKey.replace(oldParentUuid, newParentUuid)\n } else {\n newFieldKey = newNodeUuidsByOldUuid[oldFieldKey]\n }\n if (newFieldKey) {\n validationFieldsUpdated[newFieldKey] = validationField\n }\n delete validationFieldsUpdated[oldFieldKey]\n })\n return Objects.assoc({\n obj: validation,\n prop: 'fields',\n value: validationFieldsUpdated,\n sideEffect,\n })\n}\n\nconst assignNewUuids = (params: {\n record: ArenaRecord\n sideEffect: boolean\n}): { newNodeUuidsByOldUuid: OldUuidToNewUuidMap; newFileUuidsByOldUuid: OldUuidToNewUuidMap; record: ArenaRecord } => {\n const { record, sideEffect } = params\n let recordUpdated = sideEffect ? record : { ...record }\n recordUpdated.uuid = UUIDs.v4()\n\n const {\n newNodeUuidsByOldUuid,\n newFileUuidsByOldUuid,\n record: recordUpdatedUuids,\n } = assignNewUuidsToNodes({ record: recordUpdated, sideEffect })\n\n recordUpdated = recordUpdatedUuids\n\n const { validation } = recordUpdated\n if (validation) {\n const validationUpdated = assignNewUuidsToValidation({\n validation,\n newNodeUuidsByOldUuid,\n sideEffect,\n })\n recordUpdated = Objects.assoc({ obj: recordUpdated, prop: 'validation', value: validationUpdated, sideEffect })\n }\n // re-build nodes index\n const nodes = recordUpdated.nodes!\n delete recordUpdated._nodesIndex\n delete recordUpdated.nodes\n recordUpdated = Records.addNodes(nodes, { sideEffect, sortNodes: true })(recordUpdated)\n\n return { newNodeUuidsByOldUuid, newFileUuidsByOldUuid, record: recordUpdated }\n}\n\nconst removeExcludedNodes = (params: {\n survey: Survey\n record: ArenaRecord\n sideEffect: boolean\n}): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const cycle = record.cycle!\n const result = new RecordUpdateResult({ record })\n Surveys.visitDescendantsAndSelfNodeDef({\n survey,\n cycle,\n nodeDef: Surveys.getNodeDefRoot({ survey }),\n visitor: (nodeDef) => {\n const hasAncestorCodeDefExcludedInClone =\n nodeDef.type === NodeDefType.code &&\n Surveys.getNodeDefAncestorCodes({ survey, nodeDef: nodeDef as NodeDefCode }).some(NodeDefs.isExcludedInClone)\n\n if (\n !NodeDefs.isInCycle(cycle)(nodeDef) ||\n NodeDefs.isExcludedInClone(nodeDef) ||\n hasAncestorCodeDefExcludedInClone\n ) {\n const nodesToDelete = Records.getNodesByDefUuid({ nodeDefUuid: nodeDef.uuid })(result.record)\n if (nodesToDelete.length > 0) {\n const partialUpdateResult = Records.deleteNodes(\n nodesToDelete.map((node) => node.uuid),\n { sideEffect }\n )(result.record)\n result.merge(partialUpdateResult)\n }\n }\n },\n })\n return result\n}\n\nconst cloneRecord = (params: { survey: Survey; record: ArenaRecord; cycleTo: string; sideEffect?: boolean }) => {\n const { survey, record, cycleTo, sideEffect = false } = params\n\n const recordUpdated = sideEffect ? record : { ...record }\n recordUpdated.cycle = cycleTo\n recordUpdated.dateCreated = recordUpdated.dateModified = Dates.nowFormattedForStorage()\n delete recordUpdated.id\n\n // delete nodes not included in clone\n const updateResult = new RecordUpdateResult({ record: recordUpdated })\n updateResult.merge(removeExcludedNodes({ survey, record: updateResult.record, sideEffect }))\n updateResult.merge(RecordFixer.insertMissingSingleNodes({ survey, record: updateResult.record, sideEffect }))\n\n // assign new UUIDs with side effect on record and nodes, faster when record is big\n const {\n newNodeUuidsByOldUuid,\n newFileUuidsByOldUuid,\n record: recordUpdatedUuids,\n } = assignNewUuids({ record: updateResult.record, sideEffect })\n\n updateResult.merge(new RecordUpdateResult({ record: recordUpdatedUuids }))\n\n return { record: updateResult.record, newNodeUuidsByOldUuid, newFileUuidsByOldUuid }\n}\n\nexport const RecordCloner = {\n cloneRecord,\n}\n"]}
@@ -12,7 +12,7 @@ const extractPreviousCycleValues = ({ node, context, }) => {
12
12
  if (!node || !prevCycleRecord) {
13
13
  return null;
14
14
  }
15
- const currentRecordEntity = records_1.Records.getParent(node)(record);
15
+ const currentRecordEntity = records_1.Records.getParent({ node })(record);
16
16
  if (!currentRecordEntity) {
17
17
  return null;
18
18
  }
@@ -21,13 +21,12 @@ const extractPreviousCycleValues = ({ node, context, }) => {
21
21
  survey,
22
22
  cycle: records_1.Records.getCycle(record),
23
23
  entityUuid,
24
- record,
25
24
  recordOther: prevCycleRecord,
26
- });
25
+ })(record);
27
26
  if (!prevCycleEntity) {
28
27
  return null;
29
28
  }
30
- return records_1.Records.getChildren(prevCycleEntity, node.nodeDefUuid)(prevCycleRecord).map((prevNode) => prevNode.value);
29
+ return records_1.Records.getChildren({ parentNode: prevCycleEntity, childDefUuid: node.nodeDefUuid })(prevCycleRecord).map((prevNode) => prevNode.value);
31
30
  };
32
31
  exports.recordExpressionFunctions = Object.assign(Object.assign({}, functions_1.nodeDefExpressionFunctions), { count: {
33
32
  minArity: 1,
@@ -102,7 +101,7 @@ exports.recordExpressionFunctions = Object.assign(Object.assign({}, functions_1.
102
101
  if (!parentNode) {
103
102
  return -1;
104
103
  }
105
- const children = records_1.Records.getChildren(parentNode, node.nodeDefUuid)(record);
104
+ const children = records_1.Records.getChildren({ parentNode, childDefUuid: node.nodeDefUuid })(record);
106
105
  return children.findIndex((n) => node_1.Nodes.areEqual(n, node));
107
106
  },
108
107
  }, last: {