From b4dd6873cb3b19ada70af4cc48a9d0f6265304d4 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 30 Nov 2022 09:20:10 -0500 Subject: [PATCH] Add quick namespace filtering to RoleBindings view Signed-off-by: Sebastian Malton --- .../+cluster-roles/store.injectable.ts | 4 +- .../+user-management/+cluster-roles/store.ts | 2 +- .../+user-management/+role-bindings/view.scss | 4 ++ .../+user-management/+role-bindings/view.tsx | 53 ++++++++++++++++--- 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/+user-management/+cluster-roles/store.injectable.ts b/src/renderer/components/+user-management/+cluster-roles/store.injectable.ts index 021dd23d6e..bfd83f3b3b 100644 --- a/src/renderer/components/+user-management/+cluster-roles/store.injectable.ts +++ b/src/renderer/components/+user-management/+cluster-roles/store.injectable.ts @@ -7,7 +7,7 @@ import assert from "assert"; import { storesAndApisCanBeCreatedInjectionToken } from "../../../../common/k8s-api/stores-apis-can-be-created.token"; import clusterRoleApiInjectable from "../../../../common/k8s-api/endpoints/cluster-role.api.injectable"; import { kubeObjectStoreInjectionToken } from "../../../../common/k8s-api/api-manager/manager.injectable"; -import { ClusterRolesStore } from "./store"; +import { ClusterRoleStore } from "./store"; const clusterRoleStoreInjectable = getInjectable({ id: "cluster-role-store", @@ -16,7 +16,7 @@ const clusterRoleStoreInjectable = getInjectable({ const api = di.inject(clusterRoleApiInjectable); - return new ClusterRolesStore(api); + return new ClusterRoleStore(api); }, injectionToken: kubeObjectStoreInjectionToken, }); diff --git a/src/renderer/components/+user-management/+cluster-roles/store.ts b/src/renderer/components/+user-management/+cluster-roles/store.ts index 9d680285e8..a8df8bdb90 100644 --- a/src/renderer/components/+user-management/+cluster-roles/store.ts +++ b/src/renderer/components/+user-management/+cluster-roles/store.ts @@ -5,7 +5,7 @@ import type { ClusterRole, ClusterRoleApi, ClusterRoleData } from "../../../../common/k8s-api/endpoints"; import { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store"; -export class ClusterRolesStore extends KubeObjectStore { +export class ClusterRoleStore extends KubeObjectStore { protected sortItems(items: ClusterRole[]) { return super.sortItems(items, [ clusterRole => clusterRole.kind, diff --git a/src/renderer/components/+user-management/+role-bindings/view.scss b/src/renderer/components/+user-management/+role-bindings/view.scss index 032561422c..d57c5679c3 100644 --- a/src/renderer/components/+user-management/+role-bindings/view.scss +++ b/src/renderer/components/+user-management/+role-bindings/view.scss @@ -12,5 +12,9 @@ &.warning { @include table-cell-warning; } + + a.filterNamespace { + border-bottom: unset; + } } } diff --git a/src/renderer/components/+user-management/+role-bindings/view.tsx b/src/renderer/components/+user-management/+role-bindings/view.tsx index ef2447cf5f..58afc14a5e 100644 --- a/src/renderer/components/+user-management/+role-bindings/view.tsx +++ b/src/renderer/components/+user-management/+role-bindings/view.tsx @@ -9,12 +9,20 @@ import React from "react"; import { KubeObjectListLayout } from "../../kube-object-list-layout"; import { KubeObjectStatusIcon } from "../../kube-object-status-icon"; import { RoleBindingDialog } from "./dialog"; -import { roleBindingStore } from "./legacy-store"; -import { roleStore } from "../+roles/legacy-store"; -import { clusterRoleStore } from "../+cluster-roles/legacy-store"; -import { serviceAccountStore } from "../+service-accounts/legacy-store"; import { SiblingsInTabLayout } from "../../layout/siblings-in-tab-layout"; import { KubeObjectAge } from "../../kube-object/age"; +import type { RoleStore } from "../+roles/store"; +import type { ServiceAccountStore } from "../+service-accounts/store"; +import type { RoleBindingStore } from "./store"; +import { prevDefault } from "../../../utils"; +import type { ClusterRoleStore } from "../+cluster-roles/store"; +import type { FilterByNamespace } from "../../+namespaces/namespace-select-filter-model/filter-by-namespace.injectable"; +import { withInjectables } from "@ogre-tools/injectable-react"; +import clusterRoleStoreInjectable from "../+cluster-roles/store.injectable"; +import filterByNamespaceInjectable from "../../+namespaces/namespace-select-filter-model/filter-by-namespace.injectable"; +import roleBindingStoreInjectable from "./store.injectable"; +import roleStoreInjectable from "../+roles/store.injectable"; +import serviceAccountStoreInjectable from "../+service-accounts/store.injectable"; enum columnId { name = "name", @@ -23,9 +31,25 @@ enum columnId { age = "age", } +interface Dependencies { + roleBindingStore: RoleBindingStore; + roleStore: RoleStore; + clusterRoleStore: ClusterRoleStore; + serviceAccountStore: ServiceAccountStore; + filterByNamespace: FilterByNamespace; +} + @observer -export class RoleBindings extends React.Component { +class NonInjectedRoleBindings extends React.Component { render() { + const { + clusterRoleStore, + roleBindingStore, + roleStore, + serviceAccountStore, + filterByNamespace, + } = this.props; + return ( [ binding.getName(), , - binding.getNs(), + filterByNamespace(binding.getNs()))} + > + {binding.getNs()} + , binding.getSubjectNames(), , ]} @@ -69,3 +99,14 @@ export class RoleBindings extends React.Component { ); } } + +export const RoleBindings = withInjectables(NonInjectedRoleBindings, { + getProps: (di, props) => ({ + ...props, + clusterRoleStore: di.inject(clusterRoleStoreInjectable), + filterByNamespace: di.inject(filterByNamespaceInjectable), + roleBindingStore: di.inject(roleBindingStoreInjectable), + roleStore: di.inject(roleStoreInjectable), + serviceAccountStore: di.inject(serviceAccountStoreInjectable), + }), +});