@mui/x-charts
Version:
The community edition of MUI X Charts components.
87 lines (86 loc) • 2.99 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import { pie as d3Pie } from '@mui/x-charts-vendor/d3-shape';
import { getLabel } from "../../internals/getLabel.js";
import { deg2rad } from "../../internals/angleConversion.js";
const getSortingComparator = (comparator = 'none') => {
if (typeof comparator === 'function') {
return comparator;
}
switch (comparator) {
case 'none':
return null;
case 'desc':
return (a, b) => b - a;
case 'asc':
return (a, b) => a - b;
default:
return null;
}
};
const seriesProcessor = (params, dataset, isItemVisible) => {
const {
seriesOrder,
series
} = params;
const defaultizedSeries = {};
seriesOrder.forEach(seriesId => {
// Filter out hidden data points for arc calculation
const visibleData = series[seriesId].data.filter((_, index) => {
return isItemVisible?.({
type: 'pie',
seriesId,
dataIndex: index
});
});
const visibleArcs = d3Pie().startAngle(deg2rad(series[seriesId].startAngle ?? 0)).endAngle(deg2rad(series[seriesId].endAngle ?? 360)).padAngle(deg2rad(series[seriesId].paddingAngle ?? 0)).sortValues(getSortingComparator(series[seriesId].sortingValues ?? 'none'))(visibleData.map(piePoint => piePoint.value));
// Map arcs back to original data, maintaining original indices
let visibleIndex = 0;
defaultizedSeries[seriesId] = _extends({
labelMarkType: 'circle',
valueFormatter: item => item.value.toLocaleString()
}, series[seriesId], {
data: series[seriesId].data.map((item, index) => {
const itemId = item.id ?? `auto-generated-pie-id-${seriesId}-${index}`;
const isHidden = !isItemVisible?.({
type: 'pie',
seriesId,
dataIndex: index
});
let arcData;
if (isHidden) {
// For hidden items, create a zero-size arc starting at the previous visible arc's end angle
// and ending at the same angle
const startAngle = visibleIndex > 0 ? visibleArcs[visibleIndex - 1].endAngle : deg2rad(series[seriesId].startAngle ?? 0);
arcData = {
startAngle,
endAngle: startAngle,
padAngle: 0,
value: item.value,
index
};
} else {
arcData = visibleArcs[visibleIndex];
visibleIndex += 1;
}
const processedItem = _extends({}, item, {
id: itemId,
hidden: isHidden
}, arcData);
return _extends({
labelMarkType: 'circle'
}, processedItem, {
formattedValue: series[seriesId].valueFormatter?.(_extends({}, processedItem, {
label: getLabel(processedItem.label, 'arc')
}), {
dataIndex: index
}) ?? processedItem.value.toLocaleString()
});
})
});
});
return {
seriesOrder,
series: defaultizedSeries
};
};
export default seriesProcessor;