diff --git a/packages/core/src/renderer/components/+namespaces/namespace-remove-context-menu-overriding-listener.injectable.ts b/packages/core/src/renderer/components/+namespaces/namespace-remove-context-menu-overriding-listener.injectable.ts new file mode 100644 index 0000000000..a5d4b99867 --- /dev/null +++ b/packages/core/src/renderer/components/+namespaces/namespace-remove-context-menu-overriding-listener.injectable.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { action } from "mobx"; +import type { Namespace } from "../../../common/k8s-api/endpoints"; +import type { KubeObjectOnContextMenuOpenContext } from "../../kube-object/handler"; +import { staticKubeObjectHandlerInjectionToken } from "../../kube-object/handler"; +import requestDeleteNamespaceInjectable from "./request-delete-namespace.injectable"; + +const namespaceRemoveContextMenuOverridingListenerInjectable = getInjectable({ + id: "namespace-remove-context-menu-overriding-listener", + instantiate: (di) => { + const requestDeleteNamespace = di.inject(requestDeleteNamespaceInjectable); + + return ({ + apiVersions: ["v1"], + kind: "Namespace", + onContextMenuOpen: action((ctx: KubeObjectOnContextMenuOpenContext) => { + ctx.menuItems.replace([ + { + id: "new-delete-kube-object", + icon: "delete", + title: "Delete", + onClick: (obj) => requestDeleteNamespace(obj as Namespace), + }, + ...ctx.menuItems.filter((menuItem) => menuItem.id !== "delete-kube-object"), + ]); + }), + }); + }, + injectionToken: staticKubeObjectHandlerInjectionToken, +}); + +export default namespaceRemoveContextMenuOverridingListenerInjectable; diff --git a/packages/core/src/renderer/components/kube-object-menu/kube-object-menu.tsx b/packages/core/src/renderer/components/kube-object-menu/kube-object-menu.tsx index 8535006f46..119ef011fa 100644 --- a/packages/core/src/renderer/components/kube-object-menu/kube-object-menu.tsx +++ b/packages/core/src/renderer/components/kube-object-menu/kube-object-menu.tsx @@ -106,6 +106,7 @@ class NonInjectedKubeObjectMenu extends React.Component if (isRemovable) { this.menuItems.push({ + id: "delete-kube-object", title: "Delete", icon: "delete", onClick: withConfirmation({ @@ -126,6 +127,7 @@ class NonInjectedKubeObjectMenu extends React.Component if (isEditable) { this.menuItems.push({ + id: "edit-kube-object", title: "Edit", icon: "edit", onClick: async () => { diff --git a/packages/core/src/renderer/kube-object/handler.ts b/packages/core/src/renderer/kube-object/handler.ts index ad859d3ea9..63d7ccd9fe 100644 --- a/packages/core/src/renderer/kube-object/handler.ts +++ b/packages/core/src/renderer/kube-object/handler.ts @@ -4,11 +4,13 @@ */ import { getInjectionToken } from "@ogre-tools/injectable"; +import type { IObservableArray } from "mobx"; import type { RequireAtLeastOne } from "type-fest"; import type { KubeObject } from "../../common/k8s-api/kube-object"; import type { BaseIconProps } from "../components/icon"; export interface KubeObjectContextMenuItem { + id?: string; /** * If the type is `string` then it is shorthand for {@link BaseIconProps.material} * @@ -29,7 +31,7 @@ export interface KubeObjectContextMenuItem { } export interface KubeObjectOnContextMenuOpenContext { - menuItems: KubeObjectContextMenuItem[]; + readonly menuItems: IObservableArray; navigate: (location: string) => void; }