1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Remove duplication from getting preference navigation items for different groups

Co-authored-by: Alex Andreev <alex.andreev.email@gmail.com>

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-06-21 15:59:17 +03:00
parent b86db072c6
commit c76f785d07
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
15 changed files with 125 additions and 159 deletions

View File

@ -250,6 +250,7 @@ const testNavigationItemInjectable = getInjectable({
return { return {
id: "some-test-preference-navigation-item-id", id: "some-test-preference-navigation-item-id",
label: "Some preference navigation item", label: "Some preference navigation item",
parent: "general",
isActive: routeIsActive, isActive: routeIsActive,
isVisible: testRoute.isEnabled, isVisible: testRoute.isEnabled,
navigate: navigateToPreferenceTab(testRoute), navigate: navigateToPreferenceTab(testRoute),

View File

@ -6,13 +6,11 @@
import "@testing-library/jest-dom/extend-expect"; import "@testing-library/jest-dom/extend-expect";
import type { RenderResult } from "@testing-library/react"; import type { RenderResult } from "@testing-library/react";
import { computed } from "mobx"; import { computed } from "mobx";
import type { IComputedValue } from "mobx/dist/internal";
import { noop } from "../../../../utils"; import { noop } from "../../../../utils";
import type { ApplicationBuilder } from "../../../test-utils/get-application-builder"; import type { ApplicationBuilder } from "../../../test-utils/get-application-builder";
import { getApplicationBuilder } from "../../../test-utils/get-application-builder"; import { getApplicationBuilder } from "../../../test-utils/get-application-builder";
import extensionsPreferenceNavigationItemsInjectable from "../extension-preference-navigation-items.injectable";
import generalPreferenceNavigationItemsInjectable from "../general-preference-navigation-items.injectable";
import type { PreferenceNavigationItem } from "../preference-navigation-items.injectable"; import type { PreferenceNavigationItem } from "../preference-navigation-items.injectable";
import preferenceNavigationItemsInjectable from "../preference-navigation-items.injectable";
describe.only("preferences - navigation block with links", () => { describe.only("preferences - navigation block with links", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
@ -26,31 +24,9 @@ describe.only("preferences - navigation block with links", () => {
describe("when general navigation items passed", () => { describe("when general navigation items passed", () => {
beforeEach(async () => { beforeEach(async () => {
const generalNavItems: IComputedValue<PreferenceNavigationItem[]> = computed(() => [
{
id: "general",
label: "General",
isActive: computed(() => false),
isVisible: computed(() => true),
navigate: () => noop,
orderNumber: 0,
parent: "",
},
{
id: "proxy",
label: "Proxy",
isActive: computed(() => false),
isVisible: computed(() => true),
navigate: () => noop,
orderNumber: 1,
parent: "",
},
]);
applicationBuilder.beforeApplicationStart(({ rendererDi }) => { applicationBuilder.beforeApplicationStart(({ rendererDi }) => {
rendererDi.override( rendererDi.override(preferenceNavigationItemsInjectable, () =>
generalPreferenceNavigationItemsInjectable, computed(() => generalNavItems),
() => generalNavItems,
); );
}); });
@ -68,13 +44,62 @@ describe.only("preferences - navigation block with links", () => {
}); });
it("does not show custom settings block", () => { it("does not show custom settings block", () => {
expect(renderer.queryByTestId("extension-settings")).not.toBeInTheDocument(); expect(
renderer.queryByTestId("extension-settings"),
).not.toBeInTheDocument();
}); });
}); });
describe("when general + extension navigation items passed", () => { describe("when general + extension navigation items passed", () => {
beforeEach(async () => { beforeEach(async () => {
const generalNavItems: IComputedValue<PreferenceNavigationItem[]> = computed(() => [ applicationBuilder.beforeApplicationStart(({ rendererDi }) => {
rendererDi.override(preferenceNavigationItemsInjectable, () =>
computed(() => [...generalNavItems, ...extensionNavItems]),
);
});
applicationBuilder.beforeRender(() => {
applicationBuilder.preferences.navigate();
});
renderer = await applicationBuilder.render();
});
const generalLinks = ["General", "Proxy"];
it.each(generalLinks)(
"renders general link with text content %s",
(link) => {
expect(renderer.container).toHaveTextContent(link);
},
);
it("shows custom settings block", () => {
expect(
renderer.queryByTestId("extension-settings"),
).toBeInTheDocument();
});
const extensionLinks = ["lensapp-node-menu", "lensapp-pod-menu"];
it.each(extensionLinks)("shows extension navigation item %s", (link) => {
expect(
renderer.getByTestId(
`tab-link-for-extension-preferences-navigation-item-${link}`,
),
).toBeInTheDocument();
});
it("renders extension navigation items inside custom settings block", () => {
const settingsBlock = renderer.getByTestId("extension-settings");
expect(settingsBlock).toHaveTextContent("lensapp-node-menu");
});
});
});
});
const generalNavItems: PreferenceNavigationItem[] = [
{ {
id: "general", id: "general",
label: "General", label: "General",
@ -82,7 +107,7 @@ describe.only("preferences - navigation block with links", () => {
isVisible: computed(() => true), isVisible: computed(() => true),
navigate: () => noop, navigate: () => noop,
orderNumber: 0, orderNumber: 0,
parent: "", parent: "general",
}, },
{ {
id: "proxy", id: "proxy",
@ -91,11 +116,11 @@ describe.only("preferences - navigation block with links", () => {
isVisible: computed(() => true), isVisible: computed(() => true),
navigate: () => noop, navigate: () => noop,
orderNumber: 1, orderNumber: 1,
parent: "", parent: "general",
}, },
]); ];
const extensionNavItems: IComputedValue<PreferenceNavigationItem[]> = computed(() => [ const extensionNavItems = [
{ {
id: "extension-preferences-navigation-item-lensapp-node-menu", id: "extension-preferences-navigation-item-lensapp-node-menu",
label: "lensapp-node-menu", label: "lensapp-node-menu",
@ -123,48 +148,5 @@ describe.only("preferences - navigation block with links", () => {
orderNumber: 0, orderNumber: 0,
parent: "extensions", parent: "extensions",
}, },
]); ];
applicationBuilder.beforeApplicationStart(({ rendererDi }) => {
rendererDi.override(
generalPreferenceNavigationItemsInjectable,
() => generalNavItems,
);
rendererDi.override(
extensionsPreferenceNavigationItemsInjectable,
() => extensionNavItems,
);
});
applicationBuilder.beforeRender(() => {
applicationBuilder.preferences.navigate();
});
renderer = await applicationBuilder.render();
});
const generalLinks = ["General", "Proxy"];
it.each(generalLinks)("renders general link with text content %s", (link) => {
expect(renderer.container).toHaveTextContent(link);
});
it("shows custom settings block", () => {
expect(renderer.queryByTestId("extension-settings")).toBeInTheDocument();
});
const extensionLinks = ["lensapp-node-menu", "lensapp-pod-menu"];
it.each(extensionLinks)("shows extension navigation item %s", (link) => {
expect(renderer.getByTestId(`tab-link-for-extension-preferences-navigation-item-${link}`)).toBeInTheDocument();
});
it("renders extension navigation items inside custom settings block", () => {
const settingsBlock = renderer.getByTestId("extension-settings");
expect(settingsBlock).toHaveTextContent("lensapp-node-menu");
});
});
});
});

View File

@ -24,6 +24,7 @@ const applicationPreferencesNavigationItemInjectable = getInjectable({
return { return {
id: "application", id: "application",
label: "App", label: "App",
parent: "general",
navigate: navigateToPreferenceTab(route), navigate: navigateToPreferenceTab(route),
isActive: routeIsActive, isActive: routeIsActive,
isVisible: computed(() => true), isVisible: computed(() => true),

View File

@ -24,6 +24,7 @@ const editorPreferencesNavigationItemInjectable = getInjectable({
return { return {
id: "editor", id: "editor",
label: "Editor", label: "Editor",
parent: "general",
navigate: navigateToPreferenceTab(route), navigate: navigateToPreferenceTab(route),
isActive: routeIsActive, isActive: routeIsActive,
isVisible: computed(() => true), isVisible: computed(() => true),

View File

@ -1,27 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { pipeline } from "@ogre-tools/fp";
import { getInjectable } from "@ogre-tools/injectable";
import { filter, orderBy } from "lodash/fp";
import { computed } from "mobx";
import type { PreferenceNavigationItem } from "./preference-navigation-items.injectable";
import { preferenceNavigationItemInjectionToken } from "./preference-navigation-items.injectable";
const extensionsPreferenceNavigationItemsInjectable = getInjectable({
id: "extension-preference-navigation-items",
instantiate: (di) =>
computed((): PreferenceNavigationItem[] =>
pipeline(
di.injectMany(preferenceNavigationItemInjectionToken),
filter((item) => !!item.isVisible.get()),
filter((item) => item.parent == "extensions"),
(items) => orderBy([(item) => item.orderNumber], ["asc"], items),
),
),
});
export default extensionsPreferenceNavigationItemsInjectable;

View File

@ -43,6 +43,7 @@ const extensionSpecificTabNavigationItemRegistratorInjectable = getInjectable({
instantiate: () => ({ instantiate: () => ({
id, id,
label: tab.title, label: tab.title,
parent: "general",
orderNumber: tab.orderNumber || 100, orderNumber: tab.orderNumber || 100,
navigate: () => navigateToExtensionPreferences(extension.sanitizedExtensionId, tab.id), navigate: () => navigateToExtensionPreferences(extension.sanitizedExtensionId, tab.id),
isVisible: computed(() => true), isVisible: computed(() => true),

View File

@ -8,7 +8,7 @@ import type { IComputedValue } from "mobx";
import type { PreferenceNavigationItem } from "./preference-navigation-items.injectable"; import type { PreferenceNavigationItem } from "./preference-navigation-items.injectable";
import { Icon } from "../../icon"; import { Icon } from "../../icon";
import { PreferencesNavigationTab } from "./preference-navigation-tab"; import { PreferencesNavigationTab } from "./preference-navigation-tab";
import extensionsPreferenceNavigationItemsInjectable from "./extension-preference-navigation-items.injectable"; import preferenceNavigationItemsForGroupInjectable from "./preference-navigation-items-for-group.injectable";
interface Dependencies { interface Dependencies {
navigationItems: IComputedValue<PreferenceNavigationItem[]>; navigationItems: IComputedValue<PreferenceNavigationItem[]>;
@ -49,7 +49,7 @@ export const ExtensionsNavGroup = withInjectables<Dependencies>(
{ {
getProps: (di) => ({ getProps: (di) => ({
navigationItems: di.inject(extensionsPreferenceNavigationItemsInjectable), navigationItems: di.inject(preferenceNavigationItemsForGroupInjectable, "extensions"),
}), }),
}, },
); );

View File

@ -7,7 +7,7 @@ import { withInjectables } from "@ogre-tools/injectable-react";
import type { IComputedValue } from "mobx"; import type { IComputedValue } from "mobx";
import type { PreferenceNavigationItem } from "./preference-navigation-items.injectable"; import type { PreferenceNavigationItem } from "./preference-navigation-items.injectable";
import { PreferencesNavigationTab } from "./preference-navigation-tab"; import { PreferencesNavigationTab } from "./preference-navigation-tab";
import generalPreferenceNavigationItemsInjectable from "./general-preference-navigation-items.injectable"; import preferenceNavigationItemsForGroupInjectable from "./preference-navigation-items-for-group.injectable";
interface Dependencies { interface Dependencies {
navigationItems: IComputedValue<PreferenceNavigationItem[]>; navigationItems: IComputedValue<PreferenceNavigationItem[]>;
@ -38,7 +38,7 @@ export const GeneralNavGroup = withInjectables<Dependencies>(
{ {
getProps: (di) => ({ getProps: (di) => ({
navigationItems: di.inject(generalPreferenceNavigationItemsInjectable), navigationItems: di.inject(preferenceNavigationItemsForGroupInjectable, "general"),
}), }),
}, },
); );

View File

@ -1,27 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { pipeline } from "@ogre-tools/fp";
import { getInjectable } from "@ogre-tools/injectable";
import { filter, orderBy } from "lodash/fp";
import { computed } from "mobx";
import type { PreferenceNavigationItem } from "./preference-navigation-items.injectable";
import { preferenceNavigationItemInjectionToken } from "./preference-navigation-items.injectable";
const generalPreferenceNavigationItemsInjectable = getInjectable({
id: "general-preference-navigation-items",
instantiate: (di) =>
computed((): PreferenceNavigationItem[] =>
pipeline(
di.injectMany(preferenceNavigationItemInjectionToken),
filter((item) => !!item.isVisible.get()),
filter((item) => !item.parent),
(items) => orderBy([(item) => item.orderNumber], ["asc"], items),
),
),
});
export default generalPreferenceNavigationItemsInjectable;

View File

@ -27,6 +27,7 @@ const kubernetesPreferencesNavigationItemInjectable = getInjectable({
return { return {
id: "kubernetes", id: "kubernetes",
label: "Kubernetes", label: "Kubernetes",
parent: "general",
navigate: navigateToPreferenceTab(route), navigate: navigateToPreferenceTab(route),
isActive: routeIsActive, isActive: routeIsActive,
isVisible: computed(() => true), isVisible: computed(() => true),

View File

@ -0,0 +1,30 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import {
getInjectable,
lifecycleEnum,
} from "@ogre-tools/injectable";
import { computed } from "mobx";
import type { PreferenceNavigationItem } from "./preference-navigation-items.injectable";
import preferenceNavigationItemsInjectable from "./preference-navigation-items.injectable";
const preferenceNavigationItemsForGroupInjectable = getInjectable({
id: "preference-navigation-items-for-group",
instantiate: (di, group: string) => {
const preferenceNavigationItems = di.inject(preferenceNavigationItemsInjectable);
return computed((): PreferenceNavigationItem[] =>
preferenceNavigationItems.get().filter((item) => item.parent == group),
);
},
lifecycle: lifecycleEnum.keyedSingleton({
getInstanceKey: (di, group: string) => group,
}),
});
export default preferenceNavigationItemsForGroupInjectable;

View File

@ -20,7 +20,7 @@ export interface PreferenceNavigationItem {
isVisible: IComputedValue<boolean>; isVisible: IComputedValue<boolean>;
navigate: () => void; navigate: () => void;
orderNumber: number; orderNumber: number;
parent?: string; parent: string;
} }
const preferenceNavigationItemsInjectable = getInjectable({ const preferenceNavigationItemsInjectable = getInjectable({

View File

@ -24,6 +24,7 @@ const proxyPreferencesNavigationItemInjectable = getInjectable({
return { return {
id: "proxy", id: "proxy",
label: "Proxy", label: "Proxy",
parent: "general",
navigate: navigateToPreferenceTab(route), navigate: navigateToPreferenceTab(route),
isActive: routeIsActive, isActive: routeIsActive,
isVisible: computed(() => true), isVisible: computed(() => true),

View File

@ -32,6 +32,7 @@ const terminalPreferencesNavigationItemInjectable = getInjectable({
return { return {
id: "telemetry", id: "telemetry",
label: "Telemetry", label: "Telemetry",
parent: "general",
navigate: navigateToPreferenceTab(route), navigate: navigateToPreferenceTab(route),
isActive: routeIsActive, isActive: routeIsActive,

View File

@ -24,6 +24,7 @@ const terminalPreferencesNavigationItemInjectable = getInjectable({
return { return {
id: "terminal", id: "terminal",
label: "Terminal", label: "Terminal",
parent: "general",
navigate: navigateToPreferenceTab(route), navigate: navigateToPreferenceTab(route),
isActive: routeIsActive, isActive: routeIsActive,
isVisible: computed(() => true), isVisible: computed(() => true),