/* eslint-disable */
import React, { useEffect, useState } from "react";
import classnames from "classnames";
import HighchartsReact from "highcharts-react-official";
import highchartsMore from "highcharts/highcharts-more";
import { highchartsTheme } from "../pb_dashboard/pbChartsLightTheme";
import { highchartsDarkTheme } from "../pb_dashboard/pbChartsDarkTheme";
import mapColors from "../pb_dashboard/pbChartsColorsHelper";
import { globalProps } from "../utilities/globalProps";
import { buildAriaProps, buildDataProps } from "../utilities/props";
type CircleChartProps = {
align?: "left" | "right" | "center",
aria: { [key: string]: string },
chartData?: [],
children?: Node,
className?: string,
colors?: string[],
dark?: Boolean,
data?: Object,
dataLabelHtml?: string,
dataLabels?: boolean,
height?: string,
id?: string,
innerSize?: "sm" | "md" | "lg" | "none",
legend?: boolean,
maxPointSize?: number,
minPointSize?: number,
rounded?: boolean,
startAngle?: number,
style?: string,
title?: string,
tooltipHtml: string,
useHtml?: boolean,
zMin?: number,
layout?: "horizontal" | "vertical" | "proximate",
verticalAlign?: "top" | "middle" | "bottom",
x?: number,
y?: number,
borderColor?: string,
borderWidth?: number,
};
// Adjust Circle Chart Block Kit Dimensions to Match the Chart for Centering
const alignBlockElement = (event: any) => {
const itemToMove = document.querySelector(
`#wrapper-circle-chart-${event.target.renderTo.id} .pb-circle-chart-block`
) as HTMLElement;
const chartContainer = document.querySelector(`#${event.target.renderTo.id}`);
if (itemToMove !== null) {
itemToMove.style.height = `${event.target.chartHeight}px`;
itemToMove.style.width = `${event.target.chartWidth}px`;
chartContainer.firstChild.before(itemToMove);
}
};
const CircleChart = ({
align = "center",
aria = {},
rounded = false,
borderColor = rounded ? null : "",
borderWidth = rounded ? 20 : null,
chartData,
children,
className,
colors = [],
dark = false,
data = {},
dataLabelHtml = "
{point.name}
",
dataLabels = false,
height,
id,
innerSize = "md",
legend = false,
maxPointSize = null,
minPointSize = null,
startAngle = null,
style = "pie",
title,
tooltipHtml,
useHtml = false,
zMin = null,
layout = "horizontal",
verticalAlign = "bottom",
x = 0,
y = 0,
...props
}: CircleChartProps) => {
const ariaProps = buildAriaProps(aria);
const dataProps = buildDataProps(data);
const innerSizes = { sm: "35%", md: "50%", lg: "85%", none: "0%" };
const innerSizeFormat = (size: "sm" | "md" | "lg" | "none") => innerSizes[size];
const [options, setOptions] = useState({});
const [isHighchartsLoaded, setIsHighchartsLoaded] = useState(false);
useEffect(() => {
const formattedChartData = chartData.map((obj: any) => {
obj.y = obj.value;
delete obj.value;
return obj;
});
const staticOptions = {
title: {
text: title,
},
chart: {
height: height,
type: style,
events: {
render: (event: any) => alignBlockElement(event),
redraw: (event: any) => alignBlockElement(event),
},
},
legend: {
align: align,
verticalAlign: verticalAlign,
layout: layout,
x: x,
y: y,
},
plotOptions: {
pie: {
colors:
colors.length > 0 ? mapColors(colors) : highchartsTheme(window.Highcharts).colors,
dataLabels: {
enabled: dataLabels,
connectorShape: "straight",
connectorWidth: 3,
format: dataLabelHtml,
},
showInLegend: legend,
},
},
series: [
{
minPointSize: minPointSize,
maxPointSize: maxPointSize,
innerSize: borderWidth == 20 ? "100%" : innerSizeFormat(innerSize),
data: formattedChartData,
zMin: zMin,
startAngle: startAngle,
borderWidth: borderWidth,
borderColor: borderColor,
},
],
credits: false,
};
setOptions({ ...staticOptions });
const interval = setInterval(() => {
if (window.Highcharts) {
clearInterval(interval)
dark
? window.Highcharts.setOptions(highchartsDarkTheme(window.Highcharts))
: window.Highcharts.setOptions(highchartsTheme(window.Highcharts))
highchartsMore(window.Highcharts);
window.Highcharts.setOptions({
tooltip: {
headerFormat: null,
pointFormat: tooltipHtml ? tooltipHtml : '●{point.name}: ' + "{point.y}",
useHTML: useHtml,
},
});
setIsHighchartsLoaded(true)
}
}, 0)
}, [chartData]);
return (
<>
{children ? (
{
isHighchartsLoaded &&
}
{children}
) : (
isHighchartsLoaded &&
)}
>
);
};
export default CircleChart;