UNPKG

@mcdevsl/superset-ui

Version:
70 lines (59 loc) 2 kB
import { pick } from 'lodash'; import { ChartProps } from '@superset-ui/core'; import { BoxPlotDataRow, RawBoxPlotDataRow } from '../components/BoxPlot/types'; import { HookProps } from '../components/BoxPlot/BoxPlot'; import { BoxPlotEncoding } from '../components/BoxPlot/Encoder'; export default function transformProps(chartProps: ChartProps) { const { width, height, formData, queriesData } = chartProps; const { margin, theme } = formData; const encoding = formData.encoding as BoxPlotEncoding; const data = (queriesData[0].data as RawBoxPlotDataRow[]).map(({ label, values }) => ({ label, min: values.whisker_low, max: values.whisker_high, firstQuartile: values.Q1, median: values.Q2, thirdQuartile: values.Q3, outliers: values.outliers, })); const isHorizontal = encoding.y.type === 'nominal'; const boxPlotValues = data.reduce((r: number[], e: BoxPlotDataRow) => { r.push(e.min, e.max, ...e.outliers); return r; }, []); const minBoxPlotValue = Math.min(...boxPlotValues); const maxBoxPlotValue = Math.max(...boxPlotValues); const valueDomain = [ minBoxPlotValue - 0.1 * Math.abs(minBoxPlotValue), maxBoxPlotValue + 0.1 * Math.abs(maxBoxPlotValue), ]; if (isHorizontal) { if (encoding.x.scale) { encoding.x.scale.domain = valueDomain; } else { encoding.x.scale = { domain: valueDomain }; } } else if (encoding.y.scale) { encoding.y.scale.domain = valueDomain; } else { encoding.y.scale = { domain: valueDomain }; } const hooks = chartProps.hooks as HookProps; const fieldsFromHooks: (keyof HookProps)[] = [ 'TooltipRenderer', 'LegendRenderer', 'LegendGroupRenderer', 'LegendItemRenderer', 'LegendItemMarkRenderer', 'LegendItemLabelRenderer', ]; return { data, width, height, margin, theme, encoding, ...pick(hooks, fieldsFromHooks), }; }