Skip to content

Commit 3742d44

Browse files
committed
Merge branch 'tree-widget/next' into JonasD/use-visibility-methods-from-categories-visibility-handler
2 parents bd9df1b + 9defc89 commit 3742d44

File tree

5 files changed

+550
-586
lines changed

5 files changed

+550
-586
lines changed

apps/performance-tests/src/tree-widget/CategoriesTree.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ describe("categories tree", () => {
9090
showElements: false,
9191
};
9292
const idsCache = new CategoriesTreeIdsCache(imodelAccess, "3d");
93-
const handler = createCategoriesTreeVisibilityHandler({ imodelAccess, idsCache, viewport, hierarchyConfig });
93+
const handler = createCategoriesTreeVisibilityHandler({ imodelAccess, idsCache, viewport });
9494
const provider = createIModelHierarchyProvider({
9595
hierarchyDefinition: new CategoriesTreeDefinition({ idsCache, imodelAccess, viewType: "3d", hierarchyConfig }),
9696
imodelAccess,
@@ -149,7 +149,7 @@ describe("categories tree", () => {
149149
showElements: false,
150150
};
151151
const idsCache = new CategoriesTreeIdsCache(imodelAccess, "3d");
152-
const handler = createCategoriesTreeVisibilityHandler({ imodelAccess, idsCache, viewport, hierarchyConfig });
152+
const handler = createCategoriesTreeVisibilityHandler({ imodelAccess, idsCache, viewport });
153153
const provider = createIModelHierarchyProvider({
154154
hierarchyDefinition: new CategoriesTreeDefinition({ idsCache, imodelAccess, viewType: "3d", hierarchyConfig }),
155155
imodelAccess,

packages/itwin/tree-widget/src/test/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.test.ts

Lines changed: 9 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,12 @@ import {
4343
} from "./Utils.js";
4444
import { validateHierarchyVisibility } from "./VisibilityValidation.js";
4545

46-
import type { VisibilityExpectations } from "./VisibilityValidation.js";
47-
import type { InstanceKey } from "@itwin/presentation-common";
4846
import type { IModelConnection, Viewport } from "@itwin/core-frontend";
49-
import type { CategoriesTreeHierarchyConfiguration } from "../../../../tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js";
47+
import type { InstanceKey } from "@itwin/presentation-common";
5048
import type { GroupingHierarchyNode, HierarchyNodeIdentifiersPath, NonGroupingHierarchyNode } from "@itwin/presentation-hierarchies";
49+
import type { CategoriesTreeHierarchyConfiguration } from "../../../../tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js";
50+
import type { VisibilityExpectations } from "./VisibilityValidation.js";
51+
5152
describe("CategoriesTreeVisibilityHandler", () => {
5253
before(async () => {
5354
await initializePresentationTesting({
@@ -169,6 +170,7 @@ describe("CategoriesTreeVisibilityHandler", () => {
169170
expectations: "all-hidden",
170171
});
171172
});
173+
172174
describe("definitionContainers", () => {
173175
it("showing definition container makes it and all of its contained elements visible", async function () {
174176
await using buildIModelResult = await buildIModel(this, async (builder) => {
@@ -259,13 +261,13 @@ describe("CategoriesTreeVisibilityHandler", () => {
259261
handler,
260262
viewport,
261263
expectations: {
262-
[keys.definitionContainerRoot2.id]: "hidden",
263264
[keys.definitionContainerRoot.id]: "visible",
264265
[keys.definitionContainerChild.id]: "visible",
265-
[keys.category2.id]: "hidden",
266266
[keys.indirectCategory.id]: "visible",
267-
[keys.subCategory2.id]: "hidden",
268267
[keys.indirectSubCategory.id]: "visible",
268+
[keys.definitionContainerRoot2.id]: "hidden",
269+
[keys.category2.id]: "hidden",
270+
[keys.subCategory2.id]: "hidden",
269271
},
270272
});
271273
});
@@ -780,44 +782,6 @@ describe("CategoriesTreeVisibilityHandler", () => {
780782
});
781783
});
782784

783-
describe("hideSubCategories set to true", () => {
784-
it("showing subCategory does not do anything", async function () {
785-
await using buildIModelResult = await buildIModel(this, async (builder) => {
786-
const physicalModel = insertPhysicalModelWithPartition({ builder, codeValue: "TestPhysicalModel" });
787-
const definitionContainerRoot = insertDefinitionContainer({ builder, codeValue: "DefinitionContainerRoot" });
788-
const definitionModelRoot = insertSubModel({ builder, classFullName: CLASS_NAME_DefinitionModel, modeledElementId: definitionContainerRoot.id });
789-
790-
const category = insertSpatialCategory({ builder, codeValue: "SpatialCategory", modelId: definitionModelRoot.id });
791-
insertPhysicalElement({ builder, modelId: physicalModel.id, categoryId: category.id });
792-
const subCategory = insertSubCategory({
793-
builder,
794-
parentCategoryId: category.id,
795-
codeValue: "subCategory",
796-
modelId: definitionModelRoot.id,
797-
});
798-
return { category, subCategory, definitionContainerRoot, physicalModel };
799-
});
800-
801-
const { imodel, ...keys } = buildIModelResult;
802-
803-
using visibilityTestData = await createVisibilityTestData({
804-
imodel,
805-
...getModelAndCategoryIds(keys),
806-
hierarchyConfig: { hideSubCategories: true },
807-
});
808-
const { handler, provider, viewport } = visibilityTestData;
809-
setupInitialDisplayState({ viewport, ...createHiddenTestData(keys) });
810-
811-
await handler.changeVisibility(createSubCategoryHierarchyNode(keys.subCategory.id, keys.category.id), true);
812-
await validateHierarchyVisibility({
813-
provider,
814-
handler,
815-
viewport,
816-
expectations: "all-hidden",
817-
});
818-
});
819-
});
820-
821785
describe("showElements set to true", () => {
822786
describe("definitionContainers", () => {
823787
it("showing definition container makes it and all of its contained elements visible", async function () {
@@ -1790,9 +1754,7 @@ describe("CategoriesTreeVisibilityHandler", () => {
17901754
elementId: ids.subModelElement?.id,
17911755
}),
17921756
expectations: (ids: IModelWithSubModelIds) => ({
1793-
// This happens because changing element state does not turn on category visiblity, it only turns on model display if it is off.
1794-
// Since subModelCategory is also displayed at tree root (it does not have children) it's visibility remains hidden.
1795-
[ids.subModelCategory?.id ?? ""]: "hidden",
1757+
[ids.subModelCategory?.id ?? ""]: "visible",
17961758
[`${ids.modeledElement.id}-${ids.subModelCategory?.id ?? ""}`]: "visible",
17971759
[ids.category.id]: "partial",
17981760
[ids.modeledElement.id]: "partial",
@@ -2664,38 +2626,6 @@ describe("CategoriesTreeVisibilityHandler", () => {
26642626
});
26652627
});
26662628

2667-
describe("hideSubCategories set to true", () => {
2668-
it("showing subCategory does not do anything", async function () {
2669-
await using buildIModelResult = await buildIModel(this, async (builder) => {
2670-
const physicalModel = insertPhysicalModelWithPartition({ builder, codeValue: "TestPhysicalModel" });
2671-
const definitionContainerRoot = insertDefinitionContainer({ builder, codeValue: "DefinitionContainerRoot" });
2672-
const definitionModelRoot = insertSubModel({ builder, classFullName: CLASS_NAME_DefinitionModel, modeledElementId: definitionContainerRoot.id });
2673-
2674-
const category = insertSpatialCategory({ builder, codeValue: "SpatialCategory", modelId: definitionModelRoot.id });
2675-
insertPhysicalElement({ builder, modelId: physicalModel.id, categoryId: category.id });
2676-
const subCategory = insertSubCategory({
2677-
builder,
2678-
parentCategoryId: category.id,
2679-
codeValue: "subCategory",
2680-
modelId: definitionModelRoot.id,
2681-
});
2682-
return { category, subCategory, definitionContainerRoot, physicalModel };
2683-
});
2684-
2685-
const { imodel, ...keys } = buildIModelResult;
2686-
using visibilityTestData = await createVisibilityTestData({ imodel, ...getModelAndCategoryIds(keys), hierarchyConfig: { hideSubCategories: true } });
2687-
const { handler, provider, viewport } = visibilityTestData;
2688-
setupInitialDisplayState({ viewport });
2689-
2690-
await handler.changeVisibility(createSubCategoryHierarchyNode(keys.subCategory.id, keys.category.id), true);
2691-
await validateHierarchyVisibility({
2692-
provider,
2693-
handler,
2694-
viewport,
2695-
expectations: "all-visible",
2696-
});
2697-
});
2698-
});
26992629
describe("disabling category visibility through overrides", () => {
27002630
it("category is hidden when only one model contains category and override is set to 'Hide'", async function () {
27012631
await using buildIModelResult = await buildIModel(this, async (builder) => {

packages/itwin/tree-widget/src/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.tsx

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ import { CategoriesTreeIdsCache } from "./internal/CategoriesTreeIdsCache.js";
1919
import { createCategoriesTreeVisibilityHandler } from "./internal/CategoriesTreeVisibilityHandler.js";
2020
import { useFilteredPaths } from "./internal/UseFilteredPaths.js";
2121

22-
import type { CreateCacheProps } from "../common/internal/useTreeHooks/UseIdsCache.js";
23-
import type { CreateFactoryProps } from "../common/internal/useTreeHooks/UseCachedVisibility.js";
24-
import type { CategoriesTreeFilteringError } from "./internal/UseFilteredPaths.js";
2522
import type { ReactNode } from "react";
2623
import type { Id64Array } from "@itwin/core-bentley";
2724
import type { Viewport } from "@itwin/core-frontend";
2825
import type { PresentationHierarchyNode } from "@itwin/presentation-hierarchies-react";
26+
import type { CreateCacheProps } from "../common/internal/useTreeHooks/UseIdsCache.js";
27+
import type { CreateFactoryProps } from "../common/internal/useTreeHooks/UseCachedVisibility.js";
2928
import type { VisibilityTreeProps } from "../common/components/VisibilityTree.js";
3029
import type { VisibilityTreeRendererProps } from "../common/components/VisibilityTreeRenderer.js";
3130
import type { CategoryInfo } from "../common/CategoriesVisibilityUtils.js";
31+
import type { CategoriesTreeFilteringError } from "./internal/UseFilteredPaths.js";
3232
import type { CategoriesTreeHierarchyConfiguration } from "./CategoriesTreeDefinition.js";
3333

3434
/** @beta */
@@ -79,7 +79,6 @@ export function useCategoriesTree({
7979
const { visibilityHandlerFactory, onFilteredPathsChanged } = useCategoriesCachedVisibility({
8080
activeView,
8181
getCache: getCategoriesTreeIdsCache,
82-
hierarchyConfig: hierarchyConfiguration,
8382
});
8483

8584
const getHierarchyDefinition = useCallback<VisibilityTreeProps["getHierarchyDefinition"]>(
@@ -114,17 +113,14 @@ export function useCategoriesTree({
114113
};
115114
}
116115

117-
function createVisibilityHandlerFactory(
118-
props: CreateFactoryProps<CategoriesTreeIdsCache, { hierarchyConfig: CategoriesTreeHierarchyConfiguration }>,
119-
): VisibilityTreeProps["visibilityHandlerFactory"] {
120-
const { activeView, factoryProps, idsCacheGetter, filteredPaths } = props;
116+
function createVisibilityHandlerFactory(props: CreateFactoryProps<CategoriesTreeIdsCache, undefined>): VisibilityTreeProps["visibilityHandlerFactory"] {
117+
const { activeView, idsCacheGetter, filteredPaths } = props;
121118
return ({ imodelAccess }) =>
122119
createCategoriesTreeVisibilityHandler({
123120
viewport: activeView,
124121
idsCache: idsCacheGetter(),
125122
imodelAccess,
126123
filteredPaths,
127-
hierarchyConfig: factoryProps.hierarchyConfig,
128124
});
129125
}
130126

@@ -174,19 +170,12 @@ function getSublabel(node: PresentationHierarchyNode) {
174170
return node.nodeData.extendedData?.description;
175171
}
176172

177-
function useCategoriesCachedVisibility(props: {
178-
activeView: Viewport;
179-
getCache: () => CategoriesTreeIdsCache;
180-
hierarchyConfig: CategoriesTreeHierarchyConfiguration;
181-
}) {
182-
const { activeView, getCache, hierarchyConfig } = props;
183-
const { visibilityHandlerFactory, filteredPaths, onFilteredPathsChanged } = useCachedVisibility<
184-
CategoriesTreeIdsCache,
185-
{ hierarchyConfig: CategoriesTreeHierarchyConfiguration }
186-
>({
173+
function useCategoriesCachedVisibility(props: { activeView: Viewport; getCache: () => CategoriesTreeIdsCache }) {
174+
const { activeView, getCache } = props;
175+
const { visibilityHandlerFactory, filteredPaths, onFilteredPathsChanged } = useCachedVisibility<CategoriesTreeIdsCache, undefined>({
187176
activeView,
188177
getCache,
189-
factoryProps: useMemo(() => ({ hierarchyConfig }), [hierarchyConfig]),
178+
factoryProps: undefined,
190179
createFactory: createVisibilityHandlerFactory,
191180
});
192181

0 commit comments

Comments
 (0)