@itwin/tree-widget-react 1.0.0 → 1.1.1
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 +49 -181
- package/lib/cjs/TreeWidget.d.ts +1 -0
- package/lib/cjs/TreeWidget.js +10 -3
- package/lib/cjs/TreeWidget.js.map +1 -1
- package/lib/cjs/components/SelectableTree.scss +0 -1
- package/lib/cjs/components/trees/VisibilityTreeBase.scss +55 -84
- package/lib/cjs/components/trees/VisibilityTreeRenderer.d.ts +4 -3
- package/lib/cjs/components/trees/VisibilityTreeRenderer.js +5 -4
- package/lib/cjs/components/trees/VisibilityTreeRenderer.js.map +1 -1
- package/lib/cjs/components/trees/category-tree/CategoriesTree.d.ts +1 -1
- package/lib/cjs/components/trees/category-tree/CategoriesTree.js +13 -1
- package/lib/cjs/components/trees/category-tree/CategoriesTree.js.map +1 -1
- package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.d.ts +2 -2
- package/lib/cjs/components/trees/common/ContextMenu.d.ts +39 -0
- package/lib/cjs/components/trees/common/ContextMenu.js +44 -0
- package/lib/cjs/components/trees/common/ContextMenu.js.map +1 -0
- package/lib/cjs/components/trees/common/TreeNodeRenderer.d.ts +61 -0
- package/lib/cjs/components/trees/common/TreeNodeRenderer.js +50 -0
- package/lib/cjs/components/trees/common/TreeNodeRenderer.js.map +1 -0
- package/lib/cjs/components/trees/common/TreeRenderer.d.ts +26 -0
- package/lib/cjs/components/trees/common/TreeRenderer.js +41 -0
- package/lib/cjs/components/trees/common/TreeRenderer.js.map +1 -0
- package/lib/cjs/components/trees/common/TreeRenderer.scss +102 -0
- package/lib/cjs/components/trees/{Common.d.ts → common/Types.d.ts} +3 -2
- package/lib/cjs/components/trees/{Common.js → common/Types.js} +1 -1
- package/lib/cjs/components/trees/common/Types.js.map +1 -0
- package/lib/cjs/components/trees/common/Utils.d.ts +11 -0
- package/lib/cjs/components/trees/common/Utils.js +49 -0
- package/lib/cjs/components/trees/common/Utils.js.map +1 -0
- package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +1 -1
- package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js +9 -4
- package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
- package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +7 -1
- package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +1 -4
- package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
- package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.d.ts +1 -1
- package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js +8 -2
- package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
- package/lib/cjs/components/trees/index.d.ts +4 -2
- package/lib/cjs/components/trees/index.js +4 -2
- package/lib/cjs/components/trees/index.js.map +1 -1
- package/lib/cjs/components/trees/models-tree/ModelsTree.d.ts +6 -4
- package/lib/cjs/components/trees/models-tree/ModelsTree.js +25 -10
- package/lib/cjs/components/trees/models-tree/ModelsTree.js.map +1 -1
- package/lib/cjs/components/trees/models-tree/Utils.d.ts +2 -2
- package/lib/cjs/components/trees/models-tree/Utils.js +269 -335
- package/lib/cjs/components/trees/models-tree/Utils.js.map +1 -1
- package/lib/cjs/e2e-tests/TreeWidget.test.d.ts +2 -0
- package/lib/cjs/e2e-tests/TreeWidget.test.js +46 -0
- package/lib/cjs/e2e-tests/TreeWidget.test.js.map +1 -0
- package/lib/cjs/e2e-tests/utils.d.ts +8 -0
- package/lib/cjs/e2e-tests/utils.js +40 -0
- package/lib/cjs/e2e-tests/utils.js.map +1 -0
- package/lib/esm/TreeWidget.d.ts +1 -0
- package/lib/esm/TreeWidget.js +10 -3
- package/lib/esm/TreeWidget.js.map +1 -1
- package/lib/esm/components/SelectableTree.scss +0 -1
- package/lib/esm/components/trees/VisibilityTreeBase.scss +55 -84
- package/lib/esm/components/trees/VisibilityTreeRenderer.d.ts +4 -3
- package/lib/esm/components/trees/VisibilityTreeRenderer.js +6 -5
- package/lib/esm/components/trees/VisibilityTreeRenderer.js.map +1 -1
- package/lib/esm/components/trees/category-tree/CategoriesTree.d.ts +1 -1
- package/lib/esm/components/trees/category-tree/CategoriesTree.js +10 -1
- package/lib/esm/components/trees/category-tree/CategoriesTree.js.map +1 -1
- package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.d.ts +2 -2
- package/lib/esm/components/trees/common/ContextMenu.d.ts +39 -0
- package/lib/esm/components/trees/common/ContextMenu.js +39 -0
- package/lib/esm/components/trees/common/ContextMenu.js.map +1 -0
- package/lib/esm/components/trees/common/TreeNodeRenderer.d.ts +61 -0
- package/lib/esm/components/trees/common/TreeNodeRenderer.js +44 -0
- package/lib/esm/components/trees/common/TreeNodeRenderer.js.map +1 -0
- package/lib/esm/components/trees/common/TreeRenderer.d.ts +26 -0
- package/lib/esm/components/trees/common/TreeRenderer.js +34 -0
- package/lib/esm/components/trees/common/TreeRenderer.js.map +1 -0
- package/lib/esm/components/trees/common/TreeRenderer.scss +102 -0
- package/lib/esm/components/trees/{Common.d.ts → common/Types.d.ts} +3 -2
- package/lib/esm/components/trees/{Common.js → common/Types.js} +1 -1
- package/lib/esm/components/trees/common/Types.js.map +1 -0
- package/lib/esm/components/trees/common/Utils.d.ts +11 -0
- package/lib/esm/components/trees/common/Utils.js +42 -0
- package/lib/esm/components/trees/common/Utils.js.map +1 -0
- package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +1 -1
- package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js +9 -4
- package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
- package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +7 -1
- package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +1 -4
- package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
- package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.d.ts +1 -1
- package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js +8 -2
- package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
- package/lib/esm/components/trees/index.d.ts +4 -2
- package/lib/esm/components/trees/index.js +4 -2
- package/lib/esm/components/trees/index.js.map +1 -1
- package/lib/esm/components/trees/models-tree/ModelsTree.d.ts +6 -4
- package/lib/esm/components/trees/models-tree/ModelsTree.js +19 -7
- package/lib/esm/components/trees/models-tree/ModelsTree.js.map +1 -1
- package/lib/esm/components/trees/models-tree/Utils.d.ts +2 -2
- package/lib/esm/components/trees/models-tree/Utils.js +267 -333
- package/lib/esm/components/trees/models-tree/Utils.js.map +1 -1
- package/lib/esm/e2e-tests/TreeWidget.test.d.ts +2 -0
- package/lib/esm/e2e-tests/TreeWidget.test.js +41 -0
- package/lib/esm/e2e-tests/TreeWidget.test.js.map +1 -0
- package/lib/esm/e2e-tests/utils.d.ts +8 -0
- package/lib/esm/e2e-tests/utils.js +30 -0
- package/lib/esm/e2e-tests/utils.js.map +1 -0
- package/package.json +6 -2
- package/lib/cjs/components/trees/Common.js.map +0 -1
- package/lib/esm/components/trees/Common.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VisibilityTreeRenderer.js","sourceRoot":"","sources":["../../../../src/components/trees/VisibilityTreeRenderer.tsx"],"names":[],"mappings":";;;;;;;AAAA;;;+FAG+F;AAE/F,iCAAkC;AAClC,
|
|
1
|
+
{"version":3,"file":"VisibilityTreeRenderer.js","sourceRoot":"","sources":["../../../../src/components/trees/VisibilityTreeRenderer.tsx"],"names":[],"mappings":";;;;;;;AAAA;;;+FAG+F;AAE/F,4DAAoC;AACpC,iCAAkC;AAClC,8DAA4E;AAC5E,wDAAgD;AAChD,4EAAwF;AACxF,wDAAqD;AAQrD;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAoClC;;;GAGG;AACH,SAAgB,4BAA4B,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,EAA+B;IAC3G,OAAO,SAAS,sBAAsB,CAAC,SAA4B;QACjE,OAAO,uBAAC,2BAAY,OAAK,SAAS,KAAM,SAAS,EAAE,YAAY,EAAE,gCAAgC,CAAC,iBAAiB,CAAC,GAAI,CAAC;IAC3H,CAAC,CAAC;AACJ,CAAC;AAJD,oEAIC;AAED,MAAM,WAAW,GAAG,IAAI,kCAAe,EAAE,CAAC;AAE1C;;;GAGG;AACH,SAAgB,gCAAgC,CAAC,EAAE,WAAW,GAAG,EAAE,EAAE,uBAAuB,GAAG,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAmC;IACvK,OAAO,SAAS,0BAA0B,CAAC,aAAoC;QAC7E,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChI,OAAO,CACL,uBAAC,mCAAgB,OACX,aAAa,EACjB,IAAI,EAAE,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,EACzD,gBAAgB,EAAE,CAAC,aAAsC,EAAE,EAAE,CAAC,CAC5D,gCAAK,SAAS,EAAC,oCAAoC,EAAC,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,UAAU,IAAI,EAAE,YAC3F,uBAAC,0BAA0B,OAAK,aAAa,GAAI,GAC7C,CACP,EACD,kBAAkB,EAAE,kBAAkB,EACtC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EACnD,SAAS,EAAE,IAAA,oBAAU,EAAC,eAAe,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,IAAI,kBAAkB,EAAE,aAAa,CAAC,SAAS,CAAC,GACvM,CACH,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAlBD,4EAkBC;AAED;;;GAGG;AACH,SAAgB,0BAA0B,CAAC,KAA8B;IACvE,OAAO,uBAAC,wBAAQ,IACd,SAAS,EAAC,0BAA0B,EACpC,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,EACxD,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,KAAK,CAAC,KAAK,GAClB,CAAC;AACL,CAAC;AATD,gEASC;AAED;;;GAGG;AACH,SAAgB,0BAA0B,CACxC,UAA6E,EAC7E,UAAqC,EACrC,eAAqG;IAErG,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC;IACtG,MAAM,EACJ,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,qBAAqB,GACtB,GAAG,IAAA,gEAAsC,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAErF,IAAA,iBAAS,EACP,GAAG,EAAE;QACH,IAAI,MAAM,IAAI,YAAY,KAAK,SAAS,IAAI,kBAAkB,KAAK,UAAU;YAC3E,eAAe,IAAI,eAAe,CAAC,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACtF,CAAC,EACD,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,eAAe,CAAC,CACxE,CAAC;IAEF,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;AACpE,CAAC;AAtBD,gEAsBC;AAWD;;;GAGG;AACH,SAAgB,4BAA4B,CAAC,KAAwC;IACnF,OAAO,CACL,iCAAK,SAAS,EAAC,8BAA8B,aAC3C,iCAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,CAAC,KAAK,GAAQ,EAC1D,iCAAM,SAAS,EAAC,mBAAmB,YAAE,KAAK,CAAC,OAAO,GAAQ,IACtD,CACP,CAAC;AACJ,CAAC;AAPD,oEAOC","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 classNames from \"classnames\";\nimport { useEffect } from \"react\";\nimport { TreeImageLoader, TreeNodeRenderer } from \"@itwin/components-react\";\nimport { Checkbox } from \"@itwin/itwinui-react\";\nimport { useControlledPresentationTreeFiltering } from \"@itwin/presentation-components\";\nimport { TreeRenderer } from \"./common/TreeRenderer\";\n\nimport type { TreeRendererBaseProps } from \"./common/TreeRenderer\";\nimport type { AbstractTreeNodeLoaderWithProvider, TreeNodeRendererProps, TreeRendererProps } from \"@itwin/components-react\";\nimport type { NodeCheckboxRenderProps } from \"@itwin/core-react\";\nimport type { IPresentationTreeDataProvider } from \"@itwin/presentation-components\";\nimport type { VisibilityTreeFilterInfo } from \"./common/Types\";\n\n/**\n * This constant is taken from `@itwin/core-react`.\n * Defines the size in pixels of the expansion toggle.\n * It is used to keep same hierarchy nodes with children and nodes without children in the same line.\n * @note This value applies only to the leaf nodes.\n */\nconst EXPANSION_TOGGLE_WIDTH = 24;\n\n/**\n * Props for visibility tree renderer.\n * @public\n */\nexport interface VisibilityTreeRendererProps extends TreeRendererBaseProps {\n /** Props for single node renderer. */\n nodeRendererProps: VisibilityTreeNodeRendererProps;\n}\n\n/**\n * Props for visibility tree node renderer.\n * @public\n */\nexport interface VisibilityTreeNodeRendererProps {\n /**\n * Specifies whether the icon at the left of the node label should be rendered.\n */\n iconsEnabled: boolean;\n /**\n * Specifies whether node description should be enabled.\n */\n descriptionEnabled: boolean;\n /**\n * Defines the offset in pixels of how much each hierarchy level should be offset to the right from the checkbox.\n * Defaults to `20`.\n */\n levelOffset?: number;\n /**\n * Specifies whether the root node be expanded at all times.\n * Defaults to `false`.\n */\n disableRootNodeCollapse?: boolean;\n}\n\n/**\n * Creates Visibility tree renderer which renders nodes with eye checkbox.\n * @public\n */\nexport function createVisibilityTreeRenderer({ nodeRendererProps, ...restProps }: VisibilityTreeRendererProps) {\n return function VisibilityTreeRenderer(treeProps: TreeRendererProps) {\n return <TreeRenderer {...treeProps} {...restProps} nodeRenderer={createVisibilityTreeNodeRenderer(nodeRendererProps)} />;\n };\n}\n\nconst imageLoader = new TreeImageLoader();\n\n/**\n * Creates node renderer which renders node with eye checkbox.\n * @public\n */\nexport function createVisibilityTreeNodeRenderer({ levelOffset = 20, disableRootNodeCollapse = false, descriptionEnabled, iconsEnabled }: VisibilityTreeNodeRendererProps) {\n return function VisibilityTreeNodeRenderer(treeNodeProps: TreeNodeRendererProps) {\n const nodeOffset = treeNodeProps.node.depth * levelOffset + (treeNodeProps.node.numChildren === 0 ? EXPANSION_TOGGLE_WIDTH : 0);\n return (\n <TreeNodeRenderer\n {...treeNodeProps}\n node={{ ...treeNodeProps.node, depth: 0, numChildren: 1 }} // if we want to disable TreeNodeRenderer style calculations for tree nodes, we need to override these values.\n checkboxRenderer={(checkboxProps: NodeCheckboxRenderProps) => (\n <div className=\"visibility-tree-checkbox-container\" style={{ marginRight: `${nodeOffset}px` }}>\n <VisibilityTreeNodeCheckbox {...checkboxProps} />\n </div>\n )}\n descriptionEnabled={descriptionEnabled}\n imageLoader={iconsEnabled ? imageLoader : undefined}\n className={classNames(\"with-checkbox\", (treeNodeProps.node.numChildren === 0 || (disableRootNodeCollapse && treeNodeProps.node.parentId === undefined)) && \"disable-expander\", treeNodeProps.className)}\n />\n );\n };\n}\n\n/**\n * Checkbox renderer that renders an eye.\n * @public\n */\nexport function VisibilityTreeNodeCheckbox(props: NodeCheckboxRenderProps) {\n return <Checkbox\n className=\"visibility-tree-checkbox\"\n variant=\"eyeball\"\n checked={props.checked}\n onChange={(e) => props.onChange(e.currentTarget.checked)}\n disabled={props.disabled}\n title={props.title}\n />;\n}\n\n/**\n * Filters data provider used in supplied node loader and invokes onFilterApplied when filtering is completed.\n * @public\n */\nexport function useVisibilityTreeFiltering(\n nodeLoader: AbstractTreeNodeLoaderWithProvider<IPresentationTreeDataProvider>,\n filterInfo?: VisibilityTreeFilterInfo,\n onFilterApplied?: (filteredDataProvider: IPresentationTreeDataProvider, matchesCount: number) => void,\n) {\n const { filter, activeMatchIndex } = filterInfo ?? { filter: undefined, activeMatchIndex: undefined };\n const {\n filteredNodeLoader,\n isFiltering,\n matchesCount,\n nodeHighlightingProps,\n } = useControlledPresentationTreeFiltering({ nodeLoader, filter, activeMatchIndex });\n\n useEffect(\n () => {\n if (filter && matchesCount !== undefined && filteredNodeLoader !== nodeLoader)\n onFilterApplied && onFilterApplied(filteredNodeLoader.dataProvider, matchesCount);\n },\n [filter, matchesCount, nodeLoader, filteredNodeLoader, onFilterApplied],\n );\n\n return { filteredNodeLoader, isFiltering, nodeHighlightingProps };\n}\n\n/**\n * Properties for [[VisibilityTreeNoFilteredData]] component.\n * @public\n */\nexport interface VisibilityTreeNoFilteredDataProps {\n title: string;\n message: string;\n}\n\n/**\n * Renders message that no nodes was found for filter.\n * @public\n */\nexport function VisibilityTreeNoFilteredData(props: VisibilityTreeNoFilteredDataProps) {\n return (\n <div className=\"components-tree-errormessage\">\n <span className=\"errormessage-header\">{props.title}</span>\n <span className=\"errormessage-body\">{props.message}</span>\n </div>\n );\n}\n"]}
|
|
@@ -3,7 +3,7 @@ import "../VisibilityTreeBase.scss";
|
|
|
3
3
|
import { CategoryVisibilityHandler } from "./CategoryVisibilityHandler";
|
|
4
4
|
import type { ViewManager, Viewport } from "@itwin/core-frontend";
|
|
5
5
|
import type { Ruleset } from "@itwin/presentation-common";
|
|
6
|
-
import type { BaseFilterableTreeProps } from "../
|
|
6
|
+
import type { BaseFilterableTreeProps } from "../common/Types";
|
|
7
7
|
import type { CategoryInfo } from "./CategoryVisibilityHandler";
|
|
8
8
|
/**
|
|
9
9
|
* Presentation rules used by ControlledCategoriesTree
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.CategoryTree = exports.RULESET_CATEGORIES = void 0;
|
|
4
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
@@ -7,6 +10,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
7
10
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
8
11
|
*--------------------------------------------------------------------------------------------*/
|
|
9
12
|
require("../VisibilityTreeBase.scss");
|
|
13
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
10
14
|
const react_1 = require("react");
|
|
11
15
|
const components_react_1 = require("@itwin/components-react");
|
|
12
16
|
const core_frontend_1 = require("@itwin/core-frontend");
|
|
@@ -14,6 +18,7 @@ const core_react_1 = require("@itwin/core-react");
|
|
|
14
18
|
const presentation_components_1 = require("@itwin/presentation-components");
|
|
15
19
|
const presentation_frontend_1 = require("@itwin/presentation-frontend");
|
|
16
20
|
const TreeWidget_1 = require("../../../TreeWidget");
|
|
21
|
+
const Utils_1 = require("../common/Utils");
|
|
17
22
|
const VisibilityTreeEventHandler_1 = require("../VisibilityTreeEventHandler");
|
|
18
23
|
const VisibilityTreeRenderer_1 = require("../VisibilityTreeRenderer");
|
|
19
24
|
const CategoryVisibilityHandler_1 = require("./CategoryVisibilityHandler");
|
|
@@ -32,6 +37,7 @@ function CategoryTree(props) {
|
|
|
32
37
|
imodel: props.iModel,
|
|
33
38
|
ruleset: exports.RULESET_CATEGORIES,
|
|
34
39
|
pagingSize: PAGING_SIZE,
|
|
40
|
+
customizeTreeNodeItem,
|
|
35
41
|
});
|
|
36
42
|
const { filteredNodeLoader, isFiltering, nodeHighlightingProps } = (0, VisibilityTreeRenderer_1.useVisibilityTreeFiltering)(nodeLoader, props.filterInfo, props.onFilterApplied);
|
|
37
43
|
// istanbul ignore next
|
|
@@ -47,6 +53,9 @@ function CategoryTree(props) {
|
|
|
47
53
|
}), [filteredNodeLoader, visibilityHandler]));
|
|
48
54
|
const treeModel = (0, components_react_1.useTreeModel)(filteredNodeLoader.modelSource);
|
|
49
55
|
const treeRenderer = (0, VisibilityTreeRenderer_1.createVisibilityTreeRenderer)({
|
|
56
|
+
contextMenuItems: props.contextMenuItems,
|
|
57
|
+
nodeLabelRenderer: props.nodeLabelRenderer,
|
|
58
|
+
density: props.density,
|
|
50
59
|
nodeRendererProps: {
|
|
51
60
|
iconsEnabled: false,
|
|
52
61
|
descriptionEnabled: true,
|
|
@@ -58,7 +67,7 @@ function CategoryTree(props) {
|
|
|
58
67
|
const noFilteredDataRenderer = (0, react_1.useCallback)(() => {
|
|
59
68
|
return (0, jsx_runtime_1.jsx)(VisibilityTreeRenderer_1.VisibilityTreeNoFilteredData, { title: TreeWidget_1.TreeWidget.translate("categoriesTree.noCategoryFound"), message: TreeWidget_1.TreeWidget.translate("categoriesTree.noMatchingCategoryNames") });
|
|
60
69
|
}, []);
|
|
61
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: "tree-widget-visibility-tree-base", children: [(0, jsx_runtime_1.jsx)(components_react_1.ControlledTree, { nodeLoader: filteredNodeLoader, model: treeModel, selectionMode: props.selectionMode ?? components_react_1.SelectionMode.None, eventsHandler: eventHandler, treeRenderer: treeRenderer, descriptionsEnabled: true, nodeHighlightingProps: nodeHighlightingProps, noDataRenderer: filterApplied ? noFilteredDataRenderer : undefined, width: props.width, height: props.height }), overlay] }));
|
|
70
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)("tree-widget-visibility-tree-base", "tree-widget-tree-container"), children: [(0, jsx_runtime_1.jsx)(components_react_1.ControlledTree, { nodeLoader: filteredNodeLoader, model: treeModel, selectionMode: props.selectionMode ?? components_react_1.SelectionMode.None, eventsHandler: eventHandler, treeRenderer: treeRenderer, descriptionsEnabled: true, nodeHighlightingProps: nodeHighlightingProps, noDataRenderer: filterApplied ? noFilteredDataRenderer : undefined, width: props.width, height: props.height }), overlay] }));
|
|
62
71
|
}
|
|
63
72
|
exports.CategoryTree = CategoryTree;
|
|
64
73
|
function useCategoryVisibilityHandler(viewManager, imodel, categories, activeView, allViewports, visibilityHandler) {
|
|
@@ -72,4 +81,7 @@ async function setViewType(activeView) {
|
|
|
72
81
|
const viewType = view.is3d() ? "3d" : "2d"; // eslint-disable-line @itwin/no-internal
|
|
73
82
|
await presentation_frontend_1.Presentation.presentation.vars(exports.RULESET_CATEGORIES.id).setString("ViewType", viewType);
|
|
74
83
|
}
|
|
84
|
+
const customizeTreeNodeItem = (0, Utils_1.combineTreeNodeItemCustomizations)([
|
|
85
|
+
Utils_1.addCustomTreeNodeItemLabelRenderer,
|
|
86
|
+
]);
|
|
75
87
|
//# sourceMappingURL=CategoriesTree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/category-tree/CategoriesTree.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CategoriesTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/category-tree/CategoriesTree.tsx"],"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 \"../VisibilityTreeBase.scss\";\nimport classNames from \"classnames\";\nimport { useCallback, useEffect } from \"react\";\nimport { ControlledTree, SelectionMode, useTreeModel } from \"@itwin/components-react\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { useDisposable } from \"@itwin/core-react\";\nimport { usePresentationTreeNodeLoader } from \"@itwin/presentation-components\";\nimport { Presentation } from \"@itwin/presentation-frontend\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { addCustomTreeNodeItemLabelRenderer, combineTreeNodeItemCustomizations } from \"../common/Utils\";\nimport { VisibilityTreeEventHandler } from \"../VisibilityTreeEventHandler\";\nimport { createVisibilityTreeRenderer, useVisibilityTreeFiltering, VisibilityTreeNoFilteredData } from \"../VisibilityTreeRenderer\";\nimport { CategoryVisibilityHandler } from \"./CategoryVisibilityHandler\";\n\nimport type { IModelConnection, SpatialViewState, ViewManager, Viewport } from \"@itwin/core-frontend\";\nimport type { Ruleset } from \"@itwin/presentation-common\";\nimport type { BaseFilterableTreeProps } from \"../common/Types\";\nimport type { CategoryInfo } from \"./CategoryVisibilityHandler\";\n\nconst PAGING_SIZE = 20;\n\n/**\n * Presentation rules used by ControlledCategoriesTree\n * @internal\n */\nexport const RULESET_CATEGORIES: Ruleset = require(\"./Categories.json\"); // eslint-disable-line @typescript-eslint/no-var-requires\n\n/**\n * Properties for the [[CategoryTree]] component\n * @public\n */\nexport interface CategoryTreeProps extends BaseFilterableTreeProps {\n /** Flag for accommodating all viewports */\n allViewports?: boolean;\n /** Active viewport */\n activeView: Viewport;\n /**\n * Available iModel categories\n */\n categories: CategoryInfo[];\n /**\n * Custom category visibility handler to use for testing\n * @internal\n */\n categoryVisibilityHandler?: CategoryVisibilityHandler;\n /**\n * Custom view manager to use for testing\n * @internal\n */\n viewManager?: ViewManager;\n}\n\n/**\n * Tree which displays and manages display of categories contained in an iModel.\n * @public\n */\nexport function CategoryTree(props: CategoryTreeProps) {\n const { nodeLoader } = usePresentationTreeNodeLoader({\n imodel: props.iModel,\n ruleset: RULESET_CATEGORIES,\n pagingSize: PAGING_SIZE,\n customizeTreeNodeItem,\n });\n\n const { filteredNodeLoader, isFiltering, nodeHighlightingProps } = useVisibilityTreeFiltering(nodeLoader, props.filterInfo, props.onFilterApplied);\n // istanbul ignore next\n const viewManager = props.viewManager ?? IModelApp.viewManager;\n const { activeView, allViewports, categoryVisibilityHandler } = props;\n const visibilityHandler = useCategoryVisibilityHandler(viewManager, props.iModel, props.categories, activeView, allViewports, categoryVisibilityHandler);\n\n useEffect(() => {\n setViewType(activeView); // eslint-disable-line @typescript-eslint/no-floating-promises\n }, [activeView]);\n\n const eventHandler = useDisposable(useCallback(() => new VisibilityTreeEventHandler({\n nodeLoader: filteredNodeLoader,\n visibilityHandler,\n }), [filteredNodeLoader, visibilityHandler]));\n\n const treeModel = useTreeModel(filteredNodeLoader.modelSource);\n const treeRenderer = createVisibilityTreeRenderer({\n contextMenuItems: props.contextMenuItems,\n nodeLabelRenderer: props.nodeLabelRenderer,\n density: props.density,\n nodeRendererProps: {\n iconsEnabled: false,\n descriptionEnabled: true,\n levelOffset: 10,\n },\n });\n const overlay = isFiltering ? <div className=\"filteredTreeOverlay\" /> : undefined;\n const filterApplied = filteredNodeLoader !== nodeLoader;\n\n const noFilteredDataRenderer = useCallback(() => {\n return <VisibilityTreeNoFilteredData\n title={TreeWidget.translate(\"categoriesTree.noCategoryFound\")}\n message={TreeWidget.translate(\"categoriesTree.noMatchingCategoryNames\")}\n />;\n }, []);\n\n return (\n <div className={classNames(\"tree-widget-visibility-tree-base\", \"tree-widget-tree-container\")}>\n <ControlledTree\n nodeLoader={filteredNodeLoader}\n model={treeModel}\n selectionMode={props.selectionMode ?? SelectionMode.None}\n eventsHandler={eventHandler}\n treeRenderer={treeRenderer}\n descriptionsEnabled={true}\n nodeHighlightingProps={nodeHighlightingProps}\n noDataRenderer={filterApplied ? noFilteredDataRenderer : undefined}\n width={props.width}\n height={props.height}\n />\n {overlay}\n </div>\n );\n}\n\nfunction useCategoryVisibilityHandler(viewManager: ViewManager, imodel: IModelConnection, categories: CategoryInfo[], activeView: Viewport, allViewports?: boolean, visibilityHandler?: CategoryVisibilityHandler) {\n const defaultVisibilityHandler = useDisposable(useCallback(\n () =>\n new CategoryVisibilityHandler({ viewManager, imodel, categories, activeView, allViewports }),\n [viewManager, imodel, categories, activeView, allViewports]),\n );\n // istanbul ignore next\n return visibilityHandler ?? defaultVisibilityHandler;\n}\n\nasync function setViewType(activeView: Viewport) {\n const view = activeView.view as SpatialViewState;\n // TODO: remove this eslint rule when tree-widget uses itwinjs-core 4.0.0 version\n const viewType = view.is3d() ? \"3d\" : \"2d\"; // eslint-disable-line @itwin/no-internal\n await Presentation.presentation.vars(RULESET_CATEGORIES.id).setString(\"ViewType\", viewType);\n}\n\nconst customizeTreeNodeItem = combineTreeNodeItemCustomizations([\n addCustomTreeNodeItemLabelRenderer,\n]);\n"]}
|
|
@@ -44,8 +44,8 @@ export declare class CategoryVisibilityHandler implements IVisibilityHandler {
|
|
|
44
44
|
onVisibilityChange: BeEvent<VisibilityChangeListener>;
|
|
45
45
|
getVisibilityStatus(node: TreeNodeItem): VisibilityStatus;
|
|
46
46
|
changeVisibility(node: TreeNodeItem, shouldDisplay: boolean): Promise<void>;
|
|
47
|
-
getSubCategoryVisibility(id: string): "
|
|
48
|
-
getCategoryVisibility(id: string): "
|
|
47
|
+
getSubCategoryVisibility(id: string): "hidden" | "visible";
|
|
48
|
+
getCategoryVisibility(id: string): "hidden" | "visible";
|
|
49
49
|
getParent(key: string): CategoryInfo | undefined;
|
|
50
50
|
private onDisplayStyleChanged;
|
|
51
51
|
private onViewedCategoriesChanged;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { MouseEvent, PropsWithChildren, ReactNode } from "react";
|
|
2
|
+
import type { TreeModelNode } from "@itwin/components-react";
|
|
3
|
+
/**
|
|
4
|
+
* Props for single context menu item.
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export interface ContextMenuItemProps {
|
|
8
|
+
node: TreeModelNode;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Props for configuring tree context menu.
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
export interface TreeContextMenuProps {
|
|
15
|
+
contextMenuItems?: Array<(props: ContextMenuItemProps) => ReactNode>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Props for [[TreeContextMenuItem]] component.
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export interface TreeContextMenuItemProps {
|
|
22
|
+
/** Unique id of the context menu item. */
|
|
23
|
+
id: string;
|
|
24
|
+
/** Description of the context menu item. */
|
|
25
|
+
title?: string;
|
|
26
|
+
/** Callback that is invoked when context menu item is clicked. */
|
|
27
|
+
onSelect: () => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Base component for rendering single context menu item.
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export declare function TreeContextMenuItem({ id, children, title, onSelect }: PropsWithChildren<TreeContextMenuItemProps>): JSX.Element;
|
|
34
|
+
/** @internal */
|
|
35
|
+
export declare function useContextMenu({ contextMenuItems }: TreeContextMenuProps): {
|
|
36
|
+
onContextMenu: (e: MouseEvent, node: TreeModelNode) => void;
|
|
37
|
+
renderContextMenu: () => JSX.Element | null;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=ContextMenu.d.ts.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useContextMenu = exports.TreeContextMenuItem = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/*---------------------------------------------------------------------------------------------
|
|
6
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
7
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
8
|
+
*--------------------------------------------------------------------------------------------*/
|
|
9
|
+
const react_1 = require("react");
|
|
10
|
+
const core_react_1 = require("@itwin/core-react");
|
|
11
|
+
/**
|
|
12
|
+
* Base component for rendering single context menu item.
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
function TreeContextMenuItem({ id, children, title, onSelect }) {
|
|
16
|
+
return (0, jsx_runtime_1.jsx)(core_react_1.ContextMenuItem, { onSelect: onSelect, title: title, children: children }, id);
|
|
17
|
+
}
|
|
18
|
+
exports.TreeContextMenuItem = TreeContextMenuItem;
|
|
19
|
+
/** @internal */
|
|
20
|
+
function useContextMenu({ contextMenuItems }) {
|
|
21
|
+
const [contextMenu, setContextMenu] = (0, react_1.useState)();
|
|
22
|
+
const close = () => setContextMenu(undefined);
|
|
23
|
+
const onContextMenu = (e, node) => {
|
|
24
|
+
if (!contextMenuItems) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
setContextMenu({
|
|
28
|
+
items: contextMenuItems.map((item, index) => (0, jsx_runtime_1.jsx)(react_1.Fragment, { children: item({ node }) }, index)),
|
|
29
|
+
position: { x: e.clientX, y: e.clientY },
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const renderContextMenu = () => {
|
|
33
|
+
if (!contextMenu) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return ((0, jsx_runtime_1.jsx)(core_react_1.GlobalContextMenu, { identifier: "tree-widget-context-menu", x: contextMenu.position.x, y: contextMenu.position.y, opened: true, onOutsideClick: close, onEsc: close, onSelect: close, children: contextMenu.items }));
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
onContextMenu,
|
|
40
|
+
renderContextMenu,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
exports.useContextMenu = useContextMenu;
|
|
44
|
+
//# sourceMappingURL=ContextMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.js","sourceRoot":"","sources":["../../../../../src/components/trees/common/ContextMenu.tsx"],"names":[],"mappings":";;;;AAAA;;;+FAG+F;AAE/F,iCAA2C;AAC3C,kDAAuE;AAkCvE;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAA+C;IAChH,OAAO,uBAAC,4BAAe,IAErB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,YAEX,QAAQ,IAJJ,EAAE,CAKS,CAAC;AACrB,CAAC;AARD,kDAQC;AAOD,gBAAgB;AAChB,SAAgB,cAAc,CAAC,EAAE,gBAAgB,EAAwB;IACvE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,GAAe,CAAC;IAC9D,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,MAAM,aAAa,GAAG,CAAC,CAAa,EAAE,IAAmB,EAAE,EAAE;QAC3D,IAAI,CAAC,gBAAgB,EAAE;YACrB,OAAO;SACR;QAED,cAAc,CAAC;YACb,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,uBAAC,gBAAQ,cAAc,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,IAAtB,KAAK,CAA6B,CAAC;YAC/F,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;SACzC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO,IAAI,CAAC;SACb;QAED,OAAO,CACL,uBAAC,8BAAiB,IAChB,UAAU,EAAC,0BAA0B,EACrC,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,EACzB,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,EACzB,MAAM,EAAE,IAAI,EACZ,cAAc,EAAE,KAAK,EACrB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,KAAK,YAEd,WAAW,CAAC,KAAK,GACA,CACrB,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,aAAa;QACb,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAvCD,wCAuCC","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 { Fragment, useState } from \"react\";\nimport { ContextMenuItem, GlobalContextMenu } from \"@itwin/core-react\";\n\nimport type { MouseEvent, PropsWithChildren, ReactNode } from \"react\";\nimport type { TreeModelNode } from \"@itwin/components-react\";\n\n/**\n * Props for single context menu item.\n * @public\n */\nexport interface ContextMenuItemProps {\n node: TreeModelNode;\n}\n\n/**\n * Props for configuring tree context menu.\n * @public\n */\nexport interface TreeContextMenuProps {\n contextMenuItems?: Array<(props: ContextMenuItemProps) => ReactNode>;\n}\n\n/**\n * Props for [[TreeContextMenuItem]] component.\n * @public\n */\nexport interface TreeContextMenuItemProps {\n /** Unique id of the context menu item. */\n id: string;\n /** Description of the context menu item. */\n title?: string;\n /** Callback that is invoked when context menu item is clicked. */\n onSelect: () => void;\n}\n\n/**\n * Base component for rendering single context menu item.\n * @public\n */\nexport function TreeContextMenuItem({ id, children, title, onSelect }: PropsWithChildren<TreeContextMenuItemProps>) {\n return <ContextMenuItem\n key={id}\n onSelect={onSelect}\n title={title}\n >\n {children}\n </ContextMenuItem>;\n}\n\ninterface ContextMenu {\n items: ReactNode[];\n position: {x: number, y: number};\n}\n\n/** @internal */\nexport function useContextMenu({ contextMenuItems }: TreeContextMenuProps) {\n const [contextMenu, setContextMenu] = useState<ContextMenu>();\n const close = () => setContextMenu(undefined);\n\n const onContextMenu = (e: MouseEvent, node: TreeModelNode) => {\n if (!contextMenuItems) {\n return;\n }\n\n setContextMenu({\n items: contextMenuItems.map((item, index) => <Fragment key={index}>{item({ node })}</Fragment>),\n position: { x: e.clientX, y: e.clientY },\n });\n };\n\n const renderContextMenu = () => {\n if (!contextMenu) {\n return null;\n }\n\n return (\n <GlobalContextMenu\n identifier=\"tree-widget-context-menu\"\n x={contextMenu.position.x}\n y={contextMenu.position.y}\n opened={true}\n onOutsideClick={close}\n onEsc={close}\n onSelect={close}\n >\n {contextMenu.items}\n </GlobalContextMenu>\n );\n };\n\n return {\n onContextMenu,\n renderContextMenu,\n };\n}\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { PropertyRecord } from "@itwin/appui-abstract";
|
|
3
|
+
import type { IPropertyValueRenderer, PropertyValueRendererContext, TreeModelNode } from "@itwin/components-react";
|
|
4
|
+
/**
|
|
5
|
+
* Context for rendering label value.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export interface LabelRendererContext {
|
|
9
|
+
/** Style that should be applied to the rendered element. */
|
|
10
|
+
style?: React.CSSProperties;
|
|
11
|
+
/** Callback to highlight text. */
|
|
12
|
+
textHighlighter?: (text: string) => React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Props for custom node renderer.
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
export interface TreeNodeLabelRendererProps {
|
|
19
|
+
/** Tree node to rendered label for. */
|
|
20
|
+
node: TreeModelNode;
|
|
21
|
+
/** Context for rendering node's label value. */
|
|
22
|
+
context?: LabelRendererContext;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Props for customizing node rendering.
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
export interface TreeNodeRendererProps {
|
|
29
|
+
/** Custom renderer for node's label. */
|
|
30
|
+
nodeLabelRenderer?: (props: TreeNodeLabelRendererProps) => ReactNode;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Props for [[DefaultLabelRenderer]] component.
|
|
34
|
+
* @public
|
|
35
|
+
*/
|
|
36
|
+
export interface DefaultLabelRendererProps {
|
|
37
|
+
/** Label that should be rendered. */
|
|
38
|
+
label: PropertyRecord;
|
|
39
|
+
/** Context for rendering label value. */
|
|
40
|
+
context?: LabelRendererContext;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Renders label for tree node.
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
46
|
+
export declare function DefaultLabelRenderer({ label, context }: DefaultLabelRendererProps): JSX.Element;
|
|
47
|
+
/** @internal */
|
|
48
|
+
export interface TreeNodeRendererContextProviderProps extends TreeNodeRendererProps {
|
|
49
|
+
node: TreeModelNode;
|
|
50
|
+
children: ReactNode;
|
|
51
|
+
}
|
|
52
|
+
/** @internal */
|
|
53
|
+
export declare function TreeNodeRendererContextProvider({ nodeLabelRenderer, node, children }: TreeNodeRendererContextProviderProps): JSX.Element;
|
|
54
|
+
/** @internal */
|
|
55
|
+
export declare const TREE_NODE_LABEL_RENDERER = "visibility-tree-node-label";
|
|
56
|
+
/** @internal */
|
|
57
|
+
export declare class TreeNodeLabelRenderer implements IPropertyValueRenderer {
|
|
58
|
+
canRender(record: PropertyRecord, _context?: PropertyValueRendererContext | undefined): boolean;
|
|
59
|
+
render(record: PropertyRecord, context?: PropertyValueRendererContext | undefined): ReactNode;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=TreeNodeRenderer.d.ts.map
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TreeNodeLabelRenderer = exports.TREE_NODE_LABEL_RENDERER = exports.TreeNodeRendererContextProvider = exports.DefaultLabelRenderer = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/*---------------------------------------------------------------------------------------------
|
|
6
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
7
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
8
|
+
*--------------------------------------------------------------------------------------------*/
|
|
9
|
+
const react_1 = require("react");
|
|
10
|
+
const components_react_1 = require("@itwin/components-react");
|
|
11
|
+
/**
|
|
12
|
+
* Renders label for tree node.
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
function DefaultLabelRenderer({ label, context }) {
|
|
16
|
+
const renderer = new components_react_1.PrimitivePropertyValueRenderer();
|
|
17
|
+
return renderer.render(label, context);
|
|
18
|
+
}
|
|
19
|
+
exports.DefaultLabelRenderer = DefaultLabelRenderer;
|
|
20
|
+
/** @internal */
|
|
21
|
+
function TreeNodeRendererContextProvider({ nodeLabelRenderer, node, children }) {
|
|
22
|
+
return ((0, jsx_runtime_1.jsx)(treeNodeLabelRendererContext.Provider, { value: { renderer: nodeLabelRenderer, node }, children: children }));
|
|
23
|
+
}
|
|
24
|
+
exports.TreeNodeRendererContextProvider = TreeNodeRendererContextProvider;
|
|
25
|
+
/** @internal */
|
|
26
|
+
exports.TREE_NODE_LABEL_RENDERER = "visibility-tree-node-label";
|
|
27
|
+
/** @internal */
|
|
28
|
+
class TreeNodeLabelRenderer {
|
|
29
|
+
canRender(record, _context) {
|
|
30
|
+
return record.property.renderer?.name === exports.TREE_NODE_LABEL_RENDERER;
|
|
31
|
+
}
|
|
32
|
+
render(record, context) {
|
|
33
|
+
const labelContext = {
|
|
34
|
+
style: context?.style,
|
|
35
|
+
textHighlighter: context?.textHighlighter,
|
|
36
|
+
};
|
|
37
|
+
return (0, jsx_runtime_1.jsx)(LabelRenderer, { record: record, context: labelContext });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.TreeNodeLabelRenderer = TreeNodeLabelRenderer;
|
|
41
|
+
const treeNodeLabelRendererContext = (0, react_1.createContext)(undefined);
|
|
42
|
+
function LabelRenderer({ record, context }) {
|
|
43
|
+
const renderContext = (0, react_1.useContext)(treeNodeLabelRendererContext);
|
|
44
|
+
if (!renderContext || !renderContext.renderer) {
|
|
45
|
+
return (0, jsx_runtime_1.jsx)(DefaultLabelRenderer, { label: record, context: context });
|
|
46
|
+
}
|
|
47
|
+
const { renderer, node } = renderContext;
|
|
48
|
+
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: renderer({ node, context }) });
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=TreeNodeRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNodeRenderer.js","sourceRoot":"","sources":["../../../../../src/components/trees/common/TreeNodeRenderer.tsx"],"names":[],"mappings":";;;;AAAA;;;+FAG+F;AAE/F,iCAAkD;AAClD,8DAAyE;AAkDzE;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,OAAO,EAA6B;IAChF,MAAM,QAAQ,GAAG,IAAI,iDAA8B,EAAE,CAAC;IACtD,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAHD,oDAGC;AAQD,gBAAgB;AAChB,SAAgB,+BAA+B,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAwC;IACzH,OAAO,CACL,uBAAC,4BAA4B,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAChF,QAAQ,GAC6B,CACzC,CAAC;AACJ,CAAC;AAND,0EAMC;AAED,gBAAgB;AACH,QAAA,wBAAwB,GAAG,4BAA4B,CAAC;AAErE,gBAAgB;AAChB,MAAa,qBAAqB;IACzB,SAAS,CAAC,MAAsB,EAAE,QAAmD;QAC1F,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,KAAK,gCAAwB,CAAC;IACrE,CAAC;IAEM,MAAM,CAAC,MAAsB,EAAE,OAAkD;QACtF,MAAM,YAAY,GAAyB;YACzC,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,eAAe,EAAE,OAAO,EAAE,eAAe;SAC1C,CAAC;QACF,OAAO,uBAAC,aAAa,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAI,CAAC;IAClE,CAAC;CACF;AAZD,sDAYC;AAOD,MAAM,4BAA4B,GAAG,IAAA,qBAAa,EAA2C,SAAS,CAAC,CAAC;AAOxG,SAAS,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAsB;IAC5D,MAAM,aAAa,GAAG,IAAA,kBAAU,EAAC,4BAA4B,CAAC,CAAC;IAE/D,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;QAC7C,OAAO,uBAAC,oBAAoB,IAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAI,CAAC;KAClE;IAED,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;IACzC,OAAO,2DAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,GAAI,CAAC;AAC5C,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 { createContext, useContext } from \"react\";\nimport { PrimitivePropertyValueRenderer } from \"@itwin/components-react\";\n\nimport type { ReactNode } from \"react\";\nimport type { PropertyRecord } from \"@itwin/appui-abstract\";\nimport type {\n IPropertyValueRenderer, PropertyValueRendererContext, TreeModelNode,\n} from \"@itwin/components-react\";\n\n/**\n * Context for rendering label value.\n * @public\n */\nexport interface LabelRendererContext {\n /** Style that should be applied to the rendered element. */\n style?: React.CSSProperties;\n /** Callback to highlight text. */\n textHighlighter?: (text: string) => React.ReactNode;\n}\n\n/**\n * Props for custom node renderer.\n * @public\n */\nexport interface TreeNodeLabelRendererProps {\n /** Tree node to rendered label for. */\n node: TreeModelNode;\n /** Context for rendering node's label value. */\n context?: LabelRendererContext;\n}\n\n/**\n * Props for customizing node rendering.\n * @public\n */\nexport interface TreeNodeRendererProps {\n /** Custom renderer for node's label. */\n nodeLabelRenderer?: (props: TreeNodeLabelRendererProps) => ReactNode;\n}\n\n/**\n * Props for [[DefaultLabelRenderer]] component.\n * @public\n */\nexport interface DefaultLabelRendererProps {\n /** Label that should be rendered. */\n label: PropertyRecord;\n /** Context for rendering label value. */\n context?: LabelRendererContext;\n}\n\n/**\n * Renders label for tree node.\n * @public\n */\nexport function DefaultLabelRenderer({ label, context }: DefaultLabelRendererProps) {\n const renderer = new PrimitivePropertyValueRenderer();\n return renderer.render(label, context);\n}\n\n/** @internal */\nexport interface TreeNodeRendererContextProviderProps extends TreeNodeRendererProps {\n node: TreeModelNode;\n children: ReactNode;\n}\n\n/** @internal */\nexport function TreeNodeRendererContextProvider({ nodeLabelRenderer, node, children }: TreeNodeRendererContextProviderProps) {\n return (\n <treeNodeLabelRendererContext.Provider value={{ renderer: nodeLabelRenderer, node }}>\n {children}\n </treeNodeLabelRendererContext.Provider>\n );\n}\n\n/** @internal */\nexport const TREE_NODE_LABEL_RENDERER = \"visibility-tree-node-label\";\n\n/** @internal */\nexport class TreeNodeLabelRenderer implements IPropertyValueRenderer {\n public canRender(record: PropertyRecord, _context?: PropertyValueRendererContext | undefined): boolean {\n return record.property.renderer?.name === TREE_NODE_LABEL_RENDERER;\n }\n\n public render(record: PropertyRecord, context?: PropertyValueRendererContext | undefined): ReactNode {\n const labelContext: LabelRendererContext = {\n style: context?.style,\n textHighlighter: context?.textHighlighter,\n };\n return <LabelRenderer record={record} context={labelContext} />;\n }\n}\n\ninterface TreeNodeLabelRendererContext {\n renderer?: (props: TreeNodeLabelRendererProps) => ReactNode;\n node: TreeModelNode;\n}\n\nconst treeNodeLabelRendererContext = createContext<TreeNodeLabelRendererContext | undefined>(undefined);\n\ninterface LabelRendererProps {\n record: PropertyRecord;\n context?: LabelRendererContext;\n}\n\nfunction LabelRenderer({ record, context }: LabelRendererProps) {\n const renderContext = useContext(treeNodeLabelRendererContext);\n\n if (!renderContext || !renderContext.renderer) {\n return <DefaultLabelRenderer label={record} context={context} />;\n }\n\n const { renderer, node } = renderContext;\n return <>{renderer({ node, context })}</>;\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import "./TreeRenderer.scss";
|
|
3
|
+
import type { TreeRendererProps as ComponentsTreeRendererProps } from "@itwin/components-react";
|
|
4
|
+
import type { TreeNodeRendererProps } from "./TreeNodeRenderer";
|
|
5
|
+
import type { TreeContextMenuProps } from "./ContextMenu";
|
|
6
|
+
/**
|
|
7
|
+
* Base props for [[TreeRenderer]] component.
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
export interface TreeRendererBaseProps extends TreeContextMenuProps, TreeNodeRendererProps {
|
|
11
|
+
/**
|
|
12
|
+
* Modifies the density of tree nodes. `enlarged` tree nodes have bigger height and bigger button hit boxes.
|
|
13
|
+
*/
|
|
14
|
+
density?: "default" | "enlarged";
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Props for [[TreeRenderer]] component.
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
export type TreeRendererProps = ComponentsTreeRendererProps & TreeRendererBaseProps;
|
|
21
|
+
/**
|
|
22
|
+
* Base tree renderer for visibility trees.
|
|
23
|
+
* @public
|
|
24
|
+
*/
|
|
25
|
+
export declare function TreeRenderer({ contextMenuItems, nodeRenderer, nodeLabelRenderer, density, ...restProps }: TreeRendererProps): JSX.Element;
|
|
26
|
+
//# sourceMappingURL=TreeRenderer.d.ts.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TreeRenderer = void 0;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
/*---------------------------------------------------------------------------------------------
|
|
9
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
10
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
11
|
+
*--------------------------------------------------------------------------------------------*/
|
|
12
|
+
require("./TreeRenderer.scss");
|
|
13
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
14
|
+
const components_react_1 = require("@itwin/components-react");
|
|
15
|
+
const ContextMenu_1 = require("./ContextMenu");
|
|
16
|
+
const TreeNodeRenderer_1 = require("./TreeNodeRenderer");
|
|
17
|
+
/**
|
|
18
|
+
* Base tree renderer for visibility trees.
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
function TreeRenderer({ contextMenuItems, nodeRenderer, nodeLabelRenderer, density, ...restProps }) {
|
|
22
|
+
const { onContextMenu, renderContextMenu } = (0, ContextMenu_1.useContextMenu)({ contextMenuItems });
|
|
23
|
+
const nodeHeight = getNodeHeight(density ?? "default", restProps.nodeHeight);
|
|
24
|
+
const className = (0, classnames_1.default)("tree-widget-tree-nodes-list", { ["enlarge"]: density === "enlarged" });
|
|
25
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsx)(components_react_1.TreeRenderer, { ...restProps, nodeRenderer: (nodeProps) => {
|
|
26
|
+
const nodeClassName = nodeProps.node.numChildren === 0 ? "without-expander" : undefined;
|
|
27
|
+
return ((0, jsx_runtime_1.jsx)(TreeNodeRenderer_1.TreeNodeRendererContextProvider, { node: nodeProps.node, nodeLabelRenderer: nodeLabelRenderer, children: nodeRenderer
|
|
28
|
+
? nodeRenderer({ ...nodeProps, onContextMenu, className: nodeClassName })
|
|
29
|
+
: (0, jsx_runtime_1.jsx)(components_react_1.TreeNodeRenderer, { ...nodeProps, onContextMenu: onContextMenu, className: nodeClassName }) }));
|
|
30
|
+
}, nodeHeight: nodeHeight }), renderContextMenu()] }));
|
|
31
|
+
}
|
|
32
|
+
exports.TreeRenderer = TreeRenderer;
|
|
33
|
+
function getNodeHeight(density, defaultHeight) {
|
|
34
|
+
switch (density) {
|
|
35
|
+
case "default":
|
|
36
|
+
return defaultHeight;
|
|
37
|
+
case "enlarged":
|
|
38
|
+
return () => 43;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=TreeRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeRenderer.js","sourceRoot":"","sources":["../../../../../src/components/trees/common/TreeRenderer.tsx"],"names":[],"mappings":";;;;;;;AAAA;;;+FAG+F;AAE/F,+BAA6B;AAC7B,4DAAoC;AACpC,8DAAmG;AACnG,+CAA+C;AAC/C,yDAAqE;AAuBrE;;;GAGG;AACH,SAAgB,YAAY,CAAC,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,SAAS,EAAqB;IAC1H,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,IAAA,4BAAc,EAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAElF,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,IAAI,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,IAAA,oBAAU,EAAC,6BAA6B,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC;IAErG,OAAO,CACL,iCAAK,SAAS,EAAE,SAAS,aACvB,uBAAC,+BAAsB,OACjB,SAAS,EACb,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE;oBAC1B,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;oBACxF,OAAO,CACL,uBAAC,kDAA+B,IAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,YACxF,YAAY;4BACX,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;4BACzE,CAAC,CAAC,uBAAC,mCAAgB,OAAK,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,GAAI,GAC/D,CACnC,CAAC;gBACJ,CAAC,EAED,UAAU,EAAE,UAAU,GACtB,EACD,iBAAiB,EAAE,IAChB,CACP,CAAC;AACJ,CAAC;AA1BD,oCA0BC;AAED,SAAS,aAAa,CAAC,OAA+B,EAAE,aAAwD;IAC9G,QAAQ,OAAO,EAAE;QACf,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC;QACvB,KAAK,UAAU;YACb,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC;KACnB;AACH,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 \"./TreeRenderer.scss\";\nimport classNames from \"classnames\";\nimport { TreeRenderer as ComponentsTreeRenderer, TreeNodeRenderer } from \"@itwin/components-react\";\nimport { useContextMenu } from \"./ContextMenu\";\nimport { TreeNodeRendererContextProvider } from \"./TreeNodeRenderer\";\n\nimport type { TreeRendererProps as ComponentsTreeRendererProps } from \"@itwin/components-react\";\nimport type { TreeNodeRendererProps } from \"./TreeNodeRenderer\";\nimport type { TreeContextMenuProps } from \"./ContextMenu\";\n\n/**\n * Base props for [[TreeRenderer]] component.\n * @public\n */\nexport interface TreeRendererBaseProps extends TreeContextMenuProps, TreeNodeRendererProps {\n /**\n * Modifies the density of tree nodes. `enlarged` tree nodes have bigger height and bigger button hit boxes.\n */\n density?: \"default\" | \"enlarged\";\n}\n\n/**\n * Props for [[TreeRenderer]] component.\n * @public\n */\nexport type TreeRendererProps = ComponentsTreeRendererProps & TreeRendererBaseProps;\n\n/**\n * Base tree renderer for visibility trees.\n * @public\n */\nexport function TreeRenderer({ contextMenuItems, nodeRenderer, nodeLabelRenderer, density, ...restProps }: TreeRendererProps) {\n const { onContextMenu, renderContextMenu } = useContextMenu({ contextMenuItems });\n\n const nodeHeight = getNodeHeight(density ?? \"default\", restProps.nodeHeight);\n const className = classNames(\"tree-widget-tree-nodes-list\", { [\"enlarge\"]: density === \"enlarged\" });\n\n return (\n <div className={className}>\n <ComponentsTreeRenderer\n {...restProps}\n nodeRenderer={(nodeProps) => {\n const nodeClassName = nodeProps.node.numChildren === 0 ? \"without-expander\" : undefined;\n return (\n <TreeNodeRendererContextProvider node={nodeProps.node} nodeLabelRenderer={nodeLabelRenderer}>\n {nodeRenderer\n ? nodeRenderer({ ...nodeProps, onContextMenu, className: nodeClassName })\n : <TreeNodeRenderer {...nodeProps} onContextMenu={onContextMenu} className={nodeClassName} />}\n </TreeNodeRendererContextProvider>\n );\n }\n }\n nodeHeight={nodeHeight}\n />\n {renderContextMenu()}\n </div>\n );\n}\n\nfunction getNodeHeight(density: \"default\" | \"enlarged\", defaultHeight: ComponentsTreeRendererProps[\"nodeHeight\"]) {\n switch (density) {\n case \"default\":\n return defaultHeight;\n case \"enlarged\":\n return () => 43;\n }\n}\n"]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
|
|
6
|
+
.tree-widget-tree-with-header {
|
|
7
|
+
width: 100%;
|
|
8
|
+
height: 100%;
|
|
9
|
+
|
|
10
|
+
.tree-widget-tree-header {
|
|
11
|
+
height: var(--iui-size-xl);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.tree-widget-tree-content {
|
|
15
|
+
height: calc(100% - var(--iui-size-xl));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.tree-widget-tree-nodes-list {
|
|
20
|
+
height: 100%;
|
|
21
|
+
width: 100%;
|
|
22
|
+
|
|
23
|
+
.ReactWindow__VariableSizeList {
|
|
24
|
+
>div {
|
|
25
|
+
min-width: max-content !important; // to override inline class
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&.enlarge {
|
|
30
|
+
--enlarged-node-height: calc(var(--iui-size-l) + var(--iui-size-m) + var(--iui-size-3xs));
|
|
31
|
+
--enlarged-node-icon-size: var(--iui-size-m);
|
|
32
|
+
--enlarged-node-icon-padding: calc(var(--enlarged-node-height) - var(--enlarged-node-icon-size));
|
|
33
|
+
--enlarged-node-expander-additional-padding: calc(var(--iui-size-m) + var(--iui-size-3xs));
|
|
34
|
+
|
|
35
|
+
.core-tree-node {
|
|
36
|
+
&.without-expander {
|
|
37
|
+
>.contents {
|
|
38
|
+
padding-left: var(--enlarged-node-expander-additional-padding);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
>.contents {
|
|
43
|
+
height: var(--enlarged-node-height);
|
|
44
|
+
font-size: var(--iui-font-size-2);
|
|
45
|
+
|
|
46
|
+
.core-tree-expansionToggle {
|
|
47
|
+
>.icon {
|
|
48
|
+
height: var(--enlarged-node-height);
|
|
49
|
+
width: var(--enlarged-node-height);
|
|
50
|
+
padding: calc(var(--enlarged-node-icon-padding) / 2);
|
|
51
|
+
|
|
52
|
+
svg {
|
|
53
|
+
height: var(--enlarged-node-icon-size);
|
|
54
|
+
width: var(--enlarged-node-icon-size);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.iui-progress-indicator-radial {
|
|
60
|
+
height: var(--enlarged-node-height);
|
|
61
|
+
width: var(--enlarged-node-height);
|
|
62
|
+
padding: calc(var(--enlarged-node-icon-padding) / 2 - 1px); // need to reduce padding by `1px` to make sure icon is centered
|
|
63
|
+
margin: 0;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.tree-widget-tree-container {
|
|
71
|
+
height: 100%;
|
|
72
|
+
width: 100%;
|
|
73
|
+
display: flex;
|
|
74
|
+
flex-direction: column;
|
|
75
|
+
position: relative;
|
|
76
|
+
|
|
77
|
+
.filteredTreeOverlay {
|
|
78
|
+
position: absolute;
|
|
79
|
+
top: 0;
|
|
80
|
+
left: 0;
|
|
81
|
+
width: 100%;
|
|
82
|
+
height: 100%;
|
|
83
|
+
z-index: 9999;
|
|
84
|
+
background-color: hsl(var(--iui-color-background) / var(--iui-opacity-2));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.components-tree-errormessage {
|
|
88
|
+
position: absolute;
|
|
89
|
+
top: 40%;
|
|
90
|
+
left: 50%;
|
|
91
|
+
width: 75%;
|
|
92
|
+
text-align: center;
|
|
93
|
+
transform: translate(-50%, -50%);
|
|
94
|
+
font-style: italic;
|
|
95
|
+
color: var(--iui-color-text-muted);
|
|
96
|
+
|
|
97
|
+
.errormessage-header {
|
|
98
|
+
display: block;
|
|
99
|
+
font-weight: bold;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { IModelConnection } from "@itwin/core-frontend";
|
|
2
2
|
import type { SelectionMode } from "@itwin/components-react";
|
|
3
3
|
import type { IPresentationTreeDataProvider } from "@itwin/presentation-components";
|
|
4
|
+
import type { TreeRendererBaseProps } from "./TreeRenderer";
|
|
4
5
|
/**
|
|
5
6
|
* An option of how class grouping should work in a component.
|
|
6
7
|
* @public
|
|
@@ -25,7 +26,7 @@ export interface VisibilityTreeFilterInfo {
|
|
|
25
26
|
* Base props for tree components.
|
|
26
27
|
* @public
|
|
27
28
|
*/
|
|
28
|
-
export interface BaseTreeProps {
|
|
29
|
+
export interface BaseTreeProps extends TreeRendererBaseProps {
|
|
29
30
|
/** An iModel to pull data from. */
|
|
30
31
|
iModel: IModelConnection;
|
|
31
32
|
/** Width of the component. */
|
|
@@ -45,4 +46,4 @@ export interface BaseFilterableTreeProps extends BaseTreeProps {
|
|
|
45
46
|
/** Callback invoked when tree is filtered. */
|
|
46
47
|
onFilterApplied?: (filteredDataProvider: IPresentationTreeDataProvider, matchesCount: number) => void;
|
|
47
48
|
}
|
|
48
|
-
//# sourceMappingURL=
|
|
49
|
+
//# sourceMappingURL=Types.d.ts.map
|
|
@@ -18,4 +18,4 @@ var ClassGroupingOption;
|
|
|
18
18
|
/** Class grouping is enabled and grouping node shows grouped items count */
|
|
19
19
|
ClassGroupingOption[ClassGroupingOption["YesWithCounts"] = 2] = "YesWithCounts";
|
|
20
20
|
})(ClassGroupingOption = exports.ClassGroupingOption || (exports.ClassGroupingOption = {}));
|
|
21
|
-
//# sourceMappingURL=
|
|
21
|
+
//# sourceMappingURL=Types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Types.js","sourceRoot":"","sources":["../../../../../src/components/trees/common/Types.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAO/F;;;GAGG;AACH,IAAY,mBAOX;AAPD,WAAY,mBAAmB;IAC7B,iCAAiC;IACjC,yDAAE,CAAA;IACF,gCAAgC;IAChC,2DAAG,CAAA;IACH,4EAA4E;IAC5E,+EAAa,CAAA;AACf,CAAC,EAPW,mBAAmB,GAAnB,2BAAmB,KAAnB,2BAAmB,QAO9B","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 type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { SelectionMode } from \"@itwin/components-react\";\nimport type { IPresentationTreeDataProvider } from \"@itwin/presentation-components\";\nimport type { TreeRendererBaseProps } from \"./TreeRenderer\";\n\n/**\n * An option of how class grouping should work in a component.\n * @public\n */\nexport enum ClassGroupingOption {\n /** Class grouping is disabled */\n No,\n /** Class grouping is enabled */\n Yes,\n /** Class grouping is enabled and grouping node shows grouped items count */\n YesWithCounts,\n}\n\n/**\n * Data structure that describes info used to filter visibility tree.\n * @public\n */\nexport interface VisibilityTreeFilterInfo {\n filter: string;\n activeMatchIndex?: number;\n}\n\n/**\n * Base props for tree components.\n * @public\n */\nexport interface BaseTreeProps extends TreeRendererBaseProps {\n /** An iModel to pull data from. */\n iModel: IModelConnection;\n /** Width of the component. */\n width: number;\n /** Height of the component. */\n height: number;\n /** Selection mode in the tree. */\n selectionMode?: SelectionMode;\n}\n\n/**\n * Base props for filterable tree components.\n * @public\n */\nexport interface BaseFilterableTreeProps extends BaseTreeProps {\n /** Information for tree filtering. */\n filterInfo?: VisibilityTreeFilterInfo;\n /** Callback invoked when tree is filtered. */\n onFilterApplied?: (filteredDataProvider: IPresentationTreeDataProvider, matchesCount: number) => void;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { DelayLoadedTreeNodeItem } from "@itwin/components-react";
|
|
2
|
+
import type { Node } from "@itwin/presentation-common";
|
|
3
|
+
/** @internal */
|
|
4
|
+
export declare function combineTreeNodeItemCustomizations(customizations: Array<(item: Partial<DelayLoadedTreeNodeItem>, node: Partial<Node>) => void>): (item: Partial<DelayLoadedTreeNodeItem>, node: Partial<Node>) => void;
|
|
5
|
+
/** @internal */
|
|
6
|
+
export declare function addCustomTreeNodeItemLabelRenderer(item: Partial<DelayLoadedTreeNodeItem>): void;
|
|
7
|
+
/** @internal */
|
|
8
|
+
export declare function addTreeNodeItemCheckbox(item: Partial<DelayLoadedTreeNodeItem>): void;
|
|
9
|
+
/** @internal */
|
|
10
|
+
export declare function registerRenderers(): () => void;
|
|
11
|
+
//# sourceMappingURL=Utils.d.ts.map
|