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 6acce2da09f6..8913ea9109f3 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 64d4028f24a2..c16de94e4a6e 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 0a860300a350..1a98a34379f3 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 c84827f2a71d..5350c2f87745 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 1a1424b5b3ae..1ecc185585bf 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 90b30ce7d29e..c551f5e4b126 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 6448c935bc0a..aff5c969bbb5 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 dd519351fdd3..e35d19626fef 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) )); 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 000000000000..e6c454e7446e --- /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(); + }); + }); +});