From aa950026a3162abf6322afb4b5c5bf56f9f7e10f Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 21 Apr 2023 10:16:39 -0400 Subject: [PATCH] feat: Add removing subNamespaces to Namespace route Signed-off-by: Sebastian Malton --- .../renderer/components/+namespaces/route.tsx | 37 ++++++++++++++++++- .../kube-object-list-layout.tsx | 11 ++++-- .../renderer/kube-watch-api/kube-watch-api.ts | 1 + 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/packages/core/src/renderer/components/+namespaces/route.tsx b/packages/core/src/renderer/components/+namespaces/route.tsx index 436e15dcad..edfea48182 100644 --- a/packages/core/src/renderer/components/+namespaces/route.tsx +++ b/packages/core/src/renderer/components/+namespaces/route.tsx @@ -17,6 +17,8 @@ import namespaceStoreInjectable from "./store.injectable"; import { KubeObjectAge } from "../kube-object/age"; import openAddNamespaceDialogInjectable from "./add-dialog/open.injectable"; import { SubnamespaceBadge } from "./subnamespace-badge"; +import type { RequestDeleteNamespace } from "./request-delete-namespace.injectable"; +import requestDeleteNamespaceInjectable from "./request-delete-namespace.injectable"; enum columnId { name = "name", @@ -28,15 +30,45 @@ enum columnId { interface Dependencies { namespaceStore: NamespaceStore; openAddNamespaceDialog: () => void; + requestDeleteNamespace: RequestDeleteNamespace; } -const NonInjectedNamespacesRoute = ({ namespaceStore, openAddNamespaceDialog }: Dependencies) => ( +const NonInjectedNamespacesRoute = ({ + namespaceStore, + openAddNamespaceDialog, + requestDeleteNamespace, +}: Dependencies) => ( namespaceStore.getByPath(...params), + getTotalCount: (...params) => namespaceStore.getTotalCount(...params), + isSelected: (...params) => namespaceStore.isSelected(...params), + isSelectedAll: (...params) => namespaceStore.isSelectedAll(...params), + loadAll: (...params) => namespaceStore.loadAll(...params), + subscribe: () => namespaceStore.subscribe(), + toggleSelection: (...params) => namespaceStore.toggleSelection(...params), + toggleSelectionAll: (...params) => namespaceStore.toggleSelectionAll(...params), + pickOnlySelected: (...params) => namespaceStore.pickOnlySelected(...params), + removeItems: async (items) => { await Promise.all(items.map(requestDeleteNamespace)); }, + removeSelectedItems: async () => { await Promise.all(namespaceStore.selectedItems.map(requestDeleteNamespace)); }, + }} sortingCallbacks={{ [columnId.name]: namespace => namespace.getName(), [columnId.labels]: namespace => namespace.getLabels(), @@ -87,5 +119,6 @@ export const NamespacesRoute = withInjectables(NonInjectedNamespac getProps: (di) => ({ namespaceStore: di.inject(namespaceStoreInjectable), openAddNamespaceDialog: di.inject(openAddNamespaceDialogInjectable), + requestDeleteNamespace: di.inject(requestDeleteNamespaceInjectable), }), }); diff --git a/packages/core/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx b/packages/core/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx index a3806467f2..58c8be18f2 100644 --- a/packages/core/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx +++ b/packages/core/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx @@ -11,9 +11,8 @@ import { disposeOnUnmount, observer } from "mobx-react"; import type { Disposer } from "@k8slens/utilities"; import { hasTypedProperty, isObject, isString, cssNames, isDefined } from "@k8slens/utilities"; import type { KubeJsonApiDataFor, KubeObject } from "../../../common/k8s-api/kube-object"; -import type { ItemListLayoutProps } from "../item-object-list/list-layout"; +import type { ItemListLayoutProps, ItemListStore } from "../item-object-list/list-layout"; import { ItemListLayout } from "../item-object-list/list-layout"; -import type { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; import { KubeObjectMenu } from "../kube-object-menu"; import { NamespaceSelectFilter } from "../+namespaces/namespace-select-filter"; import { ResourceKindMap, ResourceNames } from "../../utils/rbac"; @@ -33,14 +32,20 @@ import type { KubeObjectListLayoutColumn, ItemObject } from "@k8slens/list-layou import { kubeObjectListLayoutColumnInjectionToken } from "@k8slens/list-layout"; import { sortBy } from "lodash"; +export type KubeItemListStore = ItemListStore & SubscribableStore & { + getByPath: (path: string) => K | undefined; + readonly contextItems: K[]; +}; + export interface KubeObjectListLayoutProps< K extends KubeObject, + // eslint-disable-next-line unused-imports/no-unused-vars-ts A extends KubeApi, D extends KubeJsonApiDataFor, > extends Omit, "getItems" | "dependentStores" | "preloadStores"> { items?: K[]; getItems?: () => K[]; - store: KubeObjectStore; + store: KubeItemListStore; dependentStores?: SubscribableStore[]; subscribeStores?: boolean; diff --git a/packages/core/src/renderer/kube-watch-api/kube-watch-api.ts b/packages/core/src/renderer/kube-watch-api/kube-watch-api.ts index cf6e6486e8..1724d66423 100644 --- a/packages/core/src/renderer/kube-watch-api/kube-watch-api.ts +++ b/packages/core/src/renderer/kube-watch-api/kube-watch-api.ts @@ -82,6 +82,7 @@ export interface SubscribableStore { readonly isNamespaced: boolean; readonly apiBase: string; readonly kind: string; + readonly apiVersionWithGroup?: string; }; loadAll(opts?: KubeObjectStoreLoadAllParams): Promise; subscribe(opts?: KubeObjectStoreSubscribeParams): Disposer;