@itwin/presentation-hierarchies-react 2.0.0-alpha.65 → 2.0.0-alpha.67

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 (23) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +2 -8
  3. package/lib/presentation-hierarchies-react/UseIModelTree.js.map +1 -1
  4. package/lib/presentation-hierarchies-react/UseTree.js.map +1 -1
  5. package/lib/presentation-hierarchies-react/stratakit/{TreeNodeRenderer.css → LabelEditor.css} +3 -3
  6. package/lib/presentation-hierarchies-react/stratakit/LabelEditor.js +300 -0
  7. package/lib/presentation-hierarchies-react/stratakit/LabelEditor.js.map +1 -0
  8. package/lib/presentation-hierarchies-react/stratakit/TreeAction.d.ts.map +1 -1
  9. package/lib/presentation-hierarchies-react/stratakit/TreeAction.js +0 -1
  10. package/lib/presentation-hierarchies-react/stratakit/TreeAction.js.map +1 -1
  11. package/lib/presentation-hierarchies-react/stratakit/TreeContextMenu.js +97 -0
  12. package/lib/presentation-hierarchies-react/stratakit/TreeContextMenu.js.map +1 -0
  13. package/lib/presentation-hierarchies-react/stratakit/TreeNodeFilterAction.js.map +1 -1
  14. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.d.ts.map +1 -1
  15. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.js.map +1 -1
  16. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts +0 -1
  17. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts.map +1 -1
  18. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js +43 -351
  19. package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js.map +1 -1
  20. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.d.ts.map +1 -1
  21. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.js +34 -5
  22. package/lib/presentation-hierarchies-react/stratakit/TreeRenderer.js.map +1 -1
  23. package/package.json +31 -26
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @itwin/presentation-hierarchies-react
2
2
 
3
+ ## 2.0.0-alpha.67
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies:
8
+ - @itwin/presentation-shared@2.0.0-alpha.14
9
+ - @itwin/presentation-hierarchies@2.0.0-alpha.19
10
+ - @itwin/unified-selection@2.0.0-alpha.2
11
+
12
+ ## 2.0.0-alpha.66
13
+
14
+ ### Major Changes
15
+
16
+ - [#1540](https://github.com/iTwin/presentation/pull/1540): Updated StrataKit dependencies to newer versions, including `@stratakit/mui@1.0.0` and `@stratakit/structures@0.6.0`. `@stratakit/foundations` is now a peer dependency and should be installed by the application, along with `@mui/material@^9.4.0`.
17
+
18
+ ### Patch Changes
19
+
20
+ - [#1514](https://github.com/iTwin/presentation/pull/1514): Fix label editor validation message size
21
+ - [#1538](https://github.com/iTwin/presentation/pull/1538): Fixed keyboard-initiated node rename instantly closing the label editor. Additionally, improved tree node rendering performance by rendering a single shared context menu and label editor at the tree level instead of mounting them in every node.
22
+ - Updated dependencies:
23
+ - @itwin/presentation-shared@2.0.0-alpha.13
24
+ - @itwin/presentation-hierarchies@2.0.0-alpha.18
25
+ - @itwin/unified-selection@2.0.0-alpha.1
26
+
3
27
  ## 2.0.0-alpha.65
4
28
 
5
29
  ### Patch Changes
@@ -1003,6 +1027,36 @@
1003
1027
 
1004
1028
  - [#847](https://github.com/iTwin/presentation/pull/847): Moving tree rendering components to a new design systems.
1005
1029
 
1030
+ ## 1.11.6
1031
+
1032
+ ### Patch Changes
1033
+
1034
+ - [#1543](https://github.com/iTwin/presentation/pull/1543): Update iTwin.js core dependencies to `^5.13.1` and refresh related tooling/test dependencies.
1035
+ - Updated dependencies:
1036
+ - @itwin/presentation-hierarchies@1.7.21
1037
+ - @itwin/presentation-shared@1.2.22
1038
+ - @itwin/unified-selection@1.8.6
1039
+
1040
+ ## 1.11.5
1041
+
1042
+ ### Patch Changes
1043
+
1044
+ - [#1500](https://github.com/iTwin/presentation/pull/1500): Update iTwin.js core dependencies to ^5.12.4 and refresh related tooling/test dependencies.
1045
+ - Updated dependencies:
1046
+ - @itwin/presentation-hierarchies@1.7.20
1047
+ - @itwin/presentation-shared@1.2.20
1048
+ - @itwin/unified-selection@1.8.5
1049
+
1050
+ ## 1.11.4
1051
+
1052
+ ### Patch Changes
1053
+
1054
+ - [#1473](https://github.com/iTwin/presentation/pull/1473): Bump dependencies.
1055
+ - Updated dependencies:
1056
+ - @itwin/presentation-hierarchies@1.7.19
1057
+ - @itwin/presentation-shared@1.2.19
1058
+ - @itwin/unified-selection@1.8.4
1059
+
1006
1060
  ## 1.11.3
1007
1061
 
1008
1062
  ### Patch Changes
package/README.md CHANGED
@@ -65,17 +65,14 @@ The hook takes 2 required properties:
65
65
 
66
66
  ```tsx
67
67
  import { IModelConnection } from "@itwin/core-frontend";
68
- import { createCachingECClassHierarchyInspector } from "@itwin/presentation-shared";
69
68
  import { createECSchemaProvider, createECSqlQueryExecutor, createIModelKey } from "@itwin/presentation-core-interop";
70
69
  import { createLimitingECSqlQueryExecutor } from "@itwin/presentation-hierarchies";
71
70
 
72
71
  function createIModelAccess(imodel: IModelConnection) {
73
- const schemaProvider = createECSchemaProvider(imodel.schemaContext);
72
+ const schemaProvider = createECSchemaProvider(imodel);
74
73
  return {
75
74
  imodelKey: createIModelKey(imodel),
76
75
  ...schemaProvider,
77
- // while caching for hierarchy inspector is not mandatory, it's recommended to use it to improve performance
78
- ...createCachingECClassHierarchyInspector({ schemaProvider, cacheSize: 100 }),
79
76
  // the second argument is the maximum number of rows the executor will return - this allows us to
80
77
  // avoid creating hierarchy levels of insane size (expensive to us and useless to users)
81
78
  ...createLimitingECSqlQueryExecutor(createECSqlQueryExecutor(imodel), 1000),
@@ -109,7 +106,6 @@ The component renders a virtualized tree using the `Tree` component from `@strat
109
106
 
110
107
  ```tsx
111
108
  import { IModelConnection } from "@itwin/core-frontend";
112
- import { createCachingECClassHierarchyInspector } from "@itwin/presentation-shared";
113
109
  import { createECSchemaProvider, createECSqlQueryExecutor, createIModelKey } from "@itwin/presentation-core-interop";
114
110
  import { createLimitingECSqlQueryExecutor } from "@itwin/presentation-hierarchies";
115
111
 
@@ -121,12 +117,10 @@ import { useIModelUnifiedSelectionTree } from "@itwin/presentation-hierarchies-r
121
117
  import { StrataKitRootErrorRenderer, StrataKitTreeRenderer } from "@itwin/presentation-hierarchies-react/stratakit";
122
118
 
123
119
  function createIModelAccess(imodel: IModelConnection) {
124
- const schemaProvider = createECSchemaProvider(imodel.schemaContext);
120
+ const schemaProvider = createECSchemaProvider(imodel);
125
121
  return {
126
122
  imodelKey: createIModelKey(imodel),
127
123
  ...schemaProvider,
128
- // while caching for hierarchy inspector is not mandatory, it's recommended to use it to improve performance
129
- ...createCachingECClassHierarchyInspector({ schemaProvider, cacheSize: 100 }),
130
124
  // the second argument is the maximum number of rows the executor will return - this allows us to
131
125
  // avoid creating hierarchy levels of insane size (expensive to us and useless to users)
132
126
  ...createLimitingECSqlQueryExecutor(createECSqlQueryExecutor(imodel), 1000),
@@ -1 +1 @@
1
- {"version":3,"file":"UseIModelTree.js","names":["useCallback","createIModelHierarchyProvider","useTranslation","useTree","useUnifiedSelectionTree","HierarchyDefinition","HierarchySearchTree","Props","UseUnifiedTreeSelectionProps","UseTreeProps","UseTreeResult","IModelHierarchyProviderProps","IModelAccess","UseIModelTreeProps","Omit","Pick","getHierarchyDefinition","props","imodelAccess","getSearchPaths","abortSignal","AbortSignal","Promise","useIModelTree","$","_c","imodelChanged","rest","t0","t1","useIModelTreeProps","t2","useIModelUnifiedSelectionTree","translate","hierarchyDefinition","localizedStrings","other","unspecified","t3","t4","getHierarchyProvider"],"sources":["../../src/presentation-hierarchies-react/UseIModelTree.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 } from \"react\";\nimport { createIModelHierarchyProvider } from \"@itwin/presentation-hierarchies\";\nimport { useTranslation } from \"./LocalizationContext.js\";\nimport { useTree, useUnifiedSelectionTree } from \"./UseTree.js\";\n\nimport type { HierarchyDefinition, HierarchySearchTree } from \"@itwin/presentation-hierarchies\";\nimport type { Props } from \"@itwin/presentation-shared\";\nimport type { UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport type { UseTreeProps, UseTreeResult } from \"./UseTree.js\";\n\n/** @public */\ntype IModelHierarchyProviderProps = Props<typeof createIModelHierarchyProvider>;\n\n/** @public */\ntype IModelAccess = IModelHierarchyProviderProps[\"imodelAccess\"];\n\n/**\n * Props for `useIModelTree` and `useIModelUnifiedSelectionTree` hooks.\n * @public\n */\ntype UseIModelTreeProps = Omit<UseTreeProps, \"getHierarchyProvider\" | \"getSearchPaths\"> &\n Pick<IModelHierarchyProviderProps, \"imodelAccess\" | \"imodelChanged\"> & {\n /**\n * Provides the hierarchy definition for the tree.\n */\n getHierarchyDefinition: (props: { imodelAccess: IModelAccess }) => HierarchyDefinition;\n\n /**\n * Provides paths to target nodes.\n */\n getSearchPaths?: (props: {\n /**\n * Object that provides access to the iModel schema and can run queries against the iModel.\n */\n imodelAccess: IModelAccess;\n /**\n * Signal indicating that that the request was canceled\n */\n abortSignal: AbortSignal;\n }) => Promise<HierarchySearchTree[] | undefined>;\n };\n\n/**\n * A React hook that creates state for a tree component whose displayed hierarchy is based on\n * iModel data.\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 * @public\n */\nexport function useIModelTree(props: UseIModelTreeProps): UseTreeResult {\n const { imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths, ...rest } = props;\n return useTree({\n ...rest,\n ...useIModelTreeProps({ imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths }),\n });\n}\n\n/**\n * A React hook that creates state for a tree component whose displayed hierarchy is based on\n * iModel data and that is integrated with unified selection through the given selection\n * storage (previously the storage was provided through the, now 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 `useIModelTree`\n * @see `useUnifiedSelectionTree`\n * @see `UnifiedSelectionProvider`\n * @public\n */\nexport function useIModelUnifiedSelectionTree(props: UseIModelTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult {\n const { imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths, ...rest } = props;\n return useUnifiedSelectionTree({\n ...rest,\n ...useIModelTreeProps({ imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths }),\n });\n}\n\nfunction useIModelTreeProps(\n props: Pick<UseIModelTreeProps, \"imodelAccess\" | \"imodelChanged\" | \"getHierarchyDefinition\" | \"getSearchPaths\">,\n): Pick<UseTreeProps, \"getHierarchyProvider\" | \"getSearchPaths\"> {\n const { imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths } = props;\n const translate = useTranslation();\n return {\n getHierarchyProvider: useCallback(\n () =>\n createIModelHierarchyProvider({\n imodelAccess,\n imodelChanged,\n hierarchyDefinition: getHierarchyDefinition({ imodelAccess }),\n localizedStrings: { other: translate(\"other\"), unspecified: translate(\"unspecified\") },\n }),\n [imodelAccess, imodelChanged, translate, getHierarchyDefinition],\n ),\n getSearchPaths: useCallback(\n async ({ abortSignal }: { abortSignal: AbortSignal }) => getSearchPaths?.({ imodelAccess, abortSignal }),\n [imodelAccess, getSearchPaths],\n ),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"UseIModelTree.js","names":["useCallback","createIModelHierarchyProvider","useTranslation","useTree","useUnifiedSelectionTree","HierarchyDefinition","HierarchySearchTree","Props","UseUnifiedTreeSelectionProps","UseTreeProps","UseTreeResult","IModelHierarchyProviderProps","IModelAccess","UseIModelTreeProps","Omit","Pick","getHierarchyDefinition","props","imodelAccess","getSearchPaths","abortSignal","AbortSignal","Promise","useIModelTree","$","_c","imodelChanged","rest","t0","t1","useIModelTreeProps","t2","useIModelUnifiedSelectionTree","translate","hierarchyDefinition","localizedStrings","other","unspecified","t3","t4","getHierarchyProvider"],"sources":["../../src/presentation-hierarchies-react/UseIModelTree.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 } from \"react\";\nimport { createIModelHierarchyProvider } from \"@itwin/presentation-hierarchies\";\nimport { useTranslation } from \"./LocalizationContext.js\";\nimport { useTree, useUnifiedSelectionTree } from \"./UseTree.js\";\n\nimport type { HierarchyDefinition, HierarchySearchTree } from \"@itwin/presentation-hierarchies\";\nimport type { Props } from \"@itwin/presentation-shared\";\nimport type { UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport type { UseTreeProps, UseTreeResult } from \"./UseTree.js\";\n\n/** @public */\ntype IModelHierarchyProviderProps = Props<typeof createIModelHierarchyProvider>;\n\n/** @public */\ntype IModelAccess = IModelHierarchyProviderProps[\"imodelAccess\"];\n\n/**\n * Props for `useIModelTree` and `useIModelUnifiedSelectionTree` hooks.\n * @public\n */\ntype UseIModelTreeProps = Omit<UseTreeProps, \"getHierarchyProvider\" | \"getSearchPaths\"> &\n Pick<IModelHierarchyProviderProps, \"imodelAccess\" | \"imodelChanged\"> & {\n /**\n * Provides the hierarchy definition for the tree.\n */\n getHierarchyDefinition: (props: { imodelAccess: IModelAccess }) => HierarchyDefinition;\n\n /**\n * Provides paths to target nodes.\n */\n getSearchPaths?: (props: {\n /**\n * Object that provides access to the iModel schema and can run queries against the iModel.\n */\n imodelAccess: IModelAccess;\n /**\n * Signal indicating that that the request was canceled\n */\n abortSignal: AbortSignal;\n }) => Promise<HierarchySearchTree[] | undefined>;\n };\n\n/**\n * A React hook that creates state for a tree component whose displayed hierarchy is based on\n * iModel data.\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 * @public\n */\nexport function useIModelTree(props: UseIModelTreeProps): UseTreeResult {\n const { imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths, ...rest } = props;\n return useTree({\n ...rest,\n ...useIModelTreeProps({ imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths }),\n });\n}\n\n/**\n * A React hook that creates state for a tree component whose displayed hierarchy is based on\n * iModel data and that is integrated with unified selection through the given selection\n * storage (previously the storage was provided through the, now 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 `useIModelTree`\n * @see `useUnifiedSelectionTree`\n * @see `UnifiedSelectionProvider`\n * @public\n */\nexport function useIModelUnifiedSelectionTree(props: UseIModelTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult {\n const { imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths, ...rest } = props;\n return useUnifiedSelectionTree({\n ...rest,\n ...useIModelTreeProps({ imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths }),\n });\n}\n\nfunction useIModelTreeProps(\n props: Pick<UseIModelTreeProps, \"imodelAccess\" | \"imodelChanged\" | \"getHierarchyDefinition\" | \"getSearchPaths\">,\n): Pick<UseTreeProps, \"getHierarchyProvider\" | \"getSearchPaths\"> {\n const { imodelAccess, imodelChanged, getHierarchyDefinition, getSearchPaths } = props;\n const translate = useTranslation();\n return {\n getHierarchyProvider: useCallback(\n () =>\n createIModelHierarchyProvider({\n imodelAccess,\n imodelChanged,\n hierarchyDefinition: getHierarchyDefinition({ imodelAccess }),\n localizedStrings: { other: translate(\"other\"), unspecified: translate(\"unspecified\") },\n }),\n [imodelAccess, imodelChanged, translate, getHierarchyDefinition],\n ),\n getSearchPaths: useCallback(\n async ({ abortSignal }: { abortSignal: AbortSignal }) => getSearchPaths?.({ imodelAccess, abortSignal }),\n [imodelAccess, getSearchPaths],\n ),\n };\n}\n"],"mappings":"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"}
@@ -1 +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 // eslint-disable-next-line react-hooks/refs\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 | undefined>(undefined);\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 // eslint-disable-next-line react-hooks/set-state-in-effect\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 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":";;;;;;;;;;;;;;;;;;;;;AAiCA,SAAOuB,QAAAC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACoC,MAAAC,KAAAC,gBAAgBJ,KAAK;CAAC,IAAAK;CAAA,IAAAJ,EAAA,OAAAE,IAAA;EAA/D,MAAA,EAAAG,kBAAAC,GAAA,GAAAC,OAAyCL;EAAzCE,OAAAG;EAAgEP,EAAA,KAAAE;EAAAF,EAAA,KAAAI;CAAA,OAAAA,OAAAJ,EAAA;CAAA,OACzDI;AAAI;;;;;;;;;;;;;;;;AAkBb,SAAOI,wBAAAN,IAAA;CAAA,MAAAF,IAAAC,EAAA,EAAA;CAAA,IAAAQ;CAAA,IAAAV;CAAA,IAAAW;CAAA,IAAAC;CAAA,IAAAX,EAAA,OAAAE,IAAA;EAAiC,CAAA,CAAAS,YAAAD,kBAAAD,mCAAAV,SAAAG;EAKMF,EAAA,KAAAE;EAAAF,EAAA,KAAAS;EAAAT,EAAA,KAAAD;EAAAC,EAAA,KAAAU;EAAAV,EAAA,KAAAW;CAAA,OAAA;EAAAF,iCAAAT,EAAA;EAAAD,QAAAC,EAAA;EAAAU,mBAAAV,EAAA;EAAAW,aAAAX,EAAA;CAAA;CACN,MAAAO,KAAAJ,gBAAgBJ,KAAK;CAAC,IAAAM;CAAA,IAAAD;CAAA,IAAAJ,EAAA,OAAAO,IAAA;EAA5D,CAAA,CAAAF,qBAAAD,QAAsCG;EAAuBP,EAAA,KAAAO;EAAAP,EAAA,KAAAK;EAAAL,EAAA,KAAAI;CAAA,OAAA;EAAAC,mBAAAL,EAAA;EAAAI,OAAAJ,EAAA;CAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAAS,kCAAAT,EAAA,OAAAK,oBAAAL,EAAA,QAAAU,oBAAAV,EAAA,QAAAW,YAAA;EACdC,KAAA;GAAAD;GAAAD;GAAAL;GAAAI;EAK/C;EAACT,EAAA,KAAAS;EAAAT,EAAA,KAAAK;EAAAL,EAAA,MAAAU;EAAAV,EAAA,MAAAW;EAAAX,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CALD,MAAAa,iBAAuB9B,wBAAwB6B,EAK9C;CACD,IAAIR,KAAIU,2BAA4BC,KAAAA,KAAaX,KAAIY,mBAA6BC,WAAA;EAAA,IAAAC;EAAA,IAAAlB,EAAA,QAAAI,KAAAY,qBAAAhB,EAAA,QAAAa,gBAAA;GAC3CK,KAAA;IAAA,GAAKd,KAAIY;IAAkB,GAAKH;GAAe;GAACb,EAAA,MAAAI,KAAAY;GAAAhB,EAAA,MAAAa;GAAAb,EAAA,MAAAkB;EAAA,OAAAA,KAAAlB,EAAA;EAAA,IAAAmB;EAAA,IAAAnB,EAAA,QAAAI,QAAAJ,EAAA,QAAAkB,IAAA;GAA9EC,KAAA;IAAA,GAAKf;IAAIY,mBAAqBE;GAAiD;GAAClB,EAAA,MAAAI;GAAAJ,EAAA,MAAAkB;GAAAlB,EAAA,MAAAmB;EAAA,OAAAA,KAAAnB,EAAA;EAAA,OAAhFmB;CAAgF;CACxF,OACMf;AAAI;AA0Eb,SAASD,gBAAgB,EACvBkB,sBACAC,gBACAI,uBACAG,0BACAI,sBACAG,qBAGA;CACA,MAAM,CAACY,OAAOC,YAAYtE,SAAoB;EAC5CmE,OAAO;GAAEI,0BAAU,IAAIC,IAAI;GAAGC,gCAAgB,IAAID,IAAI;GAAGE,UAAU;IAAEC,IAAIvC,KAAAA;IAAWwC,UAAUxC,KAAAA;GAAU;EAAE;EAC1GE,WAAWF,KAAAA;CACb,CAAC;CACD,MAAMyC,2BAA2BvE,UAAUyC,qBAAqB;CAChE,MAAM+B,8BAA8BxE,UAAU4C,wBAAwB;CACtE,MAAM6B,0BAA0BzE,UAAUgD,oBAAoB;CAC9D,MAAM0B,uBAAuB1E,UAAUmD,iBAAiB;CAExD,MAAM,CAACwB,WAAWjF,eAGd,IAAIE,aACDiE,UAAU;EACT,MAAM7B,YACJ6B,MAAMM,eAAeS,IAAI9C,KAAAA,CAAS,MAAMA,KAAAA,IACpC+C,sBAAsB/C,KAAAA,GAAW+B,OAAOa,qBAAqBI,OAAO,IACpEhD,KAAAA;EACNkC,SAAS;GAAEH;GAAO7B;EAAU,CAAC;CAC/B,IACC+C,YAAYpC,aAAa4B,yBAAyBO,UAAUC,YAAYpC,QAAQ,IAChF7B,UAAU0D,4BAA4BM,UAAUhE,KAAK,IACrDA,YAAU2D,wBAAwBK,UAAUhE,OAAK,CACpD,CACJ;CACA,MAAMkE,mBAAmBvF,OAA6CqC,KAAAA,CAAS;CAE/E,MAAM,CAACmD,mBAAmBC,wBAAwBxF,SAAwC;CAC1FH,gBAAgB;EACd,MAAM4F,WAAW/C,qBAAqB;EACtC+C,SAAS1B,aAAauB,iBAAiBF,OAAO;EAC9C,MAAMM,iCAAiCD,SAASE,iBAAiBC,aAAaC,wBAAwB;GACpG,MAAMC,qBAAqBD,oBAAoBE,cAAcC,cAAc5D,KAAAA;GAC3E6C,QAAQgB,WAAW,EAAE5B,OAAOyB,qBAAqB,YAAY,OAAO,CAAC;EACvE,CAAC;EACDb,QAAQO,qBAAqBC,QAAQ;EAErCD,qBAAqBC,QAAQ;EAC7B,aAAa;GACXC,+BAA+B;GAC/BT,QAAQiB,MAAM;GACd7F,YAAYoF,QAAQ;EACtB;CACF,GAAG,CAACR,SAASvC,oBAAoB,CAAC;CAElC,MAAM,CAACyD,aAAaC,kBAAkBpG,SAAS,KAAK;CACpDH,gBAAgB;EACd,IAAIwG,WAAW;EACf,MAAMC,aAAa,IAAIC,gBAAgB;EACvC,CAAM,YAAY;GAChB,IAAI,CAAChB,mBACH;GAGF,IAAI,CAAC5C,gBAAgB;IACnB4C,kBAAkBiB,mBAAmBpE,KAAAA,CAAS;IAE9C6C,QAAQgB,WAAW,EAAE5B,OAAO,OAAO,CAAC;IACpC+B,eAAe,KAAK;IACpB;GACF;GAEAA,eAAe,IAAI;GACnB,IAAIK;GACJ,IAAI;IACFA,QAAQ,MAAM9D,eAAe,EAAEC,aAAa0D,WAAWI,OAAO,CAAC;GACjE,QAAQ,CACR,UAAU;IACR,IAAI,CAACL,UAAU;KACbd,kBAAkBiB,mBAAmBC,QAAQ,EAAEA,MAAM,IAAIrE,KAAAA,CAAS;KAClEgE,eAAe,KAAK;IACtB;GACF;EACF,EAAA,CAAG;EACH,aAAa;GACXE,WAAWK,MAAM;GACjBN,WAAW;EACb;CACF,GAAG;EAACd;EAAmB5C;EAAgBsC;CAAO,CAAC;CAE/C,MAAMvD,mBAAmB9B,aACtBkE,WAAmB;EAClB,OAAOmB,QAAQpB,QAAQC,MAAM;CAC/B,GACA,CAACmB,OAAO,CACV;CAEA,MAAMpB,UAAUjE,aACbkE,aAAyC;EACxC,MAAMJ,OAAOuB,QAAQpB,QAAQC,QAAM;EACnC,IAAI,CAACJ,QAAQA,KAAKiB,OAAOvC,KAAAA,GACvB;EAEF,OAAOwE,eAAelD,MAAMW,MAAMF,OAAOa,qBAAqBI,OAAO;CACvE,GACA;EAACH;EAASD;EAAsBX,MAAMF;CAAK,CAC7C;CAEA,MAAM0C,aAAajH,aAChBkE,UAAgBgD,eAAwB;EACvC7B,QAAQ4B,WAAW/C,UAAQgD,UAAU;CACvC,GACA,CAAC7B,OAAO,CACV;CAEA,MAAMgB,aAAarG,aAChBmH,YAAY;EACX9B,QAAQgB,WAAWc,OAAO;CAC5B,GACA,CAAC9B,OAAO,CACV;CAEA,MAAM+B,cAAcpH,aACjBqH,SAAwBC,eAAoC;EAC3DjC,QAAQ+B,YAAYC,SAASC,UAAU;CACzC,GACA,CAACjC,OAAO,CACV;CAEA,MAAMkC,iBAAiBvH,aACpBkE,aAAmB3D,UAAUgH,eAAe9C,MAAMF,OAAOL,QAAM,GAChE,CAACO,KAAK,CACR;CAEA,MAAMN,eAAenE,aAClBoE,cAAoD;EACnDsB,iBAAiBF,UAAUpB;EAC3B,IAAI,CAACuB,mBACH;EAGFA,kBAAkBxB,aAAaC,SAAS;CAC1C,GACA,CAACuB,iBAAiB,CACpB;CAEA,MAAM6B,2BAA2BxH,aAC9BkE,aAAW;EACV,MAAMJ,SAAOuB,QAAQpB,QAAQC,QAAM;EACnC,IAAI,CAACyB,qBAAqB,CAAC7B,QACzB;EAEF,MAAM2D,gBAAgB3D,OAAKkB;EAC3B,IAAIyC,iBAAiBpH,cAAcqH,eAAeD,aAAa,GAC7D;EAGF,OAAO;GACLA;GACAE,0BAA0BnG,YACxBmE,kBAAkBiC,oBAAoB;IACpCC,YAAYJ;IACZK,gBAAgBtG,SAAOsG;IACvBC,yBAAyBvG,SAAOuG;GAClC,CAAC;GACHD,gBAAgBhE,OAAKgE;GACrBE,oBAAoBxE,WAAW6B,QAAQ2C,kBAAkB9D,UAAQV,MAAM;GACvEyE,WAAWnE,OAAKoE;GAChBC,eAAeC,UAAU/C,QAAQgD,kBAAkBnE,UAAQkE,KAAK;EAClE;CACF,GACA,CAAC/C,SAASM,iBAAiB,CAC7B;CAsBA,OAAO;EACL,GArBiCzF,cAAc;GAC/C,IAAIuE,MAAMF,MAAMO,SAASlB,OACvB,OAAO,EAAErB,wBAAwB;IAAEqB,OAAOa,MAAMF,MAAMO,SAASlB;IAAOyC;IAAYmB;GAAyB,EAAE;GAE/G,OAAO;IACLjF,wBAAwBC,KAAAA;IACxBC,mBAAmBgC,MAAM/B,YACrB;KAAEA,WAAW+B,MAAM/B;KAAWuE;KAAYG;KAAaG;KAAgBlB;KAAYmB;IAAyB,IAC5GhF,KAAAA;GACN;EACF,GAAG;GACDyE;GACAO;GACAD;GACAlB;GACAe;GACA3C,MAAMF,MAAMO,SAASlB;GACrBa,MAAM/B;EAAS,CAIZ4F;EACHtE,aAAa,CAAC,CAACS,MAAMF,MAAMO,SAASyD,aAAahC;EACjDzE;EACAmC;EACAE;CACF;AACF;AAEA,SAASoB,sBACPiD,cACAjE,OACAV,mBAC6B;CAC7B,MAAM4E,kBAAkBlE,MAAMM,eAAeS,IAAIkD,YAAY;CAC7D,IAAI,CAACC,iBACH;CAGF,OAAOA,gBACJC,KAAKC,YAAYpE,MAAMI,SAASW,IAAIqD,OAAO,CAAC,CAAC,CAC7CnF,QAAQM,SAAyC,CAAC,CAACA,IAAI,CAAC,CACxD4E,KAAe5E,SAAS;EACvB,OAAOkD,eAAelD,MAAMS,OAAOV,iBAAiB;CACtD,CAAC;AACL;AAEA,SAASmD,eACP4B,WACArE,OACAV,mBACU;CACV,MAAMgF,YAAY,CAEhB,GAAID,UAAUhF,QAAQ,CAACgF,UAAUhF,KAAK,IAAI,CAAA,GAE1C,GAAIC,oBAAoB+E,UAAU5D,QAAQ,KAAK,CAAA,CAAG;CAGpD,IAAI8D;CACJ,OAAO;EACL/D,IAAI6D,UAAU7D;EACdgE,OAAOH,UAAUG;EACjB/D,UAAU4D,UAAU5D;EACpBuD,WAAW,CAAC,CAACK,UAAUL;EACvBrB,YAAY,CAAC,CAAC0B,UAAU1B;EACxB8B,cACE,CAAC3I,cAAcqH,eAAekB,UAAU5D,QAAQ,KAAK,CAAC,CAAC4D,UAAU5D,SAASiE,qBAAqBL,UAAUE;EAC3GI,YAAY,CAAC,CAACN,UAAUd;EACxBqB,QAAQN;EACR,IAAIC,WAAW;GACb,IAAI,CAACA,UACHA,WAAWvD,sBAAsBqD,UAAU7D,IAAIR,OAAOV,iBAAiB;GAEzE,OAAOiF,WAAWA,WAAWF,UAAUE,aAAa,OAAO,OAAO,CAAA;EACpE;CACF;AACF"}
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 // eslint-disable-next-line react-hooks/refs\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 | undefined>(undefined);\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 // eslint-disable-next-line react-hooks/set-state-in-effect\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 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":";;;;;;;;;;;;;;;;;;;;;AAiCA,SAAOuB,QAAAC,OAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACoC,MAAAC,KAAAC,gBAAgBJ,KAAK;CAAC,IAAAK;CAAA,IAAAJ,EAAA,OAAAE,IAAA;EAA/D,MAAA,EAAAG,kBAAAC,GAAA,GAAAC,OAAyCL;EAAzCE,OAAAG;EAAgEP,EAAA,KAAAE;EAAAF,EAAA,KAAAI;CAAA,OAAAA,OAAAJ,EAAA;CAAA,OACzDI;AAAI;;;;;;;;;;;;;;;;AAkBb,SAAOI,wBAAAN,IAAA;CAAA,MAAAF,IAAAC,EAAA,EAAA;CAAA,IAAAQ;CAAA,IAAAV;CAAA,IAAAW;CAAA,IAAAC;CAAA,IAAAX,EAAA,OAAAE,IAAA;EAAiC,CAAA,CAAAS,YAAAD,kBAAAD,gCAAA,GAAAV,SAAAG;EAKMF,EAAA,KAAAE;EAAAF,EAAA,KAAAS;EAAAT,EAAA,KAAAD;EAAAC,EAAA,KAAAU;EAAAV,EAAA,KAAAW;CAAA,OAAA;EAAAF,iCAAAT,EAAA;EAAAD,QAAAC,EAAA;EAAAU,mBAAAV,EAAA;EAAAW,aAAAX,EAAA;CAAA;CACN,MAAAO,KAAAJ,gBAAgBJ,KAAK;CAAC,IAAAM;CAAA,IAAAD;CAAA,IAAAJ,EAAA,OAAAO,IAAA;EAA5D,CAAA,CAAAF,kBAAA,GAAAD,QAAsCG;EAAuBP,EAAA,KAAAO;EAAAP,EAAA,KAAAK;EAAAL,EAAA,KAAAI;CAAA,OAAA;EAAAC,mBAAAL,EAAA;EAAAI,OAAAJ,EAAA;CAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAAS,kCAAAT,EAAA,OAAAK,oBAAAL,EAAA,QAAAU,oBAAAV,EAAA,QAAAW,YAAA;EACdC,KAAA;GAAAD;GAAAD;GAAAL;GAAAI;EAK/C;EAACT,EAAA,KAAAS;EAAAT,EAAA,KAAAK;EAAAL,EAAA,MAAAU;EAAAV,EAAA,MAAAW;EAAAX,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CALD,MAAAa,iBAAuB9B,wBAAwB6B,EAK9C;CACD,IAAIR,KAAIU,2BAA4BC,KAAAA,KAAaX,KAAIY,mBAA6BC,WAAA;EAAA,IAAAC;EAAA,IAAAlB,EAAA,QAAAI,KAAAY,qBAAAhB,EAAA,QAAAa,gBAAA;GAC3CK,KAAA;IAAA,GAAKd,KAAIY;IAAkB,GAAKH;GAAe;GAACb,EAAA,MAAAI,KAAAY;GAAAhB,EAAA,MAAAa;GAAAb,EAAA,MAAAkB;EAAA,OAAAA,KAAAlB,EAAA;EAAA,IAAAmB;EAAA,IAAAnB,EAAA,QAAAI,QAAAJ,EAAA,QAAAkB,IAAA;GAA9EC,KAAA;IAAA,GAAKf;IAAIY,mBAAqBE;GAAiD;GAAClB,EAAA,MAAAI;GAAAJ,EAAA,MAAAkB;GAAAlB,EAAA,MAAAmB;EAAA,OAAAA,KAAAnB,EAAA;EAAA,OAAhFmB;CAAgF;CACxF,OACMf;AAAI;AA0Eb,SAASD,gBAAgB,EACvBkB,sBACAC,gBACAI,uBACAG,0BACAI,sBACAG,qBAGA;CACA,MAAM,CAACY,OAAOC,YAAYtE,SAAoB;EAC5CmE,OAAO;GAAEI,0BAAU,IAAIC,IAAI;GAAGC,gCAAgB,IAAID,IAAI;GAAGE,UAAU;IAAEC,IAAIvC,KAAAA;IAAWwC,UAAUxC,KAAAA;GAAU;EAAE;EAC1GE,WAAWF,KAAAA;CACb,CAAC;CACD,MAAMyC,2BAA2BvE,UAAUyC,qBAAqB;CAChE,MAAM+B,8BAA8BxE,UAAU4C,wBAAwB;CACtE,MAAM6B,0BAA0BzE,UAAUgD,oBAAoB;CAC9D,MAAM0B,uBAAuB1E,UAAUmD,iBAAiB;CAExD,MAAM,CAACwB,WAAWjF,eAGd,IAAIE,aACDiE,UAAU;EACT,MAAM7B,YACJ6B,MAAMM,eAAeS,IAAI9C,KAAAA,CAAS,MAAMA,KAAAA,IACpC+C,sBAAsB/C,KAAAA,GAAW+B,OAAOa,qBAAqBI,OAAO,IACpEhD,KAAAA;EACNkC,SAAS;GAAEH;GAAO7B;EAAU,CAAC;CAC/B,IACC+C,YAAYpC,aAAa4B,yBAAyBO,UAAUC,YAAYpC,QAAQ,IAChF7B,UAAU0D,4BAA4BM,UAAUhE,KAAK,IACrDA,YAAU2D,wBAAwBK,UAAUhE,OAAK,CACpD,CACJ;CACA,MAAMkE,mBAAmBvF,OAA6CqC,KAAAA,CAAS;CAE/E,MAAM,CAACmD,mBAAmBC,wBAAwBxF,SAAwC;CAC1FH,gBAAgB;EACd,MAAM4F,WAAW/C,qBAAqB;EACtC+C,SAAS1B,aAAauB,iBAAiBF,OAAO;EAC9C,MAAMM,iCAAiCD,SAASE,iBAAiBC,aAAaC,wBAAwB;GACpG,MAAMC,qBAAqBD,oBAAoBE,cAAcC,cAAc5D,KAAAA;GAC3E6C,QAAQgB,WAAW,EAAE5B,OAAOyB,qBAAqB,YAAY,OAAO,CAAC;EACvE,CAAC;EACDb,QAAQO,qBAAqBC,QAAQ;EAErCD,qBAAqBC,QAAQ;EAC7B,aAAa;GACXC,+BAA+B;GAC/BT,QAAQiB,MAAM;GACd7F,YAAYoF,QAAQ;EACtB;CACF,GAAG,CAACR,SAASvC,oBAAoB,CAAC;CAElC,MAAM,CAACyD,aAAaC,kBAAkBpG,SAAS,KAAK;CACpDH,gBAAgB;EACd,IAAIwG,WAAW;EACf,MAAMC,aAAa,IAAIC,gBAAgB;EACvC,CAAM,YAAY;GAChB,IAAI,CAAChB,mBACH;GAGF,IAAI,CAAC5C,gBAAgB;IACnB4C,kBAAkBiB,mBAAmBpE,KAAAA,CAAS;IAE9C6C,QAAQgB,WAAW,EAAE5B,OAAO,OAAO,CAAC;IACpC+B,eAAe,KAAK;IACpB;GACF;GAEAA,eAAe,IAAI;GACnB,IAAIK;GACJ,IAAI;IACFA,QAAQ,MAAM9D,eAAe,EAAEC,aAAa0D,WAAWI,OAAO,CAAC;GACjE,QAAQ,CACR,UAAU;IACR,IAAI,CAACL,UAAU;KACbd,kBAAkBiB,mBAAmBC,QAAQ,EAAEA,MAAM,IAAIrE,KAAAA,CAAS;KAClEgE,eAAe,KAAK;IACtB;GACF;EACF,EAAA,CAAG;EACH,aAAa;GACXE,WAAWK,MAAM;GACjBN,WAAW;EACb;CACF,GAAG;EAACd;EAAmB5C;EAAgBsC;CAAO,CAAC;CAE/C,MAAMvD,mBAAmB9B,aACtBkE,WAAmB;EAClB,OAAOmB,QAAQpB,QAAQC,MAAM;CAC/B,GACA,CAACmB,OAAO,CACV;CAEA,MAAMpB,UAAUjE,aACbkE,aAAyC;EACxC,MAAMJ,OAAOuB,QAAQpB,QAAQC,QAAM;EACnC,IAAI,CAACJ,QAAQA,KAAKiB,OAAOvC,KAAAA,GACvB;EAEF,OAAOwE,eAAelD,MAAMW,MAAMF,OAAOa,qBAAqBI,OAAO;CACvE,GACA;EAACH;EAASD;EAAsBX,MAAMF;CAAK,CAC7C;CAEA,MAAM0C,aAAajH,aAChBkE,UAAgBgD,eAAwB;EACvC7B,QAAQ4B,WAAW/C,UAAQgD,UAAU;CACvC,GACA,CAAC7B,OAAO,CACV;CAEA,MAAMgB,aAAarG,aAChBmH,YAAY;EACX9B,QAAQgB,WAAWc,OAAO;CAC5B,GACA,CAAC9B,OAAO,CACV;CAEA,MAAM+B,cAAcpH,aACjBqH,SAAwBC,eAAoC;EAC3DjC,QAAQ+B,YAAYC,SAASC,UAAU;CACzC,GACA,CAACjC,OAAO,CACV;CAEA,MAAMkC,iBAAiBvH,aACpBkE,aAAmB3D,UAAUgH,eAAe9C,MAAMF,OAAOL,QAAM,GAChE,CAACO,KAAK,CACR;CAEA,MAAMN,eAAenE,aAClBoE,cAAoD;EACnDsB,iBAAiBF,UAAUpB;EAC3B,IAAI,CAACuB,mBACH;EAGFA,kBAAkBxB,aAAaC,SAAS;CAC1C,GACA,CAACuB,iBAAiB,CACpB;CAEA,MAAM6B,2BAA2BxH,aAC9BkE,aAAW;EACV,MAAMJ,SAAOuB,QAAQpB,QAAQC,QAAM;EACnC,IAAI,CAACyB,qBAAqB,CAAC7B,QACzB;EAEF,MAAM2D,gBAAgB3D,OAAKkB;EAC3B,IAAIyC,iBAAiBpH,cAAcqH,eAAeD,aAAa,GAC7D;EAGF,OAAO;GACLA;GACAE,0BAA0BnG,YACxBmE,kBAAkBiC,oBAAoB;IACpCC,YAAYJ;IACZK,gBAAgBtG,SAAOsG;IACvBC,yBAAyBvG,SAAOuG;GAClC,CAAC;GACHD,gBAAgBhE,OAAKgE;GACrBE,oBAAoBxE,WAAW6B,QAAQ2C,kBAAkB9D,UAAQV,MAAM;GACvEyE,WAAWnE,OAAKoE;GAChBC,eAAeC,UAAU/C,QAAQgD,kBAAkBnE,UAAQkE,KAAK;EAClE;CACF,GACA,CAAC/C,SAASM,iBAAiB,CAC7B;CAsBA,OAAO;EACL,GArBiCzF,cAAc;GAC/C,IAAIuE,MAAMF,MAAMO,SAASlB,OACvB,OAAO,EAAErB,wBAAwB;IAAEqB,OAAOa,MAAMF,MAAMO,SAASlB;IAAOyC;IAAYmB;GAAyB,EAAE;GAE/G,OAAO;IACLjF,wBAAwBC,KAAAA;IACxBC,mBAAmBgC,MAAM/B,YACrB;KAAEA,WAAW+B,MAAM/B;KAAWuE;KAAYG;KAAaG;KAAgBlB;KAAYmB;IAAyB,IAC5GhF,KAAAA;GACN;EACF,GAAG;GACDyE;GACAO;GACAD;GACAlB;GACAe;GACA3C,MAAMF,MAAMO,SAASlB;GACrBa,MAAM/B;EAAS,CAIZ4F;EACHtE,aAAa,CAAC,CAACS,MAAMF,MAAMO,SAASyD,aAAahC;EACjDzE;EACAmC;EACAE;CACF;AACF;AAEA,SAASoB,sBACPiD,cACAjE,OACAV,mBAC6B;CAC7B,MAAM4E,kBAAkBlE,MAAMM,eAAeS,IAAIkD,YAAY;CAC7D,IAAI,CAACC,iBACH;CAGF,OAAOA,gBACJC,KAAKC,YAAYpE,MAAMI,SAASW,IAAIqD,OAAO,CAAC,CAAC,CAC7CnF,QAAQM,SAAyC,CAAC,CAACA,IAAI,CAAC,CACxD4E,KAAe5E,SAAS;EACvB,OAAOkD,eAAelD,MAAMS,OAAOV,iBAAiB;CACtD,CAAC;AACL;AAEA,SAASmD,eACP4B,WACArE,OACAV,mBACU;CACV,MAAMgF,YAAY,CAEhB,GAAID,UAAUhF,QAAQ,CAACgF,UAAUhF,KAAK,IAAI,CAAA,GAE1C,GAAIC,oBAAoB+E,UAAU5D,QAAQ,KAAK,CAAA,CAAG;CAGpD,IAAI8D;CACJ,OAAO;EACL/D,IAAI6D,UAAU7D;EACdgE,OAAOH,UAAUG;EACjB/D,UAAU4D,UAAU5D;EACpBuD,WAAW,CAAC,CAACK,UAAUL;EACvBrB,YAAY,CAAC,CAAC0B,UAAU1B;EACxB8B,cACE,CAAC3I,cAAcqH,eAAekB,UAAU5D,QAAQ,KAAK,CAAC,CAAC4D,UAAU5D,SAASiE,qBAAqBL,UAAUE;EAC3GI,YAAY,CAAC,CAACN,UAAUd;EACxBqB,QAAQN;EACR,IAAIC,WAAW;GACb,IAAI,CAACA,UACHA,WAAWvD,sBAAsBqD,UAAU7D,IAAIR,OAAOV,iBAAiB;GAEzE,OAAOiF,WAAWA,WAAWF,UAAUE,aAAa,OAAO,OAAO,CAAA;EACpE;CACF;AACF"}
@@ -4,15 +4,15 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
 
6
6
  .phr-node-label-editor {
7
- padding: var(--stratakit-space-x1);
7
+ padding: var(--stratakit-space-100);
8
8
  width: 300px;
9
9
  display: grid;
10
- gap: var(--stratakit-space-x1);
10
+ gap: var(--stratakit-space-100);
11
11
  grid-template-rows: auto auto;
12
12
 
13
13
  .phr-node-label-editor-input-row {
14
14
  display: grid;
15
- gap: var(--stratakit-space-x1);
15
+ gap: var(--stratakit-space-100);
16
16
  grid-template-columns: 1fr auto auto;
17
17
 
18
18
  .with-error {
@@ -0,0 +1,300 @@
1
+ import { useTranslation } from "../LocalizationContext.js";
2
+ import { c } from "react-compiler-runtime";
3
+ import { useEffect, useId, useRef, useState } from "react";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ import { FormHelperText, IconButton, Popover, TextField, Typography } from "@mui/material";
6
+ import { Icon } from "@stratakit/mui";
7
+ import "./LabelEditor.css";
8
+ import checkmarkSvg from "@stratakit/icons/checkmark.svg";
9
+ import dismissSvg from "@stratakit/icons/dismiss.svg";
10
+ //#region src/presentation-hierarchies-react/stratakit/LabelEditor.tsx
11
+ /**
12
+ * Renders the label editor for the node whose rename is in progress. It's rendered once at the tree
13
+ * level as a popover anchored to an invisible element positioned at the renamed node's label location,
14
+ * so it doesn't depend on the virtualized row's DOM element.
15
+ *
16
+ * @internal
17
+ */
18
+ function TreeNodeLabelEditorOverlay(t0) {
19
+ const $ = c(18);
20
+ const { node, renameParameters, onCancel, style } = t0;
21
+ const [anchorEl, setAnchorEl] = useState(null);
22
+ let t1;
23
+ if ($[0] !== style) {
24
+ t1 = /* @__PURE__ */ jsx("div", {
25
+ ref: setAnchorEl,
26
+ style,
27
+ "aria-hidden": true
28
+ });
29
+ $[0] = style;
30
+ $[1] = t1;
31
+ } else t1 = $[1];
32
+ const t2 = anchorEl !== null;
33
+ let t3;
34
+ let t4;
35
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
36
+ t3 = {
37
+ vertical: "top",
38
+ horizontal: "left"
39
+ };
40
+ t4 = {
41
+ vertical: "top",
42
+ horizontal: "left"
43
+ };
44
+ $[2] = t3;
45
+ $[3] = t4;
46
+ } else {
47
+ t3 = $[2];
48
+ t4 = $[3];
49
+ }
50
+ let t5;
51
+ if ($[4] !== node.label || $[5] !== onCancel || $[6] !== renameParameters.commit || $[7] !== renameParameters.labelValidationHint || $[8] !== renameParameters.validate) {
52
+ t5 = /* @__PURE__ */ jsx(LabelEditor, {
53
+ initialLabel: node.label,
54
+ onChange: renameParameters.commit,
55
+ onCancel,
56
+ labelValidationHint: renameParameters.labelValidationHint,
57
+ validate: renameParameters.validate
58
+ });
59
+ $[4] = node.label;
60
+ $[5] = onCancel;
61
+ $[6] = renameParameters.commit;
62
+ $[7] = renameParameters.labelValidationHint;
63
+ $[8] = renameParameters.validate;
64
+ $[9] = t5;
65
+ } else t5 = $[9];
66
+ let t6;
67
+ if ($[10] !== anchorEl || $[11] !== onCancel || $[12] !== t2 || $[13] !== t5) {
68
+ t6 = /* @__PURE__ */ jsx(Popover, {
69
+ open: t2,
70
+ anchorEl,
71
+ onClose: onCancel,
72
+ anchorOrigin: t3,
73
+ transformOrigin: t4,
74
+ disableScrollLock: true,
75
+ children: t5
76
+ });
77
+ $[10] = anchorEl;
78
+ $[11] = onCancel;
79
+ $[12] = t2;
80
+ $[13] = t5;
81
+ $[14] = t6;
82
+ } else t6 = $[14];
83
+ let t7;
84
+ if ($[15] !== t1 || $[16] !== t6) {
85
+ t7 = /* @__PURE__ */ jsxs(Fragment, { children: [t1, t6] });
86
+ $[15] = t1;
87
+ $[16] = t6;
88
+ $[17] = t7;
89
+ } else t7 = $[17];
90
+ return t7;
91
+ }
92
+ /**
93
+ * An editor for changing a tree node's label, rendered in a popover when node rename is initiated.
94
+ *
95
+ * @internal
96
+ */
97
+ function LabelEditor(t0) {
98
+ const $ = c(49);
99
+ const { initialLabel, labelValidationHint, onChange, onCancel, validate } = t0;
100
+ const translate = useTranslation();
101
+ const inputRef = useRef(null);
102
+ const [newLabelValue, setNewLabelValue] = useState(initialLabel);
103
+ const [hasError, setHasError] = useState(false);
104
+ let t1;
105
+ if ($[0] !== initialLabel || $[1] !== newLabelValue || $[2] !== onCancel || $[3] !== onChange || $[4] !== validate) {
106
+ t1 = () => {
107
+ if (validate && !validate(newLabelValue)) {
108
+ setHasError(true);
109
+ return;
110
+ }
111
+ if (initialLabel !== newLabelValue) {
112
+ onChange?.(newLabelValue);
113
+ return;
114
+ }
115
+ onCancel?.();
116
+ };
117
+ $[0] = initialLabel;
118
+ $[1] = newLabelValue;
119
+ $[2] = onCancel;
120
+ $[3] = onChange;
121
+ $[4] = validate;
122
+ $[5] = t1;
123
+ } else t1 = $[5];
124
+ const handleLabelChange = t1;
125
+ let t2;
126
+ if ($[6] !== initialLabel || $[7] !== onCancel) {
127
+ t2 = () => {
128
+ setNewLabelValue(initialLabel);
129
+ onCancel?.();
130
+ };
131
+ $[6] = initialLabel;
132
+ $[7] = onCancel;
133
+ $[8] = t2;
134
+ } else t2 = $[8];
135
+ const cancelLabelChange = t2;
136
+ let t3;
137
+ let t4;
138
+ if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
139
+ t3 = () => {
140
+ if (inputRef.current) {
141
+ inputRef.current.focus();
142
+ inputRef.current.select();
143
+ }
144
+ };
145
+ t4 = [];
146
+ $[9] = t3;
147
+ $[10] = t4;
148
+ } else {
149
+ t3 = $[9];
150
+ t4 = $[10];
151
+ }
152
+ useEffect(t3, t4);
153
+ const canRename = newLabelValue && newLabelValue !== initialLabel && !hasError;
154
+ const inputId = useId();
155
+ let t5;
156
+ if ($[11] !== translate) {
157
+ t5 = translate("newLabel");
158
+ $[11] = translate;
159
+ $[12] = t5;
160
+ } else t5 = $[12];
161
+ let t6;
162
+ if ($[13] !== t5) {
163
+ t6 = { htmlInput: { "aria-label": t5 } };
164
+ $[13] = t5;
165
+ $[14] = t6;
166
+ } else t6 = $[14];
167
+ let t7;
168
+ if ($[15] === Symbol.for("react.memo_cache_sentinel")) {
169
+ t7 = (event) => {
170
+ setNewLabelValue(event.target.value);
171
+ setHasError(false);
172
+ };
173
+ $[15] = t7;
174
+ } else t7 = $[15];
175
+ let t8;
176
+ if ($[16] !== cancelLabelChange || $[17] !== handleLabelChange) {
177
+ t8 = (event_0) => {
178
+ if (event_0.key === "Enter") handleLabelChange();
179
+ else if (event_0.key === "Escape") cancelLabelChange();
180
+ };
181
+ $[16] = cancelLabelChange;
182
+ $[17] = handleLabelChange;
183
+ $[18] = t8;
184
+ } else t8 = $[18];
185
+ let t9;
186
+ if ($[19] !== hasError || $[20] !== inputId || $[21] !== newLabelValue || $[22] !== t6 || $[23] !== t8) {
187
+ t9 = /* @__PURE__ */ jsx(TextField, {
188
+ fullWidth: true,
189
+ error: hasError,
190
+ size: "small",
191
+ id: inputId,
192
+ inputRef,
193
+ slotProps: t6,
194
+ value: newLabelValue,
195
+ onChange: t7,
196
+ onKeyDown: t8
197
+ });
198
+ $[19] = hasError;
199
+ $[20] = inputId;
200
+ $[21] = newLabelValue;
201
+ $[22] = t6;
202
+ $[23] = t8;
203
+ $[24] = t9;
204
+ } else t9 = $[24];
205
+ let t10;
206
+ if ($[25] !== translate) {
207
+ t10 = translate("cancel");
208
+ $[25] = translate;
209
+ $[26] = t10;
210
+ } else t10 = $[26];
211
+ let t11;
212
+ if ($[27] === Symbol.for("react.memo_cache_sentinel")) {
213
+ t11 = /* @__PURE__ */ jsx(Icon, { href: dismissSvg });
214
+ $[27] = t11;
215
+ } else t11 = $[27];
216
+ let t12;
217
+ if ($[28] !== cancelLabelChange || $[29] !== t10) {
218
+ t12 = /* @__PURE__ */ jsx(IconButton, {
219
+ "aria-label": t10,
220
+ onClick: cancelLabelChange,
221
+ size: "small",
222
+ children: t11
223
+ });
224
+ $[28] = cancelLabelChange;
225
+ $[29] = t10;
226
+ $[30] = t12;
227
+ } else t12 = $[30];
228
+ let t13;
229
+ if ($[31] !== translate) {
230
+ t13 = translate("confirm");
231
+ $[31] = translate;
232
+ $[32] = t13;
233
+ } else t13 = $[32];
234
+ const t14 = !canRename;
235
+ let t15;
236
+ if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
237
+ t15 = /* @__PURE__ */ jsx(Icon, { href: checkmarkSvg });
238
+ $[33] = t15;
239
+ } else t15 = $[33];
240
+ let t16;
241
+ if ($[34] !== handleLabelChange || $[35] !== t13 || $[36] !== t14) {
242
+ t16 = /* @__PURE__ */ jsx(IconButton, {
243
+ "aria-label": t13,
244
+ onClick: handleLabelChange,
245
+ disabled: t14,
246
+ size: "small",
247
+ children: t15
248
+ });
249
+ $[34] = handleLabelChange;
250
+ $[35] = t13;
251
+ $[36] = t14;
252
+ $[37] = t16;
253
+ } else t16 = $[37];
254
+ let t17;
255
+ if ($[38] !== t12 || $[39] !== t16 || $[40] !== t9) {
256
+ t17 = /* @__PURE__ */ jsxs("div", {
257
+ className: "phr-node-label-editor-input-row",
258
+ children: [
259
+ t9,
260
+ t12,
261
+ t16
262
+ ]
263
+ });
264
+ $[38] = t12;
265
+ $[39] = t16;
266
+ $[40] = t9;
267
+ $[41] = t17;
268
+ } else t17 = $[41];
269
+ let t18;
270
+ if ($[42] !== hasError || $[43] !== labelValidationHint) {
271
+ t18 = labelValidationHint !== void 0 ? /* @__PURE__ */ jsx(FormHelperText, {
272
+ render: /* @__PURE__ */ jsx("div", {}),
273
+ error: hasError,
274
+ style: { display: "flex" },
275
+ children: /* @__PURE__ */ jsx(Typography, {
276
+ variant: "caption-md",
277
+ children: labelValidationHint
278
+ })
279
+ }) : void 0;
280
+ $[42] = hasError;
281
+ $[43] = labelValidationHint;
282
+ $[44] = t18;
283
+ } else t18 = $[44];
284
+ let t19;
285
+ if ($[45] !== initialLabel || $[46] !== t17 || $[47] !== t18) {
286
+ t19 = /* @__PURE__ */ jsxs("div", {
287
+ className: "phr-node-label-editor",
288
+ children: [t17, t18]
289
+ }, initialLabel);
290
+ $[45] = initialLabel;
291
+ $[46] = t17;
292
+ $[47] = t18;
293
+ $[48] = t19;
294
+ } else t19 = $[48];
295
+ return t19;
296
+ }
297
+ //#endregion
298
+ export { LabelEditor, TreeNodeLabelEditorOverlay };
299
+
300
+ //# sourceMappingURL=LabelEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LabelEditor.js","names":["useEffect","useId","useRef","useState","FormHelperText","IconButton","Popover","TextField","Typography","Icon","useTranslation","checkmarkSvg","dismissSvg","CSSProperties","TreeNode","RenameParameters","TreeNodeLabelEditorOverlay","t0","$","_c","node","renameParameters","onCancel","style","anchorEl","setAnchorEl","t1","t2","t3","t4","Symbol","for","vertical","horizontal","t5","label","commit","labelValidationHint","validate","t6","t7","LabelEditorProps","initialLabel","onChange","newLabel","LabelEditor","translate","inputRef","newLabelValue","setNewLabelValue","hasError","setHasError","handleLabelChange","cancelLabelChange","current","focus","select","canRename","inputId","htmlInput","event","target","value","t8","event_0","key","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","undefined","display","t19"],"sources":["../../../src/presentation-hierarchies-react/stratakit/LabelEditor.tsx"],"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 \"./LabelEditor.css\";\n\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { FormHelperText, IconButton, Popover, TextField, Typography } from \"@mui/material\";\nimport { Icon } from \"@stratakit/mui\";\nimport { useTranslation } from \"../LocalizationContext.js\";\n\nimport checkmarkSvg from \"@stratakit/icons/checkmark.svg\";\nimport dismissSvg from \"@stratakit/icons/dismiss.svg\";\n\nimport type { CSSProperties } from \"react\";\nimport type { TreeNode } from \"../TreeNode.js\";\nimport type { RenameParameters } from \"./TreeNodeRenameAction.js\";\n\n/**\n * Renders the label editor for the node whose rename is in progress. It's rendered once at the tree\n * level as a popover anchored to an invisible element positioned at the renamed node's label location,\n * so it doesn't depend on the virtualized row's DOM element.\n *\n * @internal\n */\nexport function TreeNodeLabelEditorOverlay({\n node,\n renameParameters,\n onCancel,\n style,\n}: {\n node: TreeNode;\n renameParameters: RenameParameters;\n onCancel?: () => void;\n /** Placement of the anchor, generally an offset to the renamed node's label within the tree. */\n style?: CSSProperties;\n}) {\n const [anchorEl, setAnchorEl] = useState<HTMLDivElement | null>(null);\n return (\n <>\n <div ref={setAnchorEl} style={style} aria-hidden />\n <Popover\n open={anchorEl !== null}\n anchorEl={anchorEl}\n onClose={onCancel}\n anchorOrigin={{ vertical: \"top\", horizontal: \"left\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"left\" }}\n disableScrollLock\n >\n <LabelEditor\n initialLabel={node.label}\n onChange={renameParameters.commit}\n onCancel={onCancel}\n labelValidationHint={renameParameters.labelValidationHint}\n validate={renameParameters.validate}\n />\n </Popover>\n </>\n );\n}\n\ninterface LabelEditorProps {\n initialLabel: string;\n labelValidationHint?: string;\n onChange?: (newLabel: string) => void;\n onCancel?: () => void;\n validate?: (newLabel: string) => boolean;\n}\n\n/**\n * An editor for changing a tree node's label, rendered in a popover when node rename is initiated.\n *\n * @internal\n */\nexport function LabelEditor({ initialLabel, labelValidationHint, onChange, onCancel, validate }: LabelEditorProps) {\n const translate = useTranslation();\n const inputRef = useRef<HTMLInputElement>(null);\n const [newLabelValue, setNewLabelValue] = useState(initialLabel);\n const [hasError, setHasError] = useState<boolean>(false);\n const handleLabelChange = () => {\n if (validate && !validate(newLabelValue)) {\n setHasError(true);\n return;\n }\n\n if (initialLabel !== newLabelValue) {\n onChange?.(newLabelValue);\n return;\n }\n onCancel?.();\n };\n\n const cancelLabelChange = () => {\n setNewLabelValue(initialLabel);\n onCancel?.();\n };\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, []);\n\n const canRename = newLabelValue && newLabelValue !== initialLabel && !hasError;\n const inputId = useId();\n\n return (\n <div key={initialLabel} className=\"phr-node-label-editor\">\n <div className=\"phr-node-label-editor-input-row\">\n <TextField\n fullWidth\n error={hasError}\n size=\"small\"\n id={inputId}\n inputRef={inputRef}\n slotProps={{ htmlInput: { \"aria-label\": translate(\"newLabel\") } }}\n value={newLabelValue}\n onChange={(event) => {\n setNewLabelValue(event.target.value);\n setHasError(false);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n handleLabelChange();\n } else if (event.key === \"Escape\") {\n cancelLabelChange();\n }\n }}\n />\n <IconButton aria-label={translate(\"cancel\")} onClick={cancelLabelChange} size=\"small\">\n <Icon href={dismissSvg} />\n </IconButton>\n <IconButton aria-label={translate(\"confirm\")} onClick={handleLabelChange} disabled={!canRename} size=\"small\">\n <Icon href={checkmarkSvg} />\n </IconButton>\n </div>\n {labelValidationHint !== undefined ? (\n <FormHelperText render={<div />} error={hasError} style={{ display: \"flex\" }}>\n <Typography variant=\"caption-md\">{labelValidationHint}</Typography>\n </FormHelperText>\n ) : undefined}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TreeAction.d.ts","names":[],"sources":["../../../src/presentation-hierarchies-react/stratakit/TreeAction.tsx"],"mappings":";;;;;;;;UAiBiB;;;;;;;;EAQf;;;;;EAKA;;;KAIU,sBAAsB,KAAK,gCAAgC,KAAK,0BAC1E;;EAEE;;;;;;;;;;;;;;;;;;;;;cAsBS,gBAAgB,qBAAqB"}
1
+ {"version":3,"file":"TreeAction.d.ts","names":[],"sources":["../../../src/presentation-hierarchies-react/stratakit/TreeAction.tsx"],"mappings":";;;;;;;;UAiBiB;;;;;;;;EAQf;;;;;EAKA;;;KAIU,sBAAsB,KAAK,gCAAgC,KAAK,0BAC1E;;EAEE;;;;;;;;;;;;;;;;;;;;;cAuBS,gBAAgB,qBAAqB"}
@@ -80,7 +80,6 @@ const TreeActionBase = memo(function TreeActionBase(t0) {
80
80
  let t4;
81
81
  if ($[13] !== onClick || $[14] !== t2 || $[15] !== t3) {
82
82
  t4 = /* @__PURE__ */ jsxs(MenuItem, {
83
- dense: true,
84
83
  onClick,
85
84
  children: [t2, t3]
86
85
  });