import { observer } from 'mobx-react'; import { Pie, measureTextWidth } from '@ant-design/plots'; import { fixTo2Decimals, merge } from '../utils/commons'; import { dataFieldAlias } from './../libs/ht'; export default observer((props) => { const { dataSource, title, ...extProps } = props; const renderStatistic = (containerWidth, text, style) => { const { width: textWidth, height: textHeight } = measureTextWidth(text, style); const R = containerWidth / 2; // r^2 = (w / 2)^2 + (h - offsetY)^2 let scale = 1; if (containerWidth < textWidth) { scale = Math.min(Math.sqrt(Math.abs(Math.pow(R, 2) / (Math.pow(textWidth / 2, 2) + Math.pow(textHeight, 2)))), 1); } // const textStyleStr = `width:${containerWidth}px;`; const textStyleStr = `width:auto;`; return `
${text}
`; }; const config = merge( { appendPadding: 10, // angleField: 'value', // colorField: 'type', radius: 0.8, innerRadius: 0.65, label: { type: 'inner', offset: '-50%', autoRotate: false, // content: '{value}', content: ({ percent }) => percent > 0.02 ? `${fixTo2Decimals(percent * 100)}%`: '', style: { textAlign: 'center', fontSize: 14, }, }, legend: { position: 'top', }, interactions: [{ type: 'element-selected' }, { type: 'element-active' }, { type: 'pie-statistic-active' }], statistic: { title: { offsetY: -4, customHtml: (container, view, datum) => { const { width, height } = container.getBoundingClientRect(); const d = Math.sqrt(Math.pow(width / 2, 2) + Math.pow(height / 2, 2)); const text = datum ? datum[extProps.colorField] : (title || ''); return renderStatistic(d, text, { fontSize: '28px', }); }, }, content: { // style: { // whiteSpace: 'pre-wrap', // overflow: 'hidden', // textOverflow: 'ellipsis', // }, // content: title || '', offsetY: 4, style: { fontSize: '28px', }, customHtml: (container, view, datum, data) => { const { width } = container.getBoundingClientRect(); const _sum = data.reduce((r, d) => r + d[extProps.angleField], 0); const showVal = datum ? datum[extProps.angleField] : _sum; const text = dataFieldAlias[extProps.angleField].formatter(showVal); return renderStatistic(width, text, { fontSize: '28px', }); }, }, }, meta: { [extProps.angleField]: { alias: dataFieldAlias[extProps.angleField]?.alias || extProps.angleField, formatter: (v) => dataFieldAlias[extProps.angleField]?.formatter(v) || v, }, }, }, extProps ); return ; });