From 9cef2f27aaa7ea398fcb4126dad118fe9cf22e55 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Mon, 29 Nov 2021 12:11:58 +0200 Subject: [PATCH] Try extracting dependencies so separate files Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen --- ...jectable.ts => cluster-name.injectable.ts} | 0 ...jectable.ts => hide-details.injectable.ts} | 0 .../kube-object-menu-items.injectable.ts | 2 +- .../kube-object-menu-registry.injectable.ts} | 2 +- .../api-manager-store.injectable.ts | 51 +++++++++++++++++++ .../api-manager.injectable.ts} | 4 +- .../remove-action/remove-action.injectable.ts | 43 ++++++++++++++++ .../remove-action/remove-action.ts | 46 +++++++++++++++++ .../edit-resource-tab.injectable.ts} | 2 +- .../update-action/update-action.injectable.ts | 49 ++++++++++++++++++ .../update-action/update-action.ts | 45 ++++++++++++++++ .../kube-object-menu.injectable.tsx | 21 +++++--- .../kube-object-menu.test.tsx | 8 +-- .../kube-object-menu/kube-object-menu.tsx | 49 +++++------------- 14 files changed, 269 insertions(+), 53 deletions(-) rename src/renderer/components/kube-object-menu/dependencies/{clusterName.injectable.ts => cluster-name.injectable.ts} (100%) rename src/renderer/components/kube-object-menu/dependencies/{hideDetails.injectable.ts => hide-details.injectable.ts} (100%) rename src/renderer/components/kube-object-menu/dependencies/{kubeObjectMenuRegistry.injectable.ts => kube-object-menu-items/kube-object-menu-registry.injectable.ts} (94%) create mode 100644 src/renderer/components/kube-object-menu/dependencies/remove-action/api-manager-store/api-manager-store.injectable.ts rename src/renderer/components/kube-object-menu/dependencies/{apiManager.injectable.ts => remove-action/api-manager-store/api-manager.injectable.ts} (89%) create mode 100644 src/renderer/components/kube-object-menu/dependencies/remove-action/remove-action.injectable.ts create mode 100644 src/renderer/components/kube-object-menu/dependencies/remove-action/remove-action.ts rename src/renderer/components/kube-object-menu/dependencies/{editResourceTab.injectable.ts => update-action/edit-resource-tab.injectable.ts} (95%) create mode 100644 src/renderer/components/kube-object-menu/dependencies/update-action/update-action.injectable.ts create mode 100644 src/renderer/components/kube-object-menu/dependencies/update-action/update-action.ts diff --git a/src/renderer/components/kube-object-menu/dependencies/clusterName.injectable.ts b/src/renderer/components/kube-object-menu/dependencies/cluster-name.injectable.ts similarity index 100% rename from src/renderer/components/kube-object-menu/dependencies/clusterName.injectable.ts rename to src/renderer/components/kube-object-menu/dependencies/cluster-name.injectable.ts diff --git a/src/renderer/components/kube-object-menu/dependencies/hideDetails.injectable.ts b/src/renderer/components/kube-object-menu/dependencies/hide-details.injectable.ts similarity index 100% rename from src/renderer/components/kube-object-menu/dependencies/hideDetails.injectable.ts rename to src/renderer/components/kube-object-menu/dependencies/hide-details.injectable.ts diff --git a/src/renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-items.injectable.ts b/src/renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-items.injectable.ts index 1ede65feeb..fd4b28c93d 100644 --- a/src/renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-items.injectable.ts +++ b/src/renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-items.injectable.ts @@ -19,7 +19,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Injectable, lifecycleEnum } from "@ogre-tools/injectable"; -import kubeObjectMenuRegistryInjectable from "../kubeObjectMenuRegistry.injectable"; +import kubeObjectMenuRegistryInjectable from "./kube-object-menu-registry.injectable"; import { InstantiationParameter, diff --git a/src/renderer/components/kube-object-menu/dependencies/kubeObjectMenuRegistry.injectable.ts b/src/renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-registry.injectable.ts similarity index 94% rename from src/renderer/components/kube-object-menu/dependencies/kubeObjectMenuRegistry.injectable.ts rename to src/renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-registry.injectable.ts index fb171bf960..8c5b3b8e03 100644 --- a/src/renderer/components/kube-object-menu/dependencies/kubeObjectMenuRegistry.injectable.ts +++ b/src/renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-registry.injectable.ts @@ -18,7 +18,7 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { KubeObjectMenuRegistry } from "../../../../extensions/registries"; +import { KubeObjectMenuRegistry } from "../../../../../extensions/registries"; import type { Injectable } from "@ogre-tools/injectable"; const kubeObjectMenuRegistryInjectable: Injectable = { diff --git a/src/renderer/components/kube-object-menu/dependencies/remove-action/api-manager-store/api-manager-store.injectable.ts b/src/renderer/components/kube-object-menu/dependencies/remove-action/api-manager-store/api-manager-store.injectable.ts new file mode 100644 index 0000000000..0b1d78108f --- /dev/null +++ b/src/renderer/components/kube-object-menu/dependencies/remove-action/api-manager-store/api-manager-store.injectable.ts @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +import type { Injectable } from "@ogre-tools/injectable"; +import { lifecycleEnum } from "@ogre-tools/injectable"; +import apiManagerInjectable from "./api-manager.injectable"; +import type { ApiManager } from "../../../../../../common/k8s-api/api-manager"; +import type { KubeObject } from "../../../../../../common/k8s-api/kube-object"; +import type { KubeObjectStore } from "../../../../../../common/k8s-api/kube-object.store"; + +interface Dependencies { + apiManager: ApiManager; +} + +interface InstantiationParameter { + kubeObject: KubeObject | null; +} + +const apiManagerStoreInjectable: Injectable< + KubeObjectStore | null, + Dependencies, + InstantiationParameter +> = { + getDependencies: di => ({ + apiManager: di.inject(apiManagerInjectable), + }), + + instantiate: ({ apiManager }, { kubeObject }) => + kubeObject ? apiManager.getStore(kubeObject.selfLink) : null, + + lifecycle: lifecycleEnum.transient, +}; + +export default apiManagerStoreInjectable; diff --git a/src/renderer/components/kube-object-menu/dependencies/apiManager.injectable.ts b/src/renderer/components/kube-object-menu/dependencies/remove-action/api-manager-store/api-manager.injectable.ts similarity index 89% rename from src/renderer/components/kube-object-menu/dependencies/apiManager.injectable.ts rename to src/renderer/components/kube-object-menu/dependencies/remove-action/api-manager-store/api-manager.injectable.ts index 82bff6133e..e262e23cad 100644 --- a/src/renderer/components/kube-object-menu/dependencies/apiManager.injectable.ts +++ b/src/renderer/components/kube-object-menu/dependencies/remove-action/api-manager-store/api-manager.injectable.ts @@ -18,8 +18,8 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { apiManager } from "../../../../common/k8s-api/api-manager"; -import type { ApiManager } from "../../../../common/k8s-api/api-manager"; +import { apiManager } from "../../../../../../common/k8s-api/api-manager"; +import type { ApiManager } from "../../../../../../common/k8s-api/api-manager"; import type { Injectable } from "@ogre-tools/injectable"; const apiManagerInjectable: Injectable = { diff --git a/src/renderer/components/kube-object-menu/dependencies/remove-action/remove-action.injectable.ts b/src/renderer/components/kube-object-menu/dependencies/remove-action/remove-action.injectable.ts new file mode 100644 index 0000000000..f0d3496bc6 --- /dev/null +++ b/src/renderer/components/kube-object-menu/dependencies/remove-action/remove-action.injectable.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +import type { Injectable } from "@ogre-tools/injectable"; +import { lifecycleEnum } from "@ogre-tools/injectable"; +import apiManagerStoreInjectable from "./api-manager-store/api-manager-store.injectable"; +import type { InstantiationParameter } from "./remove-action"; +import type { Dependencies } from "./remove-action"; +import { removeAction } from "./remove-action"; +import hideDetailsInjectable from "../hide-details.injectable"; + +const removeActionInjectable: Injectable< + ReturnType, + Dependencies, + InstantiationParameter +> = { + getDependencies: (di, { kubeObject }) => ({ + apiManagerStore: di.inject(apiManagerStoreInjectable, { kubeObject }), + hideDetails: di.inject(hideDetailsInjectable), + }), + + instantiate: removeAction, + lifecycle: lifecycleEnum.transient, +}; + +export default removeActionInjectable; diff --git a/src/renderer/components/kube-object-menu/dependencies/remove-action/remove-action.ts b/src/renderer/components/kube-object-menu/dependencies/remove-action/remove-action.ts new file mode 100644 index 0000000000..7731ee7aba --- /dev/null +++ b/src/renderer/components/kube-object-menu/dependencies/remove-action/remove-action.ts @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +import type { KubeObjectStore } from "../../../../../common/k8s-api/kube-object.store"; +import type { KubeObject } from "../../../../../common/k8s-api/kube-object"; +import type { hideDetails as hideDetailsType } from "../../../kube-detail-params"; + +export interface Dependencies { + apiManagerStore: KubeObjectStore | null; + hideDetails: typeof hideDetailsType; +} + +export interface InstantiationParameter { + kubeObject?: KubeObject; + customAction?: (kubeObject: KubeObject) => Promise; +} + +export const removeAction = + ( + { apiManagerStore, hideDetails }: Dependencies, + { customAction, kubeObject }: InstantiationParameter, + ) => + async () => { + hideDetails(); + + const action = customAction || apiManagerStore.remove; + + await action(kubeObject); + }; diff --git a/src/renderer/components/kube-object-menu/dependencies/editResourceTab.injectable.ts b/src/renderer/components/kube-object-menu/dependencies/update-action/edit-resource-tab.injectable.ts similarity index 95% rename from src/renderer/components/kube-object-menu/dependencies/editResourceTab.injectable.ts rename to src/renderer/components/kube-object-menu/dependencies/update-action/edit-resource-tab.injectable.ts index c6a33ec07b..d8a78a2659 100644 --- a/src/renderer/components/kube-object-menu/dependencies/editResourceTab.injectable.ts +++ b/src/renderer/components/kube-object-menu/dependencies/update-action/edit-resource-tab.injectable.ts @@ -18,7 +18,7 @@ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { editResourceTab } from "../../dock/edit-resource.store"; +import { editResourceTab } from "../../../dock/edit-resource.store"; import type { Injectable } from "@ogre-tools/injectable"; const editResourceTabInjectable: Injectable = { diff --git a/src/renderer/components/kube-object-menu/dependencies/update-action/update-action.injectable.ts b/src/renderer/components/kube-object-menu/dependencies/update-action/update-action.injectable.ts new file mode 100644 index 0000000000..a730b2e8d1 --- /dev/null +++ b/src/renderer/components/kube-object-menu/dependencies/update-action/update-action.injectable.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +import type { Injectable } from "@ogre-tools/injectable"; +import { lifecycleEnum } from "@ogre-tools/injectable"; +import apiManagerStoreInjectable from "../remove-action/api-manager-store/api-manager-store.injectable"; +import hideDetailsInjectable from "../hide-details.injectable"; +import editResourceTabInjectable from "./edit-resource-tab.injectable"; + +import { + Dependencies, + InstantiationParameter, + updateAction, +} from "./update-action"; + +const updateActionInjectable: Injectable< + ReturnType, + Dependencies, + InstantiationParameter +> = { + getDependencies: (di, { kubeObject }) => ({ + apiManagerStore: di.inject(apiManagerStoreInjectable, { kubeObject }), + hideDetails: di.inject(hideDetailsInjectable), + editResourceTab: di.inject(editResourceTabInjectable), + }), + + instantiate: updateAction, + + lifecycle: lifecycleEnum.transient, +}; + +export default updateActionInjectable; diff --git a/src/renderer/components/kube-object-menu/dependencies/update-action/update-action.ts b/src/renderer/components/kube-object-menu/dependencies/update-action/update-action.ts new file mode 100644 index 0000000000..89b200bdbc --- /dev/null +++ b/src/renderer/components/kube-object-menu/dependencies/update-action/update-action.ts @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +import type { KubeObjectStore } from "../../../../../common/k8s-api/kube-object.store"; +import type { KubeObject } from "../../../../../common/k8s-api/kube-object"; +import type { hideDetails as hideDetailsType } from "../../../kube-detail-params"; +import type { editResourceTab } from "../../../dock/edit-resource.store"; + +export interface Dependencies { + apiManagerStore: KubeObjectStore | null; + hideDetails: typeof hideDetailsType; + editResourceTab: typeof editResourceTab +} + +export interface InstantiationParameter { + kubeObject?: KubeObject; +} + +export const updateAction = + ( + { editResourceTab, hideDetails }: Dependencies, + { kubeObject }: InstantiationParameter, + ) => + () => { + hideDetails(); + + editResourceTab(kubeObject); + }; diff --git a/src/renderer/components/kube-object-menu/kube-object-menu.injectable.tsx b/src/renderer/components/kube-object-menu/kube-object-menu.injectable.tsx index f212cd8734..fcf1add17a 100644 --- a/src/renderer/components/kube-object-menu/kube-object-menu.injectable.tsx +++ b/src/renderer/components/kube-object-menu/kube-object-menu.injectable.tsx @@ -28,22 +28,27 @@ import { import type { KubeObject } from "../../../common/k8s-api/kube-object"; import { lifecycleEnum, Injectable } from "@ogre-tools/injectable"; -import apiManagerInjectable from "./dependencies/apiManager.injectable"; -import clusterNameInjectable from "./dependencies/clusterName.injectable"; -import editResourceTabInjectable from "./dependencies/editResourceTab.injectable"; -import hideDetailsInjectable from "./dependencies/hideDetails.injectable"; +import clusterNameInjectable from "./dependencies/cluster-name.injectable"; import kubeObjectMenuItemsInjectable from "./dependencies/kube-object-menu-items/kube-object-menu-items.injectable"; +import removeActionInjectable from "./dependencies/remove-action/remove-action.injectable"; +import updateActionInjectable from "./dependencies/update-action/update-action.injectable"; const KubeObjectMenuInjectable: Injectable< JSX.Element, - KubeObjectMenuDependencies, + KubeObjectMenuDependencies, KubeObjectMenuProps > = { getDependencies: (di, props) => ({ clusterName: di.inject(clusterNameInjectable), - apiManager: di.inject(apiManagerInjectable), - editResourceTab: di.inject(editResourceTabInjectable), - hideDetails: di.inject(hideDetailsInjectable), + + removeObject: di.inject(removeActionInjectable, { + customAction: props.removeAction, + kubeObject: props.object, + }), + + updateObject: di.inject(updateActionInjectable, { + kubeObject: props.object, + }), kubeObjectMenuItems: di.inject(kubeObjectMenuItemsInjectable, { kubeObject: props.object, diff --git a/src/renderer/components/kube-object-menu/kube-object-menu.test.tsx b/src/renderer/components/kube-object-menu/kube-object-menu.test.tsx index ba7a5f66c9..17bb28cf16 100644 --- a/src/renderer/components/kube-object-menu/kube-object-menu.test.tsx +++ b/src/renderer/components/kube-object-menu/kube-object-menu.test.tsx @@ -33,15 +33,15 @@ import { getDiForUnitTesting } from "../getDiForUnitTesting"; import { Inject } from "@ogre-tools/injectable-react"; import clusterInjectable from "./dependencies/cluster.injectable"; -import hideDetailsInjectable from "./dependencies/hideDetails.injectable"; -import editResourceTabInjectable from "./dependencies/editResourceTab.injectable"; +import hideDetailsInjectable from "./dependencies/hide-details.injectable"; +import editResourceTabInjectable from "./dependencies/update-action/edit-resource-tab.injectable"; import { TabKind } from "../dock/dock.store"; import KubeObjectMenuInjectable from "./kube-object-menu.injectable"; -import kubeObjectMenuRegistryInjectable from "./dependencies/kubeObjectMenuRegistry.injectable"; +import kubeObjectMenuRegistryInjectable from "./dependencies/kube-object-menu-items/kube-object-menu-registry.injectable"; import { renderFor, DiRender } from "../test-utils/renderFor"; import type { Cluster } from "../../../main/cluster"; import type { ApiManager } from "../../../common/k8s-api/api-manager"; -import apiManagerInjectable from "./dependencies/apiManager.injectable"; +import apiManagerInjectable from "./dependencies/remove-action/api-manager-store/api-manager.injectable"; describe("kube-object-menu", () => { let objectStub: KubeObject | null; diff --git a/src/renderer/components/kube-object-menu/kube-object-menu.tsx b/src/renderer/components/kube-object-menu/kube-object-menu.tsx index 804140bc86..dac5ed6a04 100644 --- a/src/renderer/components/kube-object-menu/kube-object-menu.tsx +++ b/src/renderer/components/kube-object-menu/kube-object-menu.tsx @@ -24,14 +24,13 @@ import { boundMethod, cssNames } from "../../utils"; import type { KubeObject } from "../../../common/k8s-api/kube-object"; import { MenuActions, MenuActionsProps } from "../menu"; import identity from "lodash/identity"; -import type { ApiManager } from "../../../common/k8s-api/api-manager"; -export interface KubeObjectMenuDependencies { - apiManager: ApiManager; +export interface KubeObjectMenuDependencies { kubeObjectMenuItems: React.ElementType[]; clusterName: string; - hideDetails: () => void; - editResourceTab: (kubeObject: TKubeObject) => void; + + removeObject: () => Promise + updateObject: () => void } export interface KubeObjectMenuProps extends MenuActionsProps { @@ -42,41 +41,17 @@ export interface KubeObjectMenuProps extends MenuActionsProps { export interface KubeObjectMenuPropsAndDependencies extends KubeObjectMenuProps, - KubeObjectMenuDependencies {} + KubeObjectMenuDependencies {} export class KubeObjectMenu< TKubeObject extends KubeObject, > extends React.Component> { - get store() { - const { object } = this.props; - - if (!object) return null; - - return this.props.apiManager.getStore(object.selfLink); - } - get isEditable() { - return this.props.editable ?? Boolean(this.store?.patch); + return this.props.editable; // ?? Boolean(this.store?.patch); } get isRemovable() { - return this.props.removable ?? Boolean(this.store?.remove); - } - - @boundMethod - async update() { - this.props.hideDetails(); - this.props.editResourceTab(this.props.object); - } - - @boundMethod - async remove() { - this.props.hideDetails(); - const { object, removeAction } = this.props; - - // TODO: currently only branch for removeAction() is unit tested, and store.remove() is not. - if (removeAction) await removeAction(); - else await this.store.remove(object); + return this.props.removable; // ?? Boolean(this.store?.remove); } @boundMethod @@ -112,14 +87,16 @@ export class KubeObjectMenu< } render() { - const { remove, update, getRemoveMessage, isEditable, isRemovable } = this; - const { className, editable, removable, ...menuProps } = this.props; + const { getRemoveMessage, isEditable, isRemovable } = this; + const { className, editable, updateObject, removable, removeObject, ...menuProps } = this.props; return (