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:
parent
b86db072c6
commit
c76f785d07
@ -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),
|
||||||
|
|||||||
@ -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");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
@ -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;
|
|
||||||
|
|
||||||
@ -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),
|
||||||
|
|||||||
@ -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"),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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"),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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;
|
|
||||||
|
|
||||||
@ -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),
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
@ -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({
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
@ -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,
|
||||||
|
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user