@itwin/presentation-hierarchies-react 1.10.0 → 1.10.2

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 (82) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +50 -10
  3. package/lib/cjs/presentation-hierarchies-react/LocalizationContext.d.ts +1 -1
  4. package/lib/cjs/presentation-hierarchies-react/LocalizationContext.d.ts.map +1 -1
  5. package/lib/cjs/presentation-hierarchies-react/LocalizationContext.js +1 -1
  6. package/lib/cjs/presentation-hierarchies-react/LocalizationContext.js.map +1 -1
  7. package/lib/cjs/presentation-hierarchies-react/TreeNode.d.ts.map +1 -1
  8. package/lib/cjs/presentation-hierarchies-react/TreeNode.js.map +1 -1
  9. package/lib/cjs/presentation-hierarchies-react/UnifiedSelectionContext.d.ts.map +1 -1
  10. package/lib/cjs/presentation-hierarchies-react/UnifiedSelectionContext.js +1 -1
  11. package/lib/cjs/presentation-hierarchies-react/UnifiedSelectionContext.js.map +1 -1
  12. package/lib/cjs/presentation-hierarchies-react/UseIModelTree.d.ts.map +1 -1
  13. package/lib/cjs/presentation-hierarchies-react/UseIModelTree.js.map +1 -1
  14. package/lib/cjs/presentation-hierarchies-react/UseSelectionHandler.d.ts.map +1 -1
  15. package/lib/cjs/presentation-hierarchies-react/UseSelectionHandler.js +1 -4
  16. package/lib/cjs/presentation-hierarchies-react/UseSelectionHandler.js.map +1 -1
  17. package/lib/cjs/presentation-hierarchies-react/UseTree.d.ts.map +1 -1
  18. package/lib/cjs/presentation-hierarchies-react/UseTree.js +5 -22
  19. package/lib/cjs/presentation-hierarchies-react/UseTree.js.map +1 -1
  20. package/lib/cjs/presentation-hierarchies-react/internal/TreeActions.d.ts.map +1 -1
  21. package/lib/cjs/presentation-hierarchies-react/internal/TreeActions.js +27 -12
  22. package/lib/cjs/presentation-hierarchies-react/internal/TreeActions.js.map +1 -1
  23. package/lib/cjs/presentation-hierarchies-react/internal/TreeLoader.d.ts.map +1 -1
  24. package/lib/cjs/presentation-hierarchies-react/internal/TreeLoader.js +10 -21
  25. package/lib/cjs/presentation-hierarchies-react/internal/TreeLoader.js.map +1 -1
  26. package/lib/cjs/presentation-hierarchies-react/internal/TreeModel.d.ts.map +1 -1
  27. package/lib/cjs/presentation-hierarchies-react/internal/TreeModel.js +2 -2
  28. package/lib/cjs/presentation-hierarchies-react/internal/TreeModel.js.map +1 -1
  29. package/lib/cjs/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts.map +1 -1
  30. package/lib/cjs/presentation-hierarchies-react/internal/UseUnifiedSelection.js +7 -11
  31. package/lib/cjs/presentation-hierarchies-react/internal/UseUnifiedSelection.js.map +1 -1
  32. package/lib/cjs/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts.map +1 -1
  33. package/lib/cjs/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js +17 -7
  34. package/lib/cjs/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js.map +1 -1
  35. package/lib/cjs/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts +1 -1
  36. package/lib/cjs/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts.map +1 -1
  37. package/lib/cjs/presentation-hierarchies-react/itwinui/TreeRenderer.js +2 -15
  38. package/lib/cjs/presentation-hierarchies-react/itwinui/TreeRenderer.js.map +1 -1
  39. package/lib/cjs/presentation-hierarchies-react-itwinui.d.ts +1 -1
  40. package/lib/cjs/presentation-hierarchies-react-itwinui.d.ts.map +1 -1
  41. package/lib/cjs/presentation-hierarchies-react-itwinui.js.map +1 -1
  42. package/lib/esm/presentation-hierarchies-react/LocalizationContext.d.ts +1 -1
  43. package/lib/esm/presentation-hierarchies-react/LocalizationContext.d.ts.map +1 -1
  44. package/lib/esm/presentation-hierarchies-react/LocalizationContext.js +1 -1
  45. package/lib/esm/presentation-hierarchies-react/LocalizationContext.js.map +1 -1
  46. package/lib/esm/presentation-hierarchies-react/TreeNode.d.ts.map +1 -1
  47. package/lib/esm/presentation-hierarchies-react/TreeNode.js.map +1 -1
  48. package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.d.ts.map +1 -1
  49. package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.js +1 -1
  50. package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.js.map +1 -1
  51. package/lib/esm/presentation-hierarchies-react/UseIModelTree.d.ts.map +1 -1
  52. package/lib/esm/presentation-hierarchies-react/UseIModelTree.js +1 -1
  53. package/lib/esm/presentation-hierarchies-react/UseIModelTree.js.map +1 -1
  54. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.d.ts.map +1 -1
  55. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.js +1 -4
  56. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.js.map +1 -1
  57. package/lib/esm/presentation-hierarchies-react/UseTree.d.ts.map +1 -1
  58. package/lib/esm/presentation-hierarchies-react/UseTree.js +7 -24
  59. package/lib/esm/presentation-hierarchies-react/UseTree.js.map +1 -1
  60. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.d.ts.map +1 -1
  61. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.js +29 -14
  62. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.js.map +1 -1
  63. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.d.ts.map +1 -1
  64. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.js +11 -22
  65. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.js.map +1 -1
  66. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.d.ts.map +1 -1
  67. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.js +2 -2
  68. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.js.map +1 -1
  69. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts.map +1 -1
  70. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.js +8 -12
  71. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.js.map +1 -1
  72. package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts.map +1 -1
  73. package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js +19 -9
  74. package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js.map +1 -1
  75. package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts.map +1 -1
  76. package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.js +2 -15
  77. package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.js.map +1 -1
  78. package/lib/esm/presentation-hierarchies-react-itwinui.d.ts +1 -1
  79. package/lib/esm/presentation-hierarchies-react-itwinui.d.ts.map +1 -1
  80. package/lib/esm/presentation-hierarchies-react-itwinui.js +1 -1
  81. package/lib/esm/presentation-hierarchies-react-itwinui.js.map +1 -1
  82. package/package.json +18 -30
@@ -1 +1 @@
1
- {"version":3,"file":"UseSelectionHandler.js","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseSelectionHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { isPresentationHierarchyNode, PresentationHierarchyNode, PresentationTreeNode } from \"./TreeNode.js\";\nimport { useTree } from \"./UseTree.js\";\n\n/**\n * A union of different supported selection modes in a tree component:\n * - `none` - no selection is allowed,\n * - `single` - only one node can be selected at a time,\n * - `extended` - multiple nodes can be selected using shift and ctrl keys,\n * - `multiple` - multiple nodes can be selected without using shift or ctrl keys.\n *\n * @public\n */\nexport type SelectionMode = \"none\" | \"single\" | \"extended\" | \"multiple\";\n\n/**\n * Type of selection change.\n * - `add` - a node was added to the selection,\n * - `replace` - a selected node was replaced with a different one,\n * - `remove` - a node was removed from the selection.\n *\n * @public\n */\nexport type SelectionChangeType = \"add\" | \"replace\" | \"remove\";\n\n/**\n * Props for `useSelectionHandler` hook.\n * @public\n */\ntype UseSelectionHandlerProps = Pick<ReturnType<typeof useTree>, \"rootNodes\" | \"selectNodes\"> & {\n /** Selection mode that the component is working in. */\n selectionMode: SelectionMode;\n};\n\n/**\n * Result of `useSelectionHandler` hook.\n * @public\n */\ninterface UseSelectionHandlerResult {\n /** Should be called by node renderer when a node component is clicked. */\n onNodeClick: (node: PresentationHierarchyNode, isSelected: boolean, event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Should be called by node renderer when a keyboard event happens on a node. */\n onNodeKeyDown: (node: PresentationHierarchyNode, isSelected: boolean, event: React.KeyboardEvent<HTMLElement>) => void;\n}\n\ninterface FlatTreeState {\n flatNodeList: Array<string>;\n nodeIdToIndexMap: Map<string, number>;\n}\n\n/**\n * A react hook that helps implement different selection modes in a tree component created using `useTree` hook.\n * @public\n */\nexport function useSelectionHandler(props: UseSelectionHandlerProps): UseSelectionHandlerResult {\n const { rootNodes, selectionMode, selectNodes } = props;\n const previousSelectionRef = useRef<string | undefined>(undefined);\n const state = useRef<FlatTreeState>({\n flatNodeList: [],\n nodeIdToIndexMap: new Map(),\n });\n\n useEffect(() => {\n if (!rootNodes) {\n return;\n }\n state.current = computeFlatNodeList(rootNodes);\n }, [rootNodes]);\n\n const getNodeRange = (firstId?: string, secondId?: string) => {\n const getIndex = (nodeId?: string) => {\n return nodeId ? state.current.nodeIdToIndexMap.get(nodeId) : 0;\n };\n const firstIndex = getIndex(firstId);\n const secondIndex = getIndex(secondId);\n if (firstIndex === undefined || secondIndex === undefined) {\n return [];\n }\n\n const startingIndex = Math.min(firstIndex, secondIndex);\n const endIndex = Math.max(firstIndex, secondIndex);\n return state.current.flatNodeList.slice(startingIndex, endIndex + 1);\n };\n\n const onNodeSelect = useCallback(\n (nodeId: string, isSelected: boolean, shiftDown: boolean, ctrlDown: boolean) => {\n const selection = getSelectionAction(selectionMode, isSelected, shiftDown, ctrlDown);\n if (selection.type === \"disabled\") {\n return;\n }\n\n const nodes = selection.select === \"range\" ? getNodeRange(previousSelectionRef.current, nodeId) : [nodeId];\n if (!nodes.length) {\n return;\n }\n\n selection.select !== \"range\" && (previousSelectionRef.current = nodeId);\n selectNodes(nodes, selection.type);\n },\n [selectionMode, selectNodes],\n );\n\n const onNodeClick = useCallback(\n (node: PresentationHierarchyNode, isSelected: boolean, event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n return onNodeSelect(node.id, isSelected, event.shiftKey, event.ctrlKey);\n },\n [onNodeSelect],\n );\n\n const onNodeKeyDown = useCallback(\n (node: PresentationHierarchyNode, isSelected: boolean, event: React.KeyboardEvent<HTMLElement>) => {\n if (event.key === \" \" || event.key === \"Spacebar\" || event.key === \"Enter\") {\n return onNodeSelect(node.id, isSelected, event.shiftKey, event.ctrlKey);\n }\n },\n [onNodeSelect],\n );\n\n return { onNodeClick, onNodeKeyDown };\n}\n\ninterface SelectionAction {\n select: \"node\" | \"range\";\n type: SelectionChangeType | \"disabled\";\n}\n\nfunction getSelectionAction(selectionMode: SelectionMode, isSelected: boolean, shiftDown: boolean, ctrlDown: boolean): SelectionAction {\n switch (selectionMode) {\n case \"none\":\n return { select: \"node\", type: \"disabled\" };\n case \"single\":\n return { select: \"node\", type: isSelected ? \"replace\" : \"remove\" };\n case \"multiple\":\n return { select: \"node\", type: isSelected ? \"add\" : \"remove\" };\n case \"extended\":\n return getExtendedSelectionAction(isSelected, shiftDown, ctrlDown);\n }\n}\n\nfunction getExtendedSelectionAction(isSelected: boolean, shiftDown: boolean, ctrlDown: boolean): SelectionAction {\n if (shiftDown) {\n return { select: \"range\", type: \"replace\" };\n }\n if (ctrlDown) {\n return { select: \"node\", type: isSelected ? \"add\" : \"remove\" };\n }\n return { select: \"node\", type: \"replace\" };\n}\n\nfunction computeFlatNodeList(rootNodes: Array<PresentationTreeNode>): FlatTreeState {\n const flatNodeList: Array<string> = [];\n const nodeIdToIndexMap: Map<string, number> = new Map();\n\n const flattenNodeRecursively = (nodes: Array<PresentationTreeNode>) => {\n nodes.forEach((node) => {\n if (!isPresentationHierarchyNode(node)) {\n return;\n }\n nodeIdToIndexMap.set(node.id, flatNodeList.length);\n flatNodeList.push(node.id);\n if (node.isExpanded && typeof node.children !== \"boolean\") {\n flattenNodeRecursively(node.children);\n }\n });\n };\n\n flattenNodeRecursively(rootNodes);\n return { flatNodeList, nodeIdToIndexMap };\n}\n"]}
1
+ {"version":3,"file":"UseSelectionHandler.js","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseSelectionHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { isPresentationHierarchyNode, PresentationHierarchyNode, PresentationTreeNode } from \"./TreeNode.js\";\nimport { useTree } from \"./UseTree.js\";\n\n/**\n * A union of different supported selection modes in a tree component:\n * - `none` - no selection is allowed,\n * - `single` - only one node can be selected at a time,\n * - `extended` - multiple nodes can be selected using shift and ctrl keys,\n * - `multiple` - multiple nodes can be selected without using shift or ctrl keys.\n *\n * @public\n */\nexport type SelectionMode = \"none\" | \"single\" | \"extended\" | \"multiple\";\n\n/**\n * Type of selection change.\n * - `add` - a node was added to the selection,\n * - `replace` - a selected node was replaced with a different one,\n * - `remove` - a node was removed from the selection.\n *\n * @public\n */\nexport type SelectionChangeType = \"add\" | \"replace\" | \"remove\";\n\n/**\n * Props for `useSelectionHandler` hook.\n * @public\n */\ntype UseSelectionHandlerProps = Pick<ReturnType<typeof useTree>, \"rootNodes\" | \"selectNodes\"> & {\n /** Selection mode that the component is working in. */\n selectionMode: SelectionMode;\n};\n\n/**\n * Result of `useSelectionHandler` hook.\n * @public\n */\ninterface UseSelectionHandlerResult {\n /** Should be called by node renderer when a node component is clicked. */\n onNodeClick: (\n node: PresentationHierarchyNode,\n isSelected: boolean,\n event: React.MouseEvent<HTMLElement, MouseEvent>,\n ) => void;\n /** Should be called by node renderer when a keyboard event happens on a node. */\n onNodeKeyDown: (\n node: PresentationHierarchyNode,\n isSelected: boolean,\n event: React.KeyboardEvent<HTMLElement>,\n ) => void;\n}\n\ninterface FlatTreeState {\n flatNodeList: Array<string>;\n nodeIdToIndexMap: Map<string, number>;\n}\n\n/**\n * A react hook that helps implement different selection modes in a tree component created using `useTree` hook.\n * @public\n */\nexport function useSelectionHandler(props: UseSelectionHandlerProps): UseSelectionHandlerResult {\n const { rootNodes, selectionMode, selectNodes } = props;\n const previousSelectionRef = useRef<string | undefined>(undefined);\n const state = useRef<FlatTreeState>({ flatNodeList: [], nodeIdToIndexMap: new Map() });\n\n useEffect(() => {\n if (!rootNodes) {\n return;\n }\n state.current = computeFlatNodeList(rootNodes);\n }, [rootNodes]);\n\n const getNodeRange = (firstId?: string, secondId?: string) => {\n const getIndex = (nodeId?: string) => {\n return nodeId ? state.current.nodeIdToIndexMap.get(nodeId) : 0;\n };\n const firstIndex = getIndex(firstId);\n const secondIndex = getIndex(secondId);\n if (firstIndex === undefined || secondIndex === undefined) {\n return [];\n }\n\n const startingIndex = Math.min(firstIndex, secondIndex);\n const endIndex = Math.max(firstIndex, secondIndex);\n return state.current.flatNodeList.slice(startingIndex, endIndex + 1);\n };\n\n const onNodeSelect = useCallback(\n (nodeId: string, isSelected: boolean, shiftDown: boolean, ctrlDown: boolean) => {\n const selection = getSelectionAction(selectionMode, isSelected, shiftDown, ctrlDown);\n if (selection.type === \"disabled\") {\n return;\n }\n\n const nodes = selection.select === \"range\" ? getNodeRange(previousSelectionRef.current, nodeId) : [nodeId];\n if (!nodes.length) {\n return;\n }\n\n selection.select !== \"range\" && (previousSelectionRef.current = nodeId);\n selectNodes(nodes, selection.type);\n },\n [selectionMode, selectNodes],\n );\n\n const onNodeClick = useCallback(\n (node: PresentationHierarchyNode, isSelected: boolean, event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n return onNodeSelect(node.id, isSelected, event.shiftKey, event.ctrlKey);\n },\n [onNodeSelect],\n );\n\n const onNodeKeyDown = useCallback(\n (node: PresentationHierarchyNode, isSelected: boolean, event: React.KeyboardEvent<HTMLElement>) => {\n if (event.key === \" \" || event.key === \"Spacebar\" || event.key === \"Enter\") {\n return onNodeSelect(node.id, isSelected, event.shiftKey, event.ctrlKey);\n }\n },\n [onNodeSelect],\n );\n\n return { onNodeClick, onNodeKeyDown };\n}\n\ninterface SelectionAction {\n select: \"node\" | \"range\";\n type: SelectionChangeType | \"disabled\";\n}\n\nfunction getSelectionAction(\n selectionMode: SelectionMode,\n isSelected: boolean,\n shiftDown: boolean,\n ctrlDown: boolean,\n): SelectionAction {\n switch (selectionMode) {\n case \"none\":\n return { select: \"node\", type: \"disabled\" };\n case \"single\":\n return { select: \"node\", type: isSelected ? \"replace\" : \"remove\" };\n case \"multiple\":\n return { select: \"node\", type: isSelected ? \"add\" : \"remove\" };\n case \"extended\":\n return getExtendedSelectionAction(isSelected, shiftDown, ctrlDown);\n }\n}\n\nfunction getExtendedSelectionAction(isSelected: boolean, shiftDown: boolean, ctrlDown: boolean): SelectionAction {\n if (shiftDown) {\n return { select: \"range\", type: \"replace\" };\n }\n if (ctrlDown) {\n return { select: \"node\", type: isSelected ? \"add\" : \"remove\" };\n }\n return { select: \"node\", type: \"replace\" };\n}\n\nfunction computeFlatNodeList(rootNodes: Array<PresentationTreeNode>): FlatTreeState {\n const flatNodeList: Array<string> = [];\n const nodeIdToIndexMap: Map<string, number> = new Map();\n\n const flattenNodeRecursively = (nodes: Array<PresentationTreeNode>) => {\n nodes.forEach((node) => {\n if (!isPresentationHierarchyNode(node)) {\n return;\n }\n nodeIdToIndexMap.set(node.id, flatNodeList.length);\n flatNodeList.push(node.id);\n if (node.isExpanded && typeof node.children !== \"boolean\") {\n flattenNodeRecursively(node.children);\n }\n });\n };\n\n flattenNodeRecursively(rootNodes);\n return { flatNodeList, nodeIdToIndexMap };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"UseTree.d.ts","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseTree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UseTree.d.ts","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseTree.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,9 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { useCallback, useEffect, useRef, useState } from "react";
6
- import { HierarchyNode } from "@itwin/presentation-hierarchies";
6
+ import { HierarchyNode, } from "@itwin/presentation-hierarchies";
7
7
  import { TreeActions } from "./internal/TreeActions.js";
8
- import { isTreeModelHierarchyNode, isTreeModelInfoNode, TreeModel } from "./internal/TreeModel.js";
8
+ import { isTreeModelHierarchyNode, isTreeModelInfoNode, TreeModel, } from "./internal/TreeModel.js";
9
9
  import { useUnifiedTreeSelection } from "./internal/UseUnifiedSelection.js";
10
10
  import { safeDispose } from "./internal/Utils.js";
11
11
  /**
@@ -56,10 +56,7 @@ function useTreeInternal({ getHierarchyProvider, getFilteredPaths, onPerformance
56
56
  const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);
57
57
  const [actions] = useState(() => new TreeActions((model) => {
58
58
  const rootNodes = model.parentChildMap.get(undefined) !== undefined ? generateTreeStructure(undefined, model) : undefined;
59
- setState({
60
- model,
61
- rootNodes,
62
- });
59
+ setState({ model, rootNodes });
63
60
  }, (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration), (props) => onHierarchyLimitExceededRef.current?.(props), (props) => onHierarchyLoadErrorRef.current?.(props)));
64
61
  const currentFormatter = useRef();
65
62
  const [hierarchyProvider, setHierarchyProvider] = useState();
@@ -134,7 +131,7 @@ function useTreeInternal({ getHierarchyProvider, getFilteredPaths, onPerformance
134
131
  const isNodeSelected = useCallback((nodeId) => TreeModel.isNodeSelected(state.model, nodeId), [state]);
135
132
  const setFormatter = useCallback((formatter) => {
136
133
  currentFormatter.current = formatter;
137
- /* c8 ignore next 3 */
134
+ /* v8 ignore if -- @preserve */
138
135
  if (!hierarchyProvider) {
139
136
  return;
140
137
  }
@@ -188,26 +185,12 @@ function generateTreeStructure(parentNodeId, model) {
188
185
  return createPresentationHierarchyNode(node, model);
189
186
  }
190
187
  if (node.type === "ResultSetTooLarge") {
191
- return {
192
- id: node.id,
193
- parentNodeId,
194
- type: node.type,
195
- resultSetSizeLimit: node.resultSetSizeLimit,
196
- };
188
+ return { id: node.id, parentNodeId, type: node.type, resultSetSizeLimit: node.resultSetSizeLimit };
197
189
  }
198
190
  if (node.type === "NoFilterMatches") {
199
- return {
200
- id: node.id,
201
- parentNodeId,
202
- type: node.type,
203
- };
191
+ return { id: node.id, parentNodeId, type: node.type };
204
192
  }
205
- return {
206
- id: node.id,
207
- parentNodeId,
208
- type: node.type,
209
- message: node.message,
210
- };
193
+ return { id: node.id, parentNodeId, type: node.type, message: node.message };
211
194
  });
212
195
  }
213
196
  function createPresentationHierarchyNode(modelNode, model) {
@@ -1 +1 @@
1
- {"version":3,"file":"UseTree.js","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { GenericInstanceFilter, HierarchyFilteringPath, HierarchyNode, HierarchyProvider } from \"@itwin/presentation-hierarchies\";\nimport { InstanceKey, IPrimitiveValueFormatter } from \"@itwin/presentation-shared\";\nimport { TreeActions } from \"./internal/TreeActions.js\";\nimport { isTreeModelHierarchyNode, isTreeModelInfoNode, TreeModel, TreeModelHierarchyNode, TreeModelNode, TreeModelRootNode } from \"./internal/TreeModel.js\";\nimport { useUnifiedTreeSelection, UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport { safeDispose } from \"./internal/Utils.js\";\nimport { PresentationHierarchyNode, PresentationTreeNode } from \"./TreeNode.js\";\nimport { SelectionChangeType } from \"./UseSelectionHandler.js\";\n\n/**\n * A data structure that contains information about a single hierarchy level.\n * @public\n */\nexport interface HierarchyLevelDetails {\n /** The parent node whose hierarchy level's information is contained in this data structure */\n hierarchyNode: HierarchyNode | undefined;\n\n /** A function to get instance keys of the hierarchy level. */\n getInstanceKeysIterator: (props?: {\n instanceFilter?: GenericInstanceFilter;\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n }) => AsyncIterableIterator<InstanceKey>;\n\n /** Get the limit of how many nodes can be loaded in this hierarchy level. */\n sizeLimit?: number | \"unbounded\";\n /** Set the limit of how many nodes can be loaded in this hierarchy level. */\n setSizeLimit: (value: undefined | number | \"unbounded\") => void;\n\n /** Get the active instance filter applied to this hierarchy level. */\n instanceFilter?: GenericInstanceFilter;\n /** Set the instance filter to apply to this hierarchy level */\n setInstanceFilter: (filter: GenericInstanceFilter | undefined) => void;\n}\n\n/**\n * A React hook that creates state for a tree component.\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useUnifiedSelectionTree`\n * @see `useIModelTree`\n * @public\n */\nexport function useTree(props: UseTreeProps): UseTreeResult {\n const { getTreeModelNode: _, ...rest } = useTreeInternal(props);\n return rest;\n}\n\n/**\n * A React hook that creates state for a tree component, that is integrated with unified selection\n * through the given selection storage (previously the storage was provided through the, now\n * deprecated, `UnifiedSelectionProvider`).\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useTree`\n * @see `useIModelUnifiedSelectionTree`\n * @see `UnifiedSelectionProvider`\n * @public\n */\nexport function useUnifiedSelectionTree({\n sourceName,\n selectionStorage,\n createSelectableForGenericNode,\n ...props\n}: UseTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult {\n const { getTreeModelNode, ...rest } = useTreeInternal(props);\n return {\n ...rest,\n ...useUnifiedTreeSelection({ sourceName, selectionStorage, getTreeModelNode, createSelectableForGenericNode }),\n };\n}\n\n/** @public */\nexport interface UseTreeProps {\n /** Provides the hierarchy provider for the tree. */\n getHierarchyProvider: () => HierarchyProvider;\n /** Provides paths to filtered nodes. */\n getFilteredPaths?: ({ abortSignal }: { abortSignal: AbortSignal }) => Promise<HierarchyFilteringPath[] | undefined>;\n /**\n * Callback that is called just after a certain action is finished.\n * Can be used for performance tracking.\n */\n onPerformanceMeasured?: (action: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void;\n /** Action to perform when hierarchy level contains more items that the specified limit. */\n onHierarchyLimitExceeded?: (props: { parentId?: string; filter?: GenericInstanceFilter; limit?: number | \"unbounded\" }) => void;\n /** Action to perform when an error occurs while loading hierarchy. */\n onHierarchyLoadError?: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void;\n}\n\n/**\n * Options for doing either full or a sub tree reload.\n * @public\n */\ninterface ReloadTreeOptions {\n /** Specifies parent node under which sub tree should be reloaded. */\n parentNodeId: string | undefined;\n\n /**\n * Specifies how current tree state should be handled:\n * - `keep` - try to keep current tree state (expanded/collapsed nodes, instance filters, etc.).\n * - `discard` - do not try to keep current tree state. Tree model will be update after nodes are reloaded.\n * - `reset` - remove subtree from the model before reloading and reload nodes ignoring cache.\n *\n * Defaults to `\"keep\"`.\n */\n state?: \"keep\" | \"discard\" | \"reset\";\n}\n\n/** @public */\nexport interface UseTreeResult {\n /**\n * Array containing root tree nodes. It is `undefined` on initial render until any nodes are loaded.\n */\n rootNodes: PresentationTreeNode[] | undefined;\n /**\n * Specifies whether tree is loading or not. It is set to `true` when initial tree load is in progress\n * or tree is reloading.\n */\n isLoading: boolean;\n /**\n * A function that should be called to reload the tree.\n */\n reloadTree: (options?: ReloadTreeOptions) => void;\n /**\n * A function that should be called to either expand or collapse the given node.\n */\n expandNode: (nodeId: string, isExpanded: boolean) => void;\n /**\n * A function that should be called to select nodes in the tree.\n * @param nodeIds Ids of the nodes that are selected.\n * @param changeType Type of change that occurred for the selection.\n */\n selectNodes: (nodeIds: Array<string>, changeType: SelectionChangeType) => void;\n /** Determines whether a given node is selected. */\n isNodeSelected: (nodeId: string) => boolean;\n /** Get a tree node by id */\n getNode: (nodeId: string) => PresentationHierarchyNode | undefined;\n /** Returns hierarchy level details for a given node ID. */\n getHierarchyLevelDetails: (nodeId: string | undefined) => HierarchyLevelDetails | undefined;\n /** Sets a formatter for the primitive values that are displayed in the hierarchy. */\n setFormatter: (formatter: IPrimitiveValueFormatter | undefined) => void;\n}\n\ninterface TreeState {\n model: TreeModel;\n rootNodes: Array<PresentationTreeNode> | undefined;\n}\n\nfunction useTreeInternal({\n getHierarchyProvider,\n getFilteredPaths,\n onPerformanceMeasured,\n onHierarchyLimitExceeded,\n onHierarchyLoadError,\n}: UseTreeProps): UseTreeResult & {\n getTreeModelNode: (nodeId: string) => TreeModelRootNode | TreeModelNode | undefined;\n} {\n const [state, setState] = useState<TreeState>({\n model: { idToNode: new Map(), parentChildMap: new Map(), rootNode: { id: undefined, nodeData: undefined } },\n rootNodes: undefined,\n });\n const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);\n const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);\n const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);\n\n const [actions] = useState<TreeActions>(\n () =>\n new TreeActions(\n (model) => {\n const rootNodes = model.parentChildMap.get(undefined) !== undefined ? generateTreeStructure(undefined, model) : undefined;\n setState({\n model,\n rootNodes,\n });\n },\n (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration),\n (props) => onHierarchyLimitExceededRef.current?.(props),\n (props) => onHierarchyLoadErrorRef.current?.(props),\n ),\n );\n const currentFormatter = useRef<IPrimitiveValueFormatter>();\n\n const [hierarchyProvider, setHierarchyProvider] = useState<HierarchyProvider | undefined>();\n useEffect(() => {\n const provider = getHierarchyProvider();\n provider.setFormatter(currentFormatter.current);\n const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {\n const shouldDiscardState = hierarchyChangeArgs?.filterChange?.newFilter !== undefined;\n actions.reloadTree({ state: shouldDiscardState ? \"discard\" : \"keep\" });\n });\n actions.setHierarchyProvider(provider);\n setHierarchyProvider(provider);\n return () => {\n removeHierarchyChangedListener();\n actions.reset();\n safeDispose(provider);\n };\n }, [actions, getHierarchyProvider]);\n\n const [isFiltering, setIsFiltering] = useState(false);\n useEffect(() => {\n let disposed = false;\n const controller = new AbortController();\n void (async () => {\n if (!hierarchyProvider) {\n return;\n }\n\n if (!getFilteredPaths) {\n hierarchyProvider.setHierarchyFilter(undefined);\n // reload tree in case hierarchy provider does not use hierarchy filter to load initial nodes\n actions.reloadTree({ state: \"keep\" });\n setIsFiltering(false);\n return;\n }\n\n setIsFiltering(true);\n let paths: HierarchyFilteringPath[] | undefined;\n try {\n paths = await getFilteredPaths({ abortSignal: controller.signal });\n } catch {\n } finally {\n if (!disposed) {\n hierarchyProvider.setHierarchyFilter(paths ? { paths } : undefined);\n setIsFiltering(false);\n }\n }\n })();\n return () => {\n controller.abort();\n disposed = true;\n };\n }, [hierarchyProvider, getFilteredPaths, actions]);\n\n const getTreeModelNode = useCallback<(nodeId: string) => TreeModelRootNode | TreeModelNode | undefined>(\n (nodeId: string) => {\n return actions.getNode(nodeId);\n },\n [actions],\n );\n\n const getNode = useCallback(\n (nodeId: string): PresentationHierarchyNode | undefined => {\n const node = actions.getNode(nodeId);\n if (!node || !isTreeModelHierarchyNode(node)) {\n return undefined;\n }\n return createPresentationHierarchyNode(node, state.model);\n },\n [actions, state.model],\n );\n\n const expandNode = useCallback<UseTreeResult[\"expandNode\"]>(\n (nodeId: string, isExpanded: boolean) => {\n actions.expandNode(nodeId, isExpanded);\n },\n [actions],\n );\n\n const reloadTree = useCallback<UseTreeResult[\"reloadTree\"]>(\n (options) => {\n actions.reloadTree(options);\n },\n [actions],\n );\n\n const selectNodes = useCallback<UseTreeResult[\"selectNodes\"]>(\n (nodeIds: Array<string>, changeType: SelectionChangeType) => {\n actions.selectNodes(nodeIds, changeType);\n },\n [actions],\n );\n\n const isNodeSelected = useCallback<UseTreeResult[\"isNodeSelected\"]>((nodeId: string) => TreeModel.isNodeSelected(state.model, nodeId), [state]);\n\n const setFormatter = useCallback<UseTreeResult[\"setFormatter\"]>(\n (formatter: IPrimitiveValueFormatter | undefined) => {\n currentFormatter.current = formatter;\n /* c8 ignore next 3 */\n if (!hierarchyProvider) {\n return;\n }\n\n hierarchyProvider.setFormatter(formatter);\n },\n [hierarchyProvider],\n );\n\n const getHierarchyLevelDetails = useCallback<UseTreeResult[\"getHierarchyLevelDetails\"]>(\n (nodeId) => {\n const node = actions.getNode(nodeId);\n if (!hierarchyProvider || !node || isTreeModelInfoNode(node)) {\n return undefined;\n }\n const hierarchyNode = node.nodeData;\n if (hierarchyNode && HierarchyNode.isGroupingNode(hierarchyNode)) {\n return undefined;\n }\n\n return {\n hierarchyNode,\n getInstanceKeysIterator: (props) =>\n hierarchyProvider.getNodeInstanceKeys({\n parentNode: hierarchyNode,\n instanceFilter: props?.instanceFilter,\n hierarchyLevelSizeLimit: props?.hierarchyLevelSizeLimit,\n }),\n instanceFilter: node.instanceFilter,\n setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId, filter),\n sizeLimit: node.hierarchyLimit,\n setSizeLimit: (value) => actions.setHierarchyLimit(nodeId, value),\n };\n },\n [actions, hierarchyProvider],\n );\n\n return {\n rootNodes: state.rootNodes,\n isLoading: !!state.model.rootNode.isLoading || isFiltering,\n expandNode,\n reloadTree,\n selectNodes,\n isNodeSelected,\n getTreeModelNode,\n getNode,\n getHierarchyLevelDetails,\n setFormatter,\n };\n}\n\nfunction generateTreeStructure(parentNodeId: string | undefined, model: TreeModel): Array<PresentationTreeNode> | undefined {\n const currentChildren = model.parentChildMap.get(parentNodeId);\n if (!currentChildren) {\n return undefined;\n }\n\n return currentChildren\n .map((childId) => model.idToNode.get(childId))\n .filter((node): node is TreeModelNode => !!node)\n .map<PresentationTreeNode>((node) => {\n if (isTreeModelHierarchyNode(node)) {\n return createPresentationHierarchyNode(node, model);\n }\n\n if (node.type === \"ResultSetTooLarge\") {\n return {\n id: node.id,\n parentNodeId,\n type: node.type,\n resultSetSizeLimit: node.resultSetSizeLimit,\n };\n }\n\n if (node.type === \"NoFilterMatches\") {\n return {\n id: node.id,\n parentNodeId,\n type: node.type,\n };\n }\n\n return {\n id: node.id,\n parentNodeId,\n type: node.type,\n message: node.message,\n };\n });\n}\n\nfunction createPresentationHierarchyNode(modelNode: TreeModelHierarchyNode, model: TreeModel): PresentationHierarchyNode {\n let children: Array<PresentationTreeNode> | undefined;\n return {\n ...toPresentationHierarchyNodeBase(modelNode),\n get children() {\n if (!children) {\n children = generateTreeStructure(modelNode.id, model);\n }\n return children ? children : modelNode.children === true ? true : [];\n },\n };\n}\n\nfunction toPresentationHierarchyNodeBase(node: TreeModelHierarchyNode): Omit<PresentationHierarchyNode, \"children\"> {\n return {\n id: node.id,\n label: node.label,\n nodeData: node.nodeData,\n isLoading: !!node.isLoading,\n isExpanded: !!node.isExpanded,\n isFilterable: !HierarchyNode.isGroupingNode(node.nodeData) && !!node.nodeData.supportsFiltering && node.children,\n isFiltered: !!node.instanceFilter,\n extendedData: node.nodeData.extendedData,\n };\n}\n\nfunction useLatest<T>(value: T) {\n const ref = useRef(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n}\n"]}
1
+ {"version":3,"file":"UseTree.js","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseTree.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAGL,aAAa,GAEd,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,SAAS,GAIV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,uBAAuB,EAAgC,MAAM,mCAAmC,CAAC;AAC1G,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA6BlD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,OAAO,CAAC,KAAmB;IACzC,MAAM,EAAE,gBAAgB,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACtC,UAAU,EACV,gBAAgB,EAChB,8BAA8B,EAC9B,GAAG,KAAK,EACoC;IAC5C,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC7D,OAAO;QACL,GAAG,IAAI;QACP,GAAG,uBAAuB,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,CAAC;KAC/G,CAAC;AACJ,CAAC;AAkFD,SAAS,eAAe,CAAC,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,GACP;IAGb,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAY;QAC5C,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;QAC3G,SAAS,EAAE,SAAS;KACrB,CAAC,CAAC;IACH,MAAM,wBAAwB,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAClE,MAAM,2BAA2B,GAAG,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACxE,MAAM,uBAAuB,GAAG,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAEhE,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CACxB,GAAG,EAAE,CACH,IAAI,WAAW,CACb,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,SAAS,GACb,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1G,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACjC,CAAC,EACD,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAClF,CAAC,KAAK,EAAE,EAAE,CAAC,2BAA2B,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,EACvD,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CACpD,CACJ,CAAC;IACF,MAAM,gBAAgB,GAAG,MAAM,EAA4B,CAAC;IAE5D,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,EAAiC,CAAC;IAC5F,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,QAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,8BAA8B,GAAG,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,mBAAmB,EAAE,EAAE;YACnG,MAAM,kBAAkB,GAAG,mBAAmB,EAAE,YAAY,EAAE,SAAS,KAAK,SAAS,CAAC;YACtF,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACvC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,8BAA8B,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAEpC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,iBAAiB,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAChD,6FAA6F;gBAC7F,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACtC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,KAA2C,CAAC;YAChD,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,gBAAgB,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,MAAM,CAAC;YACT,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,iBAAiB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBACpE,cAAc,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnD,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,MAAc,EAAE,EAAE;QACjB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,MAAc,EAAyC,EAAE;QACxD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,+BAA+B,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,EACD,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CACvB,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,MAAc,EAAE,UAAmB,EAAE,EAAE;QACtC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,OAAO,EAAE,EAAE;QACV,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,OAAsB,EAAE,UAA+B,EAAE,EAAE;QAC1D,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,MAAc,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EACjE,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,SAA+C,EAAE,EAAE;QAClD,gBAAgB,CAAC,OAAO,GAAG,SAAS,CAAC;QACrC,+BAA+B;QAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,iBAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC,EACD,CAAC,iBAAiB,CAAC,CACpB,CAAC;IAEF,MAAM,wBAAwB,GAAG,WAAW,CAC1C,CAAC,MAAM,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC;QACpC,IAAI,aAAa,IAAI,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;YACjE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,aAAa;YACb,uBAAuB,EAAE,CAAC,KAAK,EAAE,EAAE,CACjC,iBAAiB,CAAC,mBAAmB,CAAC;gBACpC,UAAU,EAAE,aAAa;gBACzB,cAAc,EAAE,KAAK,EAAE,cAAc;gBACrC,uBAAuB,EAAE,KAAK,EAAE,uBAAuB;aACxD,CAAC;YACJ,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,iBAAiB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC;YACxE,SAAS,EAAE,IAAI,CAAC,cAAc;YAC9B,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC;SAClE,CAAC;IACJ,CAAC,EACD,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAC7B,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,WAAW;QAC1D,UAAU;QACV,UAAU;QACV,WAAW;QACX,cAAc;QACd,gBAAgB;QAChB,OAAO;QACP,wBAAwB;QACxB,YAAY;KACb,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,YAAgC,EAChC,KAAgB;IAEhB,MAAM,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC/D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,eAAe;SACnB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAC7C,MAAM,CAAC,CAAC,IAAI,EAAyB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC/C,GAAG,CAAuB,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO,+BAA+B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACtC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACrG,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACpC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACxD,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/E,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,+BAA+B,CACtC,SAAiC,EACjC,KAAgB;IAEhB,IAAI,QAAiD,CAAC;IACtD,OAAO;QACL,GAAG,+BAA+B,CAAC,SAAS,CAAC;QAC7C,IAAI,QAAQ;YACV,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,qBAAqB,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CAAC,IAA4B;IACnE,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS;QAC3B,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU;QAC7B,YAAY,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,IAAI,CAAC,QAAQ;QAChH,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc;QACjC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY;KACzC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAI,KAAQ;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACtB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n GenericInstanceFilter,\n HierarchyFilteringPath,\n HierarchyNode,\n HierarchyProvider,\n} from \"@itwin/presentation-hierarchies\";\nimport { InstanceKey, IPrimitiveValueFormatter } from \"@itwin/presentation-shared\";\nimport { TreeActions } from \"./internal/TreeActions.js\";\nimport {\n isTreeModelHierarchyNode,\n isTreeModelInfoNode,\n TreeModel,\n TreeModelHierarchyNode,\n TreeModelNode,\n TreeModelRootNode,\n} from \"./internal/TreeModel.js\";\nimport { useUnifiedTreeSelection, UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport { safeDispose } from \"./internal/Utils.js\";\nimport { PresentationHierarchyNode, PresentationTreeNode } from \"./TreeNode.js\";\nimport { SelectionChangeType } from \"./UseSelectionHandler.js\";\n\n/**\n * A data structure that contains information about a single hierarchy level.\n * @public\n */\nexport interface HierarchyLevelDetails {\n /** The parent node whose hierarchy level's information is contained in this data structure */\n hierarchyNode: HierarchyNode | undefined;\n\n /** A function to get instance keys of the hierarchy level. */\n getInstanceKeysIterator: (props?: {\n instanceFilter?: GenericInstanceFilter;\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n }) => AsyncIterableIterator<InstanceKey>;\n\n /** Get the limit of how many nodes can be loaded in this hierarchy level. */\n sizeLimit?: number | \"unbounded\";\n /** Set the limit of how many nodes can be loaded in this hierarchy level. */\n setSizeLimit: (value: undefined | number | \"unbounded\") => void;\n\n /** Get the active instance filter applied to this hierarchy level. */\n instanceFilter?: GenericInstanceFilter;\n /** Set the instance filter to apply to this hierarchy level */\n setInstanceFilter: (filter: GenericInstanceFilter | undefined) => void;\n}\n\n/**\n * A React hook that creates state for a tree component.\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useUnifiedSelectionTree`\n * @see `useIModelTree`\n * @public\n */\nexport function useTree(props: UseTreeProps): UseTreeResult {\n const { getTreeModelNode: _, ...rest } = useTreeInternal(props);\n return rest;\n}\n\n/**\n * A React hook that creates state for a tree component, that is integrated with unified selection\n * through the given selection storage (previously the storage was provided through the, now\n * deprecated, `UnifiedSelectionProvider`).\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useTree`\n * @see `useIModelUnifiedSelectionTree`\n * @see `UnifiedSelectionProvider`\n * @public\n */\nexport function useUnifiedSelectionTree({\n sourceName,\n selectionStorage,\n createSelectableForGenericNode,\n ...props\n}: UseTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult {\n const { getTreeModelNode, ...rest } = useTreeInternal(props);\n return {\n ...rest,\n ...useUnifiedTreeSelection({ sourceName, selectionStorage, getTreeModelNode, createSelectableForGenericNode }),\n };\n}\n\n/** @public */\nexport interface UseTreeProps {\n /** Provides the hierarchy provider for the tree. */\n getHierarchyProvider: () => HierarchyProvider;\n /** Provides paths to filtered nodes. */\n getFilteredPaths?: ({ abortSignal }: { abortSignal: AbortSignal }) => Promise<HierarchyFilteringPath[] | undefined>;\n /**\n * Callback that is called just after a certain action is finished.\n * Can be used for performance tracking.\n */\n onPerformanceMeasured?: (action: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void;\n /** Action to perform when hierarchy level contains more items that the specified limit. */\n onHierarchyLimitExceeded?: (props: {\n parentId?: string;\n filter?: GenericInstanceFilter;\n limit?: number | \"unbounded\";\n }) => void;\n /** Action to perform when an error occurs while loading hierarchy. */\n onHierarchyLoadError?: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void;\n}\n\n/**\n * Options for doing either full or a sub tree reload.\n * @public\n */\ninterface ReloadTreeOptions {\n /** Specifies parent node under which sub tree should be reloaded. */\n parentNodeId: string | undefined;\n\n /**\n * Specifies how current tree state should be handled:\n * - `keep` - try to keep current tree state (expanded/collapsed nodes, instance filters, etc.).\n * - `discard` - do not try to keep current tree state. Tree model will be update after nodes are reloaded.\n * - `reset` - remove subtree from the model before reloading and reload nodes ignoring cache.\n *\n * Defaults to `\"keep\"`.\n */\n state?: \"keep\" | \"discard\" | \"reset\";\n}\n\n/** @public */\nexport interface UseTreeResult {\n /**\n * Array containing root tree nodes. It is `undefined` on initial render until any nodes are loaded.\n */\n rootNodes: PresentationTreeNode[] | undefined;\n /**\n * Specifies whether tree is loading or not. It is set to `true` when initial tree load is in progress\n * or tree is reloading.\n */\n isLoading: boolean;\n /**\n * A function that should be called to reload the tree.\n */\n reloadTree: (options?: ReloadTreeOptions) => void;\n /**\n * A function that should be called to either expand or collapse the given node.\n */\n expandNode: (nodeId: string, isExpanded: boolean) => void;\n /**\n * A function that should be called to select nodes in the tree.\n * @param nodeIds Ids of the nodes that are selected.\n * @param changeType Type of change that occurred for the selection.\n */\n selectNodes: (nodeIds: Array<string>, changeType: SelectionChangeType) => void;\n /** Determines whether a given node is selected. */\n isNodeSelected: (nodeId: string) => boolean;\n /** Get a tree node by id */\n getNode: (nodeId: string) => PresentationHierarchyNode | undefined;\n /** Returns hierarchy level details for a given node ID. */\n getHierarchyLevelDetails: (nodeId: string | undefined) => HierarchyLevelDetails | undefined;\n /** Sets a formatter for the primitive values that are displayed in the hierarchy. */\n setFormatter: (formatter: IPrimitiveValueFormatter | undefined) => void;\n}\n\ninterface TreeState {\n model: TreeModel;\n rootNodes: Array<PresentationTreeNode> | undefined;\n}\n\nfunction useTreeInternal({\n getHierarchyProvider,\n getFilteredPaths,\n onPerformanceMeasured,\n onHierarchyLimitExceeded,\n onHierarchyLoadError,\n}: UseTreeProps): UseTreeResult & {\n getTreeModelNode: (nodeId: string) => TreeModelRootNode | TreeModelNode | undefined;\n} {\n const [state, setState] = useState<TreeState>({\n model: { idToNode: new Map(), parentChildMap: new Map(), rootNode: { id: undefined, nodeData: undefined } },\n rootNodes: undefined,\n });\n const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);\n const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);\n const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);\n\n const [actions] = useState<TreeActions>(\n () =>\n new TreeActions(\n (model) => {\n const rootNodes =\n model.parentChildMap.get(undefined) !== undefined ? generateTreeStructure(undefined, model) : undefined;\n setState({ model, rootNodes });\n },\n (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration),\n (props) => onHierarchyLimitExceededRef.current?.(props),\n (props) => onHierarchyLoadErrorRef.current?.(props),\n ),\n );\n const currentFormatter = useRef<IPrimitiveValueFormatter>();\n\n const [hierarchyProvider, setHierarchyProvider] = useState<HierarchyProvider | undefined>();\n useEffect(() => {\n const provider = getHierarchyProvider();\n provider.setFormatter(currentFormatter.current);\n const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {\n const shouldDiscardState = hierarchyChangeArgs?.filterChange?.newFilter !== undefined;\n actions.reloadTree({ state: shouldDiscardState ? \"discard\" : \"keep\" });\n });\n actions.setHierarchyProvider(provider);\n setHierarchyProvider(provider);\n return () => {\n removeHierarchyChangedListener();\n actions.reset();\n safeDispose(provider);\n };\n }, [actions, getHierarchyProvider]);\n\n const [isFiltering, setIsFiltering] = useState(false);\n useEffect(() => {\n let disposed = false;\n const controller = new AbortController();\n void (async () => {\n if (!hierarchyProvider) {\n return;\n }\n\n if (!getFilteredPaths) {\n hierarchyProvider.setHierarchyFilter(undefined);\n // reload tree in case hierarchy provider does not use hierarchy filter to load initial nodes\n actions.reloadTree({ state: \"keep\" });\n setIsFiltering(false);\n return;\n }\n\n setIsFiltering(true);\n let paths: HierarchyFilteringPath[] | undefined;\n try {\n paths = await getFilteredPaths({ abortSignal: controller.signal });\n } catch {\n } finally {\n if (!disposed) {\n hierarchyProvider.setHierarchyFilter(paths ? { paths } : undefined);\n setIsFiltering(false);\n }\n }\n })();\n return () => {\n controller.abort();\n disposed = true;\n };\n }, [hierarchyProvider, getFilteredPaths, actions]);\n\n const getTreeModelNode = useCallback<(nodeId: string) => TreeModelRootNode | TreeModelNode | undefined>(\n (nodeId: string) => {\n return actions.getNode(nodeId);\n },\n [actions],\n );\n\n const getNode = useCallback(\n (nodeId: string): PresentationHierarchyNode | undefined => {\n const node = actions.getNode(nodeId);\n if (!node || !isTreeModelHierarchyNode(node)) {\n return undefined;\n }\n return createPresentationHierarchyNode(node, state.model);\n },\n [actions, state.model],\n );\n\n const expandNode = useCallback<UseTreeResult[\"expandNode\"]>(\n (nodeId: string, isExpanded: boolean) => {\n actions.expandNode(nodeId, isExpanded);\n },\n [actions],\n );\n\n const reloadTree = useCallback<UseTreeResult[\"reloadTree\"]>(\n (options) => {\n actions.reloadTree(options);\n },\n [actions],\n );\n\n const selectNodes = useCallback<UseTreeResult[\"selectNodes\"]>(\n (nodeIds: Array<string>, changeType: SelectionChangeType) => {\n actions.selectNodes(nodeIds, changeType);\n },\n [actions],\n );\n\n const isNodeSelected = useCallback<UseTreeResult[\"isNodeSelected\"]>(\n (nodeId: string) => TreeModel.isNodeSelected(state.model, nodeId),\n [state],\n );\n\n const setFormatter = useCallback<UseTreeResult[\"setFormatter\"]>(\n (formatter: IPrimitiveValueFormatter | undefined) => {\n currentFormatter.current = formatter;\n /* v8 ignore if -- @preserve */\n if (!hierarchyProvider) {\n return;\n }\n\n hierarchyProvider.setFormatter(formatter);\n },\n [hierarchyProvider],\n );\n\n const getHierarchyLevelDetails = useCallback<UseTreeResult[\"getHierarchyLevelDetails\"]>(\n (nodeId) => {\n const node = actions.getNode(nodeId);\n if (!hierarchyProvider || !node || isTreeModelInfoNode(node)) {\n return undefined;\n }\n const hierarchyNode = node.nodeData;\n if (hierarchyNode && HierarchyNode.isGroupingNode(hierarchyNode)) {\n return undefined;\n }\n\n return {\n hierarchyNode,\n getInstanceKeysIterator: (props) =>\n hierarchyProvider.getNodeInstanceKeys({\n parentNode: hierarchyNode,\n instanceFilter: props?.instanceFilter,\n hierarchyLevelSizeLimit: props?.hierarchyLevelSizeLimit,\n }),\n instanceFilter: node.instanceFilter,\n setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId, filter),\n sizeLimit: node.hierarchyLimit,\n setSizeLimit: (value) => actions.setHierarchyLimit(nodeId, value),\n };\n },\n [actions, hierarchyProvider],\n );\n\n return {\n rootNodes: state.rootNodes,\n isLoading: !!state.model.rootNode.isLoading || isFiltering,\n expandNode,\n reloadTree,\n selectNodes,\n isNodeSelected,\n getTreeModelNode,\n getNode,\n getHierarchyLevelDetails,\n setFormatter,\n };\n}\n\nfunction generateTreeStructure(\n parentNodeId: string | undefined,\n model: TreeModel,\n): Array<PresentationTreeNode> | undefined {\n const currentChildren = model.parentChildMap.get(parentNodeId);\n if (!currentChildren) {\n return undefined;\n }\n\n return currentChildren\n .map((childId) => model.idToNode.get(childId))\n .filter((node): node is TreeModelNode => !!node)\n .map<PresentationTreeNode>((node) => {\n if (isTreeModelHierarchyNode(node)) {\n return createPresentationHierarchyNode(node, model);\n }\n\n if (node.type === \"ResultSetTooLarge\") {\n return { id: node.id, parentNodeId, type: node.type, resultSetSizeLimit: node.resultSetSizeLimit };\n }\n\n if (node.type === \"NoFilterMatches\") {\n return { id: node.id, parentNodeId, type: node.type };\n }\n\n return { id: node.id, parentNodeId, type: node.type, message: node.message };\n });\n}\n\nfunction createPresentationHierarchyNode(\n modelNode: TreeModelHierarchyNode,\n model: TreeModel,\n): PresentationHierarchyNode {\n let children: Array<PresentationTreeNode> | undefined;\n return {\n ...toPresentationHierarchyNodeBase(modelNode),\n get children() {\n if (!children) {\n children = generateTreeStructure(modelNode.id, model);\n }\n return children ? children : modelNode.children === true ? true : [];\n },\n };\n}\n\nfunction toPresentationHierarchyNodeBase(node: TreeModelHierarchyNode): Omit<PresentationHierarchyNode, \"children\"> {\n return {\n id: node.id,\n label: node.label,\n nodeData: node.nodeData,\n isLoading: !!node.isLoading,\n isExpanded: !!node.isExpanded,\n isFilterable: !HierarchyNode.isGroupingNode(node.nodeData) && !!node.nodeData.supportsFiltering && node.children,\n isFiltered: !!node.instanceFilter,\n extendedData: node.nodeData.extendedData,\n };\n}\n\nfunction useLatest<T>(value: T) {\n const ref = useRef(value);\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TreeActions.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeActions.ts"],"names":[],"mappings":"AAKA,OAAO,sBAAsB,CAAC;AAI9B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAiD,SAAS,EAA0B,aAAa,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAcpJ,gBAAgB;AAChB,qBAAa,WAAW;IAQpB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,yBAAyB;IACjC,OAAO,CAAC,qBAAqB;IAV/B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,cAAc,CAA8D;IACpF,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAqC;gBAG9C,eAAe,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,EAC3C,OAAO,EAAE,CAAC,UAAU,EAAE,cAAc,GAAG,sBAAsB,GAAG,QAAQ,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,EACnG,yBAAyB,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KAAE,KAAK,IAAI,EAC/H,qBAAqB,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,EAClH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,YAAY,CAAC,KAAK,MAAM,EAC3E,IAAI,CAAC,EAAE,SAAS;IAalB,OAAO,CAAC,gBAAgB;IAuDxB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,aAAa;IAwCd,KAAK;IAIL,oBAAoB,CAAC,QAAQ,CAAC,EAAE,iBAAiB;IAiBjD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,iBAAiB,GAAG,SAAS;IAIlF,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,mBAAmB;IAMnE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;;;IAa9C,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW;;;IAc1E,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,qBAAqB;;;IAc5E,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;KAAE;;;CAa5F"}
1
+ {"version":3,"file":"TreeActions.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeActions.ts"],"names":[],"mappings":"AAKA,OAAO,sBAAsB,CAAC;AAiB9B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAGL,SAAS,EAET,aAAa,EACb,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AAcxB,gBAAgB;AAChB,qBAAa,WAAW;IAQpB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,yBAAyB;IAKjC,OAAO,CAAC,qBAAqB;IAd/B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,cAAc,CAA8D;IACpF,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAqC;gBAG9C,eAAe,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,EAC3C,OAAO,EAAE,CAAC,UAAU,EAAE,cAAc,GAAG,sBAAsB,GAAG,QAAQ,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,EACnG,yBAAyB,EAAE,CAAC,KAAK,EAAE;QACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,qBAAqB,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;KAC9B,KAAK,IAAI,EACF,qBAAqB,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,EAClH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,YAAY,CAAC,KAAK,MAAM,EAC3E,IAAI,CAAC,EAAE,SAAS;IAalB,OAAO,CAAC,gBAAgB;IAuDxB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,aAAa;IAiDd,KAAK;IAIL,oBAAoB,CAAC,QAAQ,CAAC,EAAE,iBAAiB;IAiBjD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,iBAAiB,GAAG,SAAS;IAIlF,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,mBAAmB;IAMnE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;;;IAa9C,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW;;;IAc1E,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,qBAAqB;;;IAc5E,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;KAAE;;;CAa5F"}
@@ -4,10 +4,10 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import "./DisposePolyfill.js";
6
6
  import { enableMapSet, produce } from "immer";
7
- import { buffer, debounceTime, EMPTY, groupBy, map, mergeMap, reduce, Subject, switchMap, takeUntil, tap } from "rxjs";
7
+ import { buffer, debounceTime, EMPTY, groupBy, map, mergeMap, reduce, Subject, switchMap, takeUntil, tap, } from "rxjs";
8
8
  import { HierarchyNode } from "@itwin/presentation-hierarchies";
9
9
  import { TreeLoader } from "./TreeLoader.js";
10
- import { isTreeModelHierarchyNode, isTreeModelInfoNode, TreeModel } from "./TreeModel.js";
10
+ import { isTreeModelHierarchyNode, isTreeModelInfoNode, TreeModel, } from "./TreeModel.js";
11
11
  import { createNodeId, sameNodes } from "./Utils.js";
12
12
  enableMapSet();
13
13
  /** @internal */
@@ -28,7 +28,7 @@ export class TreeActions {
28
28
  this._onHierarchyLoadError = _onHierarchyLoadError;
29
29
  this._loader = new NoopTreeLoader();
30
30
  this._nodeIdFactory = nodeIdFactory ?? createNodeId;
31
- this._currentModel = seed ?? /* c8 ignore next */ {
31
+ this._currentModel = seed ?? /* v8 ignore next */ {
32
32
  idToNode: new Map(),
33
33
  parentChildMap: new Map(),
34
34
  rootNode: { id: undefined, nodeData: undefined },
@@ -91,20 +91,31 @@ export class TreeActions {
91
91
  });
92
92
  }
93
93
  getLoadAction(parentId) {
94
- return this._currentModel.idToNode.size === 0 ? "initial-load" : parentId === undefined ? "reload" : "hierarchy-level-load";
94
+ return this._currentModel.idToNode.size === 0
95
+ ? "initial-load"
96
+ : parentId === undefined
97
+ ? "reload"
98
+ : "hierarchy-level-load";
95
99
  }
96
100
  loadSubTree(options, initialRootNode, discardState) {
97
101
  const loadAction = this.getLoadAction(options.parent.id);
98
102
  const timeTracker = new TimeTracker((time) => this._onLoad(loadAction, time));
99
103
  return {
100
104
  complete: new Promise((resolve) => {
101
- this._nodeLoader.next({ loadOptions: options, onComplete: resolve, timeTracker, parentId: options.parent.id, initialRootNode, discardState });
105
+ this._nodeLoader.next({
106
+ loadOptions: options,
107
+ onComplete: resolve,
108
+ timeTracker,
109
+ parentId: options.parent.id,
110
+ initialRootNode,
111
+ discardState,
112
+ });
102
113
  }),
103
114
  };
104
115
  }
105
116
  loadNodes(parentId, ignoreCache) {
106
117
  const parentNode = this._currentModel.idToNode.get(parentId);
107
- /* c8 ignore next 3 */
118
+ /* v8 ignore if -- @preserve */
108
119
  if (!parentNode || !isTreeModelHierarchyNode(parentNode)) {
109
120
  return { complete: Promise.resolve() };
110
121
  }
@@ -117,8 +128,12 @@ export class TreeActions {
117
128
  }
118
129
  reloadSubTree(parentId, oldModel, options) {
119
130
  const currModel = this._currentModel;
120
- const expandedNodes = !!options?.discardState ? [] : collectNodes(parentId, oldModel, (node) => node.isExpanded === true);
121
- const collapsedNodes = !!options?.discardState ? [] : collectNodes(parentId, oldModel, (node) => node.isExpanded === false);
131
+ const expandedNodes = !!options?.discardState
132
+ ? []
133
+ : collectNodes(parentId, oldModel, (node) => node.isExpanded === true);
134
+ const collapsedNodes = !!options?.discardState
135
+ ? []
136
+ : collectNodes(parentId, oldModel, (node) => node.isExpanded === false);
122
137
  const getHierarchyLevelOptions = (node) => {
123
138
  if (!!options?.discardState) {
124
139
  return { instanceFilter: undefined, hierarchyLevelSizeLimit: undefined };
@@ -135,9 +150,9 @@ export class TreeActions {
135
150
  }
136
151
  return !!node.nodeData.autoExpand;
137
152
  };
138
- const buildNode = (node) => (!!options?.discardState || node.id === parentId ? node : addAttributes(node, oldModel));
153
+ const buildNode = (node) => !!options?.discardState || node.id === parentId ? node : addAttributes(node, oldModel);
139
154
  const rootNode = parentId !== undefined ? this.getNode(parentId) : currModel.rootNode;
140
- /* c8 ignore next 3 */
155
+ /* v8 ignore if -- @preserve */
141
156
  if (!rootNode || isTreeModelInfoNode(rootNode)) {
142
157
  return { complete: Promise.resolve() };
143
158
  }
@@ -159,7 +174,7 @@ export class TreeActions {
159
174
  }
160
175
  this._onHierarchyLoadError({ parentId, type, error });
161
176
  }, this._nodeIdFactory)
162
- : /* c8 ignore next */ new NoopTreeLoader();
177
+ : /* v8 ignore next */ new NoopTreeLoader();
163
178
  }
164
179
  getNode(nodeId) {
165
180
  return TreeModel.getNode(this._currentModel, nodeId);
@@ -276,13 +291,13 @@ function createHierarchyLevelOptions(model, nodeId) {
276
291
  }
277
292
  return { instanceFilter: modelNode.instanceFilter, hierarchyLevelSizeLimit: modelNode.hierarchyLimit };
278
293
  }
279
- /* c8 ignore start */
294
+ /* v8 ignore start */
280
295
  class NoopTreeLoader {
281
296
  loadNodes() {
282
297
  return EMPTY;
283
298
  }
284
299
  }
285
- /* c8 ignore end */
300
+ /* v8 ignore stop */
286
301
  class TimeTracker {
287
302
  _onFinish;
288
303
  _start;
@@ -295,7 +310,7 @@ class TimeTracker {
295
310
  this._stopped = true;
296
311
  }
297
312
  finish() {
298
- /* c8 ignore next 3 */
313
+ /* v8 ignore if -- @preserve */
299
314
  if (this._stopped) {
300
315
  return;
301
316
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TreeActions.js","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeActions.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport \"./DisposePolyfill.js\";\n\nimport { Draft, enableMapSet, produce } from \"immer\";\nimport { buffer, debounceTime, EMPTY, groupBy, map, mergeMap, Observable, reduce, Subject, switchMap, takeUntil, tap } from \"rxjs\";\nimport { GenericInstanceFilter, HierarchyNode, HierarchyProvider } from \"@itwin/presentation-hierarchies\";\nimport { SelectionChangeType } from \"../UseSelectionHandler.js\";\nimport { HierarchyLevelOptions, ITreeLoader, LoadedTreePart, LoadNodesOptions, TreeLoader } from \"./TreeLoader.js\";\nimport { isTreeModelHierarchyNode, isTreeModelInfoNode, TreeModel, TreeModelHierarchyNode, TreeModelNode, TreeModelRootNode } from \"./TreeModel.js\";\nimport { createNodeId, sameNodes } from \"./Utils.js\";\n\nenableMapSet();\n\ninterface LoadDebouncedNodesOptions {\n loadOptions: LoadNodesOptions;\n onComplete: () => void;\n timeTracker?: TimeTracker;\n initialRootNode?: TreeModelRootNode;\n parentId?: string;\n discardState?: boolean;\n}\n\n/** @internal */\nexport class TreeActions {\n private _loader: ITreeLoader;\n private _nodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n private _currentModel: TreeModel;\n private _reset = new Subject<void>();\n private _nodeLoader: Subject<LoadDebouncedNodesOptions>;\n\n constructor(\n private _onModelChanged: (model: TreeModel) => void,\n private _onLoad: (actionType: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void,\n private _onHierarchyLimitExceeded: (props: { parentId?: string; filter?: GenericInstanceFilter; limit?: number | \"unbounded\" }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void,\n nodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n seed?: TreeModel,\n ) {\n this._loader = new NoopTreeLoader();\n this._nodeIdFactory = nodeIdFactory ?? createNodeId;\n this._currentModel = seed ?? /* c8 ignore next */ {\n idToNode: new Map(),\n parentChildMap: new Map(),\n rootNode: { id: undefined, nodeData: undefined },\n };\n\n this._nodeLoader = this.createNodeLoader();\n }\n\n private createNodeLoader() {\n const subject = new Subject<LoadDebouncedNodesOptions>();\n subject\n .pipe(\n groupBy((item) => item.parentId),\n mergeMap((group) =>\n group.pipe(\n buffer(group.pipe(debounceTime(0))),\n map((groupArr) => {\n let returnIndex = groupArr.length - 1;\n\n groupArr.forEach((member, index) => {\n if (member.discardState) {\n returnIndex = index;\n }\n });\n\n groupArr.forEach((member, index) => {\n if (index === returnIndex) {\n return;\n }\n member.timeTracker?.[Symbol.dispose];\n member.onComplete();\n });\n return groupArr[returnIndex];\n }),\n switchMap((props) =>\n this._loader.loadNodes(props.loadOptions).pipe(\n collectTreePartsUntil(this._reset, props.initialRootNode),\n tap({\n next: (newModel: TreeModel) => {\n const childNodes = newModel.parentChildMap.get(props.parentId);\n const firstChildNode = childNodes?.length ? newModel.idToNode.get(childNodes[0]) : undefined;\n this.handleLoadedHierarchy(props.parentId, newModel);\n // only report load duration if no error occurs\n if (!(firstChildNode && isTreeModelInfoNode(firstChildNode))) {\n props.timeTracker?.finish();\n }\n },\n complete: () => {\n this.onLoadingComplete(props.parentId);\n props.timeTracker?.[Symbol.dispose]();\n props.onComplete();\n },\n }),\n ),\n ),\n ),\n ),\n )\n .subscribe();\n\n return subject;\n }\n\n private updateTreeModel(updater: (model: Draft<TreeModel>) => void) {\n const newModel = produce(this._currentModel, updater);\n if (this._currentModel === newModel) {\n return;\n }\n\n this._currentModel = newModel;\n this._onModelChanged(this._currentModel);\n }\n\n private handleLoadedHierarchy(parentId: string | undefined, loadedHierarchy: TreeModel) {\n this.updateTreeModel((model) => {\n TreeModel.addHierarchyPart(model, parentId, loadedHierarchy);\n });\n }\n\n private onLoadingComplete(parentId: string | undefined) {\n this.updateTreeModel((model) => {\n TreeModel.setIsLoading(model, parentId, false);\n });\n }\n\n private getLoadAction(parentId: string | undefined) {\n return this._currentModel.idToNode.size === 0 ? \"initial-load\" : parentId === undefined ? \"reload\" : \"hierarchy-level-load\";\n }\n\n private loadSubTree(options: LoadNodesOptions, initialRootNode?: TreeModelRootNode, discardState?: boolean) {\n const loadAction = this.getLoadAction(options.parent.id);\n const timeTracker = new TimeTracker((time) => this._onLoad(loadAction, time));\n\n return {\n complete: new Promise<void>((resolve) => {\n this._nodeLoader.next({ loadOptions: options, onComplete: resolve, timeTracker, parentId: options.parent.id, initialRootNode, discardState });\n }),\n };\n }\n\n private loadNodes(parentId: string, ignoreCache?: boolean) {\n const parentNode = this._currentModel.idToNode.get(parentId);\n /* c8 ignore next 3 */\n if (!parentNode || !isTreeModelHierarchyNode(parentNode)) {\n return { complete: Promise.resolve() };\n }\n\n return this.loadSubTree({\n parent: parentNode,\n getHierarchyLevelOptions: (node) => createHierarchyLevelOptions(this._currentModel, getNonGroupedParentId(node, this._nodeIdFactory)),\n shouldLoadChildren: (node) => !!node.nodeData.autoExpand,\n ignoreCache,\n });\n }\n\n private reloadSubTree(parentId: string | undefined, oldModel: TreeModel, options?: { discardState?: boolean; ignoreCache?: boolean }) {\n const currModel = this._currentModel;\n const expandedNodes = !!options?.discardState ? [] : collectNodes(parentId, oldModel, (node) => node.isExpanded === true);\n const collapsedNodes = !!options?.discardState ? [] : collectNodes(parentId, oldModel, (node) => node.isExpanded === false);\n const getHierarchyLevelOptions = (node: TreeModelRootNode | TreeModelHierarchyNode) => {\n if (!!options?.discardState) {\n return { instanceFilter: undefined, hierarchyLevelSizeLimit: undefined };\n }\n const filteredNodeId = getNonGroupedParentId(node, this._nodeIdFactory);\n return createHierarchyLevelOptions(filteredNodeId === parentId ? currModel : oldModel, filteredNodeId);\n };\n const shouldLoadChildren = (node: TreeModelHierarchyNode) => {\n if (expandedNodes.findIndex((expandedNode) => sameNodes(expandedNode.nodeData, node.nodeData)) !== -1) {\n return true;\n }\n if (collapsedNodes.findIndex((collapsedNode) => sameNodes(collapsedNode.nodeData, node.nodeData)) !== -1) {\n return false;\n }\n return !!node.nodeData.autoExpand;\n };\n const buildNode = (node: TreeModelHierarchyNode) => (!!options?.discardState || node.id === parentId ? node : addAttributes(node, oldModel));\n\n const rootNode = parentId !== undefined ? this.getNode(parentId) : currModel.rootNode;\n /* c8 ignore next 3 */\n if (!rootNode || isTreeModelInfoNode(rootNode)) {\n return { complete: Promise.resolve() };\n }\n\n if (parentId === undefined) {\n // cancel all ongoing requests\n this._reset.next();\n }\n\n return this.loadSubTree(\n { parent: rootNode, getHierarchyLevelOptions, shouldLoadChildren, buildNode, ignoreCache: options?.ignoreCache },\n !!options?.discardState ? undefined : { ...currModel.rootNode },\n options?.discardState,\n );\n }\n\n public reset() {\n this._reset.next();\n }\n\n public setHierarchyProvider(provider?: HierarchyProvider) {\n this._loader = provider\n ? new TreeLoader(\n provider,\n this._onHierarchyLimitExceeded,\n ({ parentId, type, error }) => {\n if (type === \"timeout\") {\n const loadAction = this.getLoadAction(parentId);\n this._onLoad(loadAction, Number.MAX_SAFE_INTEGER);\n }\n this._onHierarchyLoadError({ parentId, type, error });\n },\n this._nodeIdFactory,\n )\n : /* c8 ignore next */ new NoopTreeLoader();\n }\n\n public getNode(nodeId: string | undefined): TreeModelNode | TreeModelRootNode | undefined {\n return TreeModel.getNode(this._currentModel, nodeId);\n }\n\n public selectNodes(nodeIds: Array<string>, changeType: SelectionChangeType) {\n this.updateTreeModel((model) => {\n TreeModel.selectNodes(model, nodeIds, changeType);\n });\n }\n\n public expandNode(nodeId: string, isExpanded: boolean) {\n let childrenAction: ReturnType<typeof TreeModel.expandNode> = \"none\";\n this.updateTreeModel((model) => {\n childrenAction = TreeModel.expandNode(model, nodeId, isExpanded);\n });\n\n if (childrenAction === \"none\") {\n return { complete: Promise.resolve() };\n }\n\n return this.loadNodes(nodeId, childrenAction === \"reloadChildren\");\n }\n\n public setHierarchyLimit(nodeId: string | undefined, limit?: number | \"unbounded\") {\n const oldModel = this._currentModel;\n let loadChildren = false;\n this.updateTreeModel((model) => {\n loadChildren = TreeModel.setHierarchyLimit(model, nodeId, limit);\n });\n\n if (!loadChildren) {\n return { complete: Promise.resolve() };\n }\n\n return this.reloadSubTree(nodeId, oldModel);\n }\n\n public setInstanceFilter(nodeId: string | undefined, filter?: GenericInstanceFilter) {\n const oldModel = this._currentModel;\n let loadChildren = false;\n this.updateTreeModel((model) => {\n loadChildren = TreeModel.setInstanceFilter(model, nodeId, filter);\n });\n\n if (!loadChildren) {\n return { complete: Promise.resolve() };\n }\n\n return this.reloadSubTree(nodeId, oldModel);\n }\n\n public reloadTree(options?: { parentNodeId?: string; state?: \"keep\" | \"discard\" | \"reset\" }) {\n const oldModel = this._currentModel;\n this.updateTreeModel((model) => {\n TreeModel.setIsLoading(model, options?.parentNodeId, true);\n if (options?.state === \"reset\") {\n TreeModel.removeSubTree(model, options?.parentNodeId);\n }\n });\n\n const discardState = options?.state === \"discard\" || options?.state === \"reset\";\n const ignoreCache = options?.state === \"reset\";\n return this.reloadSubTree(options?.parentNodeId, oldModel, { discardState, ignoreCache });\n }\n}\n\nfunction collectTreePartsUntil(untilNotifier: Observable<void>, rootNode?: TreeModelRootNode) {\n return (source: Observable<LoadedTreePart>) =>\n source.pipe(\n reduce<LoadedTreePart, TreeModel>(\n (treeModel, loadedPart) => {\n addNodesToModel(treeModel, loadedPart);\n return treeModel;\n },\n {\n idToNode: new Map(),\n parentChildMap: new Map(),\n rootNode: rootNode ?? { id: undefined, nodeData: undefined },\n },\n ),\n takeUntil(untilNotifier),\n );\n}\n\nfunction addNodesToModel(model: TreeModel, hierarchyPart: LoadedTreePart) {\n model.parentChildMap.set(\n hierarchyPart.parentId,\n hierarchyPart.loadedNodes.map((node) => node.id),\n );\n for (const node of hierarchyPart.loadedNodes) {\n model.idToNode.set(node.id, node);\n }\n const parentNode = hierarchyPart.parentId ? model.idToNode.get(hierarchyPart.parentId) : undefined;\n if (parentNode && isTreeModelHierarchyNode(parentNode)) {\n parentNode.isExpanded = true;\n }\n}\n\nfunction addAttributes(node: TreeModelHierarchyNode, oldModel: TreeModel) {\n const oldNode = oldModel.idToNode.get(node.id);\n if (oldNode && isTreeModelHierarchyNode(oldNode)) {\n node.hierarchyLimit = oldNode.hierarchyLimit;\n node.instanceFilter = oldNode.instanceFilter;\n node.isSelected = oldNode.isSelected;\n }\n return node;\n}\n\nfunction collectNodes(parentId: string | undefined, model: TreeModel, pred: (node: TreeModelHierarchyNode) => boolean): TreeModelHierarchyNode[] {\n const currentChildren = model.parentChildMap.get(parentId);\n if (!currentChildren) {\n return [];\n }\n\n if (parentId === undefined) {\n return currentChildren.flatMap((child) => collectNodes(child, model, pred));\n }\n\n const currNode = model.idToNode.get(parentId);\n if (!currNode || !isTreeModelHierarchyNode(currNode) || !pred(currNode)) {\n return [];\n }\n\n return [currNode, ...currentChildren.flatMap((child) => collectNodes(child, model, pred))];\n}\n\nfunction getNonGroupedParentId(node: TreeModelHierarchyNode | TreeModelRootNode, nodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string) {\n if (!node.nodeData || !HierarchyNode.isGroupingNode(node.nodeData)) {\n return node.id;\n }\n\n if (!node.nodeData.nonGroupingAncestor) {\n return undefined;\n }\n\n return nodeIdFactory(node.nodeData.nonGroupingAncestor);\n}\n\nfunction createHierarchyLevelOptions(model: TreeModel, nodeId: string | undefined): HierarchyLevelOptions {\n if (nodeId === undefined) {\n return { instanceFilter: model.rootNode.instanceFilter, hierarchyLevelSizeLimit: model.rootNode.hierarchyLimit };\n }\n\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode || isTreeModelInfoNode(modelNode)) {\n return { instanceFilter: undefined, hierarchyLevelSizeLimit: undefined };\n }\n return { instanceFilter: modelNode.instanceFilter, hierarchyLevelSizeLimit: modelNode.hierarchyLimit };\n}\n\n/* c8 ignore start */\nclass NoopTreeLoader implements ITreeLoader {\n public loadNodes(): Observable<LoadedTreePart> {\n return EMPTY;\n }\n}\n/* c8 ignore end */\n\nclass TimeTracker {\n private _start: number;\n private _stopped: boolean = false;\n\n constructor(private _onFinish: (time: number) => void) {\n this._start = Date.now();\n }\n\n public [Symbol.dispose]() {\n this._stopped = true;\n }\n\n public finish() {\n /* c8 ignore next 3 */\n if (this._stopped) {\n return;\n }\n\n this._stopped = true;\n const elapsedTime = Date.now() - this._start;\n this._onFinish(elapsedTime);\n }\n}\n"]}
1
+ {"version":3,"file":"TreeActions.js","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeActions.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport \"./DisposePolyfill.js\";\n\nimport { Draft, enableMapSet, produce } from \"immer\";\nimport {\n buffer,\n debounceTime,\n EMPTY,\n groupBy,\n map,\n mergeMap,\n Observable,\n reduce,\n Subject,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs\";\nimport { GenericInstanceFilter, HierarchyNode, HierarchyProvider } from \"@itwin/presentation-hierarchies\";\nimport { SelectionChangeType } from \"../UseSelectionHandler.js\";\nimport { HierarchyLevelOptions, ITreeLoader, LoadedTreePart, LoadNodesOptions, TreeLoader } from \"./TreeLoader.js\";\nimport {\n isTreeModelHierarchyNode,\n isTreeModelInfoNode,\n TreeModel,\n TreeModelHierarchyNode,\n TreeModelNode,\n TreeModelRootNode,\n} from \"./TreeModel.js\";\nimport { createNodeId, sameNodes } from \"./Utils.js\";\n\nenableMapSet();\n\ninterface LoadDebouncedNodesOptions {\n loadOptions: LoadNodesOptions;\n onComplete: () => void;\n timeTracker?: TimeTracker;\n initialRootNode?: TreeModelRootNode;\n parentId?: string;\n discardState?: boolean;\n}\n\n/** @internal */\nexport class TreeActions {\n private _loader: ITreeLoader;\n private _nodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n private _currentModel: TreeModel;\n private _reset = new Subject<void>();\n private _nodeLoader: Subject<LoadDebouncedNodesOptions>;\n\n constructor(\n private _onModelChanged: (model: TreeModel) => void,\n private _onLoad: (actionType: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void,\n private _onHierarchyLimitExceeded: (props: {\n parentId?: string;\n filter?: GenericInstanceFilter;\n limit?: number | \"unbounded\";\n }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void,\n nodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n seed?: TreeModel,\n ) {\n this._loader = new NoopTreeLoader();\n this._nodeIdFactory = nodeIdFactory ?? createNodeId;\n this._currentModel = seed ?? /* v8 ignore next */ {\n idToNode: new Map(),\n parentChildMap: new Map(),\n rootNode: { id: undefined, nodeData: undefined },\n };\n\n this._nodeLoader = this.createNodeLoader();\n }\n\n private createNodeLoader() {\n const subject = new Subject<LoadDebouncedNodesOptions>();\n subject\n .pipe(\n groupBy((item) => item.parentId),\n mergeMap((group) =>\n group.pipe(\n buffer(group.pipe(debounceTime(0))),\n map((groupArr) => {\n let returnIndex = groupArr.length - 1;\n\n groupArr.forEach((member, index) => {\n if (member.discardState) {\n returnIndex = index;\n }\n });\n\n groupArr.forEach((member, index) => {\n if (index === returnIndex) {\n return;\n }\n member.timeTracker?.[Symbol.dispose];\n member.onComplete();\n });\n return groupArr[returnIndex];\n }),\n switchMap((props) =>\n this._loader.loadNodes(props.loadOptions).pipe(\n collectTreePartsUntil(this._reset, props.initialRootNode),\n tap({\n next: (newModel: TreeModel) => {\n const childNodes = newModel.parentChildMap.get(props.parentId);\n const firstChildNode = childNodes?.length ? newModel.idToNode.get(childNodes[0]) : undefined;\n this.handleLoadedHierarchy(props.parentId, newModel);\n // only report load duration if no error occurs\n if (!(firstChildNode && isTreeModelInfoNode(firstChildNode))) {\n props.timeTracker?.finish();\n }\n },\n complete: () => {\n this.onLoadingComplete(props.parentId);\n props.timeTracker?.[Symbol.dispose]();\n props.onComplete();\n },\n }),\n ),\n ),\n ),\n ),\n )\n .subscribe();\n\n return subject;\n }\n\n private updateTreeModel(updater: (model: Draft<TreeModel>) => void) {\n const newModel = produce(this._currentModel, updater);\n if (this._currentModel === newModel) {\n return;\n }\n\n this._currentModel = newModel;\n this._onModelChanged(this._currentModel);\n }\n\n private handleLoadedHierarchy(parentId: string | undefined, loadedHierarchy: TreeModel) {\n this.updateTreeModel((model) => {\n TreeModel.addHierarchyPart(model, parentId, loadedHierarchy);\n });\n }\n\n private onLoadingComplete(parentId: string | undefined) {\n this.updateTreeModel((model) => {\n TreeModel.setIsLoading(model, parentId, false);\n });\n }\n\n private getLoadAction(parentId: string | undefined) {\n return this._currentModel.idToNode.size === 0\n ? \"initial-load\"\n : parentId === undefined\n ? \"reload\"\n : \"hierarchy-level-load\";\n }\n\n private loadSubTree(options: LoadNodesOptions, initialRootNode?: TreeModelRootNode, discardState?: boolean) {\n const loadAction = this.getLoadAction(options.parent.id);\n const timeTracker = new TimeTracker((time) => this._onLoad(loadAction, time));\n\n return {\n complete: new Promise<void>((resolve) => {\n this._nodeLoader.next({\n loadOptions: options,\n onComplete: resolve,\n timeTracker,\n parentId: options.parent.id,\n initialRootNode,\n discardState,\n });\n }),\n };\n }\n\n private loadNodes(parentId: string, ignoreCache?: boolean) {\n const parentNode = this._currentModel.idToNode.get(parentId);\n /* v8 ignore if -- @preserve */\n if (!parentNode || !isTreeModelHierarchyNode(parentNode)) {\n return { complete: Promise.resolve() };\n }\n\n return this.loadSubTree({\n parent: parentNode,\n getHierarchyLevelOptions: (node) =>\n createHierarchyLevelOptions(this._currentModel, getNonGroupedParentId(node, this._nodeIdFactory)),\n shouldLoadChildren: (node) => !!node.nodeData.autoExpand,\n ignoreCache,\n });\n }\n\n private reloadSubTree(\n parentId: string | undefined,\n oldModel: TreeModel,\n options?: { discardState?: boolean; ignoreCache?: boolean },\n ) {\n const currModel = this._currentModel;\n const expandedNodes = !!options?.discardState\n ? []\n : collectNodes(parentId, oldModel, (node) => node.isExpanded === true);\n const collapsedNodes = !!options?.discardState\n ? []\n : collectNodes(parentId, oldModel, (node) => node.isExpanded === false);\n const getHierarchyLevelOptions = (node: TreeModelRootNode | TreeModelHierarchyNode) => {\n if (!!options?.discardState) {\n return { instanceFilter: undefined, hierarchyLevelSizeLimit: undefined };\n }\n const filteredNodeId = getNonGroupedParentId(node, this._nodeIdFactory);\n return createHierarchyLevelOptions(filteredNodeId === parentId ? currModel : oldModel, filteredNodeId);\n };\n const shouldLoadChildren = (node: TreeModelHierarchyNode) => {\n if (expandedNodes.findIndex((expandedNode) => sameNodes(expandedNode.nodeData, node.nodeData)) !== -1) {\n return true;\n }\n if (collapsedNodes.findIndex((collapsedNode) => sameNodes(collapsedNode.nodeData, node.nodeData)) !== -1) {\n return false;\n }\n return !!node.nodeData.autoExpand;\n };\n const buildNode = (node: TreeModelHierarchyNode) =>\n !!options?.discardState || node.id === parentId ? node : addAttributes(node, oldModel);\n\n const rootNode = parentId !== undefined ? this.getNode(parentId) : currModel.rootNode;\n /* v8 ignore if -- @preserve */\n if (!rootNode || isTreeModelInfoNode(rootNode)) {\n return { complete: Promise.resolve() };\n }\n\n if (parentId === undefined) {\n // cancel all ongoing requests\n this._reset.next();\n }\n\n return this.loadSubTree(\n { parent: rootNode, getHierarchyLevelOptions, shouldLoadChildren, buildNode, ignoreCache: options?.ignoreCache },\n !!options?.discardState ? undefined : { ...currModel.rootNode },\n options?.discardState,\n );\n }\n\n public reset() {\n this._reset.next();\n }\n\n public setHierarchyProvider(provider?: HierarchyProvider) {\n this._loader = provider\n ? new TreeLoader(\n provider,\n this._onHierarchyLimitExceeded,\n ({ parentId, type, error }) => {\n if (type === \"timeout\") {\n const loadAction = this.getLoadAction(parentId);\n this._onLoad(loadAction, Number.MAX_SAFE_INTEGER);\n }\n this._onHierarchyLoadError({ parentId, type, error });\n },\n this._nodeIdFactory,\n )\n : /* v8 ignore next */ new NoopTreeLoader();\n }\n\n public getNode(nodeId: string | undefined): TreeModelNode | TreeModelRootNode | undefined {\n return TreeModel.getNode(this._currentModel, nodeId);\n }\n\n public selectNodes(nodeIds: Array<string>, changeType: SelectionChangeType) {\n this.updateTreeModel((model) => {\n TreeModel.selectNodes(model, nodeIds, changeType);\n });\n }\n\n public expandNode(nodeId: string, isExpanded: boolean) {\n let childrenAction: ReturnType<typeof TreeModel.expandNode> = \"none\";\n this.updateTreeModel((model) => {\n childrenAction = TreeModel.expandNode(model, nodeId, isExpanded);\n });\n\n if (childrenAction === \"none\") {\n return { complete: Promise.resolve() };\n }\n\n return this.loadNodes(nodeId, childrenAction === \"reloadChildren\");\n }\n\n public setHierarchyLimit(nodeId: string | undefined, limit?: number | \"unbounded\") {\n const oldModel = this._currentModel;\n let loadChildren = false;\n this.updateTreeModel((model) => {\n loadChildren = TreeModel.setHierarchyLimit(model, nodeId, limit);\n });\n\n if (!loadChildren) {\n return { complete: Promise.resolve() };\n }\n\n return this.reloadSubTree(nodeId, oldModel);\n }\n\n public setInstanceFilter(nodeId: string | undefined, filter?: GenericInstanceFilter) {\n const oldModel = this._currentModel;\n let loadChildren = false;\n this.updateTreeModel((model) => {\n loadChildren = TreeModel.setInstanceFilter(model, nodeId, filter);\n });\n\n if (!loadChildren) {\n return { complete: Promise.resolve() };\n }\n\n return this.reloadSubTree(nodeId, oldModel);\n }\n\n public reloadTree(options?: { parentNodeId?: string; state?: \"keep\" | \"discard\" | \"reset\" }) {\n const oldModel = this._currentModel;\n this.updateTreeModel((model) => {\n TreeModel.setIsLoading(model, options?.parentNodeId, true);\n if (options?.state === \"reset\") {\n TreeModel.removeSubTree(model, options?.parentNodeId);\n }\n });\n\n const discardState = options?.state === \"discard\" || options?.state === \"reset\";\n const ignoreCache = options?.state === \"reset\";\n return this.reloadSubTree(options?.parentNodeId, oldModel, { discardState, ignoreCache });\n }\n}\n\nfunction collectTreePartsUntil(untilNotifier: Observable<void>, rootNode?: TreeModelRootNode) {\n return (source: Observable<LoadedTreePart>) =>\n source.pipe(\n reduce<LoadedTreePart, TreeModel>(\n (treeModel, loadedPart) => {\n addNodesToModel(treeModel, loadedPart);\n return treeModel;\n },\n {\n idToNode: new Map(),\n parentChildMap: new Map(),\n rootNode: rootNode ?? { id: undefined, nodeData: undefined },\n },\n ),\n takeUntil(untilNotifier),\n );\n}\n\nfunction addNodesToModel(model: TreeModel, hierarchyPart: LoadedTreePart) {\n model.parentChildMap.set(\n hierarchyPart.parentId,\n hierarchyPart.loadedNodes.map((node) => node.id),\n );\n for (const node of hierarchyPart.loadedNodes) {\n model.idToNode.set(node.id, node);\n }\n const parentNode = hierarchyPart.parentId ? model.idToNode.get(hierarchyPart.parentId) : undefined;\n if (parentNode && isTreeModelHierarchyNode(parentNode)) {\n parentNode.isExpanded = true;\n }\n}\n\nfunction addAttributes(node: TreeModelHierarchyNode, oldModel: TreeModel) {\n const oldNode = oldModel.idToNode.get(node.id);\n if (oldNode && isTreeModelHierarchyNode(oldNode)) {\n node.hierarchyLimit = oldNode.hierarchyLimit;\n node.instanceFilter = oldNode.instanceFilter;\n node.isSelected = oldNode.isSelected;\n }\n return node;\n}\n\nfunction collectNodes(\n parentId: string | undefined,\n model: TreeModel,\n pred: (node: TreeModelHierarchyNode) => boolean,\n): TreeModelHierarchyNode[] {\n const currentChildren = model.parentChildMap.get(parentId);\n if (!currentChildren) {\n return [];\n }\n\n if (parentId === undefined) {\n return currentChildren.flatMap((child) => collectNodes(child, model, pred));\n }\n\n const currNode = model.idToNode.get(parentId);\n if (!currNode || !isTreeModelHierarchyNode(currNode) || !pred(currNode)) {\n return [];\n }\n\n return [currNode, ...currentChildren.flatMap((child) => collectNodes(child, model, pred))];\n}\n\nfunction getNonGroupedParentId(\n node: TreeModelHierarchyNode | TreeModelRootNode,\n nodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n) {\n if (!node.nodeData || !HierarchyNode.isGroupingNode(node.nodeData)) {\n return node.id;\n }\n\n if (!node.nodeData.nonGroupingAncestor) {\n return undefined;\n }\n\n return nodeIdFactory(node.nodeData.nonGroupingAncestor);\n}\n\nfunction createHierarchyLevelOptions(model: TreeModel, nodeId: string | undefined): HierarchyLevelOptions {\n if (nodeId === undefined) {\n return { instanceFilter: model.rootNode.instanceFilter, hierarchyLevelSizeLimit: model.rootNode.hierarchyLimit };\n }\n\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode || isTreeModelInfoNode(modelNode)) {\n return { instanceFilter: undefined, hierarchyLevelSizeLimit: undefined };\n }\n return { instanceFilter: modelNode.instanceFilter, hierarchyLevelSizeLimit: modelNode.hierarchyLimit };\n}\n\n/* v8 ignore start */\nclass NoopTreeLoader implements ITreeLoader {\n public loadNodes(): Observable<LoadedTreePart> {\n return EMPTY;\n }\n}\n/* v8 ignore stop */\n\nclass TimeTracker {\n private _start: number;\n private _stopped: boolean = false;\n\n constructor(private _onFinish: (time: number) => void) {\n this._start = Date.now();\n }\n\n public [Symbol.dispose]() {\n this._stopped = true;\n }\n\n public finish() {\n /* v8 ignore if -- @preserve */\n if (this._stopped) {\n return;\n }\n\n this._stopped = true;\n const elapsedTime = Date.now() - this._start;\n this._onFinish(elapsedTime);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TreeLoader.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2C,UAAU,EAAe,MAAM,MAAM,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,iBAAiB,EAA0B,MAAM,iCAAiC,CAAC;AAClI,OAAO,EAA4B,sBAAsB,EAAqB,aAAa,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGvI,gBAAgB;AAChB,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,uBAAuB,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAChD;AAED,gBAAgB;AAChB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,sBAAsB,GAAG,iBAAiB,CAAC;IACnD,wBAAwB,EAAE,CAAC,IAAI,EAAE,iBAAiB,GAAG,sBAAsB,KAAK,qBAAqB,CAAC;IACtG,kBAAkB,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC;IAC9D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,sBAAsB,CAAC;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;CAClE;AAED,gBAAgB;AAChB,qBAAa,UAAW,YAAW,WAAW;IAI1C,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,yBAAyB;IACjC,OAAO,CAAC,qBAAqB;IAL/B,OAAO,CAAC,kBAAkB,CAA8D;gBAG9E,kBAAkB,EAAE,iBAAiB,EACrC,yBAAyB,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KAAE,KAAK,IAAI,EAC/H,qBAAqB,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,EAClH,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,YAAY,CAAC,KAAK,MAAM;IAKjF,OAAO,CAAC,YAAY;IAyDb,SAAS,CAAC,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,EAAE,gBAAgB;CAStE"}
1
+ {"version":3,"file":"TreeLoader.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2C,UAAU,EAAe,MAAM,MAAM,CAAC;AACxF,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EAElB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEL,sBAAsB,EAEtB,aAAa,EACb,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AAGxB,gBAAgB;AAChB,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,uBAAuB,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAChD;AAED,gBAAgB;AAChB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,sBAAsB,GAAG,iBAAiB,CAAC;IACnD,wBAAwB,EAAE,CAAC,IAAI,EAAE,iBAAiB,GAAG,sBAAsB,KAAK,qBAAqB,CAAC;IACtG,kBAAkB,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC;IAC9D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,sBAAsB,CAAC;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;CAClE;AAED,gBAAgB;AAChB,qBAAa,UAAW,YAAW,WAAW;IAI1C,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,yBAAyB;IAKjC,OAAO,CAAC,qBAAqB;IAT/B,OAAO,CAAC,kBAAkB,CAA8D;gBAG9E,kBAAkB,EAAE,iBAAiB,EACrC,yBAAyB,EAAE,CAAC,KAAK,EAAE;QACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,qBAAqB,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;KAC9B,KAAK,IAAI,EACF,qBAAqB,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,EAClH,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,YAAY,CAAC,KAAK,MAAM;IAMjF,OAAO,CAAC,YAAY;IAkDb,SAAS,CAAC,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,EAAE,gBAAgB;CAWtE"}
@@ -3,7 +3,7 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { catchError, expand, from, map, mergeMap, of, toArray } from "rxjs";
6
- import { isTreeModelHierarchyNode } from "./TreeModel.js";
6
+ import { isTreeModelHierarchyNode, } from "./TreeModel.js";
7
7
  import { createNodeId } from "./Utils.js";
8
8
  /** @internal */
9
9
  export class TreeLoader {
@@ -15,22 +15,23 @@ export class TreeLoader {
15
15
  this._hierarchyProvider = _hierarchyProvider;
16
16
  this._onHierarchyLimitExceeded = _onHierarchyLimitExceeded;
17
17
  this._onHierarchyLoadError = _onHierarchyLoadError;
18
- this._treeNodeIdFactory = treeNodeIdFactory ?? /* c8 ignore next */ createNodeId;
18
+ /* v8 ignore next -- @preserve */
19
+ this._treeNodeIdFactory = treeNodeIdFactory ?? createNodeId;
19
20
  }
20
- loadChildren({ parent, getHierarchyLevelOptions, buildNode, ignoreCache }) {
21
+ loadChildren({ parent, getHierarchyLevelOptions, buildNode, ignoreCache, }) {
21
22
  const { instanceFilter, hierarchyLevelSizeLimit } = getHierarchyLevelOptions(parent);
22
23
  const infoNodeIdBase = `${parent.id ?? "<root>"}`;
23
- const treeModelNodesFactory = createTreeModelNodesFactory({ buildNode, treeNodeIdFactory: this._treeNodeIdFactory });
24
+ const treeModelNodesFactory = createTreeModelNodesFactory({
25
+ buildNode,
26
+ treeNodeIdFactory: this._treeNodeIdFactory,
27
+ });
24
28
  return from(this._hierarchyProvider.getNodes({
25
29
  parentNode: parent.nodeData,
26
30
  hierarchyLevelSizeLimit,
27
31
  instanceFilter,
28
32
  ignoreCache,
29
33
  })).pipe(toArray(), catchError((err) => {
30
- const nodeProps = {
31
- id: `${infoNodeIdBase}-Unknown`,
32
- parentId: parent.id,
33
- };
34
+ const nodeProps = { id: `${infoNodeIdBase}-Unknown`, parentId: parent.id };
34
35
  let hierarchyLoadErrorType = "unknown";
35
36
  if (err instanceof Error) {
36
37
  nodeProps.id = `${infoNodeIdBase}-${err.message}`;
@@ -43,23 +44,11 @@ export class TreeLoader {
43
44
  }
44
45
  }
45
46
  this._onHierarchyLoadError({ parentId: parent.id, type: hierarchyLoadErrorType, error: err });
46
- return of([
47
- {
48
- ...nodeProps,
49
- type: "Unknown",
50
- message: "Failed to create hierarchy level",
51
- },
52
- ]);
47
+ return of([{ ...nodeProps, type: "Unknown", message: "Failed to create hierarchy level" }]);
53
48
  }), map((childNodes) => ({
54
49
  parentId: parent.id,
55
50
  loadedNodes: instanceFilter && childNodes.length === 0
56
- ? [
57
- {
58
- id: `${infoNodeIdBase}-no-filter-matches`,
59
- parentId: parent.id,
60
- type: "NoFilterMatches",
61
- },
62
- ]
51
+ ? [{ id: `${infoNodeIdBase}-no-filter-matches`, parentId: parent.id, type: "NoFilterMatches" }]
63
52
  : childNodes.map(treeModelNodesFactory),
64
53
  })));
65
54
  }