mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Expose reactive way to disable pages in Extension API
Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
parent
438390d3e2
commit
0da1f216fb
@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import type { RenderResult } from "@testing-library/react";
|
||||||
|
import type { IObservableValue } from "mobx";
|
||||||
|
import { observable, runInAction, computed } from "mobx";
|
||||||
|
import React from "react";
|
||||||
|
import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake";
|
||||||
|
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
||||||
|
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
||||||
|
import { getExtensionFakeFor } from "../../../renderer/components/test-utils/get-extension-fake";
|
||||||
|
|
||||||
|
describe("reactively disable cluster pages", () => {
|
||||||
|
let builder: ApplicationBuilder;
|
||||||
|
let rendered: RenderResult;
|
||||||
|
let someObservable: IObservableValue<boolean>;
|
||||||
|
let rendererTestExtension: TestExtensionRenderer;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
builder = getApplicationBuilder();
|
||||||
|
|
||||||
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|
||||||
|
const getExtensionFake = getExtensionFakeFor(builder);
|
||||||
|
|
||||||
|
someObservable = observable.box(false);
|
||||||
|
|
||||||
|
const testExtension = getExtensionFake({
|
||||||
|
id: "test-extension-id",
|
||||||
|
name: "test-extension",
|
||||||
|
|
||||||
|
rendererOptions: {
|
||||||
|
clusterPages: [{
|
||||||
|
components: {
|
||||||
|
Page: () => <div data-testid="some-test-page">Some page</div>,
|
||||||
|
},
|
||||||
|
|
||||||
|
enabled: computed(() => someObservable.get()),
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
rendered = await builder.render();
|
||||||
|
|
||||||
|
builder.extensions.enable(testExtension);
|
||||||
|
|
||||||
|
rendererTestExtension = testExtension.renderer;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("when navigating to the page, does not show the page", () => {
|
||||||
|
rendererTestExtension.navigate();
|
||||||
|
|
||||||
|
const actual = rendered.queryByTestId("some-test-page");
|
||||||
|
|
||||||
|
expect(actual).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("given page becomes enabled, when navigating to the page, shows the page", () => {
|
||||||
|
runInAction(() => {
|
||||||
|
someObservable.set(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
rendererTestExtension.navigate();
|
||||||
|
|
||||||
|
const actual = rendered.queryByTestId("some-test-page");
|
||||||
|
|
||||||
|
expect(actual).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -13,7 +13,6 @@ import { observable, runInAction, computed } from "mobx";
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token";
|
import { navigateToRouteInjectionToken } from "../../../../common/front-end-routing/navigate-to-route-injection-token";
|
||||||
import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token";
|
import { routeSpecificComponentInjectionToken } from "../../../../renderer/routes/route-specific-component-injection-token";
|
||||||
import extensionShouldBeEnabledForClusterFrameInjectable from "../../../../renderer/extension-loader/extension-should-be-enabled-for-cluster-frame.injectable";
|
|
||||||
import { KubeObject } from "../../../../common/k8s-api/kube-object";
|
import { KubeObject } from "../../../../common/k8s-api/kube-object";
|
||||||
import { KubeObjectMenu } from "../../../../renderer/components/kube-object-menu";
|
import { KubeObjectMenu } from "../../../../renderer/components/kube-object-menu";
|
||||||
|
|
||||||
@ -27,8 +26,6 @@ describe("reactively hide kube object menu item", () => {
|
|||||||
|
|
||||||
const rendererDi = builder.dis.rendererDi;
|
const rendererDi = builder.dis.rendererDi;
|
||||||
|
|
||||||
rendererDi.unoverride(extensionShouldBeEnabledForClusterFrameInjectable);
|
|
||||||
|
|
||||||
rendererDi.register(testRouteInjectable, testRouteComponentInjectable);
|
rendererDi.register(testRouteInjectable, testRouteComponentInjectable);
|
||||||
|
|
||||||
builder.setEnvironmentToClusterFrame();
|
builder.setEnvironmentToClusterFrame();
|
||||||
|
|||||||
@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import type { RenderResult } from "@testing-library/react";
|
||||||
|
import type { IObservableValue } from "mobx";
|
||||||
|
import { observable, runInAction, computed } from "mobx";
|
||||||
|
import React from "react";
|
||||||
|
import type { TestExtensionRenderer } from "../../../renderer/components/test-utils/get-extension-fake";
|
||||||
|
import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
||||||
|
import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder";
|
||||||
|
import { getExtensionFakeFor } from "../../../renderer/components/test-utils/get-extension-fake";
|
||||||
|
|
||||||
|
describe("reactively disable global pages", () => {
|
||||||
|
let builder: ApplicationBuilder;
|
||||||
|
let rendered: RenderResult;
|
||||||
|
let someObservable: IObservableValue<boolean>;
|
||||||
|
let rendererTestExtension: TestExtensionRenderer;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
builder = getApplicationBuilder();
|
||||||
|
|
||||||
|
const getExtensionFake = getExtensionFakeFor(builder);
|
||||||
|
|
||||||
|
someObservable = observable.box(false);
|
||||||
|
|
||||||
|
const testExtension = getExtensionFake({
|
||||||
|
id: "test-extension-id",
|
||||||
|
name: "test-extension",
|
||||||
|
|
||||||
|
rendererOptions: {
|
||||||
|
globalPages: [{
|
||||||
|
components: {
|
||||||
|
Page: () => <div data-testid="some-test-page">Some page</div>,
|
||||||
|
},
|
||||||
|
|
||||||
|
enabled: computed(() => someObservable.get()),
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
rendered = await builder.render();
|
||||||
|
|
||||||
|
builder.extensions.enable(testExtension);
|
||||||
|
|
||||||
|
rendererTestExtension = testExtension.renderer;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("when navigating to the page, does not show the page", () => {
|
||||||
|
rendererTestExtension.navigate();
|
||||||
|
|
||||||
|
const actual = rendered.queryByTestId("some-test-page");
|
||||||
|
|
||||||
|
expect(actual).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("given page becomes enabled, when navigating to the page, shows the page", () => {
|
||||||
|
runInAction(() => {
|
||||||
|
someObservable.set(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
rendererTestExtension.navigate();
|
||||||
|
|
||||||
|
const actual = rendered.queryByTestId("some-test-page");
|
||||||
|
|
||||||
|
expect(actual).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -2,6 +2,7 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
*/
|
*/
|
||||||
|
import type { IComputedValue } from "mobx";
|
||||||
import type { PageParamInit, PageParam } from "../../renderer/navigation";
|
import type { PageParamInit, PageParam } from "../../renderer/navigation";
|
||||||
|
|
||||||
// Extensions-api -> Custom page registration
|
// Extensions-api -> Custom page registration
|
||||||
@ -14,6 +15,7 @@ export interface PageRegistration {
|
|||||||
id?: string;
|
id?: string;
|
||||||
params?: PageParams<string | Omit<PageParamInit<any>, "name" | "prefix">>;
|
params?: PageParams<string | Omit<PageParamInit<any>, "name" | "prefix">>;
|
||||||
components: PageComponents;
|
components: PageComponents;
|
||||||
|
enabled?: IComputedValue<boolean>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PageComponents {
|
export interface PageComponents {
|
||||||
|
|||||||
@ -35,16 +35,22 @@ const extensionRouteRegistratorInjectable = getInjectable({
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
...extension.globalPages.map(
|
...extension.globalPages.map(
|
||||||
toRouteInjectable(
|
toRouteInjectable(false, (registration) =>
|
||||||
false,
|
computed(() =>
|
||||||
computed(() => true),
|
registration.enabled ? registration.enabled.get() : true,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
...extension.clusterPages.map(
|
...extension.clusterPages.map(
|
||||||
toRouteInjectable(
|
toRouteInjectable(true, (registration) =>
|
||||||
true,
|
computed(() => {
|
||||||
computed(() => extensionShouldBeEnabledForClusterFrame.value.get()),
|
if (!extensionShouldBeEnabledForClusterFrame.value.get()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return registration.enabled ? registration.enabled.get() : true;
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
].flat();
|
].flat();
|
||||||
@ -61,7 +67,7 @@ const toRouteInjectableFor =
|
|||||||
di: DiContainerForInjection,
|
di: DiContainerForInjection,
|
||||||
extension: LensRendererExtension,
|
extension: LensRendererExtension,
|
||||||
) =>
|
) =>
|
||||||
(clusterFrame: boolean, isEnabled: IComputedValue<boolean>) =>
|
(clusterFrame: boolean, getIsEnabled: (registration: PageRegistration) => IComputedValue<boolean>) =>
|
||||||
(registration: PageRegistration) => {
|
(registration: PageRegistration) => {
|
||||||
const routeInjectable = getInjectable({
|
const routeInjectable = getInjectable({
|
||||||
id: `route-${registration.id}-for-extension-${extension.sanitizedExtensionId}`,
|
id: `route-${registration.id}-for-extension-${extension.sanitizedExtensionId}`,
|
||||||
@ -69,7 +75,7 @@ const toRouteInjectableFor =
|
|||||||
instantiate: () => ({
|
instantiate: () => ({
|
||||||
path: getExtensionRoutePath(extension, registration.id),
|
path: getExtensionRoutePath(extension, registration.id),
|
||||||
clusterFrame,
|
clusterFrame,
|
||||||
isEnabled,
|
isEnabled: getIsEnabled(registration),
|
||||||
extension,
|
extension,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user