import type { EchartWidgetData } from '../../echart/types' /** * Calculates the sum of all numeric values in the data */ export function calculateTotal(data: EchartWidgetData): number { return data.reduce((total, series) => { return series.reduce((seriesTotal, item) => { if (Array.isArray(item)) { const value = item.at(-1) as number return typeof value === 'number' ? seriesTotal + value : seriesTotal } return Object.entries(item).reduce((itemTotal: number, [key, value]) => { if (key === 'name') { return itemTotal } return typeof value === 'number' ? itemTotal + value : itemTotal }, seriesTotal) }, total) }, 0) } /** * Transforms data to relative (percentage) values */ export function toRelativeData( data: EchartWidgetData, total: number, ): EchartWidgetData { if (total === 0) return data return data.map((series) => series.map((item) => { if (Array.isArray(item)) { return item.map((value: number, index) => { if (index === item.length - 1 && typeof value === 'number') { return (value / total) * 100 } return value }) as typeof item } const transformed: Record = {} for (const [key, value] of Object.entries(item)) { if (key === 'name') { transformed[key] = value continue } transformed[key] = typeof value === 'number' ? (value / total) * 100 : value } return transformed }), ) }