Revert "chore: Extract sidebar item injection token into separate package"

This reverts commit 8ac66380ad.
This commit is contained in:
Sebastian Malton committed 2023-05-23 10:08:42 -04:00
1 parent cb0e8764ac
commit 8f4aa497cc
113 files changed
+1678 -5646

No files matched your search

@@ -4,17 +4,18 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import applicationMenuItemsInjectable from "./application-menu-items.injectable";
import type { Composite } from "../../../common/utils/composite/get-composite/get-composite";
import { getCompositeFor } from "../../../common/utils/composite/get-composite/get-composite";
import { computed } from "mobx";
import { pipeline } from "@ogre-tools/fp";
import type { ApplicationMenuItemTypes } from "./menu-items/application-menu-item-injection-token";
import type { RootComposite } from "../../../common/utils/composite/interfaces";
import type { Discriminable } from "../../../common/utils/composable-responsibilities/discriminable/discriminable";
import { orderByOrderNumber } from "../../../common/utils/composable-responsibilities/orderable/orderable";
import logErrorInjectable from "../../../common/log-error.injectable";
import { isShown } from "../../../common/utils/composable-responsibilities/showable/showable";
import type { Orderable } from "@k8slens/utilities";
import { byOrderNumber } from "@k8slens/utilities";
export type MenuItemRoot = Discriminable<"root"> & RootComposite<"root"> & Orderable;
export type MenuItemRoot = Discriminable<"root"> & RootComposite<"root">;
const applicationMenuItemCompositeInjectable = getInjectable({
id: "application-menu-item-composite",
@@ -23,30 +24,40 @@ const applicationMenuItemCompositeInjectable = getInjectable({
const menuItems = di.inject(applicationMenuItemsInjectable);
const logError = di.inject(logErrorInjectable);
const getComposite = getCompositeFor<ApplicationMenuItemTypes | MenuItemRoot>({
getId: (x) => x.id,
getParentId: (x) => x.parentId,
transformChildren: (children) => (
[...children]
.sort(byOrderNumber)
.filter(isShown)
),
handleMissingParentIds: ({ missingParentIds }) => {
const ids = missingParentIds.join('", "');
return computed((): Composite<ApplicationMenuItemTypes | MenuItemRoot> => {
const items = menuItems.get();
logError(`[MENU]: cannot render menu item for missing parentIds: "${ids}"`);
},
return pipeline(
[
{
parentId: undefined,
id: "root",
kind: "root",
} as const,
...items,
],
getCompositeFor({
getId: (x) => x.id,
getParentId: (x) => x.parentId,
transformChildren: (children) =>
pipeline(
children,
orderByOrderNumber,
(children) => children.filter(isShown),
),
handleMissingParentIds: ({ missingParentIds }) => {
logError(
`[MENU]: cannot render menu item for missing parentIds: "${missingParentIds.join(
'", "',
)}"`,
);
},
}),
);
});
return computed(() => getComposite([
{
parentId: undefined,
id: "root",
kind: "root",
orderNumber: -Infinity,
} as const,
...menuItems.get(),
]));
},
});
@@ -8,7 +8,7 @@ import type { SetOptional } from "type-fest";
import type { ChildOfParentComposite, ParentOfChildComposite } from "../../../../common/utils/composite/interfaces";
import type { MaybeShowable } from "../../../../common/utils/composable-responsibilities/showable/showable";
import type { Discriminable } from "../../../../common/utils/composable-responsibilities/discriminable/discriminable";
import type { Orderable } from "@k8slens/utilities";
import type { Orderable } from "../../../../common/utils/composable-responsibilities/orderable/orderable";
export interface MayHaveKeyboardShortcut {
keyboardShortcut?: string;
@@ -1,244 +0,0 @@
/**
* 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 { CustomResourceDefinition } from "../../extensions/common-api/k8s-api";
import type { CustomResourceDefinitionStore } from "../../renderer/components/custom-resources/definition.store";
import customResourceDefinitionStoreInjectable from "../../renderer/components/custom-resources/definition.store.injectable";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
describe("cluster - custom resources in sidebar", () => {
let builder: ApplicationBuilder;
let result: RenderResult;
let customResourceDefinitionStore: CustomResourceDefinitionStore;
let customResourceDefinition: CustomResourceDefinition;
beforeEach(async () => {
builder = getApplicationBuilder();
builder.setEnvironmentToClusterFrame();
builder.afterWindowStart(({ windowDi }) => {
customResourceDefinitionStore = windowDi.inject(customResourceDefinitionStoreInjectable);
customResourceDefinition = new CustomResourceDefinition({
apiVersion: "apiextensions.k8s.io/v1",
kind: "CustomResourceDefinition",
metadata: {
name: "some-crd",
selfLink: "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/some-crd",
uid: "some-uid",
resourceVersion: "1",
},
spec: {
group: "some-group",
scope: "Cluster",
names: {
kind: "SomeResource",
plural: "some-resources",
singular: "some-resource",
},
versions: [
{
storage: true,
name: "v1",
served: true,
additionalPrinterColumns: [
{
name: "Some Column",
type: "string",
description: "Some description",
jsonPath: ".spec.someColumn",
},
],
},
],
},
});
});
result = await builder.render();
});
it("renders", () => {
expect(result.container).toMatchSnapshot();
});
it("shows the sidebar", () => {
expect(result.getByTestId("cluster-sidebar")).toBeInTheDocument();
});
it("does not show Custom Resources section", () => {
expect(result.queryByTestId("sidebar-item-custom-resources")).not.toBeInTheDocument();
});
describe("when custom resource exists", () => {
beforeEach(() => {
customResourceDefinitionStore.items.replace([
customResourceDefinition,
]);
});
it("renders", () => {
expect(result.container).toMatchSnapshot();
});
it("still does not show Custom Resources sidebar", () => {
expect(result.queryByTestId("sidebar-item-custom-resources")).not.toBeInTheDocument();
});
describe("when specific custom resource is an allowed resource", () => {
beforeEach(() => {
builder.allowKubeResource({
apiName: "some-resources",
group: "some-group",
});
});
it("renders", () => {
expect(result.container).toMatchSnapshot();
});
it("shows Custom Resources sidebar", () => {
expect(result.getByTestId("sidebar-item-custom-resources")).toBeInTheDocument();
});
it("shows Custom Resources sidebar as expandable", () => {
expect(result.getByTestId("sidebar-item-expand-icon-for-custom-resources")).toBeInTheDocument();
});
it("does not show SomeResources sidebar", () => {
expect(result.queryByTestId("sidebar-item-custom-resource-group-some-group")).not.toBeInTheDocument();
});
it("does not show Custom Resources Definitions sidebar", () => {
expect(result.queryByTestId("sidebar-item-custom-resource-definitions")).not.toBeInTheDocument();
});
describe("when custom resources sidebar item is expanded", () => {
beforeEach(() => {
result.getByTestId("sidebar-item-expand-icon-for-custom-resources").click();
});
it("renders", () => {
expect(result.container).toMatchSnapshot();
});
it("shows Custom Resources sidebar", () => {
expect(result.getByTestId("sidebar-item-custom-resources")).toBeInTheDocument();
});
it("shows Custom Resources sidebar as expandable", () => {
expect(result.getByTestId("sidebar-item-expand-icon-for-custom-resources")).toBeInTheDocument();
});
it("shows some-group group sidebar item", () => {
expect(result.getByTestId("sidebar-item-custom-resource-group-some-group")).toBeInTheDocument();
});
it("does not show Custom Resources Definitions sidebar", () => {
expect(result.queryByTestId("sidebar-item-custom-resource-definitions")).not.toBeInTheDocument();
});
describe("when custom resources group sidebar item is expanded", () => {
beforeEach(() => {
result.getByTestId("sidebar-item-expand-icon-for-custom-resource-group-some-group").click();
});
it("renders", () => {
expect(result.container).toMatchSnapshot();
});
it("shows some-group group sidebar item", () => {
expect(result.getByTestId("sidebar-item-custom-resource-group-some-group")).toBeInTheDocument();
});
it("shows some-resources group sidebar item", () => {
expect(result.getByTestId("sidebar-item-custom-resource-group-some-group/some-resources")).toBeInTheDocument();
});
});
});
});
describe("when custom resource definitions are an allowed resource", () => {
beforeEach(() => {
builder.allowKubeResource({
apiName: "customresourcedefinitions",
group: "apiextensions.k8s.io",
});
});
it("renders", () => {
expect(result.container).toMatchSnapshot();
});
it("shows Custom Resources sidebar", () => {
expect(result.getByTestId("sidebar-item-custom-resources")).toBeInTheDocument();
});
it("shows Custom Resources sidebar as expandable", () => {
expect(result.getByTestId("sidebar-item-expand-icon-for-custom-resources")).toBeInTheDocument();
});
it("does not show SomeResources sidebar", () => {
expect(result.queryByTestId("sidebar-item-custom-resource-group-some-group")).not.toBeInTheDocument();
});
it("does not show Custom Resources Definitions sidebar", () => {
expect(result.queryByTestId("sidebar-item-custom-resource-definitions")).not.toBeInTheDocument();
});
describe("when custom resources sidebar item is expanded", () => {
beforeEach(() => {
result.getByTestId("sidebar-item-expand-icon-for-custom-resources").click();
});
it("renders", () => {
expect(result.container).toMatchSnapshot();
});
it("shows Custom Resources sidebar", () => {
expect(result.getByTestId("sidebar-item-custom-resources")).toBeInTheDocument();
});
it("shows Custom Resources sidebar as expandable", () => {
expect(result.getByTestId("sidebar-item-expand-icon-for-custom-resources")).toBeInTheDocument();
});
it("does not show SomeResources sidebar", () => {
expect(result.queryByTestId("sidebar-item-custom-resource-group-some-group")).not.toBeInTheDocument();
});
it("shows Custom Resources Definitions sidebar", () => {
expect(result.getByTestId("sidebar-item-custom-resource-definitions")).toBeInTheDocument();
});
});
});
});
describe("when custom resource definitions are an allowed resource", () => {
beforeEach(() => {
builder.allowKubeResource({
apiName: "customresourcedefinitions",
group: "apiextensions.k8s.io",
});
});
it("renders", () => {
expect(result.container).toMatchSnapshot();
});
it("shows Custom Resources sidebar", () => {
expect(result.getByTestId("sidebar-item-custom-resources")).toBeInTheDocument();
});
it("shows Custom Resources sidebar as expandable", () => {
expect(result.getByTestId("sidebar-item-expand-icon-for-custom-resources")).toBeInTheDocument();
});
it("does not show Custom Resources Definitions sidebar", () => {
expect(result.queryByTestId("sidebar-item-custom-resource-definitions")).not.toBeInTheDocument();
});
});
});
@@ -5,8 +5,9 @@
import { getInjectable } from "@ogre-tools/injectable";
import type { RenderResult } from "@testing-library/react";
import { fireEvent } from "@testing-library/react";
import { sidebarItemInjectionToken } from "@k8slens/cluster-sidebar";
import { runInAction } from "mobx";
import type { SidebarItemRegistration } from "../../renderer/components/layout/sidebar-items.injectable";
import { sidebarItemsInjectionToken } from "../../renderer/components/layout/sidebar-items.injectable";
import { computed, runInAction } from "mobx";
import { noop } from "lodash/fp";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
@@ -22,14 +23,7 @@ describe("cluster - order of sidebar items", () => {
builder.beforeWindowStart(({ windowDi }) => {
runInAction(() => {
windowDi.register(
someParentSidebarItemInjectable,
someOtherParentSidebarItemInjectable,
someAnotherParentSidebarItemInjectable,
someChildSidebarItemInjectable,
someOtherChildSidebarItemInjectable,
someAnotherChildSidebarItemInjectable,
);
windowDi.register(testSidebarItemsInjectable);
});
});
});
@@ -84,74 +78,54 @@ describe("cluster - order of sidebar items", () => {
});
});
const someParentSidebarItemInjectable = getInjectable({
id: "some-parent-sidebar-item",
instantiate: () => ({
id: "some-parent-id",
parentId: null,
title: "Some parent",
onClick: noop,
orderNumber: 42,
}),
injectionToken: sidebarItemInjectionToken,
});
const testSidebarItemsInjectable = getInjectable({
id: "some-sidebar-item-injectable",
const someOtherParentSidebarItemInjectable = getInjectable({
id: "some-other-parent-sidebar-item",
instantiate: () => ({
id: "some-other-parent-id",
parentId: null,
title: "Some other parent",
onClick: noop,
orderNumber: 126,
}),
injectionToken: sidebarItemInjectionToken,
});
instantiate: () =>
computed((): SidebarItemRegistration[] => [
{
id: "some-parent-id",
parentId: null,
title: "Some parent",
onClick: noop,
orderNumber: 42,
},
{
id: "some-other-parent-id",
parentId: null,
title: "Some other parent",
onClick: noop,
orderNumber: 126,
},
{
id: "some-another-parent-id",
parentId: null,
title: "Some another parent",
onClick: noop,
orderNumber: 84,
},
{
id: "some-child-id",
parentId: "some-parent-id",
title: "Some child",
onClick: noop,
orderNumber: 168,
},
{
id: "some-other-child-id",
parentId: "some-parent-id",
title: "Some other child",
onClick: noop,
orderNumber: 252,
},
{
id: "some-another-child-id",
parentId: "some-parent-id",
title: "Some another child",
onClick: noop,
orderNumber: 210,
},
]),
const someAnotherParentSidebarItemInjectable = getInjectable({
id: "some-another-parent-sidebar-item",
instantiate: () => ({
id: "some-another-parent-id",
parentId: null,
title: "Some another parent",
onClick: noop,
orderNumber: 84,
}),
injectionToken: sidebarItemInjectionToken,
});
const someChildSidebarItemInjectable = getInjectable({
id: "some-child-sidebar-item",
instantiate: (di) => ({
id: "some-child-id",
parentId: di.inject(someParentSidebarItemInjectable).id,
title: "Some child",
onClick: noop,
orderNumber: 168,
}),
injectionToken: sidebarItemInjectionToken,
});
const someOtherChildSidebarItemInjectable = getInjectable({
id: "some-other-child-sidebar-item",
instantiate: (di) => ({
id: "some-other-child-id",
parentId: di.inject(someParentSidebarItemInjectable).id,
title: "Some other child",
onClick: noop,
orderNumber: 252,
}),
injectionToken: sidebarItemInjectionToken,
});
const someAnotherChildSidebarItemInjectable = getInjectable({
id: "some-another-child-sidebar-item",
instantiate: (di) => ({
id: "some-another-child-id",
parentId: di.inject(someParentSidebarItemInjectable).id,
title: "Some another child",
onClick: noop,
orderNumber: 210,
}),
injectionToken: sidebarItemInjectionToken,
injectionToken: sidebarItemsInjectionToken,
});
@@ -8,7 +8,8 @@ import React from "react";
import type { RenderResult } from "@testing-library/react";
import { fireEvent } from "@testing-library/react";
import { routeSpecificComponentInjectionToken } from "../../renderer/routes/route-specific-component-injection-token";
import { sidebarItemInjectionToken } from "@k8slens/cluster-sidebar";
import type { SidebarItemRegistration } from "../../renderer/components/layout/sidebar-items.injectable";
import { sidebarItemsInjectionToken } from "../../renderer/components/layout/sidebar-items.injectable";
import { computed, runInAction } from "mobx";
import { noop } from "lodash/fp";
import routeIsActiveInjectable from "../../renderer/routes/route-is-active.injectable";
@@ -43,12 +44,9 @@ describe("cluster - sidebar and tab navigation for core", () => {
beforeEach(() => {
builder.beforeWindowStart(({ windowDi }) => {
runInAction(() => {
windowDi.register(
testRouteInjectable,
testRouteComponentInjectable,
someParentSidebarItemInjectable,
someChildSidebarItemInjectable,
);
windowDi.register(testRouteInjectable);
windowDi.register(testRouteComponentInjectable);
windowDi.register(testSidebarItemsInjectable);
});
});
});
@@ -294,36 +292,36 @@ describe("cluster - sidebar and tab navigation for core", () => {
});
});
const someParentSidebarItemInjectable = getInjectable({
id: "some-parent-sidebar-item",
instantiate: () => ({
id: "some-parent-id",
parentId: null,
title: "Some parent",
onClick: noop,
getIcon: () => <div data-testid="some-icon-for-parent" />,
orderNumber: 42,
}),
injectionToken: sidebarItemInjectionToken,
});
const testSidebarItemsInjectable = getInjectable({
id: "some-sidebar-items-injectable",
const someChildSidebarItemInjectable = getInjectable({
id: "some-child-sidebar-item",
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,
title: "Some child",
onClick: () => navigateToRoute(route),
isActive: routeIsActive,
orderNumber: 168,
};
return computed((): SidebarItemRegistration[] => [
{
id: "some-parent-id",
parentId: null,
title: "Some parent",
onClick: noop,
getIcon: () => <div data-testid="some-icon-for-parent" />,
orderNumber: 42,
},
{
id: "some-child-id",
parentId: "some-parent-id",
title: "Some child",
onClick: () => navigateToRoute(route),
isActive: routeIsActive,
orderNumber: 42,
},
]);
},
injectionToken: sidebarItemInjectionToken,
injectionToken: sidebarItemsInjectionToken,
});
const testRouteInjectable = getInjectable({
@@ -4,8 +4,9 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import type { RenderResult } from "@testing-library/react";
import { sidebarItemInjectionToken } from "@k8slens/cluster-sidebar";
import { runInAction } from "mobx";
import type { SidebarItemRegistration } from "../../renderer/components/layout/sidebar-items.injectable";
import { sidebarItemsInjectionToken } from "../../renderer/components/layout/sidebar-items.injectable";
import { computed, runInAction } from "mobx";
import { routeSpecificComponentInjectionToken } from "../../renderer/routes/route-specific-component-injection-token";
import React from "react";
import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
@@ -101,16 +102,18 @@ const testSidebarItemsInjectable = getInjectable({
const testRoute = di.inject(testRouteInjectable);
const navigateToRoute = di.inject(navigateToRouteInjectionToken);
return {
id: "some-item-id",
parentId: null,
title: "Some item",
onClick: () => navigateToRoute(testRoute),
isVisible: testRoute.isEnabled,
orderNumber: 42,
};
return computed((): SidebarItemRegistration[] => [
{
id: "some-item-id",
parentId: null,
title: "Some item",
onClick: () => navigateToRoute(testRoute),
isVisible: testRoute.isEnabled,
orderNumber: 42,
},
]);
},
injectionToken: sidebarItemInjectionToken,
injectionToken: sidebarItemsInjectionToken,
});
@@ -8,7 +8,7 @@ import type { ChildOfParentComposite, ParentOfChildComposite } from "../../../..
import type { Discriminable } from "../../../../common/utils/composable-responsibilities/discriminable/discriminable";
import type { Labelable } from "../../../../common/utils/composable-responsibilities/labelable/labelable";
import type { MaybeShowable } from "../../../../common/utils/composable-responsibilities/showable/showable";
import type { Orderable, MaybeOrderable } from "@k8slens/utilities";
import type { Orderable } from "../../../../common/utils/composable-responsibilities/orderable/orderable";
import type { GetSeparator } from "../../../../common/utils/add-separator/add-separator";
import type { Composite } from "../../../../common/utils/composite/get-composite/get-composite";
@@ -50,7 +50,6 @@ export type PreferencePage =
& Discriminable<"page">
& ParentOfChildComposite
& ChildOfParentComposite
& MaybeOrderable
& MaybeShowable
& RenderableWithSiblings<PreferencePage>;
@@ -58,7 +57,6 @@ export type PreferenceBlock =
& Discriminable<"block">
& ParentOfChildComposite
& ChildOfParentComposite
& MaybeOrderable
& MaybeShowable
& RenderableWithSiblings<PreferenceBlock>;
@@ -8,19 +8,16 @@ import type { RootComposite } from "../../../../common/utils/composite/interface
import type { Discriminable } from "../../../../common/utils/composable-responsibilities/discriminable/discriminable";
import type { ChildrenAreSeparated } from "./preference-item-injection-token";
import styles from "./preference-tab-root.module.scss";
import type { Orderable } from "@k8slens/utilities";
export type PreferenceTabsRoot =
& Discriminable<"preference-tabs-root">
& RootComposite
& ChildrenAreSeparated
& Orderable;
& ChildrenAreSeparated;
export const preferenceTabsRoot: PreferenceTabsRoot = {
kind: "preference-tabs-root" as const,
id: "preference-tabs",
parentId: undefined,
orderNumber: Infinity,
childSeparator: () => (
<div className={styles.TabSeparator}>
@@ -7,12 +7,13 @@ import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-f
import { computed } from "mobx";
import type { PreferenceItemTypes } from "./preference-item-injection-token";
import { preferenceItemInjectionToken } from "./preference-item-injection-token";
import { pipeline } from "@ogre-tools/fp";
import type { PreferenceTabsRoot } from "./preference-tab-root";
import { preferenceTabsRoot } from "./preference-tab-root";
import logErrorInjectable from "../../../../common/log-error.injectable";
import { isShown } from "../../../../common/utils/composable-responsibilities/showable/showable";
import { orderByOrderNumber } from "../../../../common/utils/composable-responsibilities/orderable/orderable";
import { getCompositeFor } from "../../../../common/utils/composite/get-composite/get-composite";
import { byOrderNumber } from "@k8slens/utilities";
const preferencesCompositeInjectable = getInjectable({
id: "preferences-composite",
@@ -26,25 +27,27 @@ const preferencesCompositeInjectable = getInjectable({
getId: (x) => x.id,
getParentId: (x) => x.parentId,
handleMissingParentIds: ({ missingParentIds, availableParentIds }) => {
const missingIds = missingParentIds.join('", "');
const availableIds = availableParentIds.join("\n");
logError([
`Tried to create preferences, but encountered references to unknown ids: "${missingIds}".`,
"Available ids are:",
availableIds,
].join("\n\n"));
handleMissingParentIds: (ids) => {
logError(
`Tried to create preferences, but encountered references to unknown ids: "${ids.missingParentIds.join(
'", "',
)}".\n\nAvailable ids are:\n\n${ids.availableParentIds.join("\n")}`,
);
},
transformChildren: (children) => (
children
.filter(isShown)
.sort(byOrderNumber)
),
transformChildren: (children) =>
pipeline(
children.filter(isShown),
orderByOrderNumber,
),
});
return computed(() => getComposite([preferenceTabsRoot, ...preferenceItems.get()]));
return computed(() =>
pipeline(
[preferenceTabsRoot, ...preferenceItems.get()],
getComposite,
),
);
},
});