1
0
mirror of https://github.com/lensapp/lens.git synced 2024-08-16 04:40:24 +03:00

chore: Convert sidebarItemInjectionToken to use InjectWithMetadata instead of duplicating the IDs

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2023-05-12 10:46:13 -04:00
parent 04273dcda2
commit 7924ab5504
62 changed files with 145 additions and 212 deletions

View File

@ -1,26 +1,21 @@
/* eslint-disable prettier/prettier */
import { getInjectable } from "@ogre-tools/injectable";
import { getInjectable, InjectionInstanceWithMeta } from "@ogre-tools/injectable";
import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx";
import { HierarchicalSidebarItem, sidebarItemInjectionToken, SidebarItemRegistration } from "./tokens";
import { SidebarItemDeclaration, sidebarItemInjectionToken, SidebarItemRegistration } from "./tokens";
import { computed } from "mobx";
import { byOrderNumber } from "@k8slens/utilities";
const getSidebarItemsHierarchy = (
registrations: SidebarItemRegistration[],
registrations: InjectionInstanceWithMeta<SidebarItemRegistration>[],
parentId: string | null,
): HierarchicalSidebarItem[] => (
): SidebarItemDeclaration[] =>
registrations
.filter((item) => item.parentId === parentId)
.map(({
isActive,
isVisible,
...registration
}) => {
const children = getSidebarItemsHierarchy(registrations, registration.id);
.filter(({ instance }) => instance.parentId === parentId)
.map(({ instance: { isActive, isVisible, ...registration }, meta: { id } }) => {
const children = getSidebarItemsHierarchy(registrations, id);
return {
...registration,
id,
children,
isVisible: computed(() => {
if (children.length === 0) {
@ -46,8 +41,7 @@ const getSidebarItemsHierarchy = (
}),
};
})
.sort(byOrderNumber)
);
.sort(byOrderNumber);
const sidebarItemsInjectable = getInjectable({
id: "sidebar-items",
@ -55,7 +49,11 @@ const sidebarItemsInjectable = getInjectable({
const computedInjectMany = di.inject(computedInjectManyInjectable);
const sidebarItemRegistrations = computedInjectMany(sidebarItemInjectionToken);
return computed(() => getSidebarItemsHierarchy(sidebarItemRegistrations.get(), null));
return computed(() => {
void sidebarItemRegistrations.get();
return getSidebarItemsHierarchy(di.injectManyWithMeta(sidebarItemInjectionToken), null);
});
},
});

View File

@ -8,7 +8,7 @@ import type { IComputedValue } from "mobx";
import type { StrictReactNode } from "@k8slens/utilities";
export interface SidebarItemRegistration {
id: string;
id?: undefined;
parentId: string | null;
title: StrictReactNode;
onClick: () => void;
@ -18,7 +18,7 @@ export interface SidebarItemRegistration {
orderNumber: number;
}
export interface SidebarItem {
export interface SidebarItemDeclaration {
id: string;
parentId: string | null;
title: StrictReactNode;
@ -26,10 +26,7 @@ export interface SidebarItem {
getIcon?: () => StrictReactNode;
isActive: IComputedValue<boolean>;
isVisible: IComputedValue<boolean>;
}
export interface HierarchicalSidebarItem extends SidebarItem {
children: HierarchicalSidebarItem[];
children: SidebarItemDeclaration[];
}
export const sidebarItemInjectionToken = getInjectionToken<SidebarItemRegistration>({

View File

@ -37,7 +37,7 @@ describe("disable sidebar items when cluster is not relevant", () => {
clusterPageMenus: [
{
id: "some-sidebar-item",
id: "sidebar-item-some",
title: "Some sidebar item",
components: {
@ -60,7 +60,7 @@ describe("disable sidebar items when cluster is not relevant", () => {
it("does not show the sidebar item", () => {
const actual = rendered.queryByTestId(
"sidebar-item-some-extension-name-some-sidebar-item",
"sidebar-item-sidebar-item-some-extension-name-some",
);
expect(actual).not.toBeInTheDocument();
@ -78,7 +78,7 @@ describe("disable sidebar items when cluster is not relevant", () => {
it("does not show the sidebar item", () => {
const actual = rendered.queryByTestId(
"sidebar-item-some-extension-name-some-sidebar-item",
"sidebar-item-sidebar-item-some-extension-name-some",
);
expect(actual).not.toBeInTheDocument();
@ -96,7 +96,7 @@ describe("disable sidebar items when cluster is not relevant", () => {
it("shows the sidebar item", () => {
const actual = rendered.getByTestId(
"sidebar-item-test-extension-some-sidebar-item",
"sidebar-item-sidebar-item-test-extension-some",
);
expect(actual).toBeInTheDocument();

View File

@ -85,9 +85,8 @@ describe("cluster - order of sidebar items", () => {
});
const someParentSidebarItemInjectable = getInjectable({
id: "some-parent-sidebar-item",
id: "sidebar-item-some-parent",
instantiate: () => ({
id: "some-parent-id",
parentId: null,
title: "Some parent",
onClick: noop,
@ -97,9 +96,8 @@ const someParentSidebarItemInjectable = getInjectable({
});
const someOtherParentSidebarItemInjectable = getInjectable({
id: "some-other-parent-sidebar-item",
id: "sidebar-item-some-other-parent",
instantiate: () => ({
id: "some-other-parent-id",
parentId: null,
title: "Some other parent",
onClick: noop,
@ -109,9 +107,8 @@ const someOtherParentSidebarItemInjectable = getInjectable({
});
const someAnotherParentSidebarItemInjectable = getInjectable({
id: "some-another-parent-sidebar-item",
id: "sidebar-item-some-another-parent",
instantiate: () => ({
id: "some-another-parent-id",
parentId: null,
title: "Some another parent",
onClick: noop,
@ -121,10 +118,9 @@ const someAnotherParentSidebarItemInjectable = getInjectable({
});
const someChildSidebarItemInjectable = getInjectable({
id: "some-child-sidebar-item",
instantiate: (di) => ({
id: "some-child-id",
parentId: di.inject(someParentSidebarItemInjectable).id,
id: "sidebar-item-some-child",
instantiate: () => ({
parentId: someParentSidebarItemInjectable.id,
title: "Some child",
onClick: noop,
orderNumber: 168,
@ -133,10 +129,9 @@ const someChildSidebarItemInjectable = getInjectable({
});
const someOtherChildSidebarItemInjectable = getInjectable({
id: "some-other-child-sidebar-item",
instantiate: (di) => ({
id: "some-other-child-id",
parentId: di.inject(someParentSidebarItemInjectable).id,
id: "sidebar-item-some-other-child",
instantiate: () => ({
parentId: someParentSidebarItemInjectable.id,
title: "Some other child",
onClick: noop,
orderNumber: 252,
@ -145,10 +140,9 @@ const someOtherChildSidebarItemInjectable = getInjectable({
});
const someAnotherChildSidebarItemInjectable = getInjectable({
id: "some-another-child-sidebar-item",
instantiate: (di) => ({
id: "some-another-child-id",
parentId: di.inject(someParentSidebarItemInjectable).id,
id: "sidebar-item-some-another-child",
instantiate: () => ({
parentId: someParentSidebarItemInjectable.id,
title: "Some another child",
onClick: noop,
orderNumber: 210,

View File

@ -295,9 +295,8 @@ describe("cluster - sidebar and tab navigation for core", () => {
});
const someParentSidebarItemInjectable = getInjectable({
id: "some-parent-sidebar-item",
id: "sidebar-item-some-parent",
instantiate: () => ({
id: "some-parent-id",
parentId: null,
title: "Some parent",
onClick: noop,
@ -308,15 +307,14 @@ const someParentSidebarItemInjectable = getInjectable({
});
const someChildSidebarItemInjectable = getInjectable({
id: "some-child-sidebar-item",
id: "sidebar-item-some-child",
instantiate: (di) => {
const route = di.inject(testRouteInjectable);
const navigateToRoute = di.inject(navigateToRouteInjectionToken);
const routeIsActive = di.inject(routeIsActiveInjectable, route);
return {
id: "some-child-id",
parentId: di.inject(someParentSidebarItemInjectable).id,
parentId: someParentSidebarItemInjectable.id,
title: "Some child",
onClick: () => navigateToRoute(route),
isActive: routeIsActive,

View File

@ -27,7 +27,7 @@ describe("cluster - visibility of sidebar items", () => {
runInAction(() => {
windowDi.register(testRouteInjectable);
windowDi.register(testRouteComponentInjectable);
windowDi.register(testSidebarItemsInjectable);
windowDi.register(testSidebarItemInjectable);
});
});
});
@ -94,15 +94,14 @@ const testRouteComponentInjectable = getInjectable({
injectionToken: routeSpecificComponentInjectionToken,
});
const testSidebarItemsInjectable = getInjectable({
id: "some-sidebar-item-injectable",
const testSidebarItemInjectable = getInjectable({
id: "sidebar-item-test",
instantiate: (di) => {
const testRoute = di.inject(testRouteInjectable);
const navigateToRoute = di.inject(navigateToRouteInjectionToken);
return {
id: "some-item-id",
parentId: null,
title: "Some item",
onClick: () => navigateToRoute(testRoute),

View File

@ -11,13 +11,12 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToClusterOverviewInjectable from "../../../common/front-end-routing/routes/cluster/overview/navigate-to-cluster-overview.injectable";
const clusterOverviewSidebarItemInjectable = getInjectable({
id: "cluster-overview-sidebar-item",
id: "sidebar-item-cluster-overview",
instantiate: (di) => {
const route = di.inject(clusterOverviewRouteInjectable);
return {
id: "cluster-overview",
parentId: null,
title: "Cluster",
getIcon: () => <Icon svg="kube" />,

View File

@ -10,14 +10,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToHorizontalPodAutoscalersInjectable from "../../../common/front-end-routing/routes/cluster/config/horizontal-pod-autoscalers/navigate-to-horizontal-pod-autoscalers.injectable";
const horizontalPodAutoScalersSidebarItemInjectable = getInjectable({
id: "horizontal-pod-auto-scalers-sidebar-item",
id: "sidebar-item-horizontal-pod-auto-scalers",
instantiate: (di) => {
const route = di.inject(horizontalPodAutoscalersRouteInjectable);
return {
id: "horizontal-pod-auto-scalers",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "HPA",
onClick: di.inject(navigateToHorizontalPodAutoscalersInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToLeasesInjectable from "../../../common/front-end-routing/routes/cluster/config/leases/navigate-to-leases.injectable";
const leasesSidebarItemInjectable = getInjectable({
id: "leases-sidebar-item",
id: "sidebar-item-leases",
instantiate: (di) => {
const route = di.inject(leasesRouteInjectable);
return {
id: "leases",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "Leases",
onClick: di.inject(navigateToLeasesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToLimitRangesInjectable from "../../../common/front-end-routing/routes/cluster/config/limit-ranges/navigate-to-limit-ranges.injectable";
const limitRangesSidebarItemInjectable = getInjectable({
id: "limit-ranges-sidebar-item",
id: "sidebar-item-limit-ranges",
instantiate: (di) => {
const route = di.inject(limitRangesRouteInjectable);
return {
id: "limit-ranges",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "Limit Ranges",
onClick: di.inject(navigateToLimitRangesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToConfigMapsInjectable from "../../../common/front-end-routing/routes/cluster/config/config-maps/navigate-to-config-maps.injectable";
const configMapsSidebarItemInjectable = getInjectable({
id: "config-maps-sidebar-item",
id: "sidebar-item-config-maps",
instantiate: (di) => {
const route = di.inject(configMapsRouteInjectable);
return {
id: "config-maps",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "ConfigMaps",
onClick: di.inject(navigateToConfigMapsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -10,14 +10,13 @@ import navigateToMutatingWebhookConfigurationsInjectable from "../../../common/f
import configSidebarItemInjectable from "../config/config-sidebar-item.injectable";
const mutatingWebhookConfigurationsSidebarItemInjectable = getInjectable({
id: "mutating-webhook-configurations-sidebar-item",
id: "sidebar-item-mutating-webhook-configurations",
instantiate: (di) => {
const route = di.inject(mutatingWebhookConfigurationsRouteInjectable);
return {
id: "mutating-webhook-configurations",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "Mutating Webhook Configs",
onClick: di.inject(navigateToMutatingWebhookConfigurationsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToPodDisruptionBudgetsInjectable from "../../../common/front-end-routing/routes/cluster/config/pod-disruption-budgets/navigate-to-pod-disruption-budgets.injectable";
const podDisruptionBudgetsSidebarItemInjectable = getInjectable({
id: "pod-disruption-budgets-sidebar-item",
id: "sidebar-item-pod-disruption-budgets",
instantiate: (di) => {
const route = di.inject(podDisruptionBudgetsRouteInjectable);
return {
id: "pod-disruption-budgets",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "Pod Disruption Budgets",
onClick: di.inject(navigateToPodDisruptionBudgetsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToPriorityClassesInjectable from "../../../common/front-end-routing/routes/cluster/config/priority-classes/navigate-to-priority-classes.injectable";
const priorityClassesSidebarItemInjectable = getInjectable({
id: "priority-classes-sidebar-item",
id: "sidebar-item-priority-classes",
instantiate: (di) => {
const route = di.inject(priorityClassesRouteInjectable);
return {
id: "priority-classes",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "Priority Classes",
onClick: di.inject(navigateToPriorityClassesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToResourceQuotasInjectable from "../../../common/front-end-routing/routes/cluster/config/resource-quotas/navigate-to-resource-quotas.injectable";
const resourceQuotasSidebarItemInjectable = getInjectable({
id: "resource-quotas-sidebar-item",
id: "sidebar-item-resource-quotas",
instantiate: (di) => {
const route = di.inject(resourceQuotasRouteInjectable);
return {
id: "resource-quotas",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "Resource Quotas",
onClick: di.inject(navigateToResourceQuotasInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToRuntimeClassesInjectable from "../../../common/front-end-routing/routes/cluster/config/runtime-classes/navigate-to-runtime-classes.injectable";
const runtimeClassesSidebarItemInjectable = getInjectable({
id: "runtime-classes-sidebar-item",
id: "sidebar-item-runtime-classes",
instantiate: (di) => {
const route = di.inject(runtimeClassesRouteInjectable);
return {
id: "runtime-classes",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "Runtime Classes",
onClick: di.inject(navigateToRuntimeClassesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToSecretsInjectable from "../../../common/front-end-routing/routes/cluster/config/secrets/navigate-to-secrets.injectable";
const secretsSidebarItemInjectable = getInjectable({
id: "secrets-sidebar-item",
id: "sidebar-item-secrets",
instantiate: (di) => {
const route = di.inject(secretsRouteInjectable);
return {
id: "secrets",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "Secrets",
onClick: di.inject(navigateToSecretsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -10,14 +10,13 @@ import navigateToValidatingWebhookConfigurationsInjectable from "../../../common
import configSidebarItemInjectable from "../config/config-sidebar-item.injectable";
const validatingWebhookConfigurationsSidebarItemInjectable = getInjectable({
id: "validating-webhook-configurations-sidebar-item",
id: "sidebar-item-validating-webhook-configurations",
instantiate: (di) => {
const route = di.inject(validatingWebhookConfigurationsRouteInjectable);
return {
id: "validating-webhook-configurations",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "Validating Webhook Configs",
onClick: di.inject(navigateToValidatingWebhookConfigurationsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -10,14 +10,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToVerticalPodAutoscalersInjectable from "../../../common/front-end-routing/routes/cluster/config/vertical-pod-autoscalers/navigate-to-vertical-pod-autoscalers.injectable";
const verticalPodAutoScalersSidebarItemInjectable = getInjectable({
id: "vertical-pod-auto-scalers-sidebar-item",
id: "sidebar-item-vertical-pod-auto-scalers",
instantiate: (di) => {
const route = di.inject(verticalPodAutoscalersRouteInjectable);
return {
id: "vertical-pod-auto-scalers",
parentId: di.inject(configSidebarItemInjectable).id,
parentId: configSidebarItemInjectable.id,
title: "VPA",
onClick: di.inject(navigateToVerticalPodAutoscalersInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -9,10 +9,9 @@ import { sidebarItemInjectionToken } from "@k8slens/cluster-sidebar";
import { noop } from "lodash/fp";
const configSidebarItemInjectable = getInjectable({
id: "config-sidebar-item",
id: "sidebar-item-config",
instantiate: () => ({
id: "config",
parentId: null,
title: "Config",
getIcon: () => <Icon material="list" />,

View File

@ -27,10 +27,9 @@ const customResourceDefinitionGroupsSidebarItemsComputedInjectable = getInjectab
const toCustomResourceGroupToSidebarItems = ([group, definitions]: [string, CustomResourceDefinition[]], index: number) => {
const customResourceGroupSidebarItem = getInjectable({
id: `custom-resource-group-${group}-sidebar-item`,
instantiate: (di): SidebarItemRegistration => ({
id: `custom-resource-group-${group}`,
parentId: di.inject(customResourcesSidebarItemInjectable).id,
id: `sidebar-item-custom-resource-group-${group}`,
instantiate: (): SidebarItemRegistration => ({
parentId: customResourcesSidebarItemInjectable.id,
onClick: noop,
title: group,
orderNumber: 10 * index,
@ -44,10 +43,9 @@ const customResourceDefinitionGroupsSidebarItemsComputedInjectable = getInjectab
};
return getInjectable({
id: `custom-resource-group-${group}/${definition.getPluralName()}-sidebar-item`,
id: `sidebar-item-custom-resource-group-${group}/${definition.getPluralName()}`,
instantiate: (di): SidebarItemRegistration => ({
id: `custom-resource-group-${group}/${definition.getPluralName()}`,
parentId: di.inject(customResourceGroupSidebarItem).id,
parentId: customResourceGroupSidebarItem.id,
onClick: () => navigateToCustomResources(parameters),
title: definition.getResourceKind(),
isActive: computedAnd(

View File

@ -10,13 +10,12 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import customResourcesSidebarItemInjectable from "./custom-resources-sidebar-item.injectable";
const customResourceDefinitionsSidebarItemInjectable = getInjectable({
id: "custom-resource-definitions-sidebar-item",
id: "sidebar-item-custom-resource-definitions",
instantiate: (di) => {
const customResourceDefinitionsRoute = di.inject(customResourceDefinitionsRouteInjectable);
return {
id: "custom-resource-definitions",
parentId: di.inject(customResourcesSidebarItemInjectable).id,
parentId: customResourcesSidebarItemInjectable.id,
title: "Definitions",
onClick: di.inject(navigateToCustomResourcesInjectable),
isActive: di.inject(routeIsActiveInjectable, customResourceDefinitionsRoute),

View File

@ -9,9 +9,8 @@ import React from "react";
import { Icon } from "../icon";
const customResourcesSidebarItemInjectable = getInjectable({
id: "custom-resources-sidebar-item",
id: "sidebar-item-custom-resources",
instantiate: () => ({
id: "custom-resources",
parentId: null,
title: "Custom Resources",
getIcon: () => <Icon material="extension" />,

View File

@ -12,13 +12,12 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToEventsInjectable from "../../../common/front-end-routing/routes/cluster/events/navigate-to-events.injectable";
const eventsSidebarItemInjectable = getInjectable({
id: "events-sidebar-item",
id: "sidebar-item-events",
instantiate: (di) => {
const route = di.inject(eventsRouteInjectable);
return {
id: "events",
parentId: null,
getIcon: () => <Icon material="access_time" />,
title: "Events",

View File

@ -10,14 +10,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToHelmChartsInjectable from "../../../common/front-end-routing/routes/cluster/helm/charts/navigate-to-helm-charts.injectable";
const helmChartsSidebarItemInjectable = getInjectable({
id: "helm-charts-sidebar-item",
id: "sidebar-item-helm-charts",
instantiate: (di) => {
const route = di.inject(helmChartsRouteInjectable);
return {
id: "charts",
parentId: di.inject(helmSidebarItemInjectable).id,
parentId: helmSidebarItemInjectable.id,
title: "Charts",
onClick: di.inject(navigateToHelmChartsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToHelmReleasesInjectable from "../../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
const helmReleasesSidebarItemInjectable = getInjectable({
id: "helm-releases-sidebar-item",
id: "sidebar-item-helm-releases",
instantiate: (di) => {
const route = di.inject(helmReleasesRouteInjectable);
return {
id: "releases",
parentId: di.inject(helmSidebarItemInjectable).id,
parentId: helmSidebarItemInjectable.id,
title: "Releases",
onClick: di.inject(navigateToHelmReleasesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -9,10 +9,9 @@ import { Icon } from "@k8slens/icon";
import { noop } from "lodash/fp";
const helmSidebarItemInjectable = getInjectable({
id: "helm-sidebar-item",
id: "sidebar-item-helm",
instantiate: () => ({
id: "helm",
parentId: null,
getIcon: () => <Icon svg="helm" />,
title: "Helm",

View File

@ -54,9 +54,8 @@ const extensionSidebarItemRegistratorInjectable = getInjectable({
: extension.sanitizedExtensionId;
return getInjectable({
id: `${id}-sidebar-item`,
id: `sidebar-item-${id}`,
instantiate: () => ({
id,
orderNumber: registration.orderNumber ?? 9999,
parentId: registration.parentId

View File

@ -8,7 +8,7 @@ import { observer } from "mobx-react";
import React from "react";
import siblingTabsInjectable from "../../routes/sibling-tabs.injectable";
import { TabLayout } from "./tab-layout-2";
import type { HierarchicalSidebarItem } from "@k8slens/cluster-sidebar";
import type { SidebarItemDeclaration } from "@k8slens/cluster-sidebar";
import type { StrictReactNode } from "@k8slens/utilities";
interface SiblingTabLayoutProps {
@ -17,7 +17,7 @@ interface SiblingTabLayoutProps {
}
interface Dependencies {
tabs: IComputedValue<HierarchicalSidebarItem[]>;
tabs: IComputedValue<SidebarItemDeclaration[]>;
}
const NonInjectedSiblingsInTabLayout = observer(

View File

@ -12,7 +12,7 @@ import { Icon } from "@k8slens/icon";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { SidebarStorageState } from "./sidebar-storage/sidebar-storage.injectable";
import sidebarStorageInjectable from "./sidebar-storage/sidebar-storage.injectable";
import type { HierarchicalSidebarItem } from "@k8slens/cluster-sidebar";
import type { SidebarItemDeclaration } from "@k8slens/cluster-sidebar";
import type { StorageLayer } from "../../utils/storage-helper";
interface Dependencies {
@ -20,7 +20,7 @@ interface Dependencies {
}
export interface SidebarItemProps {
item: HierarchicalSidebarItem;
item: SidebarItemDeclaration;
}
const NonInjectedSidebarItem = observer((props: SidebarItemProps & Dependencies) => {
@ -56,7 +56,7 @@ const NonInjectedSidebarItem = observer((props: SidebarItemProps & Dependencies)
return (
<div
className={styles.SidebarItem}
data-testid={`sidebar-item-${id}`}
data-testid={id}
data-is-active-test={isActive}
data-parent-id-test={item.parentId}
>
@ -74,7 +74,7 @@ const NonInjectedSidebarItem = observer((props: SidebarItemProps & Dependencies)
item.onClick();
}
}}
data-testid={`sidebar-item-link-for-${id}`}
data-testid={`link-for-${id}`}
>
{item.getIcon?.()}
<span>{item.title}</span>
@ -82,7 +82,7 @@ const NonInjectedSidebarItem = observer((props: SidebarItemProps & Dependencies)
<Icon
className={styles.expandIcon}
material={expanded ? "keyboard_arrow_up" : "keyboard_arrow_down"}
data-testid={`sidebar-item-expand-icon-for-${id}`}
data-testid={`expand-icon-for-${id}`}
/>
)}
</NavLink>

View File

@ -12,13 +12,13 @@ import { SidebarItem } from "./sidebar-item";
import type { CatalogEntityRegistry } from "../../api/catalog/entity/registry";
import { SidebarCluster } from "./sidebar-cluster";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { HierarchicalSidebarItem } from "@k8slens/cluster-sidebar";
import type { SidebarItemDeclaration } from "@k8slens/cluster-sidebar";
import { sidebarItemsInjectable } from "@k8slens/cluster-sidebar";
import type { IComputedValue } from "mobx";
import catalogEntityRegistryInjectable from "../../api/catalog/entity/registry.injectable";
interface Dependencies {
sidebarItems: IComputedValue<HierarchicalSidebarItem[]>;
sidebarItems: IComputedValue<SidebarItemDeclaration[]>;
entityRegistry: CatalogEntityRegistry;
}

View File

@ -11,10 +11,10 @@ import type { StrictReactNode } from "@k8slens/utilities";
import { cssNames } from "@k8slens/utilities";
import { Tab, Tabs } from "../tabs";
import { ErrorBoundary } from "@k8slens/error-boundary";
import type { HierarchicalSidebarItem } from "@k8slens/cluster-sidebar";
import type { SidebarItemDeclaration } from "@k8slens/cluster-sidebar";
export interface TabLayoutProps {
tabs?: HierarchicalSidebarItem[];
tabs?: SidebarItemDeclaration[];
children?: StrictReactNode;
scrollable?: boolean;
}

View File

@ -11,13 +11,12 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToNamespacesInjectable from "../../../common/front-end-routing/routes/cluster/namespaces/navigate-to-namespaces.injectable";
const namespacesSidebarItemInjectable = getInjectable({
id: "namespaces-sidebar-item",
id: "sidebar-item-namespaces",
instantiate: (di) => {
const route = di.inject(namespacesRouteInjectable);
return {
id: "namespaces",
parentId: null,
getIcon: () => <Icon material="layers" />,
title: "Namespaces",

View File

@ -10,14 +10,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToEndpointsInjectable from "../../../common/front-end-routing/routes/cluster/network/endpoints/navigate-to-endpoints.injectable";
const endpointsSidebarItemInjectable = getInjectable({
id: "endpoints-sidebar-item",
id: "sidebar-item-endpoints",
instantiate: (di) => {
const route = di.inject(endpointsRouteInjectable);
return {
id: "endpoints",
parentId: di.inject(networkSidebarItemInjectable).id,
parentId: networkSidebarItemInjectable.id,
title: "Endpoints",
onClick: di.inject(navigateToEndpointsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -10,13 +10,12 @@ import navigateToIngressClassesInjectable from "../../../common/front-end-routin
import ingressClassesRouteInjectable from "../../../common/front-end-routing/routes/cluster/network/ingress-class/ingress-classes-route.injectable";
const ingressClassesSidebarItemInjectable = getInjectable({
id: "ingress-classes-sidebar-item",
id: "sidebar-item-ingress-classes",
instantiate: (di) => {
const ingressClassRoute = di.inject(ingressClassesRouteInjectable);
return {
id: "ingressclasses",
parentId: di.inject(networkSidebarItemInjectable).id,
parentId: networkSidebarItemInjectable.id,
title: "Ingress Classes",
onClick: di.inject(navigateToIngressClassesInjectable),
isActive: di.inject(routeIsActiveInjectable, ingressClassRoute),

View File

@ -10,13 +10,12 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import networkSidebarItemInjectable from "../network/network-sidebar-item.injectable";
const ingressesSidebarItemInjectable = getInjectable({
id: "ingresses-sidebar-item",
id: "sidebar-item-ingresses",
instantiate: (di) => {
const ingressRoute = di.inject(ingressesRouteInjectable);
return {
id: "ingresses",
parentId: di.inject(networkSidebarItemInjectable).id,
parentId: networkSidebarItemInjectable.id,
title: "Ingresses",
onClick: di.inject(navigateToIngressesInjectable),
isActive: di.inject(routeIsActiveInjectable, ingressRoute),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToNetworkPoliciesInjectable from "../../../common/front-end-routing/routes/cluster/network/network-policies/navigate-to-network-policies.injectable";
const networkPoliciesSidebarItemInjectable = getInjectable({
id: "network-policies-sidebar-item",
id: "sidebar-item-network-policies",
instantiate: (di) => {
const route = di.inject(networkPoliciesRouteInjectable);
return {
id: "network-policies",
parentId: di.inject(networkSidebarItemInjectable).id,
parentId: networkSidebarItemInjectable.id,
title: "Network Policies",
onClick: di.inject(navigateToNetworkPoliciesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToPortForwardsInjectable from "../../../common/front-end-routing/routes/cluster/network/port-forwards/navigate-to-port-forwards.injectable";
const portForwardsSidebarItemInjectable = getInjectable({
id: "port-forwards-sidebar-item",
id: "sidebar-item-port-forwards",
instantiate: (di) => {
const route = di.inject(portForwardsRouteInjectable);
return {
id: "port-forwards",
parentId: di.inject(networkSidebarItemInjectable).id,
parentId: networkSidebarItemInjectable.id,
title: "Port Forwarding",
onClick: di.inject(navigateToPortForwardsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToServicesInjectable from "../../../common/front-end-routing/routes/cluster/network/services/navigate-to-services.injectable";
const servicesSidebarItemInjectable = getInjectable({
id: "services-sidebar-item",
id: "sidebar-item-services",
instantiate: (di) => {
const route = di.inject(servicesRouteInjectable);
return {
id: "services",
parentId: di.inject(networkSidebarItemInjectable).id,
parentId: networkSidebarItemInjectable.id,
title: "Services",
onClick: di.inject(navigateToServicesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -9,10 +9,9 @@ import React from "react";
import { noop } from "lodash/fp";
const networkSidebarItemInjectable = getInjectable({
id: "network-sidebar-item",
id: "sidebar-item-network",
instantiate: () => ({
id: "network",
parentId: null,
getIcon: () => <Icon material="device_hub" />,
title: "Network",

View File

@ -12,13 +12,12 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToNodesInjectable from "../../../common/front-end-routing/routes/cluster/nodes/navigate-to-nodes.injectable";
const nodesSidebarItemInjectable = getInjectable({
id: "nodes-sidebar-item",
id: "sidebar-item-nodes",
instantiate: (di) => {
const route = di.inject(nodesRouteInjectable);
return {
id: "nodes",
parentId: null,
getIcon: () => <Icon svg="nodes" />,
title: "Nodes",

View File

@ -11,14 +11,13 @@ import navigateToPodSecurityPoliciesInjectable from "../../../common/front-end-r
import userManagementSidebarItemInjectable from "../user-management/user-management-sidebar-item.injectable";
const podSecurityPoliciesSidebarItemInjectable = getInjectable({
id: "pod-security-policies-sidebar-item",
id: "sidebar-item-pod-security-policies",
instantiate: (di) => {
const route = di.inject(podSecurityPoliciesRouteInjectable);
return {
id: "pod-security-policies",
parentId: di.inject(userManagementSidebarItemInjectable).id,
parentId: userManagementSidebarItemInjectable.id,
title: "Pod Security Policies",
onClick: di.inject(navigateToPodSecurityPoliciesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToStorageClassesInjectable from "../../../common/front-end-routing/routes/cluster/storage/storage-classes/navigate-to-storage-classes.injectable";
const storageClassesSidebarItemInjectable = getInjectable({
id: "storage-classes-sidebar-item",
id: "sidebar-item-storage-classes",
instantiate: (di) => {
const route = di.inject(storageClassesRouteInjectable);
return {
id: "storage-classes",
parentId: di.inject(storageSidebarItemInjectable).id,
parentId: storageSidebarItemInjectable.id,
title: "Storage Classes",
onClick: di.inject(navigateToStorageClassesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToPersistentVolumeClaimsInjectable from "../../../common/front-end-routing/routes/cluster/storage/persistent-volume-claims/navigate-to-persistent-volume-claims.injectable";
const persistentVolumeClaimsSidebarItemInjectable = getInjectable({
id: "persistent-volume-claims-sidebar-item",
id: "sidebar-item-persistent-volume-claims",
instantiate: (di) => {
const route = di.inject(persistentVolumeClaimsRouteInjectable);
return {
id: "persistent-volume-claims",
parentId: di.inject(storageSidebarItemInjectable).id,
parentId: storageSidebarItemInjectable.id,
title: "Persistent Volume Claims",
onClick: di.inject(navigateToPersistentVolumeClaimsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToPersistentVolumesInjectable from "../../../common/front-end-routing/routes/cluster/storage/persistent-volumes/navigate-to-persistent-volumes.injectable";
const persistentVolumesSidebarItemInjectable = getInjectable({
id: "persistent-volumes-sidebar-item",
id: "sidebar-item-persistent-volumes",
instantiate: (di) => {
const route = di.inject(persistentVolumesRouteInjectable);
return {
id: "persistent-volumes",
parentId: di.inject(storageSidebarItemInjectable).id,
parentId: storageSidebarItemInjectable.id,
title: "Persistent Volumes",
onClick: di.inject(navigateToPersistentVolumesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -9,10 +9,9 @@ import React from "react";
import { noop } from "lodash/fp";
const storageSidebarItemInjectable = getInjectable({
id: "storage-sidebar-item",
id: "sidebar-item-storage",
instantiate: () => ({
id: "storage",
parentId: null,
getIcon: () => <Icon material="storage" />,
title: "Storage",

View File

@ -11,14 +11,13 @@ import navigateToClusterRoleBindingsInjectable from "../../../../common/front-en
import userManagementSidebarItemInjectable from "../user-management-sidebar-item.injectable";
const clusterRoleBindingsSidebarItemInjectable = getInjectable({
id: "cluster-role-bindings-sidebar-item",
id: "sidebar-item-cluster-role-bindings",
instantiate: (di) => {
const route = di.inject(clusterRoleBindingsRouteInjectable);
return {
id: "cluster-role-bindings",
parentId: di.inject(userManagementSidebarItemInjectable).id,
parentId: userManagementSidebarItemInjectable.id,
title: "Cluster Role Bindings",
onClick: di.inject(navigateToClusterRoleBindingsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../../routes/route-is-active.injectable"
import navigateToClusterRolesInjectable from "../../../../common/front-end-routing/routes/cluster/user-management/cluster-roles/navigate-to-cluster-roles.injectable";
const clusterRolesSidebarItemInjectable = getInjectable({
id: "cluster-roles-sidebar-item",
id: "sidebar-item-cluster-roles",
instantiate: (di) => {
const route = di.inject(clusterRolesRouteInjectable);
return {
id: "cluster-roles",
parentId: di.inject(userManagementSidebarItemInjectable).id,
parentId: userManagementSidebarItemInjectable.id,
title: "Cluster Roles",
onClick: di.inject(navigateToClusterRolesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../../routes/route-is-active.injectable"
import navigateToRoleBindingsInjectable from "../../../../common/front-end-routing/routes/cluster/user-management/role-bindings/navigate-to-role-bindings.injectable";
const roleBindingsSidebarItemInjectable = getInjectable({
id: "role-bindings-sidebar-item",
id: "sidebar-item-role-bindings",
instantiate: (di) => {
const route = di.inject(roleBindingsRouteInjectable);
return {
id: "role-bindings",
parentId: di.inject(userManagementSidebarItemInjectable).id,
parentId: userManagementSidebarItemInjectable.id,
title: "Role Bindings",
onClick: di.inject(navigateToRoleBindingsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -10,14 +10,13 @@ import routeIsActiveInjectable from "../../../routes/route-is-active.injectable"
import navigateToRolesInjectable from "../../../../common/front-end-routing/routes/cluster/user-management/roles/navigate-to-roles.injectable";
const rolesSidebarItemInjectable = getInjectable({
id: "roles-sidebar-item",
id: "sidebar-item-roles",
instantiate: (di) => {
const route = di.inject(rolesRouteInjectable);
return {
id: "roles",
parentId: di.inject(userManagementSidebarItemInjectable).id,
parentId: userManagementSidebarItemInjectable.id,
title: "Roles",
onClick: di.inject(navigateToRolesInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../../routes/route-is-active.injectable"
import navigateToServiceAccountsInjectable from "../../../../common/front-end-routing/routes/cluster/user-management/service-accounts/navigate-to-service-accounts.injectable";
const serviceAccountsSidebarItemInjectable = getInjectable({
id: "service-accounts-sidebar-item",
id: "sidebar-item-service-accounts",
instantiate: (di) => {
const route = di.inject(serviceAccountsRouteInjectable);
return {
id: "service-accounts",
parentId: di.inject(userManagementSidebarItemInjectable).id,
parentId: userManagementSidebarItemInjectable.id,
title: "Service Accounts",
onClick: di.inject(navigateToServiceAccountsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -9,10 +9,9 @@ import React from "react";
import { noop } from "lodash/fp";
const userManagementSidebarItemInjectable = getInjectable({
id: "user-management-sidebar-item",
id: "sidebar-item-user-management",
instantiate: () => ({
id: "user-management",
parentId: null,
getIcon: () => <Icon material="security" />,
title: "Access Control",

View File

@ -10,14 +10,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToCronJobsInjectable from "../../../common/front-end-routing/routes/cluster/workloads/cron-jobs/navigate-to-cron-jobs.injectable";
const cronJobsSidebarItemInjectable = getInjectable({
id: "cron-jobs-sidebar-item",
id: "sidebar-item-cron-jobs",
instantiate: (di) => {
const route = di.inject(cronJobsRouteInjectable);
return {
id: "cron-jobs",
parentId: di.inject(workloadsSidebarItemInjectable).id,
parentId: workloadsSidebarItemInjectable.id,
title: "CronJobs",
onClick: di.inject(navigateToCronJobsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToDaemonsetsInjectable from "../../../common/front-end-routing/routes/cluster/workloads/daemonsets/navigate-to-daemonsets.injectable";
const daemonsetsSidebarItemInjectable = getInjectable({
id: "daemonsets-sidebar-item",
id: "sidebar-item-daemonsets",
instantiate: (di) => {
const route = di.inject(daemonsetsRouteInjectable);
return {
id: "daemon-sets",
parentId: di.inject(workloadsSidebarItemInjectable).id,
parentId: workloadsSidebarItemInjectable.id,
title: "DaemonSets",
onClick: di.inject(navigateToDaemonsetsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToDeploymentsInjectable from "../../../common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable";
const deploymentsSidebarItemInjectable = getInjectable({
id: "deployments-sidebar-item",
id: "sidebar-item-deployments",
instantiate: (di) => {
const route = di.inject(deploymentsRouteInjectable);
return {
id: "deployments",
parentId: di.inject(workloadsSidebarItemInjectable).id,
parentId: workloadsSidebarItemInjectable.id,
title: "Deployments",
onClick: di.inject(navigateToDeploymentsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToJobsInjectable from "../../../common/front-end-routing/routes/cluster/workloads/jobs/navigate-to-jobs.injectable";
const jobsSidebarItemInjectable = getInjectable({
id: "jobs-sidebar-item",
id: "sidebar-item-jobs",
instantiate: (di) => {
const route = di.inject(jobsRouteInjectable);
return {
id: "jobs",
parentId: di.inject(workloadsSidebarItemInjectable).id,
parentId: workloadsSidebarItemInjectable.id,
title: "Jobs",
onClick: di.inject(navigateToJobsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToWorkloadsOverviewInjectable from "../../../common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable";
const workloadsOverviewSidebarItemInjectable = getInjectable({
id: "workloads-overview-sidebar-item",
id: "sidebar-item-workloads-overview",
instantiate: (di) => {
const route = di.inject(workloadsOverviewRouteInjectable);
return {
id: "overview",
parentId: di.inject(workloadsSidebarItemInjectable).id,
parentId: workloadsSidebarItemInjectable.id,
title: "Overview",
onClick: di.inject(navigateToWorkloadsOverviewInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToPodsInjectable from "../../../common/front-end-routing/routes/cluster/workloads/pods/navigate-to-pods.injectable";
const podsSidebarItemInjectable = getInjectable({
id: "pods-sidebar-item",
id: "sidebar-item-pods",
instantiate: (di) => {
const route = di.inject(podsRouteInjectable);
return {
id: "pods",
parentId: di.inject(workloadsSidebarItemInjectable).id,
parentId: workloadsSidebarItemInjectable.id,
title: "Pods",
onClick: di.inject(navigateToPodsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToReplicasetsInjectable from "../../../common/front-end-routing/routes/cluster/workloads/replicasets/navigate-to-replicasets.injectable";
const replicasetsSidebarItemInjectable = getInjectable({
id: "replicasets-sidebar-item",
id: "sidebar-item-replicasets",
instantiate: (di) => {
const route = di.inject(replicasetsRouteInjectable);
return {
id: "replica-sets",
parentId: di.inject(workloadsSidebarItemInjectable).id,
parentId: workloadsSidebarItemInjectable.id,
title: "ReplicaSets",
onClick: di.inject(navigateToReplicasetsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -10,14 +10,13 @@ import replicationControllersRouteInjectable from "../../../common/front-end-rou
import navigateToReplicationControllersInjectable from "../../../common/front-end-routing/routes/cluster/workloads/replication-controllers/navigate-to.injectable";
const replicationControllerSidebarItemInjectable = getInjectable({
id: "replication-controller-sidebar-item",
id: "sidebar-item-replication-controller",
instantiate: (di) => {
const route = di.inject(replicationControllersRouteInjectable);
return {
id: "replication-controllers",
parentId: di.inject(workloadsSidebarItemInjectable).id,
parentId: workloadsSidebarItemInjectable.id,
title: "Replication Controllers",
onClick: di.inject(navigateToReplicationControllersInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -11,14 +11,13 @@ import routeIsActiveInjectable from "../../routes/route-is-active.injectable";
import navigateToStatefulsetsInjectable from "../../../common/front-end-routing/routes/cluster/workloads/statefulsets/navigate-to-statefulsets.injectable";
const statefulsetsSidebarItemInjectable = getInjectable({
id: "statefulsets-sidebar-item",
id: "sidebar-item-statefulsets",
instantiate: (di) => {
const route = di.inject(statefulsetsRouteInjectable);
return {
id: "stateful-sets",
parentId: di.inject(workloadsSidebarItemInjectable).id,
parentId: workloadsSidebarItemInjectable.id,
title: "StatefulSets",
onClick: di.inject(navigateToStatefulsetsInjectable),
isActive: di.inject(routeIsActiveInjectable, route),

View File

@ -9,10 +9,9 @@ import React from "react";
import { noop } from "lodash/fp";
const workloadsSidebarItemInjectable = getInjectable({
id: "workloads-sidebar-item",
id: "sidebar-item-workloads",
instantiate: () => ({
id: "workloads",
parentId: null,
title: "Workloads",
getIcon: () => <Icon svg="workloads" />,