/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import "./overview-workload-status.scss"; import React from "react"; import capitalize from "lodash/capitalize"; import { observer } from "mobx-react"; import type { PieChartData } from "../chart"; import { PieChart } from "../chart"; import { object } from "../../utils"; import type { LensTheme } from "../../themes/store"; import { withInjectables } from "@ogre-tools/injectable-react"; import type { PascalCase } from "type-fest"; import type { IComputedValue } from "mobx"; import activeThemeInjectable from "../../themes/active.injectable"; import type { Workload } from "./workloads/workload-injection-token"; export type LowercaseOrPascalCase = Lowercase | PascalCase; export type WorkloadStatus = Partial, number>>; function toLowercase(src: T): Lowercase { return src.toLowerCase() as Lowercase; } export interface OverviewWorkloadStatusProps { workload: Workload; } interface Dependencies { activeTheme: IComputedValue; } const statusBackgroundColorMapping = { "running": "colorOk", "scheduled": "colorOk", "pending": "colorWarning", "suspended": "colorWarning", "evicted": "colorError", "succeeded": "colorSuccess", "failed": "colorError", "terminated": "colorTerminated", "terminating": "colorTerminated", "unknown": "colorVague", "complete": "colorSuccess", } as const; const NonInjectedOverviewWorkloadStatus = observer((props: OverviewWorkloadStatusProps & Dependencies) => { const { workload, activeTheme, } = props; const statusesToBeShown = object.entries(workload.status.get()).filter(([, val]) => val > 0); const theme = activeTheme.get(); const emptyDataSet = { data: [1], backgroundColor: [theme.colors.pieChartDefaultColor], label: "Empty", }; const statusDataSet = { label: "Status", data: statusesToBeShown.map(([, value]) => value), backgroundColor: statusesToBeShown.map(([status]) => ( theme.colors[statusBackgroundColorMapping[toLowercase(status)]] )), tooltipLabels: statusesToBeShown.map(([status]) => ( (percent: string) => `${capitalize(status)}: ${percent}` )), }; const chartData: Required = { datasets: [statusesToBeShown.length > 0 ? statusDataSet : emptyDataSet], labels: statusesToBeShown.map( ([status, value]) => `${capitalize(status)}: ${value}`, ), }; return (
); }); export const OverviewWorkloadStatus = withInjectables(NonInjectedOverviewWorkloadStatus, { getProps: (di, props) => ({ ...props, activeTheme: di.inject(activeThemeInjectable), }), });