diff --git a/packages/core/src/renderer/components/+namespaces/__snapshots__/namespace-tree-view.test.tsx.snap b/packages/core/src/renderer/components/+namespaces/__snapshots__/namespace-tree-view.test.tsx.snap index 79c7b4691d..33fa830569 100644 --- a/packages/core/src/renderer/components/+namespaces/__snapshots__/namespace-tree-view.test.tsx.snap +++ b/packages/core/src/renderer/components/+namespaces/__snapshots__/namespace-tree-view.test.tsx.snap @@ -1,5 +1,133 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[` once the subscribe resolves renders namespace with 2 children namespaces 1`] = ` + +
+
+
+ Tree View +
+
    +
  • +
    +
    + +
    +
    + acme-org +
    +
    +
      +
      +
      +
    • +
      +
      + +
      +
      + team-a +
      +
      +
    • +
    • +
      +
      + +
      +
      + team-b +
      +
      +
    • +
      +
      +
    +
  • +
+
+
+ +`; + exports[` once the subscribe resolves renders null with regular namespace 1`] = `
@@ -23,9 +151,8 @@ exports[` once the subscribe resolves renders one namespace role="tree" >
- acme-group + single-root
+ diff --git a/packages/core/src/renderer/components/+namespaces/namespace-tree-view.test.tsx b/packages/core/src/renderer/components/+namespaces/namespace-tree-view.test.tsx index c1ddba6360..015c1b81c3 100644 --- a/packages/core/src/renderer/components/+namespaces/namespace-tree-view.test.tsx +++ b/packages/core/src/renderer/components/+namespaces/namespace-tree-view.test.tsx @@ -1,6 +1,7 @@ import type { AsyncFnMock } from "@async-fn/jest"; import asyncFn from "@async-fn/jest"; import type { DiContainer } from "@ogre-tools/injectable"; +import _ from "lodash"; import React from "react"; import directoryForKubeConfigsInjectable from "../../../common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable"; import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; @@ -20,7 +21,7 @@ import { NamespaceTreeView } from "./namespace-tree-view"; import type { NamespaceStore } from "./store"; import namespaceStoreInjectable from "./store.injectable"; -function createNamespace(name: string): Namespace { +function createNamespace(name: string, labels?: Record): Namespace { return new Namespace({ apiVersion: "v1", kind: "Namespace", @@ -29,10 +30,35 @@ function createNamespace(name: string): Namespace { resourceVersion: "1", selfLink: `/api/v1/namespaces/${name}`, uid: `${name}-1`, + labels: { + ...labels + } }, }); } +const singleRoot = createNamespace("single-root", { + "hnc.x-k8s.io/included-namespace": "true", +}); + +const acmeGroup = createNamespace("acme-org", { + "hnc.x-k8s.io/included-namespace": "true", +}); + +const teamA = createNamespace("team-a", { + "hnc.x-k8s.io/included-namespace": "true", + "acme-org.tree.hnc.x-k8s.io/depth": "1", + "kubernetes.io/metadata.name": "team-a", + "team-a.tree.hnc.x-k8s.io/depth": "0", +}); + +const teamB = createNamespace("team-b", { + "hnc.x-k8s.io/included-namespace": "true", + "acme-org.tree.hnc.x-k8s.io/depth": "1", + "kubernetes.io/metadata.name": "team-b", + "team-b.tree.hnc.x-k8s.io/depth": "0", +}); + describe("", () => { let di: DiContainer; let render: DiRender; @@ -87,14 +113,9 @@ describe("", () => { createNamespace("test-3"), createNamespace("test-4"), createNamespace("test-5"), - createNamespace("test-6"), - createNamespace("test-7"), - createNamespace("test-8"), - createNamespace("test-9"), - createNamespace("test-10"), - createNamespace("test-11"), - createNamespace("test-12"), - createNamespace("test-13"), + acmeGroup, + teamA, + teamB, ], }))); }); @@ -106,22 +127,15 @@ describe("", () => { }); it("renders one namespace without children", () => { - const ns = new Namespace({ - apiVersion: "v1", - kind: "Namespace", - metadata: { - name: "acme-group", - resourceVersion: "1", - selfLink: `/api/v1/namespaces/acme-group`, - uid: `acme-group-1`, - labels: { - "hnc.x-k8s.io/included-namespace": "true", - } - }, - }); - const result = render(); + const result = render(); expect(result.baseElement).toMatchSnapshot(); }); + + it("renders namespace with 2 children namespaces", () => { + const result = render(); + + expect(result.baseElement).toMatchSnapshot(); + }) }); }); \ No newline at end of file diff --git a/packages/core/src/renderer/components/+namespaces/namespace-tree-view.tsx b/packages/core/src/renderer/components/+namespaces/namespace-tree-view.tsx index 07718ab1a7..103d05bb17 100644 --- a/packages/core/src/renderer/components/+namespaces/namespace-tree-view.tsx +++ b/packages/core/src/renderer/components/+namespaces/namespace-tree-view.tsx @@ -15,11 +15,19 @@ interface Dependencies { namespaceStore: NamespaceStore; } -function NonInjectableNamespaceTreeView({ root }: Dependencies & NamespaceTreeViewProps) { +function NonInjectableNamespaceTreeView({ root, namespaceStore }: Dependencies & NamespaceTreeViewProps) { + const hierarchicalNamespaces = namespaceStore.getByLabel(["hnc.x-k8s.io/included-namespace=true"]); + function renderChildren(parent: Namespace) { - return ( -
no children
+ const children = hierarchicalNamespaces.filter(ns => + ns.getLabels().find(label => label === `${parent.getName()}.tree.hnc.x-k8s.io/depth=1`) ); + + return children.map(child => ( + + {renderChildren(child)} + + )); } if (!root.getLabels().find(label => label === "hnc.x-k8s.io/included-namespace=true")) { @@ -30,6 +38,7 @@ function NonInjectableNamespaceTreeView({ root }: Dependencies & NamespaceTreeVi
Tree View } defaultExpandIcon={} defaultEndIcon={}