@itwin/presentation-hierarchies-react 1.6.0 → 2.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +1 -21
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButtons.d.ts +14 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButtons.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButtons.js +27 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButtons.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.d.ts +12 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.js +72 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeLevelRenderer.d.ts +12 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeLevelRenderer.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeLevelRenderer.js +10 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeLevelRenderer.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts +14 -28
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js +21 -84
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts +10 -40
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.js +5 -73
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react.d.ts +3 -1
- package/lib/esm/presentation-hierarchies-react.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react.js +3 -1
- package/lib/esm/presentation-hierarchies-react.js.map +1 -1
- package/package.json +10 -14
- package/lib/cjs/package.json +0 -1
- package/lib/cjs/presentation-hierarchies-react/TreeNode.d.ts +0 -75
- package/lib/cjs/presentation-hierarchies-react/TreeNode.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/TreeNode.js +0 -15
- package/lib/cjs/presentation-hierarchies-react/TreeNode.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/UnifiedSelectionContext.d.ts +0 -15
- package/lib/cjs/presentation-hierarchies-react/UnifiedSelectionContext.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/UnifiedSelectionContext.js +0 -26
- package/lib/cjs/presentation-hierarchies-react/UnifiedSelectionContext.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/UseIModelTree.d.ts +0 -55
- package/lib/cjs/presentation-hierarchies-react/UseIModelTree.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/UseIModelTree.js +0 -66
- package/lib/cjs/presentation-hierarchies-react/UseIModelTree.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/UseSelectionHandler.d.ts +0 -46
- package/lib/cjs/presentation-hierarchies-react/UseSelectionHandler.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/UseSelectionHandler.js +0 -101
- package/lib/cjs/presentation-hierarchies-react/UseSelectionHandler.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/UseTree.d.ts +0 -132
- package/lib/cjs/presentation-hierarchies-react/UseTree.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/UseTree.js +0 -246
- package/lib/cjs/presentation-hierarchies-react/UseTree.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/DisposePolyfill.d.ts +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/DisposePolyfill.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/DisposePolyfill.js +0 -11
- package/lib/cjs/presentation-hierarchies-react/internal/DisposePolyfill.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/TreeActions.d.ts +0 -53
- package/lib/cjs/presentation-hierarchies-react/internal/TreeActions.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/TreeActions.js +0 -311
- package/lib/cjs/presentation-hierarchies-react/internal/TreeActions.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/TreeLoader.d.ts +0 -44
- package/lib/cjs/presentation-hierarchies-react/internal/TreeLoader.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/TreeLoader.js +0 -98
- package/lib/cjs/presentation-hierarchies-react/internal/TreeLoader.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/TreeModel.d.ts +0 -70
- package/lib/cjs/presentation-hierarchies-react/internal/TreeModel.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/TreeModel.js +0 -158
- package/lib/cjs/presentation-hierarchies-react/internal/TreeModel.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts +0 -28
- package/lib/cjs/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/UseUnifiedSelection.js +0 -131
- package/lib/cjs/presentation-hierarchies-react/internal/UseUnifiedSelection.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/Utils.d.ts +0 -23
- package/lib/cjs/presentation-hierarchies-react/internal/Utils.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/internal/Utils.js +0 -64
- package/lib/cjs/presentation-hierarchies-react/internal/Utils.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/itwinui/LocalizationContext.d.ts +0 -73
- package/lib/cjs/presentation-hierarchies-react/itwinui/LocalizationContext.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/itwinui/LocalizationContext.js +0 -38
- package/lib/cjs/presentation-hierarchies-react/itwinui/LocalizationContext.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/itwinui/TreeNodeRenderer.css +0 -29
- package/lib/cjs/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts +0 -56
- package/lib/cjs/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js +0 -126
- package/lib/cjs/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts +0 -60
- package/lib/cjs/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react/itwinui/TreeRenderer.js +0 -94
- package/lib/cjs/presentation-hierarchies-react/itwinui/TreeRenderer.js.map +0 -1
- package/lib/cjs/presentation-hierarchies-react.d.ts +0 -11
- package/lib/cjs/presentation-hierarchies-react.d.ts.map +0 -1
- package/lib/cjs/presentation-hierarchies-react.js +0 -30
- package/lib/cjs/presentation-hierarchies-react.js.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.css +0 -29
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
-
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.useIModelTree = useIModelTree;
|
|
8
|
-
exports.useIModelUnifiedSelectionTree = useIModelUnifiedSelectionTree;
|
|
9
|
-
const react_1 = require("react");
|
|
10
|
-
const presentation_hierarchies_1 = require("@itwin/presentation-hierarchies");
|
|
11
|
-
const UseTree_js_1 = require("./UseTree.js");
|
|
12
|
-
/**
|
|
13
|
-
* A React hook that creates state for a tree component whose displayed hierarchy is based on
|
|
14
|
-
* iModel data.
|
|
15
|
-
*
|
|
16
|
-
* The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
|
|
17
|
-
* component-agnostic result which may be used to render the hierarchy using any UI framework.
|
|
18
|
-
*
|
|
19
|
-
* See `README.md` for an example
|
|
20
|
-
*
|
|
21
|
-
* @see `useTree`
|
|
22
|
-
* @see `useIModelUnifiedSelectionTree`
|
|
23
|
-
* @public
|
|
24
|
-
*/
|
|
25
|
-
function useIModelTree(props) {
|
|
26
|
-
const { imodelAccess, imodelChanged, getHierarchyDefinition, getFilteredPaths, localizedStrings, ...rest } = props;
|
|
27
|
-
return (0, UseTree_js_1.useTree)({
|
|
28
|
-
...rest,
|
|
29
|
-
...useIModelTreeProps({ imodelAccess, imodelChanged, getHierarchyDefinition, getFilteredPaths, localizedStrings }),
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* A React hook that creates state for a tree component whose displayed hierarchy is based on
|
|
34
|
-
* iModel data and that is integrated with unified selection through the given selection
|
|
35
|
-
* storage (previously the storage was provided through the, now deprecated, `UnifiedSelectionProvider`).
|
|
36
|
-
*
|
|
37
|
-
* The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
|
|
38
|
-
* component-agnostic result which may be used to render the hierarchy using any UI framework.
|
|
39
|
-
*
|
|
40
|
-
* See `README.md` for an example
|
|
41
|
-
*
|
|
42
|
-
* @see `useIModelTree`
|
|
43
|
-
* @see `useUnifiedSelectionTree`
|
|
44
|
-
* @see `UnifiedSelectionProvider`
|
|
45
|
-
* @public
|
|
46
|
-
*/
|
|
47
|
-
function useIModelUnifiedSelectionTree(props) {
|
|
48
|
-
const { imodelAccess, imodelChanged, getHierarchyDefinition, getFilteredPaths, localizedStrings, ...rest } = props;
|
|
49
|
-
return (0, UseTree_js_1.useUnifiedSelectionTree)({
|
|
50
|
-
...rest,
|
|
51
|
-
...useIModelTreeProps({ imodelAccess, imodelChanged, getHierarchyDefinition, getFilteredPaths, localizedStrings }),
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
function useIModelTreeProps(props) {
|
|
55
|
-
const { imodelAccess, imodelChanged, getHierarchyDefinition, getFilteredPaths, localizedStrings } = props;
|
|
56
|
-
return {
|
|
57
|
-
getHierarchyProvider: (0, react_1.useCallback)(() => (0, presentation_hierarchies_1.createIModelHierarchyProvider)({
|
|
58
|
-
imodelAccess,
|
|
59
|
-
imodelChanged,
|
|
60
|
-
hierarchyDefinition: getHierarchyDefinition({ imodelAccess }),
|
|
61
|
-
localizedStrings,
|
|
62
|
-
}), [imodelAccess, imodelChanged, getHierarchyDefinition, localizedStrings]),
|
|
63
|
-
getFilteredPaths: (0, react_1.useCallback)(async () => getFilteredPaths?.({ imodelAccess }), [imodelAccess, getFilteredPaths]),
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=UseIModelTree.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UseIModelTree.js","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseIModelTree.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;AA2ChG,sCAMC;AAiBD,sEAMC;AAtED,iCAAoC;AACpC,8EAA6H;AAG7H,6CAA6F;AAwB7F;;;;;;;;;;;;GAYG;AACH,SAAgB,aAAa,CAAC,KAAyB;IACrD,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACnH,OAAO,IAAA,oBAAO,EAAC;QACb,GAAG,IAAI;QACP,GAAG,kBAAkB,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;KACnH,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,6BAA6B,CAAC,KAAwD;IACpG,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACnH,OAAO,IAAA,oCAAuB,EAAC;QAC7B,GAAG,IAAI;QACP,GAAG,kBAAkB,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;KACnH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAsI;IAEtI,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAC1G,OAAO;QACL,oBAAoB,EAAE,IAAA,mBAAW,EAC/B,GAAG,EAAE,CACH,IAAA,wDAA6B,EAAC;YAC5B,YAAY;YACZ,aAAa;YACb,mBAAmB,EAAE,sBAAsB,CAAC,EAAE,YAAY,EAAE,CAAC;YAC7D,gBAAgB;SACjB,CAAC,EACJ,CAAC,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CACxE;QACD,gBAAgB,EAAE,IAAA,mBAAW,EAAC,KAAK,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;KAClH,CAAC;AACJ,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback } from \"react\";\nimport { createIModelHierarchyProvider, HierarchyDefinition, HierarchyFilteringPath } from \"@itwin/presentation-hierarchies\";\nimport { Props } from \"@itwin/presentation-shared\";\nimport { UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport { useTree, UseTreeProps, UseTreeResult, useUnifiedSelectionTree } 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\" | \"getFilteredPaths\"> &\n Pick<IModelHierarchyProviderProps, \"localizedStrings\" | \"imodelAccess\" | \"imodelChanged\"> & {\n /** Provides the hierarchy definition for the tree. */\n getHierarchyDefinition: (props: { imodelAccess: IModelAccess }) => HierarchyDefinition;\n\n /** Provides paths to filtered nodes. */\n getFilteredPaths?: (props: {\n /** Object that provides access to the iModel schema and can run queries against the iModel. */\n imodelAccess: IModelAccess;\n }) => Promise<HierarchyFilteringPath[] | 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, getFilteredPaths, localizedStrings, ...rest } = props;\n return useTree({\n ...rest,\n ...useIModelTreeProps({ imodelAccess, imodelChanged, getHierarchyDefinition, getFilteredPaths, localizedStrings }),\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, getFilteredPaths, localizedStrings, ...rest } = props;\n return useUnifiedSelectionTree({\n ...rest,\n ...useIModelTreeProps({ imodelAccess, imodelChanged, getHierarchyDefinition, getFilteredPaths, localizedStrings }),\n });\n}\n\nfunction useIModelTreeProps(\n props: Pick<UseIModelTreeProps, \"imodelAccess\" | \"imodelChanged\" | \"getHierarchyDefinition\" | \"getFilteredPaths\" | \"localizedStrings\">,\n): Pick<UseTreeProps, \"getHierarchyProvider\" | \"getFilteredPaths\"> {\n const { imodelAccess, imodelChanged, getHierarchyDefinition, getFilteredPaths, localizedStrings } = props;\n return {\n getHierarchyProvider: useCallback(\n () =>\n createIModelHierarchyProvider({\n imodelAccess,\n imodelChanged,\n hierarchyDefinition: getHierarchyDefinition({ imodelAccess }),\n localizedStrings,\n }),\n [imodelAccess, imodelChanged, getHierarchyDefinition, localizedStrings],\n ),\n getFilteredPaths: useCallback(async () => getFilteredPaths?.({ imodelAccess }), [imodelAccess, getFilteredPaths]),\n };\n}\n"]}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { PresentationHierarchyNode } from "./TreeNode.js";
|
|
2
|
-
import { useTree } from "./UseTree.js";
|
|
3
|
-
/**
|
|
4
|
-
* A union of different supported selection modes in a tree component:
|
|
5
|
-
* - `none` - no selection is allowed,
|
|
6
|
-
* - `single` - only one node can be selected at a time,
|
|
7
|
-
* - `extended` - multiple nodes can be selected using shift and ctrl keys,
|
|
8
|
-
* - `multiple` - multiple nodes can be selected without using shift or ctrl keys.
|
|
9
|
-
*
|
|
10
|
-
* @public
|
|
11
|
-
*/
|
|
12
|
-
export type SelectionMode = "none" | "single" | "extended" | "multiple";
|
|
13
|
-
/**
|
|
14
|
-
* Type of selection change.
|
|
15
|
-
* - `add` - a node was added to the selection,
|
|
16
|
-
* - `replace` - a selected node was replaced with a different one,
|
|
17
|
-
* - `remove` - a node was removed from the selection.
|
|
18
|
-
*
|
|
19
|
-
* @public
|
|
20
|
-
*/
|
|
21
|
-
export type SelectionChangeType = "add" | "replace" | "remove";
|
|
22
|
-
/**
|
|
23
|
-
* Props for `useSelectionHandler` hook.
|
|
24
|
-
* @public
|
|
25
|
-
*/
|
|
26
|
-
type UseSelectionHandlerProps = Pick<ReturnType<typeof useTree>, "rootNodes" | "selectNodes"> & {
|
|
27
|
-
/** Selection mode that the component is working in. */
|
|
28
|
-
selectionMode: SelectionMode;
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* Result of `useSelectionHandler` hook.
|
|
32
|
-
* @public
|
|
33
|
-
*/
|
|
34
|
-
interface UseSelectionHandlerResult {
|
|
35
|
-
/** Should be called by node renderer when a node component is clicked. */
|
|
36
|
-
onNodeClick: (node: PresentationHierarchyNode, isSelected: boolean, event: React.MouseEvent<HTMLElement, MouseEvent>) => void;
|
|
37
|
-
/** Should be called by node renderer when a keyboard event happens on a node. */
|
|
38
|
-
onNodeKeyDown: (node: PresentationHierarchyNode, isSelected: boolean, event: React.KeyboardEvent<HTMLElement>) => void;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* A react hook that helps implement different selection modes in a tree component created using `useTree` hook.
|
|
42
|
-
* @public
|
|
43
|
-
*/
|
|
44
|
-
export declare function useSelectionHandler(props: UseSelectionHandlerProps): UseSelectionHandlerResult;
|
|
45
|
-
export {};
|
|
46
|
-
//# sourceMappingURL=UseSelectionHandler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UseSelectionHandler.d.ts","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseSelectionHandler.ts"],"names":[],"mappings":"AAMA,OAAO,EAA+B,yBAAyB,EAAwB,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAExE;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE/D;;;GAGG;AACH,KAAK,wBAAwB,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,GAAG;IAC9F,uDAAuD;IACvD,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF;;;GAGG;AACH,UAAU,yBAAyB;IACjC,0EAA0E;IAC1E,WAAW,EAAE,CAAC,IAAI,EAAE,yBAAyB,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IAC9H,iFAAiF;IACjF,aAAa,EAAE,CAAC,IAAI,EAAE,yBAAyB,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CACxH;AAOD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,yBAAyB,CAiE9F"}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
-
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.useSelectionHandler = useSelectionHandler;
|
|
8
|
-
const react_1 = require("react");
|
|
9
|
-
const TreeNode_js_1 = require("./TreeNode.js");
|
|
10
|
-
/**
|
|
11
|
-
* A react hook that helps implement different selection modes in a tree component created using `useTree` hook.
|
|
12
|
-
* @public
|
|
13
|
-
*/
|
|
14
|
-
function useSelectionHandler(props) {
|
|
15
|
-
const { rootNodes, selectionMode, selectNodes } = props;
|
|
16
|
-
const previousSelectionRef = (0, react_1.useRef)(undefined);
|
|
17
|
-
const state = (0, react_1.useRef)({
|
|
18
|
-
flatNodeList: [],
|
|
19
|
-
nodeIdToIndexMap: new Map(),
|
|
20
|
-
});
|
|
21
|
-
(0, react_1.useEffect)(() => {
|
|
22
|
-
if (!rootNodes) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
state.current = computeFlatNodeList(rootNodes);
|
|
26
|
-
}, [rootNodes]);
|
|
27
|
-
const getNodeRange = (firstId, secondId) => {
|
|
28
|
-
const getIndex = (nodeId) => {
|
|
29
|
-
return nodeId ? state.current.nodeIdToIndexMap.get(nodeId) : 0;
|
|
30
|
-
};
|
|
31
|
-
const firstIndex = getIndex(firstId);
|
|
32
|
-
const secondIndex = getIndex(secondId);
|
|
33
|
-
if (firstIndex === undefined || secondIndex === undefined) {
|
|
34
|
-
return [];
|
|
35
|
-
}
|
|
36
|
-
const startingIndex = Math.min(firstIndex, secondIndex);
|
|
37
|
-
const endIndex = Math.max(firstIndex, secondIndex);
|
|
38
|
-
return state.current.flatNodeList.slice(startingIndex, endIndex + 1);
|
|
39
|
-
};
|
|
40
|
-
const onNodeSelect = (0, react_1.useCallback)((nodeId, isSelected, shiftDown, ctrlDown) => {
|
|
41
|
-
const selection = getSelectionAction(selectionMode, isSelected, shiftDown, ctrlDown);
|
|
42
|
-
if (selection.type === "disabled") {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
const nodes = selection.select === "range" ? getNodeRange(previousSelectionRef.current, nodeId) : [nodeId];
|
|
46
|
-
if (!nodes.length) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
selection.select !== "range" && (previousSelectionRef.current = nodeId);
|
|
50
|
-
selectNodes(nodes, selection.type);
|
|
51
|
-
}, [selectionMode, selectNodes]);
|
|
52
|
-
const onNodeClick = (0, react_1.useCallback)((node, isSelected, event) => {
|
|
53
|
-
return onNodeSelect(node.id, isSelected, event.shiftKey, event.ctrlKey);
|
|
54
|
-
}, [onNodeSelect]);
|
|
55
|
-
const onNodeKeyDown = (0, react_1.useCallback)((node, isSelected, event) => {
|
|
56
|
-
if (event.key === " " || event.key === "Spacebar" || event.key === "Enter") {
|
|
57
|
-
return onNodeSelect(node.id, isSelected, event.shiftKey, event.ctrlKey);
|
|
58
|
-
}
|
|
59
|
-
}, [onNodeSelect]);
|
|
60
|
-
return { onNodeClick, onNodeKeyDown };
|
|
61
|
-
}
|
|
62
|
-
function getSelectionAction(selectionMode, isSelected, shiftDown, ctrlDown) {
|
|
63
|
-
switch (selectionMode) {
|
|
64
|
-
case "none":
|
|
65
|
-
return { select: "node", type: "disabled" };
|
|
66
|
-
case "single":
|
|
67
|
-
return { select: "node", type: isSelected ? "replace" : "remove" };
|
|
68
|
-
case "multiple":
|
|
69
|
-
return { select: "node", type: isSelected ? "add" : "remove" };
|
|
70
|
-
case "extended":
|
|
71
|
-
return getExtendedSelectionAction(isSelected, shiftDown, ctrlDown);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
function getExtendedSelectionAction(isSelected, shiftDown, ctrlDown) {
|
|
75
|
-
if (shiftDown) {
|
|
76
|
-
return { select: "range", type: "replace" };
|
|
77
|
-
}
|
|
78
|
-
if (ctrlDown) {
|
|
79
|
-
return { select: "node", type: isSelected ? "add" : "remove" };
|
|
80
|
-
}
|
|
81
|
-
return { select: "node", type: isSelected ? "replace" : "disabled" };
|
|
82
|
-
}
|
|
83
|
-
function computeFlatNodeList(rootNodes) {
|
|
84
|
-
const flatNodeList = [];
|
|
85
|
-
const nodeIdToIndexMap = new Map();
|
|
86
|
-
const flattenNodeRecursively = (nodes) => {
|
|
87
|
-
nodes.forEach((node) => {
|
|
88
|
-
if (!(0, TreeNode_js_1.isPresentationHierarchyNode)(node)) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
nodeIdToIndexMap.set(node.id, flatNodeList.length);
|
|
92
|
-
flatNodeList.push(node.id);
|
|
93
|
-
if (node.isExpanded && typeof node.children !== "boolean") {
|
|
94
|
-
flattenNodeRecursively(node.children);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
flattenNodeRecursively(rootNodes);
|
|
99
|
-
return { flatNodeList, nodeIdToIndexMap };
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=UseSelectionHandler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UseSelectionHandler.js","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseSelectionHandler.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { isPresentationHierarchyNode, PresentationHierarchyNode, PresentationTreeNode } from \"./TreeNode.js\";\nimport { useTree } from \"./UseTree.js\";\n\n/**\n * A union of different supported selection modes in a tree component:\n * - `none` - no selection is allowed,\n * - `single` - only one node can be selected at a time,\n * - `extended` - multiple nodes can be selected using shift and ctrl keys,\n * - `multiple` - multiple nodes can be selected without using shift or ctrl keys.\n *\n * @public\n */\nexport type SelectionMode = \"none\" | \"single\" | \"extended\" | \"multiple\";\n\n/**\n * Type of selection change.\n * - `add` - a node was added to the selection,\n * - `replace` - a selected node was replaced with a different one,\n * - `remove` - a node was removed from the selection.\n *\n * @public\n */\nexport type SelectionChangeType = \"add\" | \"replace\" | \"remove\";\n\n/**\n * Props for `useSelectionHandler` hook.\n * @public\n */\ntype UseSelectionHandlerProps = Pick<ReturnType<typeof useTree>, \"rootNodes\" | \"selectNodes\"> & {\n /** Selection mode that the component is working in. */\n selectionMode: SelectionMode;\n};\n\n/**\n * Result of `useSelectionHandler` hook.\n * @public\n */\ninterface UseSelectionHandlerResult {\n /** Should be called by node renderer when a node component is clicked. */\n onNodeClick: (node: PresentationHierarchyNode, isSelected: boolean, event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Should be called by node renderer when a keyboard event happens on a node. */\n onNodeKeyDown: (node: PresentationHierarchyNode, isSelected: boolean, event: React.KeyboardEvent<HTMLElement>) => void;\n}\n\ninterface FlatTreeState {\n flatNodeList: Array<string>;\n nodeIdToIndexMap: Map<string, number>;\n}\n\n/**\n * A react hook that helps implement different selection modes in a tree component created using `useTree` hook.\n * @public\n */\nexport function useSelectionHandler(props: UseSelectionHandlerProps): UseSelectionHandlerResult {\n const { rootNodes, selectionMode, selectNodes } = props;\n const previousSelectionRef = useRef<string | undefined>(undefined);\n const state = useRef<FlatTreeState>({\n flatNodeList: [],\n nodeIdToIndexMap: new Map(),\n });\n\n useEffect(() => {\n if (!rootNodes) {\n return;\n }\n state.current = computeFlatNodeList(rootNodes);\n }, [rootNodes]);\n\n const getNodeRange = (firstId?: string, secondId?: string) => {\n const getIndex = (nodeId?: string) => {\n return nodeId ? state.current.nodeIdToIndexMap.get(nodeId) : 0;\n };\n const firstIndex = getIndex(firstId);\n const secondIndex = getIndex(secondId);\n if (firstIndex === undefined || secondIndex === undefined) {\n return [];\n }\n\n const startingIndex = Math.min(firstIndex, secondIndex);\n const endIndex = Math.max(firstIndex, secondIndex);\n return state.current.flatNodeList.slice(startingIndex, endIndex + 1);\n };\n\n const onNodeSelect = useCallback(\n (nodeId: string, isSelected: boolean, shiftDown: boolean, ctrlDown: boolean) => {\n const selection = getSelectionAction(selectionMode, isSelected, shiftDown, ctrlDown);\n if (selection.type === \"disabled\") {\n return;\n }\n\n const nodes = selection.select === \"range\" ? getNodeRange(previousSelectionRef.current, nodeId) : [nodeId];\n if (!nodes.length) {\n return;\n }\n\n selection.select !== \"range\" && (previousSelectionRef.current = nodeId);\n selectNodes(nodes, selection.type);\n },\n [selectionMode, selectNodes],\n );\n\n const onNodeClick = useCallback(\n (node: PresentationHierarchyNode, isSelected: boolean, event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n return onNodeSelect(node.id, isSelected, event.shiftKey, event.ctrlKey);\n },\n [onNodeSelect],\n );\n\n const onNodeKeyDown = useCallback(\n (node: PresentationHierarchyNode, isSelected: boolean, event: React.KeyboardEvent<HTMLElement>) => {\n if (event.key === \" \" || event.key === \"Spacebar\" || event.key === \"Enter\") {\n return onNodeSelect(node.id, isSelected, event.shiftKey, event.ctrlKey);\n }\n },\n [onNodeSelect],\n );\n\n return { onNodeClick, onNodeKeyDown };\n}\n\ninterface SelectionAction {\n select: \"node\" | \"range\";\n type: SelectionChangeType | \"disabled\";\n}\n\nfunction getSelectionAction(selectionMode: SelectionMode, isSelected: boolean, shiftDown: boolean, ctrlDown: boolean): SelectionAction {\n switch (selectionMode) {\n case \"none\":\n return { select: \"node\", type: \"disabled\" };\n case \"single\":\n return { select: \"node\", type: isSelected ? \"replace\" : \"remove\" };\n case \"multiple\":\n return { select: \"node\", type: isSelected ? \"add\" : \"remove\" };\n case \"extended\":\n return getExtendedSelectionAction(isSelected, shiftDown, ctrlDown);\n }\n}\n\nfunction getExtendedSelectionAction(isSelected: boolean, shiftDown: boolean, ctrlDown: boolean): SelectionAction {\n if (shiftDown) {\n return { select: \"range\", type: \"replace\" };\n }\n if (ctrlDown) {\n return { select: \"node\", type: isSelected ? \"add\" : \"remove\" };\n }\n return { select: \"node\", type: isSelected ? \"replace\" : \"disabled\" };\n}\n\nfunction computeFlatNodeList(rootNodes: Array<PresentationTreeNode>): FlatTreeState {\n const flatNodeList: Array<string> = [];\n const nodeIdToIndexMap: Map<string, number> = new Map();\n\n const flattenNodeRecursively = (nodes: Array<PresentationTreeNode>) => {\n nodes.forEach((node) => {\n if (!isPresentationHierarchyNode(node)) {\n return;\n }\n nodeIdToIndexMap.set(node.id, flatNodeList.length);\n flatNodeList.push(node.id);\n if (node.isExpanded && typeof node.children !== \"boolean\") {\n flattenNodeRecursively(node.children);\n }\n });\n };\n\n flattenNodeRecursively(rootNodes);\n return { flatNodeList, nodeIdToIndexMap };\n}\n"]}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { GenericInstanceFilter, HierarchyFilteringPath, HierarchyNode, HierarchyProvider } from "@itwin/presentation-hierarchies";
|
|
2
|
-
import { InstanceKey, IPrimitiveValueFormatter } from "@itwin/presentation-shared";
|
|
3
|
-
import { UseUnifiedTreeSelectionProps } from "./internal/UseUnifiedSelection.js";
|
|
4
|
-
import { PresentationHierarchyNode, PresentationTreeNode } from "./TreeNode.js";
|
|
5
|
-
import { SelectionChangeType } from "./UseSelectionHandler.js";
|
|
6
|
-
/**
|
|
7
|
-
* A data structure that contains information about a single hierarchy level.
|
|
8
|
-
* @public
|
|
9
|
-
*/
|
|
10
|
-
export interface HierarchyLevelDetails {
|
|
11
|
-
/** The parent node whose hierarchy level's information is contained in this data structure */
|
|
12
|
-
hierarchyNode: HierarchyNode | undefined;
|
|
13
|
-
/** A function to get instance keys of the hierarchy level. */
|
|
14
|
-
getInstanceKeysIterator: (props?: {
|
|
15
|
-
instanceFilter?: GenericInstanceFilter;
|
|
16
|
-
hierarchyLevelSizeLimit?: number | "unbounded";
|
|
17
|
-
}) => AsyncIterableIterator<InstanceKey>;
|
|
18
|
-
/** Get the limit of how many nodes can be loaded in this hierarchy level. */
|
|
19
|
-
sizeLimit?: number | "unbounded";
|
|
20
|
-
/** Set the limit of how many nodes can be loaded in this hierarchy level. */
|
|
21
|
-
setSizeLimit: (value: undefined | number | "unbounded") => void;
|
|
22
|
-
/** Get the active instance filter applied to this hierarchy level. */
|
|
23
|
-
instanceFilter?: GenericInstanceFilter;
|
|
24
|
-
/** Set the instance filter to apply to this hierarchy level */
|
|
25
|
-
setInstanceFilter: (filter: GenericInstanceFilter | undefined) => void;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* A React hook that creates state for a tree component.
|
|
29
|
-
*
|
|
30
|
-
* The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
|
|
31
|
-
* component-agnostic result which may be used to render the hierarchy using any UI framework.
|
|
32
|
-
*
|
|
33
|
-
* See `README.md` for an example
|
|
34
|
-
*
|
|
35
|
-
* @see `useUnifiedSelectionTree`
|
|
36
|
-
* @see `useIModelTree`
|
|
37
|
-
* @public
|
|
38
|
-
*/
|
|
39
|
-
export declare function useTree(props: UseTreeProps): UseTreeResult;
|
|
40
|
-
/**
|
|
41
|
-
* A React hook that creates state for a tree component, that is integrated with unified selection
|
|
42
|
-
* through the given selection storage (previously the storage was provided through the, now
|
|
43
|
-
* deprecated, `UnifiedSelectionProvider`).
|
|
44
|
-
*
|
|
45
|
-
* The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
|
|
46
|
-
* component-agnostic result which may be used to render the hierarchy using any UI framework.
|
|
47
|
-
*
|
|
48
|
-
* See `README.md` for an example
|
|
49
|
-
*
|
|
50
|
-
* @see `useTree`
|
|
51
|
-
* @see `useIModelUnifiedSelectionTree`
|
|
52
|
-
* @see `UnifiedSelectionProvider`
|
|
53
|
-
* @public
|
|
54
|
-
*/
|
|
55
|
-
export declare function useUnifiedSelectionTree({ sourceName, selectionStorage, ...props }: UseTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult;
|
|
56
|
-
/** @public */
|
|
57
|
-
export interface UseTreeProps {
|
|
58
|
-
/** Provides the hierarchy provider for the tree. */
|
|
59
|
-
getHierarchyProvider: () => HierarchyProvider;
|
|
60
|
-
/** Provides paths to filtered nodes. */
|
|
61
|
-
getFilteredPaths?: () => Promise<HierarchyFilteringPath[] | undefined>;
|
|
62
|
-
/**
|
|
63
|
-
* Callback that is called just after a certain action is finished.
|
|
64
|
-
* Can be used for performance tracking.
|
|
65
|
-
*/
|
|
66
|
-
onPerformanceMeasured?: (action: "initial-load" | "hierarchy-level-load" | "reload", duration: number) => void;
|
|
67
|
-
/** Action to perform when hierarchy level contains more items that the specified limit. */
|
|
68
|
-
onHierarchyLimitExceeded?: (props: {
|
|
69
|
-
parentId?: string;
|
|
70
|
-
filter?: GenericInstanceFilter;
|
|
71
|
-
limit?: number | "unbounded";
|
|
72
|
-
}) => void;
|
|
73
|
-
/** Action to perform when an error occurs while loading hierarchy. */
|
|
74
|
-
onHierarchyLoadError?: (props: {
|
|
75
|
-
parentId?: string;
|
|
76
|
-
type: "timeout" | "unknown";
|
|
77
|
-
error: unknown;
|
|
78
|
-
}) => void;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Options for doing either full or a sub tree reload.
|
|
82
|
-
* @public
|
|
83
|
-
*/
|
|
84
|
-
interface ReloadTreeOptions {
|
|
85
|
-
/** Specifies parent node under which sub tree should be reloaded. */
|
|
86
|
-
parentNodeId: string | undefined;
|
|
87
|
-
/**
|
|
88
|
-
* Specifies how current tree state should be handled:
|
|
89
|
-
* - `keep` - try to keep current tree state (expanded/collapsed nodes, instance filters, etc.).
|
|
90
|
-
* - `discard` - do not try to keep current tree state. Tree model will be update after nodes are reloaded.
|
|
91
|
-
* - `reset` - remove subtree from the model before reloading and reload nodes ignoring cache.
|
|
92
|
-
*
|
|
93
|
-
* Defaults to `"keep"`.
|
|
94
|
-
*/
|
|
95
|
-
state?: "keep" | "discard" | "reset";
|
|
96
|
-
}
|
|
97
|
-
/** @public */
|
|
98
|
-
export interface UseTreeResult {
|
|
99
|
-
/**
|
|
100
|
-
* Array containing root tree nodes. It is `undefined` on initial render until any nodes are loaded.
|
|
101
|
-
*/
|
|
102
|
-
rootNodes: PresentationTreeNode[] | undefined;
|
|
103
|
-
/**
|
|
104
|
-
* Specifies whether tree is loading or not. It is set to `true` when initial tree load is in progress
|
|
105
|
-
* or tree is reloading.
|
|
106
|
-
*/
|
|
107
|
-
isLoading: boolean;
|
|
108
|
-
/**
|
|
109
|
-
* A function that should be called to reload the tree.
|
|
110
|
-
*/
|
|
111
|
-
reloadTree: (options?: ReloadTreeOptions) => void;
|
|
112
|
-
/**
|
|
113
|
-
* A function that should be called to either expand or collapse the given node.
|
|
114
|
-
*/
|
|
115
|
-
expandNode: (nodeId: string, isExpanded: boolean) => void;
|
|
116
|
-
/**
|
|
117
|
-
* A function that should be called to select nodes in the tree.
|
|
118
|
-
* @param nodeIds Ids of the nodes that are selected.
|
|
119
|
-
* @param changeType Type of change that occurred for the selection.
|
|
120
|
-
*/
|
|
121
|
-
selectNodes: (nodeIds: Array<string>, changeType: SelectionChangeType) => void;
|
|
122
|
-
/** Determines whether a given node is selected. */
|
|
123
|
-
isNodeSelected: (nodeId: string) => boolean;
|
|
124
|
-
/** Get a tree node by id */
|
|
125
|
-
getNode: (nodeId: string) => PresentationHierarchyNode | undefined;
|
|
126
|
-
/** Returns hierarchy level details for a given node ID. */
|
|
127
|
-
getHierarchyLevelDetails: (nodeId: string | undefined) => HierarchyLevelDetails | undefined;
|
|
128
|
-
/** Sets a formatter for the primitive values that are displayed in the hierarchy. */
|
|
129
|
-
setFormatter: (formatter: IPrimitiveValueFormatter | undefined) => void;
|
|
130
|
-
}
|
|
131
|
-
export {};
|
|
132
|
-
//# sourceMappingURL=UseTree.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UseTree.d.ts","sourceRoot":"","sources":["../../../src/presentation-hierarchies-react/UseTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
-
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.useTree = useTree;
|
|
8
|
-
exports.useUnifiedSelectionTree = useUnifiedSelectionTree;
|
|
9
|
-
const react_1 = require("react");
|
|
10
|
-
const presentation_hierarchies_1 = require("@itwin/presentation-hierarchies");
|
|
11
|
-
const TreeActions_js_1 = require("./internal/TreeActions.js");
|
|
12
|
-
const TreeModel_js_1 = require("./internal/TreeModel.js");
|
|
13
|
-
const UseUnifiedSelection_js_1 = require("./internal/UseUnifiedSelection.js");
|
|
14
|
-
const Utils_js_1 = require("./internal/Utils.js");
|
|
15
|
-
/**
|
|
16
|
-
* A React hook that creates state for a tree component.
|
|
17
|
-
*
|
|
18
|
-
* The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
|
|
19
|
-
* component-agnostic result which may be used to render the hierarchy using any UI framework.
|
|
20
|
-
*
|
|
21
|
-
* See `README.md` for an example
|
|
22
|
-
*
|
|
23
|
-
* @see `useUnifiedSelectionTree`
|
|
24
|
-
* @see `useIModelTree`
|
|
25
|
-
* @public
|
|
26
|
-
*/
|
|
27
|
-
function useTree(props) {
|
|
28
|
-
const { getTreeModelNode: _, ...rest } = useTreeInternal(props);
|
|
29
|
-
return rest;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* A React hook that creates state for a tree component, that is integrated with unified selection
|
|
33
|
-
* through the given selection storage (previously the storage was provided through the, now
|
|
34
|
-
* deprecated, `UnifiedSelectionProvider`).
|
|
35
|
-
*
|
|
36
|
-
* The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a
|
|
37
|
-
* component-agnostic result which may be used to render the hierarchy using any UI framework.
|
|
38
|
-
*
|
|
39
|
-
* See `README.md` for an example
|
|
40
|
-
*
|
|
41
|
-
* @see `useTree`
|
|
42
|
-
* @see `useIModelUnifiedSelectionTree`
|
|
43
|
-
* @see `UnifiedSelectionProvider`
|
|
44
|
-
* @public
|
|
45
|
-
*/
|
|
46
|
-
function useUnifiedSelectionTree({ sourceName, selectionStorage, ...props }) {
|
|
47
|
-
const { getTreeModelNode, ...rest } = useTreeInternal(props);
|
|
48
|
-
return {
|
|
49
|
-
...rest,
|
|
50
|
-
...(0, UseUnifiedSelection_js_1.useUnifiedTreeSelection)({ sourceName, selectionStorage, getTreeModelNode }),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
function useTreeInternal({ getHierarchyProvider, getFilteredPaths, onPerformanceMeasured, onHierarchyLimitExceeded, onHierarchyLoadError, }) {
|
|
54
|
-
const [state, setState] = (0, react_1.useState)({
|
|
55
|
-
model: { idToNode: new Map(), parentChildMap: new Map(), rootNode: { id: undefined, nodeData: undefined } },
|
|
56
|
-
rootNodes: undefined,
|
|
57
|
-
});
|
|
58
|
-
const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);
|
|
59
|
-
const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);
|
|
60
|
-
const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);
|
|
61
|
-
const [actions] = (0, react_1.useState)(() => new TreeActions_js_1.TreeActions((model) => {
|
|
62
|
-
const rootNodes = model.parentChildMap.get(undefined) !== undefined ? generateTreeStructure(undefined, model) : undefined;
|
|
63
|
-
setState({
|
|
64
|
-
model,
|
|
65
|
-
rootNodes,
|
|
66
|
-
});
|
|
67
|
-
}, (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration), (props) => onHierarchyLimitExceededRef.current?.(props), (props) => onHierarchyLoadErrorRef.current?.(props)));
|
|
68
|
-
const currentFormatter = (0, react_1.useRef)();
|
|
69
|
-
const [hierarchyProvider, setHierarchyProvider] = (0, react_1.useState)();
|
|
70
|
-
(0, react_1.useEffect)(() => {
|
|
71
|
-
const provider = getHierarchyProvider();
|
|
72
|
-
provider.setFormatter(currentFormatter.current);
|
|
73
|
-
const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {
|
|
74
|
-
const shouldDiscardState = hierarchyChangeArgs?.filterChange?.newFilter !== undefined;
|
|
75
|
-
actions.reloadTree({ state: shouldDiscardState ? "discard" : "keep" });
|
|
76
|
-
});
|
|
77
|
-
actions.setHierarchyProvider(provider);
|
|
78
|
-
setHierarchyProvider(provider);
|
|
79
|
-
return () => {
|
|
80
|
-
removeHierarchyChangedListener();
|
|
81
|
-
actions.reset();
|
|
82
|
-
(0, Utils_js_1.safeDispose)(provider);
|
|
83
|
-
};
|
|
84
|
-
}, [actions, getHierarchyProvider]);
|
|
85
|
-
const [isFiltering, setIsFiltering] = (0, react_1.useState)(false);
|
|
86
|
-
(0, react_1.useEffect)(() => {
|
|
87
|
-
let disposed = false;
|
|
88
|
-
void (async () => {
|
|
89
|
-
if (!hierarchyProvider) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
if (!getFilteredPaths) {
|
|
93
|
-
hierarchyProvider.setHierarchyFilter(undefined);
|
|
94
|
-
// reload tree in case hierarchy provider does not use hierarchy filter to load initial nodes
|
|
95
|
-
actions.reloadTree({ state: "keep" });
|
|
96
|
-
setIsFiltering(false);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
setIsFiltering(true);
|
|
100
|
-
let paths;
|
|
101
|
-
try {
|
|
102
|
-
paths = await getFilteredPaths();
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
}
|
|
106
|
-
finally {
|
|
107
|
-
if (!disposed) {
|
|
108
|
-
hierarchyProvider.setHierarchyFilter(paths ? { paths } : undefined);
|
|
109
|
-
setIsFiltering(false);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
})();
|
|
113
|
-
return () => {
|
|
114
|
-
disposed = true;
|
|
115
|
-
};
|
|
116
|
-
}, [hierarchyProvider, getFilteredPaths, actions]);
|
|
117
|
-
const getTreeModelNode = (0, react_1.useCallback)((nodeId) => {
|
|
118
|
-
return actions.getNode(nodeId);
|
|
119
|
-
}, [actions]);
|
|
120
|
-
const getNode = (0, react_1.useCallback)((nodeId) => {
|
|
121
|
-
const node = actions.getNode(nodeId);
|
|
122
|
-
if (!node || !(0, TreeModel_js_1.isTreeModelHierarchyNode)(node)) {
|
|
123
|
-
return undefined;
|
|
124
|
-
}
|
|
125
|
-
return createPresentationHierarchyNode(node, state.model);
|
|
126
|
-
}, [actions, state.model]);
|
|
127
|
-
const expandNode = (0, react_1.useCallback)((nodeId, isExpanded) => {
|
|
128
|
-
actions.expandNode(nodeId, isExpanded);
|
|
129
|
-
}, [actions]);
|
|
130
|
-
const reloadTree = (0, react_1.useCallback)((options) => {
|
|
131
|
-
actions.reloadTree(options);
|
|
132
|
-
}, [actions]);
|
|
133
|
-
const selectNodes = (0, react_1.useCallback)((nodeIds, changeType) => {
|
|
134
|
-
actions.selectNodes(nodeIds, changeType);
|
|
135
|
-
}, [actions]);
|
|
136
|
-
const isNodeSelected = (0, react_1.useCallback)((nodeId) => TreeModel_js_1.TreeModel.isNodeSelected(state.model, nodeId), [state]);
|
|
137
|
-
const setFormatter = (0, react_1.useCallback)((formatter) => {
|
|
138
|
-
currentFormatter.current = formatter;
|
|
139
|
-
/* c8 ignore next 3 */
|
|
140
|
-
if (!hierarchyProvider) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
hierarchyProvider.setFormatter(formatter);
|
|
144
|
-
}, [hierarchyProvider]);
|
|
145
|
-
const getHierarchyLevelDetails = (0, react_1.useCallback)((nodeId) => {
|
|
146
|
-
const node = actions.getNode(nodeId);
|
|
147
|
-
if (!hierarchyProvider || !node || (0, TreeModel_js_1.isTreeModelInfoNode)(node)) {
|
|
148
|
-
return undefined;
|
|
149
|
-
}
|
|
150
|
-
const hierarchyNode = node.nodeData;
|
|
151
|
-
if (hierarchyNode && presentation_hierarchies_1.HierarchyNode.isGroupingNode(hierarchyNode)) {
|
|
152
|
-
return undefined;
|
|
153
|
-
}
|
|
154
|
-
return {
|
|
155
|
-
hierarchyNode,
|
|
156
|
-
getInstanceKeysIterator: (props) => hierarchyProvider.getNodeInstanceKeys({
|
|
157
|
-
parentNode: hierarchyNode,
|
|
158
|
-
instanceFilter: props?.instanceFilter,
|
|
159
|
-
hierarchyLevelSizeLimit: props?.hierarchyLevelSizeLimit,
|
|
160
|
-
}),
|
|
161
|
-
instanceFilter: node.instanceFilter,
|
|
162
|
-
setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId, filter),
|
|
163
|
-
sizeLimit: node.hierarchyLimit,
|
|
164
|
-
setSizeLimit: (value) => actions.setHierarchyLimit(nodeId, value),
|
|
165
|
-
};
|
|
166
|
-
}, [actions, hierarchyProvider]);
|
|
167
|
-
return {
|
|
168
|
-
rootNodes: state.rootNodes,
|
|
169
|
-
isLoading: !!state.model.rootNode.isLoading || isFiltering,
|
|
170
|
-
expandNode,
|
|
171
|
-
reloadTree,
|
|
172
|
-
selectNodes,
|
|
173
|
-
isNodeSelected,
|
|
174
|
-
getTreeModelNode,
|
|
175
|
-
getNode,
|
|
176
|
-
getHierarchyLevelDetails,
|
|
177
|
-
setFormatter,
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
function generateTreeStructure(parentNodeId, model) {
|
|
181
|
-
const currentChildren = model.parentChildMap.get(parentNodeId);
|
|
182
|
-
if (!currentChildren) {
|
|
183
|
-
return undefined;
|
|
184
|
-
}
|
|
185
|
-
return currentChildren
|
|
186
|
-
.map((childId) => model.idToNode.get(childId))
|
|
187
|
-
.filter((node) => !!node)
|
|
188
|
-
.map((node) => {
|
|
189
|
-
if ((0, TreeModel_js_1.isTreeModelHierarchyNode)(node)) {
|
|
190
|
-
return createPresentationHierarchyNode(node, model);
|
|
191
|
-
}
|
|
192
|
-
if (node.type === "ResultSetTooLarge") {
|
|
193
|
-
return {
|
|
194
|
-
id: node.id,
|
|
195
|
-
parentNodeId,
|
|
196
|
-
type: node.type,
|
|
197
|
-
resultSetSizeLimit: node.resultSetSizeLimit,
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
if (node.type === "NoFilterMatches") {
|
|
201
|
-
return {
|
|
202
|
-
id: node.id,
|
|
203
|
-
parentNodeId,
|
|
204
|
-
type: node.type,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
return {
|
|
208
|
-
id: node.id,
|
|
209
|
-
parentNodeId,
|
|
210
|
-
type: node.type,
|
|
211
|
-
message: node.message,
|
|
212
|
-
};
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
function createPresentationHierarchyNode(modelNode, model) {
|
|
216
|
-
let children;
|
|
217
|
-
return {
|
|
218
|
-
...toPresentationHierarchyNodeBase(modelNode),
|
|
219
|
-
get children() {
|
|
220
|
-
if (!children) {
|
|
221
|
-
children = generateTreeStructure(modelNode.id, model);
|
|
222
|
-
}
|
|
223
|
-
return children ? children : modelNode.children === true ? true : [];
|
|
224
|
-
},
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
function toPresentationHierarchyNodeBase(node) {
|
|
228
|
-
return {
|
|
229
|
-
id: node.id,
|
|
230
|
-
label: node.label,
|
|
231
|
-
nodeData: node.nodeData,
|
|
232
|
-
isLoading: !!node.isLoading,
|
|
233
|
-
isExpanded: !!node.isExpanded,
|
|
234
|
-
isFilterable: !presentation_hierarchies_1.HierarchyNode.isGroupingNode(node.nodeData) && !!node.nodeData.supportsFiltering && node.children,
|
|
235
|
-
isFiltered: !!node.instanceFilter,
|
|
236
|
-
extendedData: node.nodeData.extendedData,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
function useLatest(value) {
|
|
240
|
-
const ref = (0, react_1.useRef)(value);
|
|
241
|
-
(0, react_1.useEffect)(() => {
|
|
242
|
-
ref.current = value;
|
|
243
|
-
}, [value]);
|
|
244
|
-
return ref;
|
|
245
|
-
}
|
|
246
|
-
//# sourceMappingURL=UseTree.js.map
|