@itwin/presentation-hierarchies-react 2.0.0-alpha.6 → 2.0.0-alpha.61

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 (163) hide show
  1. package/CHANGELOG.md +1151 -11
  2. package/README.md +93 -160
  3. package/lib/presentation-hierarchies-react/FlatTreeNode.d.ts +49 -0
  4. package/lib/presentation-hierarchies-react/FlatTreeNode.d.ts.map +1 -0
  5. package/lib/presentation-hierarchies-react/FlatTreeNode.js +96 -0
  6. package/lib/presentation-hierarchies-react/FlatTreeNode.js.map +1 -0
  7. package/lib/presentation-hierarchies-react/LocalizationContext.d.ts +24 -0
  8. package/lib/presentation-hierarchies-react/LocalizationContext.d.ts.map +1 -0
  9. package/lib/presentation-hierarchies-react/LocalizationContext.js +40 -0
  10. package/lib/presentation-hierarchies-react/LocalizationContext.js.map +1 -0
  11. package/lib/presentation-hierarchies-react/Renderers.d.ts +92 -0
  12. package/lib/presentation-hierarchies-react/Renderers.d.ts.map +1 -0
  13. package/lib/presentation-hierarchies-react/TreeNode.d.ts +80 -0
  14. package/lib/presentation-hierarchies-react/TreeNode.d.ts.map +1 -0
  15. package/lib/{esm/presentation-hierarchies-react → presentation-hierarchies-react}/UseIModelTree.d.ts +28 -15
  16. package/lib/presentation-hierarchies-react/UseIModelTree.d.ts.map +1 -0
  17. package/lib/presentation-hierarchies-react/UseIModelTree.js +183 -0
  18. package/lib/presentation-hierarchies-react/UseIModelTree.js.map +1 -0
  19. package/lib/presentation-hierarchies-react/UseNodeHighlighting.d.ts +30 -0
  20. package/lib/presentation-hierarchies-react/UseNodeHighlighting.d.ts.map +1 -0
  21. package/lib/presentation-hierarchies-react/UseNodeHighlighting.js +57 -0
  22. package/lib/presentation-hierarchies-react/UseNodeHighlighting.js.map +1 -0
  23. package/lib/presentation-hierarchies-react/UseSelectionHandler.d.ts +23 -0
  24. package/lib/presentation-hierarchies-react/UseSelectionHandler.d.ts.map +1 -0
  25. package/lib/presentation-hierarchies-react/UseSelectionHandler.js +124 -0
  26. package/lib/presentation-hierarchies-react/UseSelectionHandler.js.map +1 -0
  27. package/lib/presentation-hierarchies-react/UseTree.d.ts +112 -0
  28. package/lib/presentation-hierarchies-react/UseTree.d.ts.map +1 -0
  29. package/lib/presentation-hierarchies-react/UseTree.js +298 -0
  30. package/lib/presentation-hierarchies-react/UseTree.js.map +1 -0
  31. package/lib/presentation-hierarchies-react/Utils.js +56 -0
  32. package/lib/presentation-hierarchies-react/Utils.js.map +1 -0
  33. package/lib/presentation-hierarchies-react/internal/DisposePolyfill.js +10 -0
  34. package/lib/presentation-hierarchies-react/internal/DisposePolyfill.js.map +1 -0
  35. package/lib/presentation-hierarchies-react/internal/LocalizedStrings.d.ts +9 -0
  36. package/lib/presentation-hierarchies-react/internal/LocalizedStrings.d.ts.map +1 -0
  37. package/lib/presentation-hierarchies-react/internal/LocalizedStrings.js +12 -0
  38. package/lib/presentation-hierarchies-react/internal/LocalizedStrings.js.map +1 -0
  39. package/lib/presentation-hierarchies-react/internal/TreeActions.js +294 -0
  40. package/lib/presentation-hierarchies-react/internal/TreeActions.js.map +1 -0
  41. package/lib/presentation-hierarchies-react/internal/TreeLoader.js +98 -0
  42. package/lib/presentation-hierarchies-react/internal/TreeLoader.js.map +1 -0
  43. package/lib/presentation-hierarchies-react/internal/TreeModel.d.ts +1 -0
  44. package/lib/presentation-hierarchies-react/internal/TreeModel.js +115 -0
  45. package/lib/presentation-hierarchies-react/internal/TreeModel.js.map +1 -0
  46. package/lib/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts +35 -0
  47. package/lib/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts.map +1 -0
  48. package/lib/presentation-hierarchies-react/internal/UseUnifiedSelection.js +141 -0
  49. package/lib/presentation-hierarchies-react/internal/UseUnifiedSelection.js.map +1 -0
  50. package/lib/presentation-hierarchies-react/internal/Utils.js +42 -0
  51. package/lib/presentation-hierarchies-react/internal/Utils.js.map +1 -0
  52. package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.d.ts +40 -0
  53. package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.d.ts.map +1 -0
  54. package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.js +387 -0
  55. package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.js.map +1 -0
  56. package/lib/presentation-hierarchies-react/stratakit/RootErrorRenderer.d.ts +21 -0
  57. package/lib/presentation-hierarchies-react/stratakit/RootErrorRenderer.d.ts.map +1 -0
  58. package/lib/presentation-hierarchies-react/stratakit/RootErrorRenderer.js +185 -0
  59. package/lib/presentation-hierarchies-react/stratakit/RootErrorRenderer.js.map +1 -0
  60. package/lib/presentation-hierarchies-react/stratakit/TreeAction.d.ts +49 -0
  61. package/lib/presentation-hierarchies-react/stratakit/TreeAction.d.ts.map +1 -0
  62. package/lib/presentation-hierarchies-react/stratakit/TreeAction.js +88 -0
  63. package/lib/presentation-hierarchies-react/stratakit/TreeAction.js.map +1 -0
  64. package/lib/presentation-hierarchies-react/stratakit/TreeErrorRenderer.d.ts +38 -0
  65. package/lib/presentation-hierarchies-react/stratakit/TreeErrorRenderer.d.ts.map +1 -0
  66. package/lib/presentation-hierarchies-react/stratakit/TreeErrorRenderer.js +77 -0
  67. package/lib/presentation-hierarchies-react/stratakit/TreeErrorRenderer.js.map +1 -0
  68. package/lib/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.d.ts +29 -0
  69. package/lib/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.d.ts.map +1 -0
  70. package/lib/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.js +91 -0
  71. package/lib/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.js.map +1 -0
  72. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.d.ts +31 -0
  73. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.d.ts.map +1 -0
  74. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.js +155 -0
  75. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.js.map +1 -0
  76. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.css +25 -0
  77. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts +14 -0
  78. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts.map +1 -0
  79. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js +540 -0
  80. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js.map +1 -0
  81. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.d.ts +75 -0
  82. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.d.ts.map +1 -0
  83. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.js +417 -0
  84. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.js.map +1 -0
  85. package/lib/presentation-hierarchies-react-extract.d.ts +17 -0
  86. package/lib/presentation-hierarchies-react-extract.js +16 -0
  87. package/lib/presentation-hierarchies-react-stratakit.d.ts +8 -0
  88. package/lib/presentation-hierarchies-react-stratakit.js +8 -0
  89. package/lib/presentation-hierarchies-react.d.ts +11 -0
  90. package/lib/presentation-hierarchies-react.js +8 -0
  91. package/lib/public/locales/en/PresentationHierarchies_1.0.json +26 -0
  92. package/package.json +78 -56
  93. package/lib/esm/presentation-hierarchies-react/TreeNode.d.ts +0 -75
  94. package/lib/esm/presentation-hierarchies-react/TreeNode.d.ts.map +0 -1
  95. package/lib/esm/presentation-hierarchies-react/TreeNode.js +0 -12
  96. package/lib/esm/presentation-hierarchies-react/TreeNode.js.map +0 -1
  97. package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.d.ts +0 -15
  98. package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.d.ts.map +0 -1
  99. package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.js +0 -22
  100. package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.js.map +0 -1
  101. package/lib/esm/presentation-hierarchies-react/UseIModelTree.d.ts.map +0 -1
  102. package/lib/esm/presentation-hierarchies-react/UseIModelTree.js +0 -62
  103. package/lib/esm/presentation-hierarchies-react/UseIModelTree.js.map +0 -1
  104. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.d.ts +0 -46
  105. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.d.ts.map +0 -1
  106. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.js +0 -98
  107. package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.js.map +0 -1
  108. package/lib/esm/presentation-hierarchies-react/UseTree.d.ts +0 -132
  109. package/lib/esm/presentation-hierarchies-react/UseTree.d.ts.map +0 -1
  110. package/lib/esm/presentation-hierarchies-react/UseTree.js +0 -242
  111. package/lib/esm/presentation-hierarchies-react/UseTree.js.map +0 -1
  112. package/lib/esm/presentation-hierarchies-react/internal/DisposePolyfill.d.ts +0 -2
  113. package/lib/esm/presentation-hierarchies-react/internal/DisposePolyfill.d.ts.map +0 -1
  114. package/lib/esm/presentation-hierarchies-react/internal/DisposePolyfill.js +0 -11
  115. package/lib/esm/presentation-hierarchies-react/internal/DisposePolyfill.js.map +0 -1
  116. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.d.ts +0 -53
  117. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.d.ts.map +0 -1
  118. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.js +0 -307
  119. package/lib/esm/presentation-hierarchies-react/internal/TreeActions.js.map +0 -1
  120. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.d.ts +0 -44
  121. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.d.ts.map +0 -1
  122. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.js +0 -94
  123. package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.js.map +0 -1
  124. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.d.ts +0 -70
  125. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.d.ts.map +0 -1
  126. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.js +0 -153
  127. package/lib/esm/presentation-hierarchies-react/internal/TreeModel.js.map +0 -1
  128. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts +0 -28
  129. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts.map +0 -1
  130. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.js +0 -128
  131. package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.js.map +0 -1
  132. package/lib/esm/presentation-hierarchies-react/internal/Utils.d.ts +0 -23
  133. package/lib/esm/presentation-hierarchies-react/internal/Utils.d.ts.map +0 -1
  134. package/lib/esm/presentation-hierarchies-react/internal/Utils.js +0 -58
  135. package/lib/esm/presentation-hierarchies-react/internal/Utils.js.map +0 -1
  136. package/lib/esm/presentation-hierarchies-react/itwinui/FlatTreeNode.d.ts +0 -21
  137. package/lib/esm/presentation-hierarchies-react/itwinui/FlatTreeNode.d.ts.map +0 -1
  138. package/lib/esm/presentation-hierarchies-react/itwinui/FlatTreeNode.js +0 -30
  139. package/lib/esm/presentation-hierarchies-react/itwinui/FlatTreeNode.js.map +0 -1
  140. package/lib/esm/presentation-hierarchies-react/itwinui/LocalizationContext.d.ts +0 -73
  141. package/lib/esm/presentation-hierarchies-react/itwinui/LocalizationContext.d.ts.map +0 -1
  142. package/lib/esm/presentation-hierarchies-react/itwinui/LocalizationContext.js +0 -34
  143. package/lib/esm/presentation-hierarchies-react/itwinui/LocalizationContext.js.map +0 -1
  144. package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButton.d.ts +0 -25
  145. package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButton.d.ts.map +0 -1
  146. package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButton.js +0 -40
  147. package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButton.js.map +0 -1
  148. package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.d.ts +0 -23
  149. package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.d.ts.map +0 -1
  150. package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.js +0 -72
  151. package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.js.map +0 -1
  152. package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts +0 -40
  153. package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts.map +0 -1
  154. package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js +0 -80
  155. package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js.map +0 -1
  156. package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts +0 -30
  157. package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts.map +0 -1
  158. package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.js +0 -48
  159. package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.js.map +0 -1
  160. package/lib/esm/presentation-hierarchies-react.d.ts +0 -13
  161. package/lib/esm/presentation-hierarchies-react.d.ts.map +0 -1
  162. package/lib/esm/presentation-hierarchies-react.js +0 -16
  163. package/lib/esm/presentation-hierarchies-react.js.map +0 -1
@@ -0,0 +1,124 @@
1
+ import { c } from "react-compiler-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ //#region src/presentation-hierarchies-react/UseSelectionHandler.ts
4
+ /**
5
+ * A react hook that helps implement different selection modes in a tree component created using `useTree` hook.
6
+ * @internal
7
+ */
8
+ function useSelectionHandler(props) {
9
+ const $ = c(10);
10
+ const { rootNodes, selectionMode, selectNodes } = props;
11
+ const previousSelectionRef = useRef(void 0);
12
+ let t0;
13
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
14
+ t0 = {
15
+ flatNodeList: [],
16
+ nodeIdToIndexMap: /* @__PURE__ */ new Map()
17
+ };
18
+ $[0] = t0;
19
+ } else t0 = $[0];
20
+ const state = useRef(t0);
21
+ let t1;
22
+ let t2;
23
+ if ($[1] !== rootNodes) {
24
+ t1 = () => {
25
+ state.current = computeFlatNodeList(rootNodes);
26
+ };
27
+ t2 = [rootNodes];
28
+ $[1] = rootNodes;
29
+ $[2] = t1;
30
+ $[3] = t2;
31
+ } else {
32
+ t1 = $[2];
33
+ t2 = $[3];
34
+ }
35
+ useEffect(t1, t2);
36
+ let t3;
37
+ if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
38
+ t3 = (firstId, secondId) => {
39
+ const getIndex = (nodeId) => nodeId ? state.current.nodeIdToIndexMap.get(nodeId) : 0;
40
+ const firstIndex = getIndex(firstId);
41
+ const secondIndex = getIndex(secondId);
42
+ if (firstIndex === void 0 || secondIndex === void 0) return [];
43
+ const startingIndex = Math.min(firstIndex, secondIndex);
44
+ const endIndex = Math.max(firstIndex, secondIndex);
45
+ return state.current.flatNodeList.slice(startingIndex, endIndex + 1);
46
+ };
47
+ $[4] = t3;
48
+ } else t3 = $[4];
49
+ const getNodeRange = t3;
50
+ let t4;
51
+ if ($[5] !== selectNodes || $[6] !== selectionMode) {
52
+ t4 = (t5) => {
53
+ const { nodeId: nodeId_0, isSelected, shiftDown, ctrlDown } = t5;
54
+ const selection = getSelectionAction(selectionMode, isSelected, shiftDown, ctrlDown);
55
+ if (selection.type === "disabled") return;
56
+ const nodes = selection.select === "range" ? getNodeRange(previousSelectionRef.current, nodeId_0) : [nodeId_0];
57
+ if (!nodes.length) return;
58
+ selection.select !== "range" && (previousSelectionRef.current = nodeId_0);
59
+ selectNodes(nodes, selection.type);
60
+ };
61
+ $[5] = selectNodes;
62
+ $[6] = selectionMode;
63
+ $[7] = t4;
64
+ } else t4 = $[7];
65
+ const handleNodeSelect = t4;
66
+ let t5;
67
+ if ($[8] !== handleNodeSelect) {
68
+ t5 = { handleNodeSelect };
69
+ $[8] = handleNodeSelect;
70
+ $[9] = t5;
71
+ } else t5 = $[9];
72
+ return t5;
73
+ }
74
+ function getSelectionAction(selectionMode, isSelected, shiftDown, ctrlDown) {
75
+ switch (selectionMode) {
76
+ case "none": return {
77
+ select: "node",
78
+ type: "disabled"
79
+ };
80
+ case "single": return {
81
+ select: "node",
82
+ type: isSelected ? "remove" : "replace"
83
+ };
84
+ case "multiple": return {
85
+ select: "node",
86
+ type: isSelected ? "remove" : "add"
87
+ };
88
+ case "extended": return getExtendedSelectionAction(isSelected, shiftDown, ctrlDown);
89
+ }
90
+ }
91
+ function getExtendedSelectionAction(isSelected, shiftDown, ctrlDown) {
92
+ if (shiftDown) return {
93
+ select: "range",
94
+ type: "replace"
95
+ };
96
+ if (ctrlDown) return {
97
+ select: "node",
98
+ type: isSelected ? "remove" : "add"
99
+ };
100
+ return {
101
+ select: "node",
102
+ type: "replace"
103
+ };
104
+ }
105
+ function computeFlatNodeList(rootNodes) {
106
+ const flatNodeList = [];
107
+ const nodeIdToIndexMap = /* @__PURE__ */ new Map();
108
+ const flattenNodeRecursively = (nodes) => {
109
+ nodes.forEach((node) => {
110
+ nodeIdToIndexMap.set(node.id, flatNodeList.length);
111
+ flatNodeList.push(node.id);
112
+ if (node.isExpanded && typeof node.children !== "boolean") flattenNodeRecursively(node.children);
113
+ });
114
+ };
115
+ flattenNodeRecursively(rootNodes);
116
+ return {
117
+ flatNodeList,
118
+ nodeIdToIndexMap
119
+ };
120
+ }
121
+ //#endregion
122
+ export { useSelectionHandler };
123
+
124
+ //# sourceMappingURL=UseSelectionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UseSelectionHandler.js","names":["useCallback","useEffect","useRef","TreeRendererProps","TreeNode","SelectionMode","SelectionChangeType","UseSelectionHandlerProps","Pick","selectionMode","UseSelectionHandlerResult","handleNodeSelect","props","nodeId","isSelected","shiftDown","ctrlDown","FlatTreeState","flatNodeList","Array","nodeIdToIndexMap","Map","useSelectionHandler","$","_c","rootNodes","selectNodes","previousSelectionRef","undefined","t0","Symbol","for","state","t1","t2","current","computeFlatNodeList","t3","firstId","secondId","getIndex","get","firstIndex","secondIndex","startingIndex","Math","min","endIndex","max","slice","getNodeRange","t4","t5","nodeId_0","selection","getSelectionAction","type","nodes","select","length","SelectionAction","getExtendedSelectionAction","flattenNodeRecursively","forEach","node","set","id","push","isExpanded","children"],"sources":["../../src/presentation-hierarchies-react/UseSelectionHandler.ts"],"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\";\n\nimport type { TreeRendererProps } from \"./Renderers.js\";\nimport type { TreeNode } from \"./TreeNode.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 * @alpha\n */\ntype UseSelectionHandlerProps = Pick<TreeRendererProps, \"selectNodes\" | \"rootNodes\"> & {\n /**\n * Selection mode that the component is working in.\n */\n selectionMode: SelectionMode;\n};\n\n/**\n * Result of `useSelectionHandler` hook.\n * @internal\n */\ninterface UseSelectionHandlerResult {\n /** Updates nodes selection based on current node state and modifier keys used. */\n handleNodeSelect: (props: { nodeId: string; isSelected: boolean; shiftDown: boolean; ctrlDown: boolean }) => 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 * @internal\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 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 handleNodeSelect = useCallback<UseSelectionHandlerResult[\"handleNodeSelect\"]>(\n ({ nodeId, isSelected, shiftDown, ctrlDown }) => {\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 return { handleNodeSelect };\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 ? \"remove\" : \"replace\" };\n case \"multiple\":\n return { select: \"node\", type: isSelected ? \"remove\" : \"add\" };\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 ? \"remove\" : \"add\" };\n }\n return { select: \"node\", type: \"replace\" };\n}\n\nfunction computeFlatNodeList(rootNodes: Array<TreeNode>): FlatTreeState {\n const flatNodeList: Array<string> = [];\n const nodeIdToIndexMap: Map<string, number> = new Map();\n\n const flattenNodeRecursively = (nodes: Array<TreeNode>) => {\n nodes.forEach((node) => {\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"],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { ErrorInfo, TreeNode } from "./TreeNode.js";
2
+ import { RootErrorRendererProps, TreeRendererProps } from "./Renderers.js";
3
+ import { UseUnifiedTreeSelectionProps } from "./internal/UseUnifiedSelection.js";
4
+ import { GenericInstanceFilter, HierarchyNode, HierarchyProvider, HierarchySearchTree } from "@itwin/presentation-hierarchies";
5
+ import { IPrimitiveValueFormatter } from "@itwin/presentation-shared";
6
+
7
+ //#region src/presentation-hierarchies-react/UseTree.d.ts
8
+ /**
9
+ * A React hook that creates state for a tree component.
10
+ *
11
+ * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
12
+ * component-agnostic result which may be used to render the hierarchy using any UI framework.
13
+ *
14
+ * See `README.md` for an example
15
+ *
16
+ * @see `useUnifiedSelectionTree`
17
+ * @see `useIModelTree`
18
+ * @public
19
+ */
20
+ declare function useTree(props: UseTreeProps): UseTreeResult;
21
+ /**
22
+ * A React hook that creates state for a tree component, that is integrated with unified selection
23
+ * through the given selection storage (previously the storage was provided through the, now
24
+ * deprecated, `UnifiedSelectionProvider`).
25
+ *
26
+ * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
27
+ * component-agnostic result which may be used to render the hierarchy using any UI framework.
28
+ *
29
+ * See `README.md` for an example
30
+ *
31
+ * @see `useTree`
32
+ * @see `useIModelUnifiedSelectionTree`
33
+ * @see `UnifiedSelectionProvider`
34
+ * @public
35
+ */
36
+ declare function useUnifiedSelectionTree({
37
+ sourceName,
38
+ selectionStorage,
39
+ createSelectableForGenericNode,
40
+ ...props
41
+ }: UseTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult;
42
+ /** @public */
43
+ interface UseTreeProps {
44
+ /** Provides the hierarchy provider for the tree. */
45
+ getHierarchyProvider: () => HierarchyProvider;
46
+ /** Provides paths to search nodes. */
47
+ getSearchPaths?: ({
48
+ abortSignal
49
+ }: {
50
+ abortSignal: AbortSignal;
51
+ }) => Promise<HierarchySearchTree[] | undefined>;
52
+ /**
53
+ * Callback that is called just after a certain action is finished.
54
+ * Can be used for performance tracking.
55
+ */
56
+ onPerformanceMeasured?: (action: "initial-load" | "hierarchy-level-load" | "reload", duration: number) => void;
57
+ /** Action to perform when hierarchy level contains more items that the specified limit. */
58
+ onHierarchyLimitExceeded?: (props: {
59
+ parentId?: string;
60
+ filter?: GenericInstanceFilter;
61
+ limit?: number | "unbounded";
62
+ }) => void;
63
+ /** Action to perform when an error occurs while loading hierarchy. */
64
+ onHierarchyLoadError?: (props: {
65
+ parentId?: string;
66
+ type: "timeout" | "unknown";
67
+ error: unknown;
68
+ }) => void;
69
+ /**
70
+ * Callback to set custom TreeNode errors.
71
+ * Errors returned from this callback are combined with internal errors when populating `TreeNode.errors`.
72
+ */
73
+ getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[];
74
+ }
75
+ /** @public */
76
+ type UseTreeResult = {
77
+ /**
78
+ * Specifies whether tree is reloading or not. It is set to `false` when initial tree load is in progress to check if
79
+ * or tree is reloading.
80
+ */
81
+ isReloading: boolean;
82
+ /**
83
+ * Get a tree node by id
84
+ */
85
+ getNode: (nodeId: string) => TreeNode | undefined;
86
+ /**
87
+ * Sets a formatter for the primitive values that are displayed in the hierarchy.
88
+ */
89
+ setFormatter: (formatter: IPrimitiveValueFormatter | undefined) => void;
90
+ } & RendererProps;
91
+ /**.
92
+ * @alpha
93
+ */
94
+ type RendererProps = {
95
+ /**
96
+ * An object containing information used to render root error handling UI.
97
+ * Use in combination with `RootErrorRenderer` or your custom implementation.
98
+ * Defined when root nodes fail to load.
99
+ */
100
+ rootErrorRendererProps: RootErrorRendererProps;
101
+ } | {
102
+ /** Is undefined when rootNodes were successfully loaded or are in initial loading process. */rootErrorRendererProps: undefined;
103
+ /**
104
+ * An object containing information used to render tree.
105
+ * Use with `TreeRenderer` or your custom implementation.
106
+ * Is undefined on initial loading process.
107
+ */
108
+ treeRendererProps?: TreeRendererProps;
109
+ };
110
+ //#endregion
111
+ export { UseTreeProps, UseTreeResult, useTree, useUnifiedSelectionTree };
112
+ //# sourceMappingURL=UseTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UseTree.d.ts","names":[],"sources":["../../src/presentation-hierarchies-react/UseTree.ts"],"mappings":";;;;;;;;AAiCA;;;;;;;;;AAoBA;;iBApBgB,OAAA,CAAQ,KAAA,EAAO,YAAA,GAAe,aAAA;;;;;;;;;;;;;;;;iBAoB9B,uBAAA,CAAA;EACd,UAAA;EACA,gBAAA;EACA,8BAAA;EAAA,GACG;AAAA,GACF,YAAA,GAAe,4BAAA,GAA+B,aAAA;;UAehC,YAAA;EAf6C;EAiB5D,oBAAA,QAA4B,iBAAA;EAFb;EAIf,cAAA;IAAoB;EAAA;IAAiB,WAAA,EAAa,WAAA;EAAA,MAAkB,OAAA,CAAQ,mBAAA;EAAxD;;;;EAKpB,qBAAA,IAAyB,MAAA,sDAA4D,QAAA;EAa1D;EAX3B,wBAAA,IAA4B,KAAA;IAC1B,QAAA;IACA,MAAA,GAAS,qBAAA;IACT,KAAA;EAAA;EAVF;EAaA,oBAAA,IAAwB,KAAA;IAAS,QAAA;IAAmB,IAAA;IAA6B,KAAA;EAAA;EAbL;;;;EAkB5E,iBAAA,IAAqB,IAAA,EAAM,aAAA,KAAkB,SAAA;AAAA;;KAInC,aAAA;EAZR;;;;EAiBF,WAAA;EAdiF;;;EAkBjF,OAAA,GAAU,MAAA,aAAmB,QAAA;EAbR;;;EAiBrB,YAAA,GAAe,SAAA,EAAW,wBAAA;AAAA,IACxB,aAAA;;;;KAKC,aAAA;EALD;;;;;EAYE,sBAAA,EAAwB,sBAAA;AAAA;EAb5B,8FAiBI,sBAAA;EAjBW;;;;AACC;EAsBZ,iBAAA,GAAoB,iBAAA;AAAA"}
@@ -0,0 +1,298 @@
1
+ import { safeDispose } from "./internal/Utils.js";
2
+ import { TreeModel } from "./internal/TreeModel.js";
3
+ import { TreeActions } from "./internal/TreeActions.js";
4
+ import { useUnifiedTreeSelection } from "./internal/UseUnifiedSelection.js";
5
+ import { useLatest } from "./Utils.js";
6
+ import { c } from "react-compiler-runtime";
7
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
8
+ import { HierarchyNode } from "@itwin/presentation-hierarchies";
9
+ //#region src/presentation-hierarchies-react/UseTree.ts
10
+ /**
11
+ * A React hook that creates state for a tree component.
12
+ *
13
+ * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
14
+ * component-agnostic result which may be used to render the hierarchy using any UI framework.
15
+ *
16
+ * See `README.md` for an example
17
+ *
18
+ * @see `useUnifiedSelectionTree`
19
+ * @see `useIModelTree`
20
+ * @public
21
+ */
22
+ function useTree(props) {
23
+ const $ = c(2);
24
+ const t0 = useTreeInternal(props);
25
+ let rest;
26
+ if ($[0] !== t0) {
27
+ const { getTreeModelNode: _, ...t1 } = t0;
28
+ rest = t1;
29
+ $[0] = t0;
30
+ $[1] = rest;
31
+ } else rest = $[1];
32
+ return rest;
33
+ }
34
+ /**
35
+ * A React hook that creates state for a tree component, that is integrated with unified selection
36
+ * through the given selection storage (previously the storage was provided through the, now
37
+ * deprecated, `UnifiedSelectionProvider`).
38
+ *
39
+ * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
40
+ * component-agnostic result which may be used to render the hierarchy using any UI framework.
41
+ *
42
+ * See `README.md` for an example
43
+ *
44
+ * @see `useTree`
45
+ * @see `useIModelUnifiedSelectionTree`
46
+ * @see `UnifiedSelectionProvider`
47
+ * @public
48
+ */
49
+ function useUnifiedSelectionTree(t0) {
50
+ const $ = c(19);
51
+ let createSelectableForGenericNode;
52
+ let props;
53
+ let selectionStorage;
54
+ let sourceName;
55
+ if ($[0] !== t0) {
56
+ ({sourceName, selectionStorage, createSelectableForGenericNode, ...props} = t0);
57
+ $[0] = t0;
58
+ $[1] = createSelectableForGenericNode;
59
+ $[2] = props;
60
+ $[3] = selectionStorage;
61
+ $[4] = sourceName;
62
+ } else {
63
+ createSelectableForGenericNode = $[1];
64
+ props = $[2];
65
+ selectionStorage = $[3];
66
+ sourceName = $[4];
67
+ }
68
+ const t1 = useTreeInternal(props);
69
+ let getTreeModelNode;
70
+ let rest;
71
+ if ($[5] !== t1) {
72
+ ({getTreeModelNode, ...rest} = t1);
73
+ $[5] = t1;
74
+ $[6] = getTreeModelNode;
75
+ $[7] = rest;
76
+ } else {
77
+ getTreeModelNode = $[6];
78
+ rest = $[7];
79
+ }
80
+ let t2;
81
+ if ($[8] !== createSelectableForGenericNode || $[9] !== getTreeModelNode || $[10] !== selectionStorage || $[11] !== sourceName) {
82
+ t2 = {
83
+ sourceName,
84
+ selectionStorage,
85
+ getTreeModelNode,
86
+ createSelectableForGenericNode
87
+ };
88
+ $[8] = createSelectableForGenericNode;
89
+ $[9] = getTreeModelNode;
90
+ $[10] = selectionStorage;
91
+ $[11] = sourceName;
92
+ $[12] = t2;
93
+ } else t2 = $[12];
94
+ const selectionProps = useUnifiedTreeSelection(t2);
95
+ if (rest.rootErrorRendererProps === void 0 && rest.treeRendererProps?.rootNodes) {
96
+ let t3;
97
+ if ($[13] !== rest.treeRendererProps || $[14] !== selectionProps) {
98
+ t3 = {
99
+ ...rest.treeRendererProps,
100
+ ...selectionProps
101
+ };
102
+ $[13] = rest.treeRendererProps;
103
+ $[14] = selectionProps;
104
+ $[15] = t3;
105
+ } else t3 = $[15];
106
+ let t4;
107
+ if ($[16] !== rest || $[17] !== t3) {
108
+ t4 = {
109
+ ...rest,
110
+ treeRendererProps: t3
111
+ };
112
+ $[16] = rest;
113
+ $[17] = t3;
114
+ $[18] = t4;
115
+ } else t4 = $[18];
116
+ return t4;
117
+ }
118
+ return rest;
119
+ }
120
+ function useTreeInternal({ getHierarchyProvider, getSearchPaths, onPerformanceMeasured, onHierarchyLimitExceeded, onHierarchyLoadError, getTreeNodeErrors }) {
121
+ const [state, setState] = useState({
122
+ model: {
123
+ idToNode: /* @__PURE__ */ new Map(),
124
+ parentChildMap: /* @__PURE__ */ new Map(),
125
+ rootNode: {
126
+ id: void 0,
127
+ nodeData: void 0
128
+ }
129
+ },
130
+ rootNodes: void 0
131
+ });
132
+ const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);
133
+ const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);
134
+ const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);
135
+ const getTreeNodeErrorsRef = useLatest(getTreeNodeErrors);
136
+ const [actions] = useState(() => new TreeActions((model) => {
137
+ setState({
138
+ model,
139
+ rootNodes: model.parentChildMap.get(void 0) !== void 0 ? generateTreeStructure(void 0, model, getTreeNodeErrorsRef.current) : void 0
140
+ });
141
+ }, (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration), (props) => onHierarchyLimitExceededRef.current?.(props), (props_0) => onHierarchyLoadErrorRef.current?.(props_0)));
142
+ const currentFormatter = useRef();
143
+ const [hierarchyProvider, setHierarchyProvider] = useState();
144
+ useEffect(() => {
145
+ const provider = getHierarchyProvider();
146
+ provider.setFormatter(currentFormatter.current);
147
+ const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {
148
+ const shouldDiscardState = hierarchyChangeArgs.searchChange?.newSearch !== void 0;
149
+ actions.reloadTree({ state: shouldDiscardState ? "discard" : "keep" });
150
+ });
151
+ actions.setHierarchyProvider(provider);
152
+ setHierarchyProvider(provider);
153
+ return () => {
154
+ removeHierarchyChangedListener();
155
+ actions.reset();
156
+ safeDispose(provider);
157
+ };
158
+ }, [actions, getHierarchyProvider]);
159
+ const [isSearching, setIsSearching] = useState(false);
160
+ useEffect(() => {
161
+ let disposed = false;
162
+ const controller = new AbortController();
163
+ (async () => {
164
+ if (!hierarchyProvider) return;
165
+ if (!getSearchPaths) {
166
+ hierarchyProvider.setHierarchySearch(void 0);
167
+ actions.reloadTree({ state: "keep" });
168
+ setIsSearching(false);
169
+ return;
170
+ }
171
+ setIsSearching(true);
172
+ let paths;
173
+ try {
174
+ paths = await getSearchPaths({ abortSignal: controller.signal });
175
+ } catch {} finally {
176
+ if (!disposed) {
177
+ hierarchyProvider.setHierarchySearch(paths ? { paths } : void 0);
178
+ setIsSearching(false);
179
+ }
180
+ }
181
+ })();
182
+ return () => {
183
+ controller.abort();
184
+ disposed = true;
185
+ };
186
+ }, [
187
+ hierarchyProvider,
188
+ getSearchPaths,
189
+ actions
190
+ ]);
191
+ const getTreeModelNode = useCallback((nodeId) => {
192
+ return actions.getNode(nodeId);
193
+ }, [actions]);
194
+ const getNode = useCallback((nodeId_0) => {
195
+ const node = actions.getNode(nodeId_0);
196
+ if (!node || node.id === void 0) return;
197
+ return createTreeNode(node, state.model, getTreeNodeErrorsRef.current);
198
+ }, [
199
+ actions,
200
+ getTreeNodeErrorsRef,
201
+ state.model
202
+ ]);
203
+ const expandNode = useCallback((nodeId_1, isExpanded) => {
204
+ actions.expandNode(nodeId_1, isExpanded);
205
+ }, [actions]);
206
+ const reloadTree = useCallback((options) => {
207
+ actions.reloadTree(options);
208
+ }, [actions]);
209
+ const selectNodes = useCallback((nodeIds, changeType) => {
210
+ actions.selectNodes(nodeIds, changeType);
211
+ }, [actions]);
212
+ const isNodeSelected = useCallback((nodeId_2) => TreeModel.isNodeSelected(state.model, nodeId_2), [state]);
213
+ const setFormatter = useCallback((formatter) => {
214
+ currentFormatter.current = formatter;
215
+ /* c8 ignore next 3 */
216
+ if (!hierarchyProvider) return;
217
+ hierarchyProvider.setFormatter(formatter);
218
+ }, [hierarchyProvider]);
219
+ const getHierarchyLevelDetails = useCallback((nodeId_3) => {
220
+ const node_0 = actions.getNode(nodeId_3);
221
+ if (!hierarchyProvider || !node_0) return;
222
+ const hierarchyNode = node_0.nodeData;
223
+ if (hierarchyNode && HierarchyNode.isGroupingNode(hierarchyNode)) return;
224
+ return {
225
+ hierarchyNode,
226
+ getInstanceKeysIterator: (props_1) => hierarchyProvider.getNodeInstanceKeys({
227
+ parentNode: hierarchyNode,
228
+ instanceFilter: props_1?.instanceFilter,
229
+ hierarchyLevelSizeLimit: props_1?.hierarchyLevelSizeLimit
230
+ }),
231
+ instanceFilter: node_0.instanceFilter,
232
+ setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId_3, filter),
233
+ sizeLimit: node_0.hierarchyLimit,
234
+ setSizeLimit: (value) => actions.setHierarchyLimit(nodeId_3, value)
235
+ };
236
+ }, [actions, hierarchyProvider]);
237
+ return {
238
+ ...useMemo(() => {
239
+ if (state.model.rootNode.error) return { rootErrorRendererProps: {
240
+ error: state.model.rootNode.error,
241
+ reloadTree,
242
+ getHierarchyLevelDetails
243
+ } };
244
+ return {
245
+ rootErrorRendererProps: void 0,
246
+ treeRendererProps: state.rootNodes ? {
247
+ rootNodes: state.rootNodes,
248
+ expandNode,
249
+ selectNodes,
250
+ isNodeSelected,
251
+ reloadTree,
252
+ getHierarchyLevelDetails
253
+ } : void 0
254
+ };
255
+ }, [
256
+ expandNode,
257
+ getHierarchyLevelDetails,
258
+ isNodeSelected,
259
+ reloadTree,
260
+ selectNodes,
261
+ state.model.rootNode.error,
262
+ state.rootNodes
263
+ ]),
264
+ isReloading: !!state.model.rootNode.isLoading || isSearching,
265
+ getTreeModelNode,
266
+ getNode,
267
+ setFormatter
268
+ };
269
+ }
270
+ function generateTreeStructure(parentNodeId, model, getTreeNodeErrors) {
271
+ const currentChildren = model.parentChildMap.get(parentNodeId);
272
+ if (!currentChildren) return;
273
+ return currentChildren.map((childId) => model.idToNode.get(childId)).filter((node) => !!node).map((node) => {
274
+ return createTreeNode(node, model, getTreeNodeErrors);
275
+ });
276
+ }
277
+ function createTreeNode(modelNode, model, getTreeNodeErrors) {
278
+ const allErrors = [...modelNode.error ? [modelNode.error] : [], ...getTreeNodeErrors?.(modelNode.nodeData) ?? []];
279
+ let children;
280
+ return {
281
+ id: modelNode.id,
282
+ label: modelNode.label,
283
+ nodeData: modelNode.nodeData,
284
+ isLoading: !!modelNode.isLoading,
285
+ isExpanded: !!modelNode.isExpanded,
286
+ isFilterable: !HierarchyNode.isGroupingNode(modelNode.nodeData) && !!modelNode.nodeData.supportsFiltering && modelNode.children,
287
+ isFiltered: !!modelNode.instanceFilter,
288
+ errors: allErrors,
289
+ get children() {
290
+ if (!children) children = generateTreeStructure(modelNode.id, model, getTreeNodeErrors);
291
+ return children ? children : modelNode.children === true ? true : [];
292
+ }
293
+ };
294
+ }
295
+ //#endregion
296
+ export { useTree, useUnifiedSelectionTree };
297
+
298
+ //# sourceMappingURL=UseTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UseTree.js","names":["useCallback","useEffect","useMemo","useRef","useState","HierarchyNode","TreeActions","TreeModel","useUnifiedTreeSelection","safeDispose","useLatest","GenericInstanceFilter","HierarchyProvider","HierarchySearchTree","IPrimitiveValueFormatter","TreeModelHierarchyNode","TreeModelRootNode","UseUnifiedTreeSelectionProps","RootErrorRendererProps","TreeRendererProps","ErrorInfo","TreeNode","SelectionChangeType","useTree","props","$","_c","t0","useTreeInternal","rest","getTreeModelNode","_","t1","useUnifiedSelectionTree","createSelectableForGenericNode","selectionStorage","sourceName","t2","selectionProps","rootErrorRendererProps","undefined","treeRendererProps","rootNodes","t3","t4","UseTreeProps","getHierarchyProvider","getSearchPaths","abortSignal","AbortSignal","Promise","onPerformanceMeasured","action","duration","onHierarchyLimitExceeded","parentId","filter","limit","onHierarchyLoadError","type","error","getTreeNodeErrors","node","UseTreeResult","isReloading","getNode","nodeId","setFormatter","formatter","RendererProps","TreeState","model","Array","state","setState","idToNode","Map","parentChildMap","rootNode","id","nodeData","onPerformanceMeasuredRef","onHierarchyLimitExceededRef","onHierarchyLoadErrorRef","getTreeNodeErrorsRef","actions","get","generateTreeStructure","current","actionType","currentFormatter","hierarchyProvider","setHierarchyProvider","provider","removeHierarchyChangedListener","hierarchyChanged","addListener","hierarchyChangeArgs","shouldDiscardState","searchChange","newSearch","reloadTree","reset","isSearching","setIsSearching","disposed","controller","AbortController","setHierarchySearch","paths","signal","abort","createTreeNode","expandNode","isExpanded","options","selectNodes","nodeIds","changeType","isNodeSelected","getHierarchyLevelDetails","hierarchyNode","isGroupingNode","getInstanceKeysIterator","getNodeInstanceKeys","parentNode","instanceFilter","hierarchyLevelSizeLimit","setInstanceFilter","sizeLimit","hierarchyLimit","setSizeLimit","value","setHierarchyLimit","renderProps","isLoading","parentNodeId","currentChildren","map","childId","modelNode","allErrors","children","label","isFilterable","supportsFiltering","isFiltered","errors"],"sources":["../../src/presentation-hierarchies-react/UseTree.ts"],"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, useMemo, useRef, useState } from \"react\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { TreeActions } from \"./internal/TreeActions.js\";\nimport { TreeModel } from \"./internal/TreeModel.js\";\nimport { useUnifiedTreeSelection } from \"./internal/UseUnifiedSelection.js\";\nimport { safeDispose } from \"./internal/Utils.js\";\nimport { useLatest } from \"./Utils.js\";\n\nimport type { GenericInstanceFilter, HierarchyProvider, HierarchySearchTree } from \"@itwin/presentation-hierarchies\";\nimport type { IPrimitiveValueFormatter } from \"@itwin/presentation-shared\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./internal/TreeModel.js\";\nimport type { UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport type { RootErrorRendererProps, TreeRendererProps } from \"./Renderers.js\";\nimport type { ErrorInfo, TreeNode } from \"./TreeNode.js\";\nimport type { SelectionChangeType } from \"./UseSelectionHandler.js\";\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 const selectionProps = useUnifiedTreeSelection({\n sourceName,\n selectionStorage,\n getTreeModelNode,\n createSelectableForGenericNode,\n });\n if (rest.rootErrorRendererProps === undefined && rest.treeRendererProps?.rootNodes) {\n return { ...rest, treeRendererProps: { ...rest.treeRendererProps, ...selectionProps } };\n }\n return rest;\n}\n\n/** @public */\nexport interface UseTreeProps {\n /** Provides the hierarchy provider for the tree. */\n getHierarchyProvider: () => HierarchyProvider;\n /** Provides paths to search nodes. */\n getSearchPaths?: ({ abortSignal }: { abortSignal: AbortSignal }) => Promise<HierarchySearchTree[] | 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 * Callback to set custom TreeNode errors.\n * Errors returned from this callback are combined with internal errors when populating `TreeNode.errors`.\n */\n getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[];\n}\n\n/** @public */\nexport type UseTreeResult = {\n /**\n * Specifies whether tree is reloading or not. It is set to `false` when initial tree load is in progress to check if\n * or tree is reloading.\n */\n isReloading: boolean;\n /**\n * Get a tree node by id\n */\n getNode: (nodeId: string) => TreeNode | undefined;\n /**\n * Sets a formatter for the primitive values that are displayed in the hierarchy.\n */\n setFormatter: (formatter: IPrimitiveValueFormatter | undefined) => void;\n} & RendererProps;\n\n/**.\n * @alpha\n */\ntype RendererProps =\n | {\n /**\n * An object containing information used to render root error handling UI.\n * Use in combination with `RootErrorRenderer` or your custom implementation.\n * Defined when root nodes fail to load.\n */\n rootErrorRendererProps: RootErrorRendererProps;\n }\n | {\n /** Is undefined when rootNodes were successfully loaded or are in initial loading process. */\n rootErrorRendererProps: undefined;\n /**\n * An object containing information used to render tree.\n * Use with `TreeRenderer` or your custom implementation.\n * Is undefined on initial loading process.\n */\n treeRendererProps?: TreeRendererProps;\n };\n\ninterface TreeState {\n model: TreeModel;\n rootNodes: Array<TreeNode> | undefined;\n}\n\nfunction useTreeInternal({\n getHierarchyProvider,\n getSearchPaths,\n onPerformanceMeasured,\n onHierarchyLimitExceeded,\n onHierarchyLoadError,\n getTreeNodeErrors,\n}: UseTreeProps): UseTreeResult & {\n getTreeModelNode: (nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | 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 const getTreeNodeErrorsRef = useLatest(getTreeNodeErrors);\n\n const [actions] = useState<TreeActions>(\n () =>\n new TreeActions(\n (model) => {\n const rootNodes =\n model.parentChildMap.get(undefined) !== undefined\n ? generateTreeStructure(undefined, model, getTreeNodeErrorsRef.current)\n : 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.searchChange?.newSearch !== 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 [isSearching, setIsSearching] = useState(false);\n useEffect(() => {\n let disposed = false as boolean;\n const controller = new AbortController();\n void (async () => {\n if (!hierarchyProvider) {\n return;\n }\n\n if (!getSearchPaths) {\n hierarchyProvider.setHierarchySearch(undefined);\n // reload tree in case hierarchy provider does not use hierarchy search to load initial nodes\n actions.reloadTree({ state: \"keep\" });\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n let paths: HierarchySearchTree[] | undefined;\n try {\n paths = await getSearchPaths({ abortSignal: controller.signal });\n } catch {\n } finally {\n if (!disposed) {\n hierarchyProvider.setHierarchySearch(paths ? { paths } : undefined);\n setIsSearching(false);\n }\n }\n })();\n return () => {\n controller.abort();\n disposed = true;\n };\n }, [hierarchyProvider, getSearchPaths, actions]);\n\n const getTreeModelNode = useCallback<(nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | undefined>(\n (nodeId: string) => {\n return actions.getNode(nodeId);\n },\n [actions],\n );\n\n const getNode = useCallback(\n (nodeId: string): TreeNode | undefined => {\n const node = actions.getNode(nodeId);\n if (!node || node.id === undefined) {\n return undefined;\n }\n return createTreeNode(node, state.model, getTreeNodeErrorsRef.current);\n },\n [actions, getTreeNodeErrorsRef, state.model],\n );\n\n const expandNode = useCallback<TreeRendererProps[\"expandNode\"]>(\n (nodeId: string, isExpanded: boolean) => {\n actions.expandNode(nodeId, isExpanded);\n },\n [actions],\n );\n\n const reloadTree = useCallback<TreeRendererProps[\"reloadTree\"]>(\n (options) => {\n actions.reloadTree(options);\n },\n [actions],\n );\n\n const selectNodes = useCallback<TreeRendererProps[\"selectNodes\"]>(\n (nodeIds: Array<string>, changeType: SelectionChangeType) => {\n actions.selectNodes(nodeIds, changeType);\n },\n [actions],\n );\n\n const isNodeSelected = useCallback<TreeRendererProps[\"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 /* c8 ignore next 3 */\n if (!hierarchyProvider) {\n return;\n }\n\n hierarchyProvider.setFormatter(formatter);\n },\n [hierarchyProvider],\n );\n\n const getHierarchyLevelDetails = useCallback<TreeRendererProps[\"getHierarchyLevelDetails\"]>(\n (nodeId) => {\n const node = actions.getNode(nodeId);\n if (!hierarchyProvider || !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 const renderProps: RendererProps = useMemo(() => {\n if (state.model.rootNode.error) {\n return { rootErrorRendererProps: { error: state.model.rootNode.error, reloadTree, getHierarchyLevelDetails } };\n }\n return {\n rootErrorRendererProps: undefined,\n treeRendererProps: state.rootNodes\n ? { rootNodes: state.rootNodes, expandNode, selectNodes, isNodeSelected, reloadTree, getHierarchyLevelDetails }\n : undefined,\n };\n }, [\n expandNode,\n getHierarchyLevelDetails,\n isNodeSelected,\n reloadTree,\n selectNodes,\n state.model.rootNode.error,\n state.rootNodes,\n ]);\n\n return {\n ...renderProps,\n isReloading: !!state.model.rootNode.isLoading || isSearching,\n getTreeModelNode,\n getNode,\n setFormatter,\n };\n}\n\nfunction generateTreeStructure(\n parentNodeId: string | undefined,\n model: TreeModel,\n getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[],\n): Array<TreeNode> | 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 TreeModelHierarchyNode => !!node)\n .map<TreeNode>((node) => {\n return createTreeNode(node, model, getTreeNodeErrors);\n });\n}\n\nfunction createTreeNode(\n modelNode: TreeModelHierarchyNode,\n model: TreeModel,\n getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[],\n): TreeNode {\n const allErrors = [\n // internal errors\n ...(modelNode.error ? [modelNode.error] : []),\n // external errors\n ...(getTreeNodeErrors?.(modelNode.nodeData) ?? []),\n ];\n\n let children: Array<TreeNode> | undefined;\n return {\n id: modelNode.id,\n label: modelNode.label,\n nodeData: modelNode.nodeData,\n isLoading: !!modelNode.isLoading,\n isExpanded: !!modelNode.isExpanded,\n isFilterable:\n !HierarchyNode.isGroupingNode(modelNode.nodeData) && !!modelNode.nodeData.supportsFiltering && modelNode.children,\n isFiltered: !!modelNode.instanceFilter,\n errors: allErrors,\n get children() {\n if (!children) {\n children = generateTreeStructure(modelNode.id, model, getTreeNodeErrors);\n }\n return children ? children : modelNode.children === true ? true : [];\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { c } from "react-compiler-runtime";
2
+ import { useCallback, useInsertionEffect, useRef } from "react";
3
+ //#region src/presentation-hierarchies-react/Utils.ts
4
+ /** @internal */
5
+ function useLatest(value) {
6
+ const $ = c(3);
7
+ const ref = useRef(value);
8
+ let t0;
9
+ let t1;
10
+ if ($[0] !== value) {
11
+ t0 = () => {
12
+ ref.current = value;
13
+ };
14
+ t1 = [value];
15
+ $[0] = value;
16
+ $[1] = t0;
17
+ $[2] = t1;
18
+ } else {
19
+ t0 = $[1];
20
+ t1 = $[2];
21
+ }
22
+ useInsertionEffect(t0, t1);
23
+ return ref;
24
+ }
25
+ /* c8 ignore start */
26
+ /** @internal */
27
+ function useEvent(callback) {
28
+ const $ = c(2);
29
+ const latestCallback = useLatest(callback);
30
+ let t0;
31
+ if ($[0] !== latestCallback) {
32
+ t0 = (...t1) => {
33
+ const args = t1;
34
+ latestCallback.current(...args);
35
+ };
36
+ $[0] = latestCallback;
37
+ $[1] = t0;
38
+ } else t0 = $[1];
39
+ return t0;
40
+ }
41
+ /* c8 ignore end */
42
+ /* c8 ignore start */
43
+ /** @internal */
44
+ function useMergedRefs(...refs) {
45
+ return useCallback((instance) => {
46
+ refs.forEach((ref) => {
47
+ if (typeof ref === "function") ref(instance);
48
+ else if (ref) ref.current = instance;
49
+ });
50
+ }, [...refs]);
51
+ }
52
+ /* c8 ignore end */
53
+ //#endregion
54
+ export { useEvent, useLatest, useMergedRefs };
55
+
56
+ //# sourceMappingURL=Utils.js.map