diff --git a/src/renderer/components/+workloads-overview/overview-statuses.tsx b/src/renderer/components/+workloads-overview/overview-statuses.tsx index 8d2bea4c6d..6862695ccf 100644 --- a/src/renderer/components/+workloads-overview/overview-statuses.tsx +++ b/src/renderer/components/+workloads-overview/overview-statuses.tsx @@ -9,78 +9,49 @@ import React from "react"; import { observer } from "mobx-react"; import { OverviewWorkloadStatus } from "./overview-workload-status"; import { Link } from "react-router-dom"; -import type { NamespaceStore } from "../+namespaces/namespace-store/namespace.store"; import type { KubeResource } from "../../../common/rbac"; -import { ResourceNames } from "../../utils/rbac"; -import { workloadURL } from "../../../common/routes"; import { withInjectables } from "@ogre-tools/injectable-react"; -import namespaceStoreInjectable from "../+namespaces/namespace-store/namespace-store.injectable"; -import type { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; -import { podsStore } from "../+workloads-pods/pods.store"; -import { deploymentStore } from "../+workloads-deployments/deployments.store"; -import { daemonSetStore } from "../+workloads-daemonsets/daemonsets.store"; -import { statefulSetStore } from "../+workloads-statefulsets/statefulset.store"; -import { jobStore } from "../+workloads-jobs/job.store"; -import { cronJobStore } from "../+workloads-cronjobs/cronjob.store"; -import { replicaSetStore } from "../+workloads-replicasets/replicasets.store"; -import type { KubeObject } from "../../../common/k8s-api/kube-object"; -import type { IsAllowedResource } from "../../../common/utils/is-allowed-resource.injectable"; -import isAllowedResourceInjectable from "../../../common/utils/is-allowed-resource.injectable"; - -const workloadStores = new Map>([ - ["pods", podsStore], - ["deployments", deploymentStore], - ["daemonsets", daemonSetStore], - ["statefulsets", statefulSetStore], - ["replicasets", replicaSetStore], - ["jobs", jobStore], - ["cronjobs", cronJobStore], -]); +import type { IComputedValue } from "mobx"; +import workloadsInjectable from "./workloads.injectable"; export interface OverviewStatusesProps {} -interface Dependencies { - namespaceStore: NamespaceStore; - isAllowedResource: IsAllowedResource; +interface Workload { + resource: KubeResource; + amountOfItems: number; + href: string; + status: Record; + title: string } -const NonInjectedOverviewStatuses = observer(({ namespaceStore, isAllowedResource }: Dependencies & OverviewStatusesProps) => { - const renderWorkloads = () => { - const workloads: React.ReactNode[] = []; +interface Dependencies { + workloads: IComputedValue; +} - for (const [resource, store] of workloadStores.entries()) { - if (!isAllowedResource(resource)) { - continue; - } - - const items = store.getAllByNs(namespaceStore.contextNamespaces); - - workloads.push( -
-
- {ResourceNames[resource]} ({items.length}) -
- -
, - ); - } - - return workloads; - }; - - return ( +const NonInjectedOverviewStatuses = observer( + ({ workloads }: Dependencies & OverviewStatusesProps) => (
- {renderWorkloads()} + {workloads.get() + .map(({ resource, title, href, status, amountOfItems }) => ( +
+
+ + {title} ({amountOfItems}) + +
+ + +
+ ))}
- ); -}); + ), +); export const OverviewStatuses = withInjectables(NonInjectedOverviewStatuses, { getProps: (di, props) => ({ - namespaceStore: di.inject(namespaceStoreInjectable), - isAllowedResource: di.inject(isAllowedResourceInjectable), + workloads: di.inject(workloadsInjectable), ...props, }), }); diff --git a/src/renderer/components/+workloads-overview/workloads.injectable.ts b/src/renderer/components/+workloads-overview/workloads.injectable.ts new file mode 100644 index 0000000000..013a195816 --- /dev/null +++ b/src/renderer/components/+workloads-overview/workloads.injectable.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; +import type { KubeResource } from "../../../common/rbac"; +import type { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; +import type { KubeObject } from "../../../common/k8s-api/kube-object"; +import { podsStore } from "../+workloads-pods/pods.store"; +import { deploymentStore } from "../+workloads-deployments/deployments.store"; +import { daemonSetStore } from "../+workloads-daemonsets/daemonsets.store"; +import { statefulSetStore } from "../+workloads-statefulsets/statefulset.store"; +import { replicaSetStore } from "../+workloads-replicasets/replicasets.store"; +import { jobStore } from "../+workloads-jobs/job.store"; +import { cronJobStore } from "../+workloads-cronjobs/cronjob.store"; +import isAllowedResourceInjectable from "../../../common/utils/is-allowed-resource.injectable"; +import namespaceStoreInjectable from "../+namespaces/namespace-store/namespace-store.injectable"; +import { workloads } from "./workloads"; + +const workloadsInjectable = getInjectable({ + instantiate: (di) => + workloads({ + isAllowedResource: di.inject(isAllowedResourceInjectable), + namespaceStore: di.inject(namespaceStoreInjectable), + + workloadStores: new Map>([ + ["pods", podsStore], + ["deployments", deploymentStore], + ["daemonsets", daemonSetStore], + ["statefulsets", statefulSetStore], + ["replicasets", replicaSetStore], + ["jobs", jobStore], + ["cronjobs", cronJobStore], + ]), + }), + + lifecycle: lifecycleEnum.singleton, +}); + +export default workloadsInjectable; diff --git a/src/renderer/components/+workloads-overview/workloads.ts b/src/renderer/components/+workloads-overview/workloads.ts new file mode 100644 index 0000000000..da99834a86 --- /dev/null +++ b/src/renderer/components/+workloads-overview/workloads.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { computed } from "mobx"; +import type { KubeResource } from "../../../common/rbac"; +import type { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; +import type { KubeObject } from "../../../common/k8s-api/kube-object"; +import { workloadURL } from "../../../common/routes"; +import { ResourceNames } from "../../utils/rbac"; +import type { NamespaceStore } from "../+namespaces/namespace-store/namespace.store"; + +interface Dependencies { + workloadStores: Map>; + isAllowedResource: (resource: KubeResource) => boolean; + namespaceStore: NamespaceStore; +} + +export const workloads = ({ + workloadStores, + isAllowedResource, + namespaceStore, +}: Dependencies) => + computed(() => + [...workloadStores.entries()] + .filter(([resource]) => isAllowedResource(resource)) + .map(([resource, store]) => { + const items = store.getAllByNs(namespaceStore.contextNamespaces); + + return { + resource, + href: workloadURL[resource](), + amountOfItems: items.length, + status: store.getStatuses(items), + title: ResourceNames[resource], + }; + }), + );