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

Cleanup OverviewWorkloadStatus, remove findDOMNode (#4392)

This commit is contained in:
Sebastian Malton 2021-11-26 08:42:17 -05:00 committed by GitHub
parent 0e7704ea3f
commit aab48a784c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -23,87 +23,73 @@ import "./overview-workload-status.scss";
import React from "react"; import React from "react";
import capitalize from "lodash/capitalize"; import capitalize from "lodash/capitalize";
import { findDOMNode } from "react-dom";
import { observable, makeObservable } from "mobx";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { PieChart } from "../chart"; import { PieChart } from "../chart";
import { cssVar } from "../../utils"; import { cssVar } from "../../utils";
import type { ChartData, ChartDataSets } from "chart.js"; import type { ChartData } from "chart.js";
import { ThemeStore } from "../../theme.store"; import { ThemeStore } from "../../theme.store";
interface SimpleChartDataSets extends ChartDataSets {
backgroundColor?: string[];
}
interface Props { interface Props {
status: { status: Record<string, number>;
[key: string]: number;
};
} }
@observer @observer
export class OverviewWorkloadStatus extends React.Component<Props> { export class OverviewWorkloadStatus extends React.Component<Props> {
@observable elem: HTMLElement; elem?: HTMLElement;
constructor(props: Props) {
super(props);
makeObservable(this);
}
componentDidMount() {
// eslint-disable-next-line react/no-find-dom-node
this.elem = findDOMNode(this) as HTMLElement;
}
getStatusColor(status: string) {
return cssVar(this.elem).get(`--workload-status-${status.toLowerCase()}`).toString();
}
renderChart() { renderChart() {
if (!this.elem) return null; if (!this.elem) {
const { status } = this.props; return null;
const statuses = Object.entries(status); }
const chartData: Partial<ChartData> = {
labels: [] as string[], const cssVars = cssVar(this.elem);
datasets: [{ const chartData: Required<ChartData> = {
labels: [],
datasets: [],
};
const statuses = Object.entries(this.props.status).filter(([, val]) => val > 0);
if (statuses.length === 0) {
chartData.datasets.push({
data: [1], data: [1],
backgroundColor: [ThemeStore.getInstance().activeTheme.colors.pieChartDefaultColor], backgroundColor: [ThemeStore.getInstance().activeTheme.colors.pieChartDefaultColor],
label: "Empty", label: "Empty",
}],
};
if (statuses.some(([, val]) => val > 0)) {
const dataset: SimpleChartDataSets = {
data: [],
backgroundColor: [],
label: "Status",
};
statuses.forEach(([key, val]) => {
if (val !== 0) {
dataset.data.push(val);
dataset.backgroundColor.push(this.getStatusColor(key));
chartData.labels.push(`${capitalize(key)}: ${val}`);
}
}); });
chartData.datasets[0] = dataset; } else {
const data: number[] = [];
const backgroundColor: string[] = [];
for (const [status, value] of statuses) {
data.push(value);
backgroundColor.push(cssVars.get(`--workload-status-${status.toLowerCase()}`).toString());
chartData.labels.push(`${capitalize(status)}: ${value}`);
}
chartData.datasets.push({
data,
backgroundColor,
label: "Status",
});
} }
const options = {
elements: {
arc: {
borderWidth: 0,
},
},
};
return ( return (
<PieChart data={chartData} options={options}/> <PieChart
data={chartData}
options={{
elements: {
arc: {
borderWidth: 0,
},
},
}}
/>
); );
} }
render() { render() {
return ( return (
<div className="OverviewWorkloadStatus"> <div className="OverviewWorkloadStatus" ref={e => this.elem = e}>
<div className="flex column align-center box grow"> <div className="flex column align-center box grow">
{this.renderChart()} {this.renderChart()}
</div> </div>