UNPKG

@mcdevsl/superset-ui

Version:
114 lines (103 loc) 3.36 kB
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { ChartProps, LegacyQueryData, QueryFormData, QueryFormMetric } from '@superset-ui/core'; import { RawBoxPlotDataRow, BoxPlotDataRow } from '../../components/BoxPlot/types'; export type LegacyBoxPlotFormData = { groupby?: QueryFormData['groupby']; metrics?: QueryFormData['metrics']; colorScheme?: string; }; export type LegacyBoxPlotChartProps = ChartProps & { formData: LegacyBoxPlotFormData; queriesData: (LegacyQueryData & { data?: RawBoxPlotDataRow[]; })[]; }; export default function transformProps(chartProps: LegacyBoxPlotChartProps) { const { width, height, datasource, formData, queriesData } = chartProps; const { verboseMap = {} } = datasource; const { colorScheme, groupby = [], metrics = [] } = formData; const data = (queriesData[0].data || []).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 xAxisLabel = groupby.join('/'); let metric: QueryFormMetric = ''; if (Array.isArray(metrics)) { metric = metrics.length > 0 ? metrics[0] : ''; } else { metric = metrics; } const yAxisLabel = typeof metric === 'string' ? verboseMap[metric] || metric : metric.label; 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), ]; return { data, width, height, encoding: { x: { field: 'label', type: 'nominal', scale: { type: 'band', paddingInner: 0.15, paddingOuter: 0.3, }, axis: { title: xAxisLabel, }, }, y: { field: 'value', type: 'quantitative', scale: { type: 'linear', domain: valueDomain, }, axis: { title: yAxisLabel, numTicks: 5, format: 'SMART_NUMBER', }, }, color: { field: 'label', type: 'nominal', scale: { scheme: colorScheme, }, legend: false, }, }, }; }