From e81824e49edb86bf08d34e361340841dca40f457 Mon Sep 17 00:00:00 2001 From: Juho Heikka Date: Thu, 1 Jun 2023 09:47:22 +0300 Subject: [PATCH 1/2] Add support for controlling entity settings visibility during runtime Signed-off-by: Juho Heikka --- .../entity-settings/extension-registrator.injectable.ts | 6 ++++++ .../general-settings.injectable.tsx | 2 ++ .../metrics-settings.injectable.tsx | 2 ++ .../namespace-settings.injectable.tsx | 2 ++ .../node-shell-settings.injectable.tsx | 2 ++ .../proxy-settings.injectable.tsx | 2 ++ .../terminal-settings.injectable.tsx | 2 ++ .../components/entity-settings/settings.injectable.ts | 1 + 8 files changed, 19 insertions(+) diff --git a/packages/core/src/renderer/components/entity-settings/extension-registrator.injectable.ts b/packages/core/src/renderer/components/entity-settings/extension-registrator.injectable.ts index 6acce2da09..8913ea9109 100644 --- a/packages/core/src/renderer/components/entity-settings/extension-registrator.injectable.ts +++ b/packages/core/src/renderer/components/entity-settings/extension-registrator.injectable.ts @@ -7,6 +7,8 @@ import { extensionRegistratorInjectionToken } from "../../../extensions/extensio import type { LensRendererExtension } from "../../../extensions/lens-renderer-extension"; import type { CatalogEntity } from "../../api/catalog-entity"; import { entitySettingInjectionToken } from "./token"; +import type { IComputedValue } from "mobx"; +import { computed } from "mobx"; export interface EntitySettingViewProps { entity: CatalogEntity; @@ -25,6 +27,7 @@ export interface EntitySettingRegistration { id?: string; priority?: number; group?: string; + visible?: IComputedValue; } export interface RegisteredEntitySetting { @@ -36,6 +39,7 @@ export interface RegisteredEntitySetting { components: EntitySettingComponents; source?: string; group: string; + isShown: IComputedValue; } const entitySettingExtensionRegistratorInjectable = getInjectable({ @@ -59,6 +63,7 @@ const getInjectableForEntitySettingRegistrationFor = (extension: LensRendererExt id = btoa(title), priority, source, + visible, }: EntitySettingRegistration) => getInjectable({ id: `${extension.manifest.name}:${group}/${kind}:${id}`, instantiate: () => ({ @@ -70,6 +75,7 @@ const getInjectableForEntitySettingRegistrationFor = (extension: LensRendererExt title, group, source, + isShown: computed(() => visible?.get() ?? true), }), injectionToken: entitySettingInjectionToken, }); diff --git a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/general-settings.injectable.tsx b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/general-settings.injectable.tsx index 64d4028f24..c16de94e4a 100644 --- a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/general-settings.injectable.tsx +++ b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/general-settings.injectable.tsx @@ -13,6 +13,7 @@ import { ClusterKubeconfig } from "../../cluster-settings/kubeconfig"; import { ClusterNameSetting } from "../../cluster-settings/name-setting"; import type { EntitySettingViewProps } from "../extension-registrator.injectable"; import { entitySettingInjectionToken } from "../token"; +import { computed } from "mobx"; interface Dependencies { getClusterById: GetClusterById; @@ -64,6 +65,7 @@ const generalKubernetesClusterEntitySettingsInjectable = getInjectable({ components: { View: GeneralKubernetesClusterSettings, }, + isShown: computed(() => true), }), injectionToken: entitySettingInjectionToken, }); diff --git a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/metrics-settings.injectable.tsx b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/metrics-settings.injectable.tsx index 0a860300a3..1a98a34379 100644 --- a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/metrics-settings.injectable.tsx +++ b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/metrics-settings.injectable.tsx @@ -12,6 +12,7 @@ import { ClusterPrometheusSetting } from "../../cluster-settings/prometheus-sett import { ShowMetricsSetting } from "../../cluster-settings/show-metrics"; import type { EntitySettingViewProps } from "../extension-registrator.injectable"; import { entitySettingInjectionToken } from "../token"; +import { computed } from "mobx"; interface Dependencies { getClusterById: GetClusterById; @@ -57,6 +58,7 @@ const metricsKubernetesClusterEntitySettingsInjectable = getInjectable({ components: { View: MetricsKubernetesClusterSettings, }, + isShown: computed(() => true), }), injectionToken: entitySettingInjectionToken, }); diff --git a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/namespace-settings.injectable.tsx b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/namespace-settings.injectable.tsx index c84827f2a7..5350c2f877 100644 --- a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/namespace-settings.injectable.tsx +++ b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/namespace-settings.injectable.tsx @@ -10,6 +10,7 @@ import getClusterByIdInjectable from "../../../../features/cluster/storage/commo import { ClusterAccessibleNamespaces } from "../../cluster-settings/accessible-namespaces"; import type { EntitySettingViewProps } from "../extension-registrator.injectable"; import { entitySettingInjectionToken } from "../token"; +import { computed } from "mobx"; interface Dependencies { getClusterById: GetClusterById; @@ -48,6 +49,7 @@ const namespaceKubernetesClusterEntitySettingsInjectable = getInjectable({ components: { View: NamespaceKubernetesClusterSettings, }, + isShown: computed(() => true), }), injectionToken: entitySettingInjectionToken, }); diff --git a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/node-shell-settings.injectable.tsx b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/node-shell-settings.injectable.tsx index 1a1424b5b3..1ecc185585 100644 --- a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/node-shell-settings.injectable.tsx +++ b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/node-shell-settings.injectable.tsx @@ -10,6 +10,7 @@ import getClusterByIdInjectable from "../../../../features/cluster/storage/commo import { ClusterNodeShellSetting } from "../../cluster-settings/node-shell-setting"; import type { EntitySettingViewProps } from "../extension-registrator.injectable"; import { entitySettingInjectionToken } from "../token"; +import { computed } from "mobx"; interface Dependencies { getClusterById: GetClusterById; @@ -48,6 +49,7 @@ const nodeShellKubernetesClusterEntitySettingsInjectable = getInjectable({ components: { View: NodeShellKubernetesClusterSettings, }, + isShown: computed(() => true), }), injectionToken: entitySettingInjectionToken, }); diff --git a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/proxy-settings.injectable.tsx b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/proxy-settings.injectable.tsx index 90b30ce7d2..c551f5e4b1 100644 --- a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/proxy-settings.injectable.tsx +++ b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/proxy-settings.injectable.tsx @@ -10,6 +10,7 @@ import getClusterByIdInjectable from "../../../../features/cluster/storage/commo import { ClusterProxySetting } from "../../cluster-settings/proxy-setting"; import type { EntitySettingViewProps } from "../extension-registrator.injectable"; import { entitySettingInjectionToken } from "../token"; +import { computed } from "mobx"; interface Dependencies { getClusterById: GetClusterById; @@ -48,6 +49,7 @@ const proxyKubernetesClusterEntitySettingsInjectable = getInjectable({ components: { View: ProxyKubernetesClusterSettings, }, + isShown: computed(() => true), }), injectionToken: entitySettingInjectionToken, }); diff --git a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/terminal-settings.injectable.tsx b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/terminal-settings.injectable.tsx index 6448c935bc..aff5c969bb 100644 --- a/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/terminal-settings.injectable.tsx +++ b/packages/core/src/renderer/components/entity-settings/internal-kubernetes-cluster/terminal-settings.injectable.tsx @@ -10,6 +10,7 @@ import getClusterByIdInjectable from "../../../../features/cluster/storage/commo import { ClusterLocalTerminalSetting } from "../../cluster-settings/local-terminal-settings"; import type { EntitySettingViewProps } from "../extension-registrator.injectable"; import { entitySettingInjectionToken } from "../token"; +import { computed } from "mobx"; interface Dependencies { getClusterById: GetClusterById; @@ -48,6 +49,7 @@ const terminalKubernetesClusterEntitySettingsInjectable = getInjectable({ components: { View: TerminalKubernetesClusterSettings, }, + isShown: computed(() => true), }), injectionToken: entitySettingInjectionToken, }); diff --git a/packages/core/src/renderer/components/entity-settings/settings.injectable.ts b/packages/core/src/renderer/components/entity-settings/settings.injectable.ts index dd519351fd..e35d19626f 100644 --- a/packages/core/src/renderer/components/entity-settings/settings.injectable.ts +++ b/packages/core/src/renderer/components/entity-settings/settings.injectable.ts @@ -21,6 +21,7 @@ const catalogEntitySettingItemsInjectable = getInjectable({ item.apiVersions.has(entity.apiVersion) && item.kind === entity.kind && (!item.source || item.source === entity.metadata.source) + && item.isShown.get() )) .sort(byOrderNumber) )); From de3db0503f8a21c89cc2db67721c5300331273a2 Mon Sep 17 00:00:00 2001 From: Juho Heikka Date: Thu, 1 Jun 2023 23:24:53 +0300 Subject: [PATCH 2/2] Add unit test to entity settings visibility Signed-off-by: Juho Heikka --- .../entity-settings/settings.test.ts | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 packages/core/src/renderer/components/entity-settings/settings.test.ts diff --git a/packages/core/src/renderer/components/entity-settings/settings.test.ts b/packages/core/src/renderer/components/entity-settings/settings.test.ts new file mode 100644 index 0000000000..e6c454e744 --- /dev/null +++ b/packages/core/src/renderer/components/entity-settings/settings.test.ts @@ -0,0 +1,112 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type { ApplicationBuilder } from "../test-utils/get-application-builder"; +import { getApplicationBuilder } from "../test-utils/get-application-builder"; +import type { FakeExtensionOptions } from "../test-utils/get-extension-fake"; +import type { EntitySettingRegistration, RegisteredEntitySetting } from "./extension-registrator.injectable"; +import type { DiContainer } from "@ogre-tools/injectable"; +import catalogEntitySettingItemsInjectable from "./settings.injectable"; +import { KubernetesCluster } from "../../../common/catalog-entities"; +import type { IComputedValue, IObservableValue } from "mobx"; +import { observable } from "mobx"; + +describe("entity-settings", () => { + let builder: ApplicationBuilder; + let windowDi: DiContainer; + let items: IComputedValue; + + beforeEach(async () => { + builder = getApplicationBuilder(); + + await builder.render(); + + windowDi = builder.applicationWindow.only.di; + + const entity = new KubernetesCluster({ + metadata: { + labels: {}, + name: "some-kubernetes-cluster", + uid: "some-entity-id", + }, + spec: { + kubeconfigContext: "some-context", + kubeconfigPath: "/some/path/to/kubeconfig", + }, + status: { + phase: "connecting", + }, + }); + + items = windowDi.inject(catalogEntitySettingItemsInjectable, entity); + + }); + + it("given extension does not specify entity settings visibility, it will be shown by default", () => { + const entitySetting: EntitySettingRegistration = { + title: "some-title", + kind: "KubernetesCluster", + apiVersions: ["entity.k8slens.dev/v1alpha1"], + components: { + View: () => null, + }, + }; + + const testExtensionOptions: FakeExtensionOptions = { + id: "some-extension", + name: "some-extension-name", + + rendererOptions: { + entitySettings: [entitySetting], + }, + }; + const itemCountBefore = items.get().length; + + builder.extensions.enable(testExtensionOptions); + + expect(items.get().length).toBe(itemCountBefore + 1); + }); + + describe("given extension entity settings has visibility set to false", () => { + let settingVisible: IObservableValue; + + beforeEach(() => { + settingVisible = observable.box(false); + const entitySetting: EntitySettingRegistration = { + title: "some-title", + kind: "KubernetesCluster", + apiVersions: ["entity.k8slens.dev/v1alpha1"], + components: { + View: () => null, + }, + visible: settingVisible, + }; + + const testExtensionOptions: FakeExtensionOptions = { + id: "some-extension", + name: "some-extension-name", + + rendererOptions: { + entitySettings: [entitySetting], + }, + }; + + builder.extensions.enable(testExtensionOptions); + }); + + it("it won't be shown initially", () => { + const settingsItem = items.get().find(item => item.title === "some-title"); + + expect(settingsItem).toBe(undefined); + }); + + it("visibility is changed, it is shown", () => { + settingVisible.set(true); + const settingsItem = items.get().find(item => item.title === "some-title"); + + expect(settingsItem).toBeDefined(); + }); + }); +});