@openforis/arena-core 2.16.2 → 2.16.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/authorizer.js +2 -1
- package/dist/auth/authorizer.js.map +1 -1
- package/dist/esm/auth/authorizer.js +2 -1
- package/dist/esm/auth/authorizer.js.map +1 -1
- package/dist/esm/node/node.js +1 -0
- package/dist/esm/node/node.js.map +1 -1
- package/dist/esm/record/_records/recordGetters.js +17 -13
- package/dist/esm/record/_records/recordGetters.js.map +1 -1
- package/dist/esm/record/recordCloner.js +14 -2
- package/dist/esm/record/recordCloner.js.map +1 -1
- package/dist/esm/record/recordFixer.js +1 -8
- package/dist/esm/record/recordFixer.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodesCreator.js +6 -0
- package/dist/esm/record/recordNodesUpdater/recordNodesCreator.js.map +1 -1
- package/dist/esm/record/records.js +2 -1
- package/dist/esm/record/records.js.map +1 -1
- package/dist/node/node.d.ts +2 -1
- package/dist/node/node.js +1 -0
- package/dist/node/node.js.map +1 -1
- package/dist/record/_records/recordGetters.d.ts +4 -0
- package/dist/record/_records/recordGetters.js +19 -14
- package/dist/record/_records/recordGetters.js.map +1 -1
- package/dist/record/recordCloner.js +14 -2
- package/dist/record/recordCloner.js.map +1 -1
- package/dist/record/recordFixer.js +1 -8
- package/dist/record/recordFixer.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodesCreator.js +6 -0
- package/dist/record/recordNodesUpdater/recordNodesCreator.js.map +1 -1
- package/dist/record/records.d.ts +2 -1
- package/dist/record/records.js +1 -0
- package/dist/record/records.js.map +1 -1
- package/package.json +1 -1
|
@@ -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.removeNodes(\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 // new uuids generated in advance: meta.hCode can reference nodes cloned later (e.g. sibling code attributes)\n for (const node of nodesArray) {\n newNodeUuidsByOldUuid[node.uuid] = UUIDs.v4()\n }\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 = newNodeUuidsByOldUuid[oldUuid]\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 const hierarchyCode = Nodes.getHierarchyCode(node)\n if (hierarchyCode.length > 0) {\n nodeUpdated = Objects.assocPath({\n obj: nodeUpdated,\n path: [NodeKeys.meta, NodeMetaKeys.hCode],\n value: hierarchyCode.map((ancestorCodeUuid) => newNodeUuidsByOldUuid[ancestorCodeUuid]),\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.removeNodes(\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"]}
|
|
@@ -16,14 +16,7 @@ const fixCodeAttribute = (params) => {
|
|
|
16
16
|
return node;
|
|
17
17
|
}
|
|
18
18
|
// populate meta.hCode with ancestor code attribute node uuids
|
|
19
|
-
const hCode =
|
|
20
|
-
let currentCodeDef = nodeDef;
|
|
21
|
-
let currentParentCodeAttribute = Records.getParentCodeAttribute(parentNode, currentCodeDef)(record);
|
|
22
|
-
while (currentParentCodeAttribute) {
|
|
23
|
-
hCode.unshift(currentParentCodeAttribute.uuid);
|
|
24
|
-
currentCodeDef = Surveys.getNodeDefByUuid({ survey, uuid: currentParentCodeAttribute.nodeDefUuid });
|
|
25
|
-
currentParentCodeAttribute = Records.getParentCodeAttribute(parentNode, currentCodeDef)(record);
|
|
26
|
-
}
|
|
19
|
+
const hCode = Records.getAncestorCodeAttributes(survey, parentNode, nodeDef)(record).map((codeAttribute) => codeAttribute.uuid);
|
|
27
20
|
const nodeUpdated = sideEffect ? node : Object.assign({}, node);
|
|
28
21
|
nodeUpdated.meta = Object.assign(Object.assign({}, nodeUpdated.meta), { hCode });
|
|
29
22
|
return nodeUpdated;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordFixer.js","sourceRoot":"","sources":["../../../src/record/recordFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodeFactory, Nodes } from '../node'\nimport { NodeDef, NodeDefCode, NodeDefs, NodeDefType } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Objects } from '../utils'\nimport type { ArenaRecord } from './record'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { Records } from './records'\n\nconst fixCodeAttribute = (params: {\n survey: Survey\n nodeDef: NodeDefCode\n record: ArenaRecord\n node: ArenaRecordNode\n sideEffect: boolean\n}): ArenaRecordNode => {\n const { survey, nodeDef, record, node, sideEffect } = params\n if (!NodeDefs.getParentCodeDefUuid(nodeDef) || Objects.isNotEmpty(Nodes.getHierarchyCode(node))) {\n // nodeDef is not a code attribute or meta.hCode already populated: do nothing\n return node\n }\n const parentNode = Records.getParent(node)(record)\n if (!parentNode) {\n // missing parent node; node parentUuid could be invalid\n return node\n }\n // populate meta.hCode with ancestor code attribute node uuids\n const hCode: string[] = []\n let currentCodeDef: NodeDefCode = nodeDef\n let currentParentCodeAttribute = Records.getParentCodeAttribute(parentNode, currentCodeDef)(record)\n while (currentParentCodeAttribute) {\n hCode.unshift(currentParentCodeAttribute.uuid)\n currentCodeDef = Surveys.getNodeDefByUuid({ survey, uuid: currentParentCodeAttribute.nodeDefUuid }) as NodeDefCode\n currentParentCodeAttribute = Records.getParentCodeAttribute(parentNode, currentCodeDef)(record)\n }\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.meta = { ...nodeUpdated.meta, hCode }\n return nodeUpdated\n}\n\nconst insertMissingSingleNode = (params: {\n survey: Survey\n nodeDef: NodeDef<any>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n sideEffect: boolean\n}): RecordUpdateResult | null => {\n const { survey, nodeDef, record, parentNode, sideEffect } = params\n if (!NodeDefs.isSingle(nodeDef)) {\n // multiple node: don't insert it\n return null\n }\n const nodeDefUuid = nodeDef.uuid\n const children = Records.getChildren(parentNode, nodeDef.uuid)(record)\n if (!Objects.isEmpty(children)) {\n // single node already inserted\n return null\n }\n // insert missing single node\n const recordUuid = record.uuid\n let node = NodeFactory.createInstance({ nodeDefUuid, recordUuid, parentNode })\n\n if (nodeDef.type === NodeDefType.code) {\n node = fixCodeAttribute({ survey, nodeDef: nodeDef as NodeDefCode, record, node, sideEffect })\n }\n\n const recordUpdated = Records.addNode(node, { sideEffect })(record)\n return new RecordUpdateResult({ record: recordUpdated, nodes: { [node.uuid]: node } })\n}\n\nconst insertMissingSingleNodes = (params: {\n survey: Survey\n record: ArenaRecord\n sideEffect: boolean\n}): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n Surveys.visitNodeDefs({\n survey,\n visitor: (nodeDef) => {\n const parentDefUuid = nodeDef.parentUuid\n if (parentDefUuid) {\n const parentNodes = Records.getNodesByDefUuid(parentDefUuid)(updateResult.record)\n for (const parentNode of parentNodes) {\n const partialUpdateResult = insertMissingSingleNode({\n survey,\n nodeDef,\n record: updateResult.record,\n parentNode,\n sideEffect,\n })\n if (partialUpdateResult) {\n updateResult.merge(partialUpdateResult)\n }\n }\n }\n },\n })\n return updateResult\n}\n\nconst deleteNodesByDefUuid = (params: { record: ArenaRecord; nodeDefUuid: string; sideEffect: boolean }) => {\n const { record, nodeDefUuid, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n\n const recordUpdateOptions = { sideEffect }\n\n const nodesToDelete = Records.getNodesByDefUuid(nodeDefUuid)(updateResult.record)\n for (const nodeToDelete of nodesToDelete) {\n // cleanup child applicability\n const parentNode = Records.getParent(nodeToDelete)(updateResult.record)\n if (parentNode && !Nodes.isChildApplicable(parentNode, nodeDefUuid)) {\n const parentNodeUpdated = Nodes.dissocChildApplicability(parentNode, nodeDefUuid)\n const recordWithParentNodeUpdated = Records.addNode(parentNodeUpdated, recordUpdateOptions)(updateResult.record)\n updateResult.merge(new RecordUpdateResult({ record: recordWithParentNodeUpdated }))\n }\n }\n const nodeUuidsToDelete = nodesToDelete.map((node) => node.uuid)\n const nodesDeleteUpdateResult = Records.removeNodes(nodeUuidsToDelete, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdateResult)\n\n return updateResult\n}\n\n/**\n * Fix a record by:\n * - inserting missing single nodes\n * - deleting nodes with non existing node defs\n * - removing status flags (created, deleted, updated) from all nodes\n */\nconst fixRecord = (params: { survey: Survey; record: ArenaRecord; sideEffect?: boolean }): RecordUpdateResult => {\n const { survey, record, sideEffect = false } = params\n const result = new RecordUpdateResult({ record })\n\n // 1. delete nodes with non existing node defs (and their descendants), once per missing node def\n const missingNodeDefUuids = new Set<string>()\n for (const { nodeDefUuid } of Records.getNodesArray(record)) {\n if (!Surveys.findNodeDefByUuid({ survey, uuid: nodeDefUuid })) {\n missingNodeDefUuids.add(nodeDefUuid)\n }\n }\n for (const nodeDefUuid of missingNodeDefUuids) {\n result.merge(deleteNodesByDefUuid({ record: result.record, nodeDefUuid, sideEffect }))\n }\n\n // 2. fix the remaining nodes (read from the updated record, without the deleted nodes); add them all at once\n const nodesUpdated: { [key: string]: ArenaRecordNode } = {}\n for (const node of Records.getNodesArray(result.record)) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n // remove status flags\n let nodeUpdated = Nodes.removeStatusFlags({ node, sideEffect })\n\n if (nodeDef.type === NodeDefType.code) {\n nodeUpdated = fixCodeAttribute({\n survey,\n nodeDef: nodeDef as NodeDefCode,\n record: result.record,\n node: nodeUpdated,\n sideEffect,\n })\n }\n nodesUpdated[nodeUpdated.uuid] = nodeUpdated\n }\n const recordWithNodesUpdated = Records.addNodes(nodesUpdated, { sideEffect })(result.record)\n result.merge(new RecordUpdateResult({ record: recordWithNodesUpdated, nodes: nodesUpdated }))\n\n const missingNodesUpdateResult = insertMissingSingleNodes({ survey, record: result.record, sideEffect })\n result.merge(missingNodesUpdateResult)\n return result\n}\n\nexport const RecordFixer = {\n fixRecord,\n insertMissingSingleNodes,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"recordFixer.js","sourceRoot":"","sources":["../../../src/record/recordFixer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,WAAW,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAwB,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,EAAU,OAAO,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,gBAAgB,GAAG,CAAC,MAMzB,EAAmB,EAAE;IACpB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAC5D,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAChG,8EAA8E;QAC9E,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,wDAAwD;QACxD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,8DAA8D;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,yBAAyB,CAC7C,MAAM,EACN,UAAU,EACV,OAAO,CACR,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACpD,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,mBAAM,IAAI,CAAE,CAAA;IACnD,WAAW,CAAC,IAAI,mCAAQ,WAAW,CAAC,IAAI,KAAE,KAAK,GAAE,CAAA;IACjD,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,CAAC,MAMhC,EAA6B,EAAE;IAC9B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAClE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,iCAAiC;QACjC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAA;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;IACtE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,+BAA+B;QAC/B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,6BAA6B;IAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAA;IAC9B,IAAI,IAAI,GAAG,WAAW,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAA;IAE9E,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAsB,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;IAChG,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACnE,OAAO,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;AACxF,CAAC,CAAA;AAED,MAAM,wBAAwB,GAAG,CAAC,MAIjC,EAAsB,EAAE;IACvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAC7C,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IACvD,OAAO,CAAC,aAAa,CAAC;QACpB,MAAM;QACN,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAA;YACxC,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;gBACjF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;oBACrC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;wBAClD,MAAM;wBACN,OAAO;wBACP,MAAM,EAAE,YAAY,CAAC,MAAM;wBAC3B,UAAU;wBACV,UAAU;qBACX,CAAC,CAAA;oBACF,IAAI,mBAAmB,EAAE,CAAC;wBACxB,YAAY,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC,CAAA;IACF,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,CAAC,MAAyE,EAAE,EAAE;IACzG,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAClD,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEvD,MAAM,mBAAmB,GAAG,EAAE,UAAU,EAAE,CAAA;IAE1C,MAAM,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IACjF,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,8BAA8B;QAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACvE,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;YACpE,MAAM,iBAAiB,GAAG,KAAK,CAAC,wBAAwB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;YACjF,MAAM,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YAChH,YAAY,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAA;QACrF,CAAC;IACH,CAAC;IACD,MAAM,iBAAiB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChE,MAAM,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAChH,YAAY,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAE3C,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,SAAS,GAAG,CAAC,MAAqE,EAAsB,EAAE;IAC9G,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;IACrD,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEjD,iGAAiG;IACjG,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7C,KAAK,MAAM,EAAE,WAAW,EAAE,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;YAC9D,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,WAAW,IAAI,mBAAmB,EAAE,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;IACxF,CAAC;IAED,6GAA6G;IAC7G,MAAM,YAAY,GAAuC,EAAE,CAAA;IAC3D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QAC5E,sBAAsB;QACtB,IAAI,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;QAE/D,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;YACtC,WAAW,GAAG,gBAAgB,CAAC;gBAC7B,MAAM;gBACN,OAAO,EAAE,OAAsB;gBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,WAAW;gBACjB,UAAU;aACX,CAAC,CAAA;QACJ,CAAC;QACD,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,CAAA;IAC9C,CAAC;IACD,MAAM,sBAAsB,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC5F,MAAM,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IAE7F,MAAM,wBAAwB,GAAG,wBAAwB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IACxG,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;IACtC,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS;IACT,wBAAwB;CACzB,CAAA","sourcesContent":["import { ArenaRecordNode, NodeFactory, Nodes } from '../node'\nimport { NodeDef, NodeDefCode, NodeDefs, NodeDefType } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Objects } from '../utils'\nimport type { ArenaRecord } from './record'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { Records } from './records'\n\nconst fixCodeAttribute = (params: {\n survey: Survey\n nodeDef: NodeDefCode\n record: ArenaRecord\n node: ArenaRecordNode\n sideEffect: boolean\n}): ArenaRecordNode => {\n const { survey, nodeDef, record, node, sideEffect } = params\n if (!NodeDefs.getParentCodeDefUuid(nodeDef) || Objects.isNotEmpty(Nodes.getHierarchyCode(node))) {\n // nodeDef is not a code attribute or meta.hCode already populated: do nothing\n return node\n }\n const parentNode = Records.getParent(node)(record)\n if (!parentNode) {\n // missing parent node; node parentUuid could be invalid\n return node\n }\n // populate meta.hCode with ancestor code attribute node uuids\n const hCode = Records.getAncestorCodeAttributes(\n survey,\n parentNode,\n nodeDef\n )(record).map((codeAttribute) => codeAttribute.uuid)\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.meta = { ...nodeUpdated.meta, hCode }\n return nodeUpdated\n}\n\nconst insertMissingSingleNode = (params: {\n survey: Survey\n nodeDef: NodeDef<any>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n sideEffect: boolean\n}): RecordUpdateResult | null => {\n const { survey, nodeDef, record, parentNode, sideEffect } = params\n if (!NodeDefs.isSingle(nodeDef)) {\n // multiple node: don't insert it\n return null\n }\n const nodeDefUuid = nodeDef.uuid\n const children = Records.getChildren(parentNode, nodeDef.uuid)(record)\n if (!Objects.isEmpty(children)) {\n // single node already inserted\n return null\n }\n // insert missing single node\n const recordUuid = record.uuid\n let node = NodeFactory.createInstance({ nodeDefUuid, recordUuid, parentNode })\n\n if (nodeDef.type === NodeDefType.code) {\n node = fixCodeAttribute({ survey, nodeDef: nodeDef as NodeDefCode, record, node, sideEffect })\n }\n\n const recordUpdated = Records.addNode(node, { sideEffect })(record)\n return new RecordUpdateResult({ record: recordUpdated, nodes: { [node.uuid]: node } })\n}\n\nconst insertMissingSingleNodes = (params: {\n survey: Survey\n record: ArenaRecord\n sideEffect: boolean\n}): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n Surveys.visitNodeDefs({\n survey,\n visitor: (nodeDef) => {\n const parentDefUuid = nodeDef.parentUuid\n if (parentDefUuid) {\n const parentNodes = Records.getNodesByDefUuid(parentDefUuid)(updateResult.record)\n for (const parentNode of parentNodes) {\n const partialUpdateResult = insertMissingSingleNode({\n survey,\n nodeDef,\n record: updateResult.record,\n parentNode,\n sideEffect,\n })\n if (partialUpdateResult) {\n updateResult.merge(partialUpdateResult)\n }\n }\n }\n },\n })\n return updateResult\n}\n\nconst deleteNodesByDefUuid = (params: { record: ArenaRecord; nodeDefUuid: string; sideEffect: boolean }) => {\n const { record, nodeDefUuid, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n\n const recordUpdateOptions = { sideEffect }\n\n const nodesToDelete = Records.getNodesByDefUuid(nodeDefUuid)(updateResult.record)\n for (const nodeToDelete of nodesToDelete) {\n // cleanup child applicability\n const parentNode = Records.getParent(nodeToDelete)(updateResult.record)\n if (parentNode && !Nodes.isChildApplicable(parentNode, nodeDefUuid)) {\n const parentNodeUpdated = Nodes.dissocChildApplicability(parentNode, nodeDefUuid)\n const recordWithParentNodeUpdated = Records.addNode(parentNodeUpdated, recordUpdateOptions)(updateResult.record)\n updateResult.merge(new RecordUpdateResult({ record: recordWithParentNodeUpdated }))\n }\n }\n const nodeUuidsToDelete = nodesToDelete.map((node) => node.uuid)\n const nodesDeleteUpdateResult = Records.removeNodes(nodeUuidsToDelete, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdateResult)\n\n return updateResult\n}\n\n/**\n * Fix a record by:\n * - inserting missing single nodes\n * - deleting nodes with non existing node defs\n * - removing status flags (created, deleted, updated) from all nodes\n */\nconst fixRecord = (params: { survey: Survey; record: ArenaRecord; sideEffect?: boolean }): RecordUpdateResult => {\n const { survey, record, sideEffect = false } = params\n const result = new RecordUpdateResult({ record })\n\n // 1. delete nodes with non existing node defs (and their descendants), once per missing node def\n const missingNodeDefUuids = new Set<string>()\n for (const { nodeDefUuid } of Records.getNodesArray(record)) {\n if (!Surveys.findNodeDefByUuid({ survey, uuid: nodeDefUuid })) {\n missingNodeDefUuids.add(nodeDefUuid)\n }\n }\n for (const nodeDefUuid of missingNodeDefUuids) {\n result.merge(deleteNodesByDefUuid({ record: result.record, nodeDefUuid, sideEffect }))\n }\n\n // 2. fix the remaining nodes (read from the updated record, without the deleted nodes); add them all at once\n const nodesUpdated: { [key: string]: ArenaRecordNode } = {}\n for (const node of Records.getNodesArray(result.record)) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n // remove status flags\n let nodeUpdated = Nodes.removeStatusFlags({ node, sideEffect })\n\n if (nodeDef.type === NodeDefType.code) {\n nodeUpdated = fixCodeAttribute({\n survey,\n nodeDef: nodeDef as NodeDefCode,\n record: result.record,\n node: nodeUpdated,\n sideEffect,\n })\n }\n nodesUpdated[nodeUpdated.uuid] = nodeUpdated\n }\n const recordWithNodesUpdated = Records.addNodes(nodesUpdated, { sideEffect })(result.record)\n result.merge(new RecordUpdateResult({ record: recordWithNodesUpdated, nodes: nodesUpdated }))\n\n const missingNodesUpdateResult = insertMissingSingleNodes({ survey, record: result.record, sideEffect })\n result.merge(missingNodesUpdateResult)\n return result\n}\n\nexport const RecordFixer = {\n fixRecord,\n insertMissingSingleNodes,\n}\n"]}
|
|
@@ -12,6 +12,7 @@ import { NodeFactory, Nodes } from '../../node';
|
|
|
12
12
|
import { NodeValues } from '../../node/nodeValues';
|
|
13
13
|
import { NodeDefType, NodeDefs } from '../../nodeDef';
|
|
14
14
|
import { getNodeDefChildren, getNodeDefEnumerator } from '../../survey/surveys/nodeDefs';
|
|
15
|
+
import { getAncestorCodeAttributes } from '../_records/recordGetters';
|
|
15
16
|
import { getEnumeratingCategoryItems } from '../_records/recordUtils';
|
|
16
17
|
import { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator';
|
|
17
18
|
import { RecordUpdateResult } from './recordUpdateResult';
|
|
@@ -119,6 +120,11 @@ export const addNodeAndDescendants = (params) => __awaiter(void 0, void 0, void
|
|
|
119
120
|
parentNode,
|
|
120
121
|
surveyUuid: survey.uuid,
|
|
121
122
|
});
|
|
123
|
+
if (parentNode && nodeDef.type === NodeDefType.code && NodeDefs.getParentCodeDefUuid(nodeDef)) {
|
|
124
|
+
// meta.hCode indexes the node as dependent of its ancestor code attributes (cleared when they change)
|
|
125
|
+
const ancestorCodeAttributes = getAncestorCodeAttributes(survey, parentNode, nodeDef)(record);
|
|
126
|
+
node.meta = Object.assign(Object.assign({}, node.meta), { hCode: ancestorCodeAttributes.map((codeAttribute) => codeAttribute.uuid) });
|
|
127
|
+
}
|
|
122
128
|
const updateResult = new RecordUpdateResult({ record });
|
|
123
129
|
updateResult.addNode(node, { sideEffect });
|
|
124
130
|
// Add children if entity
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordNodesCreator.js","sourceRoot":"","sources":["../../../../src/record/recordNodesUpdater/recordNodesCreator.ts"],"names":[],"mappings":"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","sourcesContent":["import { User } from '../../auth'\nimport { SystemError, SystemErrorKeys } from '../../error'\nimport { CategoryItem } from '../../category'\nimport { ArenaRecordNode, NodeFactory, Nodes } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { NodeDef, NodeDefCode, NodeDefEntity, NodeDefType, NodeDefs } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { Survey } from '../../survey'\nimport { getNodeDefChildren, getNodeDefEnumerator } from '../../survey/surveys/nodeDefs'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordExpressionEvaluationContext } from './recordExpressionEvaluationContext'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nexport type NodesUpdateParams = RecordExpressionEvaluationContext & {\n dateModified?: string\n clearNonApplicableValues?: boolean\n}\n\nexport type NodeCreateParams = NodesUpdateParams & {\n parentNode?: ArenaRecordNode\n nodeDef: NodeDef<any>\n createMultipleEntities?: boolean\n}\n\nconst getNodesToInsertCount = (params: { parentNode: ArenaRecordNode | undefined; nodeDef: NodeDef<any> }): number => {\n const { nodeDef, parentNode } = params\n if (!parentNode || NodeDefs.isSingle(nodeDef)) return 1\n if (nodeDef.type === NodeDefType.code) return 0 // never create nodes for multiple code attributes\n\n if (NodeDefs.isMultipleEntity(nodeDef) && !NodeDefs.isAutoCreateMinCountItems(nodeDef)) return 0\n\n const minCount = Nodes.getChildrenMinCount({ parentNode, nodeDef })\n if (Number.isNaN(minCount) || minCount <= 0) return 0\n return minCount\n}\n\nexport const createEnumeratedEntityNode = async (params: {\n user: User\n survey: Survey\n parentNode: ArenaRecordNode\n nodeDef: NodeDefEntity\n enumeratorDef: NodeDefCode\n categoryItem: CategoryItem\n updateResult: RecordUpdateResult\n sideEffect?: boolean\n}): Promise<void> => {\n const { user, survey, parentNode, nodeDef, enumeratorDef, categoryItem, updateResult, sideEffect } = params\n\n const { record } = updateResult\n\n const childUpdateResult = await addNodeAndDescendants({\n user,\n survey,\n record: updateResult.record,\n parentNode,\n nodeDef,\n sideEffect,\n })\n const enumeratorNode = Object.values(childUpdateResult.nodes).find((node) => node.nodeDefUuid === enumeratorDef.uuid)\n if (!enumeratorNode) {\n throw new SystemError(SystemErrorKeys.record.enumeratorNodeNotFound, {\n recordUuid: record.uuid,\n entityDef: NodeDefs.getName(nodeDef),\n enumerator: NodeDefs.getName(enumeratorDef),\n })\n }\n enumeratorNode.value = NodeValues.newCodeValue({ itemUuid: categoryItem.uuid })\n enumeratorNode.meta = { ...enumeratorNode.meta, defaultValueApplied: true }\n enumeratorNode.refData = { categoryItem }\n\n updateResult.merge(childUpdateResult)\n}\n\nexport const createEnumeratedEntityNodes = async (params: {\n user: User\n survey: Survey\n parentNode: ArenaRecordNode\n nodeDef: NodeDefEntity\n updateResult: RecordUpdateResult\n categoryItemProvider?: CategoryItemProvider\n sideEffect?: boolean\n}): Promise<boolean> => {\n const { user, survey, parentNode, nodeDef, updateResult, categoryItemProvider } = params\n\n const enumeratorDef = getNodeDefEnumerator({ survey, entityDef: nodeDef })\n if (!enumeratorDef) return false\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef: nodeDef,\n parentNode,\n })\n\n const categoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n if (categoryItems.length === 0) return false\n\n for (const categoryItem of categoryItems) {\n // sequential: each iteration updates the record\n await createEnumeratedEntityNode({ ...params, enumeratorDef, categoryItem }) // NOSONAR\n }\n return true\n}\n\nconst createChildNodesBasedOnMinCount = async (\n params: NodeCreateParams & { updateResult: RecordUpdateResult }\n): Promise<void> => {\n const { parentNode, nodeDef, updateResult, createMultipleEntities = true } = params\n\n if (NodeDefs.isMultipleEntity(nodeDef) && NodeDefs.isEnumerate(nodeDef)) {\n if (await createEnumeratedEntityNodes({ ...params, parentNode: parentNode! })) {\n return\n }\n }\n\n const nodesToInsertCount = getNodesToInsertCount({ parentNode, nodeDef })\n if (\n nodesToInsertCount === 0 ||\n (NodeDefs.isMultipleEntity(nodeDef) &&\n (!createMultipleEntities || (parentNode && !Nodes.isChildApplicable(parentNode, nodeDef.uuid))))\n ) {\n return // do nothing\n }\n for (let index = 0; index < nodesToInsertCount; index++) {\n // sequential: each iteration updates the record\n const childUpdateResult = await addNodeAndDescendants({ ...params, record: updateResult.record }) // NOSONAR\n updateResult.merge(childUpdateResult)\n }\n}\n\nexport const addDescendants = async (params: NodeCreateParams): Promise<RecordUpdateResult> => {\n const { survey, record, nodeDef } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n if (NodeDefs.isEntity(nodeDef)) {\n const childDefs = getNodeDefChildren({ survey, nodeDef })\n\n // Add only child single nodes (it allows to apply default values)\n for (const childDef of childDefs) {\n // sequential: each iteration updates the record\n await createChildNodesBasedOnMinCount({ ...params, updateResult, nodeDef: childDef }) // NOSONAR\n }\n }\n return updateResult\n}\n\nexport const addNodeAndDescendants = async (params: NodeCreateParams): Promise<RecordUpdateResult> => {\n const { survey, record, parentNode, nodeDef, sideEffect = false } = params\n\n const node = NodeFactory.createInstance({\n nodeDefUuid: nodeDef.uuid,\n recordUuid: record.uuid,\n parentNode,\n surveyUuid: survey.uuid,\n })\n\n const updateResult = new RecordUpdateResult({ record })\n updateResult.addNode(node, { sideEffect })\n\n // Add children if entity\n if (NodeDefs.isEntity(nodeDef)) {\n const descendantsUpdateResult = await addDescendants({\n ...params,\n record: updateResult.record,\n parentNode: node,\n })\n updateResult.merge(descendantsUpdateResult)\n }\n return updateResult\n}\n"]}
|
|
1
|
+
{"version":3,"file":"recordNodesCreator.js","sourceRoot":"","sources":["../../../../src/record/recordNodesUpdater/recordNodesCreator.ts"],"names":[],"mappings":"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","sourcesContent":["import { User } from '../../auth'\nimport { SystemError, SystemErrorKeys } from '../../error'\nimport { CategoryItem } from '../../category'\nimport { ArenaRecordNode, NodeFactory, Nodes } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { NodeDef, NodeDefCode, NodeDefEntity, NodeDefType, NodeDefs } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { Survey } from '../../survey'\nimport { getNodeDefChildren, getNodeDefEnumerator } from '../../survey/surveys/nodeDefs'\nimport { getAncestorCodeAttributes } from '../_records/recordGetters'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordExpressionEvaluationContext } from './recordExpressionEvaluationContext'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nexport type NodesUpdateParams = RecordExpressionEvaluationContext & {\n dateModified?: string\n clearNonApplicableValues?: boolean\n}\n\nexport type NodeCreateParams = NodesUpdateParams & {\n parentNode?: ArenaRecordNode\n nodeDef: NodeDef<any>\n createMultipleEntities?: boolean\n}\n\nconst getNodesToInsertCount = (params: { parentNode: ArenaRecordNode | undefined; nodeDef: NodeDef<any> }): number => {\n const { nodeDef, parentNode } = params\n if (!parentNode || NodeDefs.isSingle(nodeDef)) return 1\n if (nodeDef.type === NodeDefType.code) return 0 // never create nodes for multiple code attributes\n\n if (NodeDefs.isMultipleEntity(nodeDef) && !NodeDefs.isAutoCreateMinCountItems(nodeDef)) return 0\n\n const minCount = Nodes.getChildrenMinCount({ parentNode, nodeDef })\n if (Number.isNaN(minCount) || minCount <= 0) return 0\n return minCount\n}\n\nexport const createEnumeratedEntityNode = async (params: {\n user: User\n survey: Survey\n parentNode: ArenaRecordNode\n nodeDef: NodeDefEntity\n enumeratorDef: NodeDefCode\n categoryItem: CategoryItem\n updateResult: RecordUpdateResult\n sideEffect?: boolean\n}): Promise<void> => {\n const { user, survey, parentNode, nodeDef, enumeratorDef, categoryItem, updateResult, sideEffect } = params\n\n const { record } = updateResult\n\n const childUpdateResult = await addNodeAndDescendants({\n user,\n survey,\n record: updateResult.record,\n parentNode,\n nodeDef,\n sideEffect,\n })\n const enumeratorNode = Object.values(childUpdateResult.nodes).find((node) => node.nodeDefUuid === enumeratorDef.uuid)\n if (!enumeratorNode) {\n throw new SystemError(SystemErrorKeys.record.enumeratorNodeNotFound, {\n recordUuid: record.uuid,\n entityDef: NodeDefs.getName(nodeDef),\n enumerator: NodeDefs.getName(enumeratorDef),\n })\n }\n enumeratorNode.value = NodeValues.newCodeValue({ itemUuid: categoryItem.uuid })\n enumeratorNode.meta = { ...enumeratorNode.meta, defaultValueApplied: true }\n enumeratorNode.refData = { categoryItem }\n\n updateResult.merge(childUpdateResult)\n}\n\nexport const createEnumeratedEntityNodes = async (params: {\n user: User\n survey: Survey\n parentNode: ArenaRecordNode\n nodeDef: NodeDefEntity\n updateResult: RecordUpdateResult\n categoryItemProvider?: CategoryItemProvider\n sideEffect?: boolean\n}): Promise<boolean> => {\n const { user, survey, parentNode, nodeDef, updateResult, categoryItemProvider } = params\n\n const enumeratorDef = getNodeDefEnumerator({ survey, entityDef: nodeDef })\n if (!enumeratorDef) return false\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef: nodeDef,\n parentNode,\n })\n\n const categoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n if (categoryItems.length === 0) return false\n\n for (const categoryItem of categoryItems) {\n // sequential: each iteration updates the record\n await createEnumeratedEntityNode({ ...params, enumeratorDef, categoryItem }) // NOSONAR\n }\n return true\n}\n\nconst createChildNodesBasedOnMinCount = async (\n params: NodeCreateParams & { updateResult: RecordUpdateResult }\n): Promise<void> => {\n const { parentNode, nodeDef, updateResult, createMultipleEntities = true } = params\n\n if (NodeDefs.isMultipleEntity(nodeDef) && NodeDefs.isEnumerate(nodeDef)) {\n if (await createEnumeratedEntityNodes({ ...params, parentNode: parentNode! })) {\n return\n }\n }\n\n const nodesToInsertCount = getNodesToInsertCount({ parentNode, nodeDef })\n if (\n nodesToInsertCount === 0 ||\n (NodeDefs.isMultipleEntity(nodeDef) &&\n (!createMultipleEntities || (parentNode && !Nodes.isChildApplicable(parentNode, nodeDef.uuid))))\n ) {\n return // do nothing\n }\n for (let index = 0; index < nodesToInsertCount; index++) {\n // sequential: each iteration updates the record\n const childUpdateResult = await addNodeAndDescendants({ ...params, record: updateResult.record }) // NOSONAR\n updateResult.merge(childUpdateResult)\n }\n}\n\nexport const addDescendants = async (params: NodeCreateParams): Promise<RecordUpdateResult> => {\n const { survey, record, nodeDef } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n if (NodeDefs.isEntity(nodeDef)) {\n const childDefs = getNodeDefChildren({ survey, nodeDef })\n\n // Add only child single nodes (it allows to apply default values)\n for (const childDef of childDefs) {\n // sequential: each iteration updates the record\n await createChildNodesBasedOnMinCount({ ...params, updateResult, nodeDef: childDef }) // NOSONAR\n }\n }\n return updateResult\n}\n\nexport const addNodeAndDescendants = async (params: NodeCreateParams): Promise<RecordUpdateResult> => {\n const { survey, record, parentNode, nodeDef, sideEffect = false } = params\n\n const node = NodeFactory.createInstance({\n nodeDefUuid: nodeDef.uuid,\n recordUuid: record.uuid,\n parentNode,\n surveyUuid: survey.uuid,\n })\n if (parentNode && nodeDef.type === NodeDefType.code && NodeDefs.getParentCodeDefUuid(nodeDef as NodeDefCode)) {\n // meta.hCode indexes the node as dependent of its ancestor code attributes (cleared when they change)\n const ancestorCodeAttributes = getAncestorCodeAttributes(survey, parentNode, nodeDef as NodeDefCode)(record)\n node.meta = { ...node.meta, hCode: ancestorCodeAttributes.map((codeAttribute) => codeAttribute.uuid) }\n }\n\n const updateResult = new RecordUpdateResult({ record })\n updateResult.addNode(node, { sideEffect })\n\n // Add children if entity\n if (NodeDefs.isEntity(nodeDef)) {\n const descendantsUpdateResult = await addDescendants({\n ...params,\n record: updateResult.record,\n parentNode: node,\n })\n updateResult.merge(descendantsUpdateResult)\n }\n return updateResult\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getCycle, getRoot, getNodes, getNodesArray, getNodeByUuid, getNodesByUuids, getNodesByDefUuid, getChild, getChildren, getParent, getParentCodeAttribute, getAncestorCodePath, getDependentCodeAttributes, getAncestor, getEntityKeyNodes, getEntityKeyNodesByDefUuid, getEntityKeyValues, getEntityKeyValuesByDefUuid, getEntitySiblings, getAttributeSiblings, getNodeIndex, isNodeApplicable, isNodeEditable, isNodeVisible, isNodeRequired, visitAncestorsAndSelf, getAncestorsAndSelf, getDescendant, getDescendantsOrSelf, isDescendantOf, visitDescendantsAndSelf, getDependentNodePointers, findEntityByKeyValues, findEntityWithSameKeysInAnotherRecord, getCategoryItemUuid, isNodeEmpty, isNodeFilledByUser, isEmpty, getStep, isInAnalysisStep, } from './_records/recordGetters';
|
|
1
|
+
import { getCycle, getRoot, getNodes, getNodesArray, getNodeByUuid, getNodesByUuids, getNodesByDefUuid, getChild, getChildren, getParent, getParentCodeAttribute, getAncestorCodeAttributes, getAncestorCodePath, getDependentCodeAttributes, getAncestor, getEntityKeyNodes, getEntityKeyNodesByDefUuid, getEntityKeyValues, getEntityKeyValuesByDefUuid, getEntitySiblings, getAttributeSiblings, getNodeIndex, isNodeApplicable, isNodeEditable, isNodeVisible, isNodeRequired, visitAncestorsAndSelf, getAncestorsAndSelf, getDescendant, getDescendantsOrSelf, isDescendantOf, visitDescendantsAndSelf, getDependentNodePointers, findEntityByKeyValues, findEntityWithSameKeysInAnotherRecord, getCategoryItemUuid, isNodeEmpty, isNodeFilledByUser, isEmpty, getStep, isInAnalysisStep, } from './_records/recordGetters';
|
|
2
2
|
import { addNode, addNodes } from './_records/recordUpdater';
|
|
3
3
|
import { getEnumeratingCategoryItems, findDependentEnumeratedEntityDefsNotEmpty } from './_records/recordUtils';
|
|
4
4
|
import { getEntityCompletionPercent, getEntityCompletionStats, getEntityOwnCompletionPercent, getRecordCompletionPercent, } from './_records/recordCompletion';
|
|
@@ -17,6 +17,7 @@ export const Records = {
|
|
|
17
17
|
getChildren,
|
|
18
18
|
getParent,
|
|
19
19
|
getParentCodeAttribute,
|
|
20
|
+
getAncestorCodeAttributes,
|
|
20
21
|
getAncestorCodePath,
|
|
21
22
|
getDependentCodeAttributes,
|
|
22
23
|
getAncestor,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/record/records.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,aAAa,EACb,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,sBAAsB,EACtB,mBAAmB,EACnB,0BAA0B,EAC1B,WAAW,EACX,iBAAiB,EACjB,0BAA0B,EAC1B,kBAAkB,EAClB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,qCAAqC,EACrC,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,OAAO,EACP,gBAAgB,GACjB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,2BAA2B,EAAE,yCAAyC,EAAE,MAAM,wBAAwB,CAAA;AAC/G,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,6BAA6B,EAC7B,2BAA2B,EAC3B,eAAe,EACf,uBAAuB,EACvB,gCAAgC,EAChC,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAEjF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,aAAa;IACb,aAAa;IACb,eAAe;IACf,iBAAiB;IACjB,QAAQ;IACR,WAAW;IACX,SAAS;IACT,sBAAsB;IACtB,mBAAmB;IACnB,0BAA0B;IAC1B,WAAW;IACX,iBAAiB;IACjB,0BAA0B;IAC1B,kBAAkB;IAClB,2BAA2B;IAC3B,iBAAiB;IACjB,oBAAoB;IACpB,YAAY;IACZ,gBAAgB;IAChB,cAAc;IACd,aAAa;IACb,cAAc;IACd,qBAAqB;IACrB,mBAAmB;IACnB,aAAa;IACb,oBAAoB;IACpB,cAAc;IACd,uBAAuB;IACvB,wBAAwB;IACxB,qBAAqB;IACrB,qCAAqC;IACrC,mBAAmB;IACnB,WAAW;IACX,kBAAkB;IAClB,OAAO;IACP,OAAO;IACP,gBAAgB;IAChB,0BAA0B;IAC1B,wBAAwB;IACxB,6BAA6B;IAC7B,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,6BAA6B;IAC7B,iBAAiB;IACjB,oBAAoB;IACpB,uBAAuB;IACvB,gBAAgB;IAChB,gCAAgC;IAChC,sBAAsB;IACtB,6BAA6B;IAC7B,SAAS;IACT,OAAO;IACP,QAAQ;IACR,gIAAgI;IAChI,UAAU;IACV,oIAAoI;IACpI,WAAW;IACX,uGAAuG;IACvG,UAAU,EAAE,UAAU;IACtB,yGAAyG;IACzG,WAAW,EAAE,WAAW;IACxB,QAAQ;IACR,2BAA2B;IAC3B,yCAAyC;CAC1C,CAAA","sourcesContent":["import {\n getCycle,\n getRoot,\n getNodes,\n getNodesArray,\n getNodeByUuid,\n getNodesByUuids,\n getNodesByDefUuid,\n getChild,\n getChildren,\n getParent,\n getParentCodeAttribute,\n getAncestorCodePath,\n getDependentCodeAttributes,\n getAncestor,\n getEntityKeyNodes,\n getEntityKeyNodesByDefUuid,\n getEntityKeyValues,\n getEntityKeyValuesByDefUuid,\n getEntitySiblings,\n getAttributeSiblings,\n getNodeIndex,\n isNodeApplicable,\n isNodeEditable,\n isNodeVisible,\n isNodeRequired,\n visitAncestorsAndSelf,\n getAncestorsAndSelf,\n getDescendant,\n getDescendantsOrSelf,\n isDescendantOf,\n visitDescendantsAndSelf,\n getDependentNodePointers,\n findEntityByKeyValues,\n findEntityWithSameKeysInAnotherRecord,\n getCategoryItemUuid,\n isNodeEmpty,\n isNodeFilledByUser,\n isEmpty,\n getStep,\n isInAnalysisStep,\n} from './_records/recordGetters'\nimport { addNode, addNodes } from './_records/recordUpdater'\nimport { getEnumeratingCategoryItems, findDependentEnumeratedEntityDefsNotEmpty } from './_records/recordUtils'\nimport {\n getEntityCompletionPercent,\n getEntityCompletionStats,\n getEntityOwnCompletionPercent,\n getRecordCompletionPercent,\n} from './_records/recordCompletion'\nimport {\n getDescendantPageNodeDefUuids,\n getEntitySubtreeStatus,\n getMultiplePageEntitiesStatus,\n getNodeDefChildrenInOwnPage,\n getPageNodeDefs,\n getPageValidationStatus,\n getRecordPagesValidationProgress,\n nodeBelongsToOwnPage,\n nodeBelongsToPage,\n pageHasOwnErrors,\n} from './_records/recordPagesValidation'\nimport { removeNode, removeNodes } from './recordNodesUpdater/recordNodesDeleter'\n\nexport const Records = {\n // READ\n getCycle,\n getRoot,\n getNodes,\n getNodesArray,\n getNodeByUuid,\n getNodesByUuids,\n getNodesByDefUuid,\n getChild,\n getChildren,\n getParent,\n getParentCodeAttribute,\n getAncestorCodePath,\n getDependentCodeAttributes,\n getAncestor,\n getEntityKeyNodes,\n getEntityKeyNodesByDefUuid,\n getEntityKeyValues,\n getEntityKeyValuesByDefUuid,\n getEntitySiblings,\n getAttributeSiblings,\n getNodeIndex,\n isNodeApplicable,\n isNodeEditable,\n isNodeVisible,\n isNodeRequired,\n visitAncestorsAndSelf,\n getAncestorsAndSelf,\n getDescendant,\n getDescendantsOrSelf,\n isDescendantOf,\n visitDescendantsAndSelf,\n getDependentNodePointers,\n findEntityByKeyValues,\n findEntityWithSameKeysInAnotherRecord,\n getCategoryItemUuid,\n isNodeEmpty,\n isNodeFilledByUser,\n isEmpty,\n getStep,\n isInAnalysisStep,\n getEntityCompletionPercent,\n getEntityCompletionStats,\n getEntityOwnCompletionPercent,\n getRecordCompletionPercent,\n getNodeDefChildrenInOwnPage,\n getPageNodeDefs,\n getDescendantPageNodeDefUuids,\n nodeBelongsToPage,\n nodeBelongsToOwnPage,\n getPageValidationStatus,\n pageHasOwnErrors,\n getRecordPagesValidationProgress,\n getEntitySubtreeStatus,\n getMultiplePageEntitiesStatus,\n // UPDATE\n addNode,\n addNodes,\n /** Low-level: removes the node and its descendants without updating dependents and validation (see RecordUpdater.deleteNode) */\n removeNode,\n /** Low-level: removes the nodes and their descendants without updating dependents and validation (see RecordUpdater.deleteNodes) */\n removeNodes,\n /** @deprecated Use removeNode (or RecordUpdater.deleteNode to update dependents and validation too) */\n deleteNode: removeNode,\n /** @deprecated Use removeNodes (or RecordUpdater.deleteNodes to update dependents and validation too) */\n deleteNodes: removeNodes,\n // Utils\n getEnumeratingCategoryItems,\n findDependentEnumeratedEntityDefsNotEmpty,\n}\n\nexport type { RecordUpdateOptions } from './_records/recordUpdateOptions'\nexport type {\n EntitySubtreeStatus,\n PageValidationStatus,\n PagesValidationProgress,\n} from './_records/recordPagesValidation'\n"]}
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../../src/record/records.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,aAAa,EACb,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,0BAA0B,EAC1B,WAAW,EACX,iBAAiB,EACjB,0BAA0B,EAC1B,kBAAkB,EAClB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,qCAAqC,EACrC,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,OAAO,EACP,gBAAgB,GACjB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,2BAA2B,EAAE,yCAAyC,EAAE,MAAM,wBAAwB,CAAA;AAC/G,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,6BAA6B,EAC7B,2BAA2B,EAC3B,eAAe,EACf,uBAAuB,EACvB,gCAAgC,EAChC,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAEjF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,aAAa;IACb,aAAa;IACb,eAAe;IACf,iBAAiB;IACjB,QAAQ;IACR,WAAW;IACX,SAAS;IACT,sBAAsB;IACtB,yBAAyB;IACzB,mBAAmB;IACnB,0BAA0B;IAC1B,WAAW;IACX,iBAAiB;IACjB,0BAA0B;IAC1B,kBAAkB;IAClB,2BAA2B;IAC3B,iBAAiB;IACjB,oBAAoB;IACpB,YAAY;IACZ,gBAAgB;IAChB,cAAc;IACd,aAAa;IACb,cAAc;IACd,qBAAqB;IACrB,mBAAmB;IACnB,aAAa;IACb,oBAAoB;IACpB,cAAc;IACd,uBAAuB;IACvB,wBAAwB;IACxB,qBAAqB;IACrB,qCAAqC;IACrC,mBAAmB;IACnB,WAAW;IACX,kBAAkB;IAClB,OAAO;IACP,OAAO;IACP,gBAAgB;IAChB,0BAA0B;IAC1B,wBAAwB;IACxB,6BAA6B;IAC7B,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,6BAA6B;IAC7B,iBAAiB;IACjB,oBAAoB;IACpB,uBAAuB;IACvB,gBAAgB;IAChB,gCAAgC;IAChC,sBAAsB;IACtB,6BAA6B;IAC7B,SAAS;IACT,OAAO;IACP,QAAQ;IACR,gIAAgI;IAChI,UAAU;IACV,oIAAoI;IACpI,WAAW;IACX,uGAAuG;IACvG,UAAU,EAAE,UAAU;IACtB,yGAAyG;IACzG,WAAW,EAAE,WAAW;IACxB,QAAQ;IACR,2BAA2B;IAC3B,yCAAyC;CAC1C,CAAA","sourcesContent":["import {\n getCycle,\n getRoot,\n getNodes,\n getNodesArray,\n getNodeByUuid,\n getNodesByUuids,\n getNodesByDefUuid,\n getChild,\n getChildren,\n getParent,\n getParentCodeAttribute,\n getAncestorCodeAttributes,\n getAncestorCodePath,\n getDependentCodeAttributes,\n getAncestor,\n getEntityKeyNodes,\n getEntityKeyNodesByDefUuid,\n getEntityKeyValues,\n getEntityKeyValuesByDefUuid,\n getEntitySiblings,\n getAttributeSiblings,\n getNodeIndex,\n isNodeApplicable,\n isNodeEditable,\n isNodeVisible,\n isNodeRequired,\n visitAncestorsAndSelf,\n getAncestorsAndSelf,\n getDescendant,\n getDescendantsOrSelf,\n isDescendantOf,\n visitDescendantsAndSelf,\n getDependentNodePointers,\n findEntityByKeyValues,\n findEntityWithSameKeysInAnotherRecord,\n getCategoryItemUuid,\n isNodeEmpty,\n isNodeFilledByUser,\n isEmpty,\n getStep,\n isInAnalysisStep,\n} from './_records/recordGetters'\nimport { addNode, addNodes } from './_records/recordUpdater'\nimport { getEnumeratingCategoryItems, findDependentEnumeratedEntityDefsNotEmpty } from './_records/recordUtils'\nimport {\n getEntityCompletionPercent,\n getEntityCompletionStats,\n getEntityOwnCompletionPercent,\n getRecordCompletionPercent,\n} from './_records/recordCompletion'\nimport {\n getDescendantPageNodeDefUuids,\n getEntitySubtreeStatus,\n getMultiplePageEntitiesStatus,\n getNodeDefChildrenInOwnPage,\n getPageNodeDefs,\n getPageValidationStatus,\n getRecordPagesValidationProgress,\n nodeBelongsToOwnPage,\n nodeBelongsToPage,\n pageHasOwnErrors,\n} from './_records/recordPagesValidation'\nimport { removeNode, removeNodes } from './recordNodesUpdater/recordNodesDeleter'\n\nexport const Records = {\n // READ\n getCycle,\n getRoot,\n getNodes,\n getNodesArray,\n getNodeByUuid,\n getNodesByUuids,\n getNodesByDefUuid,\n getChild,\n getChildren,\n getParent,\n getParentCodeAttribute,\n getAncestorCodeAttributes,\n getAncestorCodePath,\n getDependentCodeAttributes,\n getAncestor,\n getEntityKeyNodes,\n getEntityKeyNodesByDefUuid,\n getEntityKeyValues,\n getEntityKeyValuesByDefUuid,\n getEntitySiblings,\n getAttributeSiblings,\n getNodeIndex,\n isNodeApplicable,\n isNodeEditable,\n isNodeVisible,\n isNodeRequired,\n visitAncestorsAndSelf,\n getAncestorsAndSelf,\n getDescendant,\n getDescendantsOrSelf,\n isDescendantOf,\n visitDescendantsAndSelf,\n getDependentNodePointers,\n findEntityByKeyValues,\n findEntityWithSameKeysInAnotherRecord,\n getCategoryItemUuid,\n isNodeEmpty,\n isNodeFilledByUser,\n isEmpty,\n getStep,\n isInAnalysisStep,\n getEntityCompletionPercent,\n getEntityCompletionStats,\n getEntityOwnCompletionPercent,\n getRecordCompletionPercent,\n getNodeDefChildrenInOwnPage,\n getPageNodeDefs,\n getDescendantPageNodeDefUuids,\n nodeBelongsToPage,\n nodeBelongsToOwnPage,\n getPageValidationStatus,\n pageHasOwnErrors,\n getRecordPagesValidationProgress,\n getEntitySubtreeStatus,\n getMultiplePageEntitiesStatus,\n // UPDATE\n addNode,\n addNodes,\n /** Low-level: removes the node and its descendants without updating dependents and validation (see RecordUpdater.deleteNode) */\n removeNode,\n /** Low-level: removes the nodes and their descendants without updating dependents and validation (see RecordUpdater.deleteNodes) */\n removeNodes,\n /** @deprecated Use removeNode (or RecordUpdater.deleteNode to update dependents and validation too) */\n deleteNode: removeNode,\n /** @deprecated Use removeNodes (or RecordUpdater.deleteNodes to update dependents and validation too) */\n deleteNodes: removeNodes,\n // Utils\n getEnumeratingCategoryItems,\n findDependentEnumeratedEntityDefsNotEmpty,\n}\n\nexport type { RecordUpdateOptions } from './_records/recordUpdateOptions'\nexport type {\n EntitySubtreeStatus,\n PageValidationStatus,\n PagesValidationProgress,\n} from './_records/recordPagesValidation'\n"]}
|
package/dist/node/node.d.ts
CHANGED
package/dist/node/node.js
CHANGED
package/dist/node/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/node/node.ts"],"names":[],"mappings":";;;AAGA,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,2BAAe,CAAA;AACjB,CAAC,EAHW,QAAQ,aAAR,QAAQ,GAAR,QAAQ,QAGnB;AAED,IAAY,
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/node/node.ts"],"names":[],"mappings":";;;AAGA,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,yBAAa,CAAA;IACb,2BAAe,CAAA;AACjB,CAAC,EAHW,QAAQ,aAAR,QAAQ,GAAR,QAAQ,QAGnB;AAED,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,uBAAO,CAAA;IACP,+BAAe,CAAA;AACjB,CAAC,EAHW,YAAY,aAAZ,YAAY,GAAZ,YAAY,QAGvB","sourcesContent":["import { CategoryItem } from '../category'\nimport { Taxon } from '../taxonomy'\n\nexport enum NodeKeys {\n meta = 'meta',\n value = 'value',\n}\n\nexport enum NodeMetaKeys {\n h = 'h',\n hCode = 'hCode',\n}\n\nexport interface NodeMeta {\n /**\n * Applicability of the node children (by definition UUID). If not defined, the children are applicable by default.\n */\n childApplicability?: { [uuid: string]: boolean }\n /**\n * Whether the node children (by definition UUID) are editable (true) or read-only (false).\n * If not defined, the children are editable by default.\n */\n cEdit?: { [uuid: string]: boolean }\n /**\n * Whether the node children (by definition UUID) are required because their \"required if\" condition is met (true).\n * If not defined, the children are not required by a condition (only true values are stored).\n */\n cReq?: { [uuid: string]: boolean }\n /**\n * Maximum number of children (by definition UUID) for the node.\n */\n childrenMaxCount?: { [uuid: string]: number }\n /**\n * Minimum number of children (by definition UUID) for the node.\n */\n childrenMinCount?: { [uuid: string]: number }\n /**\n * Whether the node children (by definition UUID) are visible (true) or hidden (false).\n * If not defined, the children are visible by default.\n */\n cVis?: { [uuid: string]: boolean }\n /**\n * Hierarchy of ancestor node UUIDs.\n */\n h?: string[]\n /**\n * Hierarchy of code attribute ancestor UUIDs (according to the parent code defs specified).\n */\n hCode?: string[]\n /**\n * True if the value has been auto-filled from the node default value\n */\n defaultValueApplied?: boolean\n /**\n * True if the value has been auto-filled from the user group qualifier\n */\n qualifierValueApplied?: boolean\n}\n\nexport interface NodeRefData {\n categoryItem?: CategoryItem\n taxon?: Taxon\n}\n\nexport interface ArenaRecordNode {\n dateCreated?: string\n dateModified?: string\n id?: number\n meta?: NodeMeta\n nodeDefUuid: string\n parentUuid?: string\n recordUuid: string\n refData?: NodeRefData\n uuid: string\n value?: any\n placeholder?: boolean\n surveyUuid?: string\n\n // transient status variables\n /**\n * Record node has been created but not persisted yet.\n */\n created?: boolean\n /**\n * Record node has been deleted.\n */\n deleted?: boolean\n /**\n * Record node has been modified but not persisted yet.\n */\n updated?: boolean\n}\n\n/**\n * @deprecated Use ArenaRecordNode: this name shadows the DOM Node type.\n * It will be removed in the next major version.\n */\nexport type Node = ArenaRecordNode\n\nexport interface NodesMap {\n [key: string]: ArenaRecordNode\n}\n"]}
|
|
@@ -73,6 +73,10 @@ export declare const getNodeIndex: (node: ArenaRecordNode) => (record: ArenaReco
|
|
|
73
73
|
export declare const findEntityByKeyValues: (survey: Survey, cycle: string, parentEntity: ArenaRecordNode, entityDefUuid: string, keyValuesByDefUuid: Dictionary<any>) => (record: ArenaRecord) => ArenaRecordNode | undefined;
|
|
74
74
|
export declare const findEntityWithSameKeysInAnotherRecord: (survey: Survey, cycle: string, entityUuid: string, recordOther: ArenaRecord) => (record: ArenaRecord) => ArenaRecordNode | undefined;
|
|
75
75
|
export declare const getDependentNodePointers: (survey: Survey, node: ArenaRecordNode, dependencyType: SurveyDependencyType, includeSelf?: boolean, filterFn?: ((nodePointer: NodePointer) => boolean) | null) => (record: ArenaRecord) => NodePointer[];
|
|
76
|
+
/**
|
|
77
|
+
* Returns the code attributes the specified code attribute depends on, from the top level one to the parent one.
|
|
78
|
+
*/
|
|
79
|
+
export declare const getAncestorCodeAttributes: (survey: Survey, parentNode: ArenaRecordNode, nodeDef: NodeDefCode) => (record: ArenaRecord) => ArenaRecordNode[];
|
|
76
80
|
export declare const getAncestorCodePath: (survey: Survey, parentNode: ArenaRecordNode, nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>) => (record: ArenaRecord) => string[];
|
|
77
81
|
export declare const getCategoryItemUuid: (survey: Survey, nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>, parentNode: ArenaRecordNode, code: string) => (record: ArenaRecord) => string | undefined;
|
|
78
82
|
export declare const isNodeFilledByUser: (node: ArenaRecordNode) => (record: ArenaRecord) => boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isInAnalysisStep = exports.getStep = exports.isEmpty = exports.isNodeEmpty = exports.isNodeFilledByUser = exports.getCategoryItemUuid = exports.getAncestorCodePath = exports.getDependentNodePointers = exports.findEntityWithSameKeysInAnotherRecord = exports.findEntityByKeyValues = exports.getNodeIndex = exports.getAttributeSiblings = exports.getEntitySiblings = exports.getEntityKeyValues = exports.getEntityKeyValuesByDefUuid = exports.getEntityKeyNodes = exports.getEntityKeyNodesByDefUuid = exports.findDescendantOrSelf = exports.visitDescendantsAndSelf = exports.isDescendantOf = exports.getDescendant = exports.getDescendantsOrSelf = exports.getAncestorsAndSelf = exports.getAncestor = exports.findAncestor = exports.visitAncestorsAndSelf = exports.getParentCodeAttribute = exports.getDependentCodeAttributes = exports.isNodeRequired = exports.isNodeVisible = exports.isNodeEditable = exports.isNodeApplicable = exports.getNodesByDefUuid = exports.getParent = exports.getChild = exports.getChildren = exports.getRoot = exports.getNodesByUuids = exports.getNodeByUuid = exports.getNodesArray = exports.getNodes = exports.getCycle = void 0;
|
|
3
|
+
exports.isInAnalysisStep = exports.getStep = exports.isEmpty = exports.isNodeEmpty = exports.isNodeFilledByUser = exports.getCategoryItemUuid = exports.getAncestorCodePath = exports.getAncestorCodeAttributes = exports.getDependentNodePointers = exports.findEntityWithSameKeysInAnotherRecord = exports.findEntityByKeyValues = exports.getNodeIndex = exports.getAttributeSiblings = exports.getEntitySiblings = exports.getEntityKeyValues = exports.getEntityKeyValuesByDefUuid = exports.getEntityKeyNodes = exports.getEntityKeyNodesByDefUuid = exports.findDescendantOrSelf = exports.visitDescendantsAndSelf = exports.isDescendantOf = exports.getDescendant = exports.getDescendantsOrSelf = exports.getAncestorsAndSelf = exports.getAncestor = exports.findAncestor = exports.visitAncestorsAndSelf = exports.getParentCodeAttribute = exports.getDependentCodeAttributes = exports.isNodeRequired = exports.isNodeVisible = exports.isNodeEditable = exports.isNodeApplicable = exports.getNodesByDefUuid = exports.getParent = exports.getChild = exports.getChildren = exports.getRoot = exports.getNodesByUuids = exports.getNodeByUuid = exports.getNodesArray = exports.getNodes = exports.getCycle = void 0;
|
|
4
4
|
const common_1 = require("../../common");
|
|
5
5
|
const error_1 = require("../../error");
|
|
6
6
|
const node_1 = require("../../node");
|
|
@@ -400,28 +400,33 @@ const getDependentNodePointers = (survey, node, dependencyType, includeSelf = fa
|
|
|
400
400
|
return nodePointers;
|
|
401
401
|
};
|
|
402
402
|
exports.getDependentNodePointers = getDependentNodePointers;
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
return '';
|
|
409
|
-
const item = survey_1.Surveys.getCategoryItemByUuid({ survey, itemUuid: codeItemUuid });
|
|
410
|
-
return (_a = item === null || item === void 0 ? void 0 : item.props.code) !== null && _a !== void 0 ? _a : '';
|
|
411
|
-
};
|
|
412
|
-
const codePaths = [];
|
|
403
|
+
/**
|
|
404
|
+
* Returns the code attributes the specified code attribute depends on, from the top level one to the parent one.
|
|
405
|
+
*/
|
|
406
|
+
const getAncestorCodeAttributes = (survey, parentNode, nodeDef) => (record) => {
|
|
407
|
+
const ancestorCodeAttributes = [];
|
|
413
408
|
let currentParentCodeAttribute = (0, exports.getParentCodeAttribute)(parentNode, nodeDef)(record);
|
|
414
409
|
while (currentParentCodeAttribute) {
|
|
415
|
-
|
|
416
|
-
codePaths.unshift(ancestorItemCode);
|
|
410
|
+
ancestorCodeAttributes.unshift(currentParentCodeAttribute);
|
|
417
411
|
const ancestorCodeDef = survey_1.Surveys.getNodeDefByUuid({
|
|
418
412
|
survey,
|
|
419
413
|
uuid: currentParentCodeAttribute.nodeDefUuid,
|
|
420
414
|
});
|
|
421
415
|
currentParentCodeAttribute = (0, exports.getParentCodeAttribute)(parentNode, ancestorCodeDef)(record);
|
|
422
416
|
}
|
|
423
|
-
return
|
|
417
|
+
return ancestorCodeAttributes;
|
|
424
418
|
};
|
|
419
|
+
exports.getAncestorCodeAttributes = getAncestorCodeAttributes;
|
|
420
|
+
const getAncestorCodePath = (survey, parentNode, nodeDef) => (record) => (0, exports.getAncestorCodeAttributes)(survey, parentNode, nodeDef)(record).map((codeAttribute) => {
|
|
421
|
+
var _a;
|
|
422
|
+
var _b, _c;
|
|
423
|
+
const codeItemUuid = nodeValues_1.NodeValues.getItemUuid(codeAttribute);
|
|
424
|
+
if (!codeItemUuid)
|
|
425
|
+
return '';
|
|
426
|
+
// items of big categories are not in the survey ref data: they can be in the node ref data
|
|
427
|
+
const item = (_b = (_a = codeAttribute.refData) === null || _a === void 0 ? void 0 : _a.categoryItem) !== null && _b !== void 0 ? _b : survey_1.Surveys.getCategoryItemByUuid({ survey, itemUuid: codeItemUuid });
|
|
428
|
+
return (_c = item === null || item === void 0 ? void 0 : item.props.code) !== null && _c !== void 0 ? _c : '';
|
|
429
|
+
});
|
|
425
430
|
exports.getAncestorCodePath = getAncestorCodePath;
|
|
426
431
|
const getCategoryItemUuid = (survey, nodeDef, parentNode, code) => (record) => {
|
|
427
432
|
const categoryUuid = nodeDef.props.categoryUuid;
|