From a61d475bbc929e1665a903b198dc2769b142bb55 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Thu, 2 Mar 2023 14:41:32 +0300 Subject: [PATCH] Create NamespaceMenu component Signed-off-by: Alex Andreev --- .../components/+namespaces/namespace-menu.tsx | 63 +++++++++++++++++++ .../renderer/components/+namespaces/route.tsx | 6 ++ 2 files changed, 69 insertions(+) create mode 100644 packages/core/src/renderer/components/+namespaces/namespace-menu.tsx diff --git a/packages/core/src/renderer/components/+namespaces/namespace-menu.tsx b/packages/core/src/renderer/components/+namespaces/namespace-menu.tsx new file mode 100644 index 0000000000..f82acdd578 --- /dev/null +++ b/packages/core/src/renderer/components/+namespaces/namespace-menu.tsx @@ -0,0 +1,63 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { withInjectables } from "@ogre-tools/injectable-react"; +import React from "react"; +import type { Namespace } from "../../../common/k8s-api/endpoints"; +import type { KubeObject } from "../../../common/k8s-api/kube-object"; +import createEditResourceTabInjectable from "../dock/edit-resource/edit-resource-tab.injectable"; +import { Icon } from "../icon"; +import { MenuItem } from "../menu"; +import type { MenuActionsProps } from "../menu/menu-actions"; +import { MenuActions } from "../menu/menu-actions"; +import removeSubnamespaceInjectable from "./remove-subnamespace.injectable"; +import type { NamespaceStore } from "./store"; +import namespaceStoreInjectable from "./store.injectable"; + +export interface NamespaceMenuProps extends MenuActionsProps { + namespace: Namespace; +} + +interface Dependencies { + readonly removeSubnamespace: (name: string) => Promise; + readonly namespaceStore: NamespaceStore; + readonly createEditResourceTab: (kubeObject: KubeObject) => void; +} + +function NonInjectedNamespaceMenu(props: NamespaceMenuProps & Dependencies) { + const { namespace, removeSubnamespace, namespaceStore, createEditResourceTab } = props; + + const remove = async () => { + if (namespace.isSubnamespace()) { + await removeSubnamespace(namespace.getName()); + } else { + await namespaceStore.remove(namespace); + } + + namespaceStore.clearSelected(); + }; + + return ( + + createEditResourceTab(namespace)}> + + Edit + + + + Delete + + + ); +} + +export const NamespaceMenu = withInjectables(NonInjectedNamespaceMenu, { + getProps: (di, props) => ({ + ...props, + removeSubnamespace: di.inject(removeSubnamespaceInjectable), + namespaceStore: di.inject(namespaceStoreInjectable), + createEditResourceTab: di.inject(createEditResourceTabInjectable), + }), +}); \ No newline at end of file diff --git a/packages/core/src/renderer/components/+namespaces/route.tsx b/packages/core/src/renderer/components/+namespaces/route.tsx index 11e6d97864..78c6396c15 100644 --- a/packages/core/src/renderer/components/+namespaces/route.tsx +++ b/packages/core/src/renderer/components/+namespaces/route.tsx @@ -17,6 +17,7 @@ import namespaceStoreInjectable from "./store.injectable"; import { KubeObjectAge } from "../kube-object/age"; import openAddNamepaceDialogInjectable from "./add-dialog/open.injectable"; import { SubnamespaceBadge } from "./subnamespace-badge"; +import { NamespaceMenu } from "./namespace-menu"; enum columnId { name = "name", @@ -77,6 +78,11 @@ const NonInjectedNamespacesRoute = ({ namespaceStore, openAddNamespaceDialog }: addTooltip: "Add Namespace", onAdd: openAddNamespaceDialog, }} + renderItemMenu={namespace => ( + + )} />