import React, { useState } from 'react'; import { ResponsiveContainer, Tooltip } from 'recharts'; import { PieChart, Pie, Cell, Legend } from 'recharts'; import { Styles } from '../../common'; import { NoContent } from 'UI'; import { filtersMap } from 'Types/filter/newFilter'; import { numberWithCommas } from 'App/utils'; import CustomTooltip from '../CustomChartTooltip'; interface Props { metric: { metricOf: string; metricType: string; }; data: { chart: any[]; namesMap: string[]; }; colors: any; onClick?: (filters) => void; inGrid?: boolean; } function CustomMetricPieChart(props: Props) { const { metric, data, onClick = () => null, inGrid } = props; const [hoveredSeries, setHoveredSeries] = useState(null); const onClickHandler = (event) => { if (event && !event.payload.group) { const filters = Array(); let filter = { ...filtersMap[metric.metricOf] }; filter.value = [event.payload.name]; filter.type = filter.key; delete filter.key; delete filter.operatorOptions; delete filter.category; delete filter.icon; delete filter.label; delete filter.options; filters.push(filter); onClick(filters); } }; const handleMouseOver = (name: string) => setHoveredSeries(name); const handleMouseLeave = () => setHoveredSeries(null); const getTotalForSeries = (series: string) => data.chart ? data.chart.reduce((acc, curr) => acc + curr[series], 0) : 0; const values = data.namesMap.map((k) => ({ name: k, value: getTotalForSeries(k), })); const highest = values.reduce( (acc, curr) => (acc.value > curr.value ? acc : curr), { name: '', value: 0 } ); return ( } /> handleMouseOver(name)} onMouseLeave={handleMouseLeave} labelLine={({ cx, cy, midAngle, innerRadius, outerRadius, value, }) => { const RADIAN = Math.PI / 180; let radius1 = 15 + innerRadius + (outerRadius - innerRadius); let radius2 = innerRadius + (outerRadius - innerRadius); let x2 = cx + radius1 * Math.cos(-midAngle * RADIAN); let y2 = cy + radius1 * Math.sin(-midAngle * RADIAN); let x1 = cx + radius2 * Math.cos(-midAngle * RADIAN); let y1 = cy + radius2 * Math.sin(-midAngle * RADIAN); const percentage = (value * 100) / highest.value; if (percentage < 3) { return null; } return ( ); }} label={({ cx, cy, midAngle, innerRadius, outerRadius, value, index, }) => { const RADIAN = Math.PI / 180; let radius = 20 + innerRadius + (outerRadius - innerRadius); let x = cx + radius * Math.cos(-midAngle * RADIAN); let y = cy + radius * Math.sin(-midAngle * RADIAN); const percentage = (value / highest.value) * 100; let name = values[index].name || 'Unidentified'; name = name.length > 20 ? name.substring(0, 20) + '...' : name; if (percentage < 3) { return null; } return ( cx ? 'start' : 'end'} dominantBaseline="central" fill="#666" > {numberWithCommas(value)} ); }} > {values.map((entry, index) => ( ))} ); } export default CustomMetricPieChart;