diff --git a/src/behaviours/preferences/__snapshots__/navigation-to-extension-specific-preferences.test.tsx.snap b/src/behaviours/preferences/__snapshots__/navigation-to-extension-specific-preferences.test.tsx.snap index babbd9063a..7a6935b4a3 100644 --- a/src/behaviours/preferences/__snapshots__/navigation-to-extension-specific-preferences.test.tsx.snap +++ b/src/behaviours/preferences/__snapshots__/navigation-to-extension-specific-preferences.test.tsx.snap @@ -1,5 +1,20 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`preferences - navigation to extension specific preferences given in preferences, when rendered given extension with registered tab shows extension tab in general area 1`] = ` + +`; + exports[`preferences - navigation to extension specific preferences given in preferences, when rendered given multiple extensions with specific preferences, when navigating to extension specific preferences page renders 1`] = `
- -
+
+
+
+ + + extension + + + Extensions +
+
+ + +
+
@@ -118,7 +155,8 @@ exports[`preferences - navigation to extension specific preferences given in pre id="extensions" >

- Extensions + some-test-extension-id + preferences

-
+
+
+
+ + + extension + + + Extensions +
+
+ +
+
@@ -843,7 +903,7 @@ exports[`preferences - navigation to extension specific preferences given in pre >
Select...
@@ -869,7 +929,7 @@ exports[`preferences - navigation to extension specific preferences given in pre >
Select...
@@ -954,7 +1014,7 @@ exports[`preferences - navigation to extension specific preferences given in pre >
Select...
@@ -1094,7 +1154,7 @@ exports[`preferences - navigation to extension specific preferences given in pre >
Select...
@@ -1179,7 +1239,7 @@ exports[`preferences - navigation to extension specific preferences given in pre > -
+
+
+
+ + + extension + + + Extensions +
+
+ +
+
@@ -1370,7 +1452,8 @@ exports[`preferences - navigation to extension specific preferences given in pre id="extensions" >

- Extensions + some-test-extension-id + preferences

{ }); }); }); + + describe("given extension with registered tab", () => { + beforeEach(async () => { + const extension = getRendererExtensionFake(extensionStubWithWithRegisteredTab); + + await applicationBuilder.addExtensions(extension); + }); + + it("shows extension tab in general area", () => { + const actual = rendered.getByTestId("tab-link-for-extension-specific-tab-navigation-item-license-extension-tab"); + + expect(actual).toMatchSnapshot(); + }); + + it("does not show custom settings block", () => { + const actual = rendered.queryByTestId("extension-settings"); + + expect(actual).not.toBeInTheDocument(); + }); + }); }); }); @@ -231,3 +251,46 @@ const extensionStubWithShowInPreferencesTab: Partial = { }, ], }; + +const extensionStubWithWithRegisteredTab: Partial = { + id: "registered-tab-page-id", + + appPreferences: [ + { + title: "License item", + id: "license-preference-item-id", + showInPreferencesTab: "license-extension-tab", + + components: { + Hint: () =>
, + Input: () =>
, + }, + }, + { + title: "Menu item", + id: "menu-preference-item-id", + showInPreferencesTab: "menu-extension-tab", + + components: { + Hint: () =>
, + Input: () =>
, + }, + }, + { + title: "Survey item", + id: "survey-preference-item-id", + showInPreferencesTab: "survey-extension-tab", + + components: { + Hint: () =>
, + Input: () =>
, + }, + }, + ], + + appPreferenceTabs: [{ + title: "License tab", + id: "license-extension-tab", + orderNumber: 100, + }], +}; diff --git a/src/renderer/components/+preferences/preferences-navigation/extension-general-preferences-navigation-item.injectable.ts b/src/renderer/components/+preferences/preferences-navigation/extension-general-preferences-navigation-item.injectable.ts new file mode 100644 index 0000000000..13380d3116 --- /dev/null +++ b/src/renderer/components/+preferences/preferences-navigation/extension-general-preferences-navigation-item.injectable.ts @@ -0,0 +1,59 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { computed } from "mobx"; +import { map } from "lodash/fp"; + +import navigateToRouteInjectable from "../../../../main/navigate-to-route/navigate-to-route.injectable"; +import routeIsActiveInjectable from "../../../routes/route-is-active.injectable"; +import { preferenceNavigationItemInjectionToken } from "./preference-navigation-items.injectable"; + +import type { LensRendererExtension } from "../../../../extensions/lens-renderer-extension"; +import { extensionRegistratorInjectionToken } from "../../../../extensions/extension-loader/extension-registrator-injection-token"; +import { pipeline } from "@ogre-tools/fp"; + +const extensionSpecificTabNavigationItemRegistratorInjectable = getInjectable({ + id: "extension-specific-tab-preferences-navigation-items", + + instantiate: (di) => { + return (extension: LensRendererExtension) => { + const navigateToRoute = di.inject(navigateToRouteInjectable); + + const injectables = pipeline( + extension.appPreferenceTabs, + + map((tab) => { + const id = `extension-specific-tab-navigation-item-${tab.id}`; + const route = { + path: `/preferences/${tab.id}`, + clusterFrame: false, + isEnabled: computed(() => true), + }; + const routeIsActive = di.inject(routeIsActiveInjectable, route); + + return getInjectable({ + id, + injectionToken: preferenceNavigationItemInjectionToken, + instantiate: () => ({ + id, + label: tab.title, + orderNumber: tab.orderNumber, + navigate: () => navigateToRoute(route, {}), + isVisible: computed(() => true), + isActive: computed(() => routeIsActive.get()), + }), + }); + }), + ); + + injectables.forEach(di.register); + + return; + }; + }, + injectionToken: extensionRegistratorInjectionToken, +}); + +export default extensionSpecificTabNavigationItemRegistratorInjectable;