Skip to content

Commit 322c91f

Browse files
committed
fix: type tree
1 parent d0750a0 commit 322c91f

3 files changed

Lines changed: 49 additions & 16 deletions

File tree

‎ui/components/SideBar/assetTree.vue‎

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
authorizationTreeMetricId,
88
hasAssetName,
99
registerAssetNameLookup,
10+
unwrapTypeTreeRoot,
1011
useAssetTree,
1112
useAssetTreeSearch
1213
} from "~/composables/useAssetTree";
@@ -209,20 +210,6 @@ const batchMenuItems = computed(() => [
209210
]
210211
]);
211212
212-
const resetTreeLevels = (nodes: AssetTreeNode[], level = 0) => {
213-
for (const node of nodes) {
214-
node.level = level;
215-
if (node.children?.length) resetTreeLevels(node.children, level + 1);
216-
}
217-
return nodes;
218-
};
219-
220-
const unwrapAllTypesRoot = (nodes: AssetTreeNode[]) => {
221-
const root = nodes.find((node) => node.id.toUpperCase() === "ROOT");
222-
if (!root?.children?.length) return nodes;
223-
return resetTreeLevels(root.children);
224-
};
225-
226213
const removeFavoriteNodes = (nodes: AssetTreeNode[]): AssetTreeNode[] =>
227214
nodes
228215
.filter((node) => node.id.toLowerCase() !== "favorite" && node.key?.toLowerCase() !== "favorite")
@@ -310,7 +297,7 @@ const loadRoot = async (kind: PanelKind, requestEpoch: number) => {
310297
);
311298
}
312299
} else {
313-
typeNodes.value = unwrapAllTypesRoot(nodes);
300+
typeNodes.value = unwrapTypeTreeRoot(nodes);
314301
}
315302
} catch (error) {
316303
if (requestEpoch === treeRequestEpoch) reportError(error);

‎ui/composables/useAssetTree.test.ts‎

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { EffectScope } from "vue";
22
import type { AssetTreeNode } from "~/types";
33
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
44
import { effectScope, nextTick, reactive, ref } from "vue";
5-
import { applyAssetRename, hasAssetName, useAssetTree, useAssetTreeSearch } from "./useAssetTree";
5+
import { applyAssetRename, hasAssetName, unwrapTypeTreeRoot, useAssetTree, useAssetTreeSearch } from "./useAssetTree";
66

77
describe("applyAssetRename", () => {
88
it("renames matching leaves in place and leaves parents open", () => {
@@ -44,6 +44,38 @@ describe("asset rename names", () => {
4444
});
4545
});
4646

47+
describe("unwrapTypeTreeRoot", () => {
48+
it("removes the empty API root instead of leaving it expandable", () => {
49+
const nodes = [{ id: "ROOT", name: "All types", isParent: true, level: 0 }] as AssetTreeNode[];
50+
51+
expect(unwrapTypeTreeRoot(nodes)).toEqual([]);
52+
});
53+
54+
it("promotes root children and resets their levels", () => {
55+
const nodes = [
56+
{
57+
id: "ROOT",
58+
name: "All types",
59+
isParent: true,
60+
level: 0,
61+
children: [
62+
{
63+
id: "ROOT_HOST",
64+
name: "Host",
65+
isParent: true,
66+
level: 1,
67+
children: [{ id: "ROOT_HOST_LINUX", name: "Linux", isParent: true, level: 2 }]
68+
}
69+
]
70+
}
71+
] as AssetTreeNode[];
72+
73+
expect(unwrapTypeTreeRoot(nodes)).toMatchObject([
74+
{ id: "ROOT_HOST", level: 0, children: [{ id: "ROOT_HOST_LINUX", level: 1 }] }
75+
]);
76+
});
77+
});
78+
4779
const userInfoStore = reactive({ loggedIn: true, orgId: "org-1", currentSite: "site-1", currentAccountId: "user-1" });
4880
vi.mock("~/store/modules/userInfo", () => ({ useUserInfoStore: () => userInfoStore }));
4981

‎ui/composables/useAssetTree.ts‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,20 @@ const normalizeTreeNodes = (value: unknown, baseLevel = 0): AssetTreeNode[] => {
7171
return roots;
7272
};
7373

74+
const resetTreeLevels = (nodes: AssetTreeNode[], level = 0) => {
75+
for (const node of nodes) {
76+
node.level = level;
77+
if (node.children?.length) resetTreeLevels(node.children, level + 1);
78+
}
79+
return nodes;
80+
};
81+
82+
export const unwrapTypeTreeRoot = (nodes: AssetTreeNode[]) => {
83+
const root = nodes.find((node) => node.id.toUpperCase() === "ROOT");
84+
if (!root) return nodes;
85+
return resetTreeLevels(root.children || []);
86+
};
87+
7488
export function applyAssetRename(nodes: AssetTreeNode[], assetId: string, name: string) {
7589
for (const node of nodes) {
7690
const isBranch = Boolean(node.isParent || node.children?.length);

0 commit comments

Comments
 (0)