1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Replace WorkloadsOverviewDetailRegistry with reactive solution (#4817)

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-03-04 10:04:38 +02:00 committed by GitHub
parent 8dbc0b82f8
commit 125a47a56d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 92 additions and 74 deletions

View File

@ -277,7 +277,6 @@ export class ExtensionLoader {
registries.ClusterPageRegistry.getInstance().add(extension.clusterPages, extension), registries.ClusterPageRegistry.getInstance().add(extension.clusterPages, extension),
registries.ClusterPageMenuRegistry.getInstance().add(extension.clusterPageMenus, extension), registries.ClusterPageMenuRegistry.getInstance().add(extension.clusterPageMenus, extension),
registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems), registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems),
registries.WorkloadsOverviewDetailRegistry.getInstance().add(extension.kubeWorkloadsOverviewItems),
]; ];
this.events.on("remove", (removedExtension: LensRendererExtension) => { this.events.on("remove", (removedExtension: LensRendererExtension) => {

View File

@ -20,6 +20,7 @@ import type { AdditionalCategoryColumnRegistration } from "../renderer/component
import type { CustomCategoryViewRegistration } from "../renderer/components/+catalog/custom-views"; import type { CustomCategoryViewRegistration } from "../renderer/components/+catalog/custom-views";
import type { StatusBarRegistration } from "../renderer/components/status-bar/status-bar-registration"; import type { StatusBarRegistration } from "../renderer/components/status-bar/status-bar-registration";
import type { KubeObjectMenuRegistration } from "../renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-registration"; import type { KubeObjectMenuRegistration } from "../renderer/components/kube-object-menu/dependencies/kube-object-menu-items/kube-object-menu-registration";
import type { WorkloadsOverviewDetailRegistration } from "../renderer/components/+workloads-overview/workloads-overview-detail-registration";
import type { KubeObjectStatusRegistration } from "../renderer/components/kube-object-status-icon/kube-object-status-registration"; import type { KubeObjectStatusRegistration } from "../renderer/components/kube-object-status-icon/kube-object-status-registration";
export class LensRendererExtension extends LensExtension { export class LensRendererExtension extends LensExtension {
@ -32,7 +33,7 @@ export class LensRendererExtension extends LensExtension {
statusBarItems: StatusBarRegistration[] = []; statusBarItems: StatusBarRegistration[] = [];
kubeObjectDetailItems: registries.KubeObjectDetailRegistration[] = []; kubeObjectDetailItems: registries.KubeObjectDetailRegistration[] = [];
kubeObjectMenuItems: KubeObjectMenuRegistration[] = []; kubeObjectMenuItems: KubeObjectMenuRegistration[] = [];
kubeWorkloadsOverviewItems: registries.WorkloadsOverviewDetailRegistration[] = []; kubeWorkloadsOverviewItems: WorkloadsOverviewDetailRegistration[] = [];
commands: CommandRegistration[] = []; commands: CommandRegistration[] = [];
welcomeMenus: WelcomeMenuRegistration[] = []; welcomeMenus: WelcomeMenuRegistration[] = [];
welcomeBanners: WelcomeBannerRegistration[] = []; welcomeBanners: WelcomeBannerRegistration[] = [];

View File

@ -10,5 +10,4 @@ export * from "./page-menu-registry";
export * from "./kube-object-detail-registry"; export * from "./kube-object-detail-registry";
export * from "./entity-setting-registry"; export * from "./entity-setting-registry";
export * from "./catalog-entity-detail-registry"; export * from "./catalog-entity-detail-registry";
export * from "./workloads-overview-detail-registry";
export * from "./protocol-handler"; export * from "./protocol-handler";

View File

@ -1,31 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { orderBy } from "lodash";
import type React from "react";
import { BaseRegistry } from "./base-registry";
export interface WorkloadsOverviewDetailComponents {
Details: React.ComponentType<{}>;
}
export interface WorkloadsOverviewDetailRegistration {
components: WorkloadsOverviewDetailComponents;
priority?: number;
}
type RegisteredWorkloadsOverviewDetail = Required<WorkloadsOverviewDetailRegistration>;
export class WorkloadsOverviewDetailRegistry extends BaseRegistry<WorkloadsOverviewDetailRegistration, RegisteredWorkloadsOverviewDetail> {
getItems() {
return orderBy(super.getItems(), "priority", "desc");
}
protected getRegisteredItem(item: WorkloadsOverviewDetailRegistration): RegisteredWorkloadsOverviewDetail {
const { priority = 50, ...rest } = item;
return { priority, ...rest };
}
}

View File

@ -76,9 +76,6 @@ export async function bootstrap(di: DiContainer) {
logger.info(`${logPrefix} initializing KubeObjectDetailRegistry`); logger.info(`${logPrefix} initializing KubeObjectDetailRegistry`);
initializers.initKubeObjectDetailRegistry(); initializers.initKubeObjectDetailRegistry();
logger.info(`${logPrefix} initializing WorkloadsOverviewDetailRegistry`);
initializers.initWorkloadsOverviewDetailRegistry();
logger.info(`${logPrefix} initializing CatalogEntityDetailRegistry`); logger.info(`${logPrefix} initializing CatalogEntityDetailRegistry`);
initializers.initCatalogEntityDetailRegistry(); initializers.initCatalogEntityDetailRegistry();

View File

@ -0,0 +1,70 @@
/**
* 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 { computed } from "mobx";
import rendererExtensionsInjectable from "../../../extensions/renderer-extensions.injectable";
import { OverviewStatuses } from "./overview-statuses";
import { WorkloadEvents } from "../../initializers/workload-events";
import { orderBy } from "lodash/fp";
import type { WorkloadsOverviewDetailRegistration } from "./workloads-overview-detail-registration";
const detailComponentsInjectable = getInjectable({
id: "workload-detail-components",
instantiate: (di) => {
const extensions = di.inject(rendererExtensionsInjectable);
return computed(() => {
const extensionRegistrations = extensions
.get()
.flatMap((extension) => extension.kubeWorkloadsOverviewItems);
const allRegistrations = [
...coreRegistrations,
...extensionRegistrations,
];
return getRegistrationsInPriorityOrder(allRegistrations).map(
(item) => item.components.Details,
);
});
},
lifecycle: lifecycleEnum.singleton,
});
const coreRegistrations = [
{
components: {
Details: OverviewStatuses,
},
},
{
priority: 5,
components: {
Details: WorkloadEvents,
},
},
];
const toRegistrationWithDefaultPriority = ({
priority = 50,
...rest
}: WorkloadsOverviewDetailRegistration) => ({
priority,
...rest,
});
const getRegistrationsInPriorityOrder = (
allRegistrations: WorkloadsOverviewDetailRegistration[],
) =>
orderBy(
"priority",
"desc",
allRegistrations.map(toRegistrationWithDefaultPriority),
);
export default detailComponentsInjectable;

View File

@ -16,9 +16,8 @@ import { statefulSetStore } from "../+workloads-statefulsets/statefulset.store";
import { replicaSetStore } from "../+workloads-replicasets/replicasets.store"; import { replicaSetStore } from "../+workloads-replicasets/replicasets.store";
import { jobStore } from "../+workloads-jobs/job.store"; import { jobStore } from "../+workloads-jobs/job.store";
import { cronJobStore } from "../+workloads-cronjobs/cronjob.store"; import { cronJobStore } from "../+workloads-cronjobs/cronjob.store";
import { WorkloadsOverviewDetailRegistry } from "../../../extensions/registries";
import type { WorkloadsOverviewRouteParams } from "../../../common/routes"; import type { WorkloadsOverviewRouteParams } from "../../../common/routes";
import { makeObservable, observable, reaction } from "mobx"; import { IComputedValue, makeObservable, observable, reaction } from "mobx";
import { NamespaceSelectFilter } from "../+namespaces/namespace-select-filter"; import { NamespaceSelectFilter } from "../+namespaces/namespace-select-filter";
import { Icon } from "../icon"; import { Icon } from "../icon";
import { TooltipPosition } from "../tooltip"; import { TooltipPosition } from "../tooltip";
@ -30,11 +29,13 @@ import type { KubeObject } from "../../../common/k8s-api/kube-object";
import type { Disposer } from "../../../common/utils"; import type { Disposer } from "../../../common/utils";
import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable"; import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
import type { KubeWatchSubscribeStoreOptions } from "../../kube-watch-api/kube-watch-api"; import type { KubeWatchSubscribeStoreOptions } from "../../kube-watch-api/kube-watch-api";
import detailComponentsInjectable from "./detail-components.injectable";
export interface WorkloadsOverviewProps extends RouteComponentProps<WorkloadsOverviewRouteParams> { export interface WorkloadsOverviewProps extends RouteComponentProps<WorkloadsOverviewRouteParams> {
} }
interface Dependencies { interface Dependencies {
detailComponents: IComputedValue<React.ComponentType<{}>[]>;
clusterFrameContext: ClusterFrameContext; clusterFrameContext: ClusterFrameContext;
subscribeStores: (stores: KubeObjectStore<KubeObject>[], options: KubeWatchSubscribeStoreOptions) => Disposer; subscribeStores: (stores: KubeObjectStore<KubeObject>[], options: KubeWatchSubscribeStoreOptions) => Disposer;
} }
@ -91,13 +92,6 @@ class NonInjectedWorkloadsOverview extends React.Component<WorkloadsOverviewProp
} }
render() { render() {
const items = WorkloadsOverviewDetailRegistry
.getInstance()
.getItems()
.map(({ components: { Details }}, index) => (
<Details key={`workload-overview-${index}`}/>
));
return ( return (
<div className="WorkloadsOverview flex column gaps"> <div className="WorkloadsOverview flex column gaps">
<div className="header flex gaps align-center"> <div className="header flex gaps align-center">
@ -105,7 +99,10 @@ class NonInjectedWorkloadsOverview extends React.Component<WorkloadsOverviewProp
{this.renderLoadErrors()} {this.renderLoadErrors()}
<NamespaceSelectFilter /> <NamespaceSelectFilter />
</div> </div>
{items}
{this.props.detailComponents.get().map((Details, index) => (
<Details key={`workload-overview-${index}`} />
))}
</div> </div>
); );
} }
@ -116,6 +113,7 @@ export const WorkloadsOverview = withInjectables<Dependencies, WorkloadsOverview
{ {
getProps: (di, props) => ({ getProps: (di, props) => ({
detailComponents: di.inject(detailComponentsInjectable),
clusterFrameContext: di.inject(clusterFrameContextInjectable), clusterFrameContext: di.inject(clusterFrameContextInjectable),
subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores, subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
...props, ...props,

View File

@ -0,0 +1,12 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
interface WorkloadsOverviewDetailComponents {
Details: React.ComponentType<{}>;
}
export interface WorkloadsOverviewDetailRegistration {
components: WorkloadsOverviewDetailComponents;
priority?: number;
}

View File

@ -9,5 +9,4 @@ export * from "./entity-settings-registry";
export * from "./ipc"; export * from "./ipc";
export * from "./kube-object-detail-registry"; export * from "./kube-object-detail-registry";
export * from "./registries"; export * from "./registries";
export * from "./workloads-overview-detail-registry";
export * from "./catalog-category-registry"; export * from "./catalog-category-registry";

View File

@ -12,5 +12,4 @@ export function initRegistries() {
registries.EntitySettingRegistry.createInstance(); registries.EntitySettingRegistry.createInstance();
registries.GlobalPageRegistry.createInstance(); registries.GlobalPageRegistry.createInstance();
registries.KubeObjectDetailRegistry.createInstance(); registries.KubeObjectDetailRegistry.createInstance();
registries.WorkloadsOverviewDetailRegistry.createInstance();
} }

View File

@ -1,25 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { WorkloadsOverviewDetailRegistry } from "../../extensions/registries";
import { OverviewStatuses } from "../components/+workloads-overview/overview-statuses";
import { WorkloadEvents } from "./workload-events";
export function initWorkloadsOverviewDetailRegistry() {
WorkloadsOverviewDetailRegistry.getInstance()
.add([
{
components: {
Details: OverviewStatuses,
},
},
{
priority: 5,
components: {
Details: WorkloadEvents,
},
},
]);
}