/*
* <<
* Davinci
* ==
* Copyright (C) 2016 - 2017 EDP
* ==
* Licensed 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 { IChartProps } from '../../components/Chart'
import { EChartOption } from 'echarts'
import {
decodeMetricName,
getSizeValue,
getSizeRate
} from '../../components/util'
import { getFieldAlias } from '../../components/Config/Field'
import { getFormattedValue } from '../../components/Config/Format'
import {
getMetricAxisOption,
getLabelOption,
getLegendOption,
getSymbolSize
} from './util'
export default function (chartProps: IChartProps) {
const {
width,
height,
data,
cols,
metrics,
chartStyles,
color,
tip
} = chartProps
const { label, legend, radar, toolbox } = chartStyles
const { legendPosition, fontSize } = legend
const labelOption = {
label: getLabelOption('radar', label, metrics)
}
let dimensions = []
if (cols.length) {
dimensions = dimensions.concat(cols)
}
const metricsNames = metrics.map((m) => decodeMetricName(m.name))
let seriesData
let indicator
let indicatorMax = -Infinity
let legendData
if (!dimensions.length) {
if (color.items.length) {
dimensions = dimensions.concat(color.items.map((c) => c.name))
}
const metricsData = !data.length
? []
: metrics.map((m) => data[0][`${m.agg}(${decodeMetricName(m.name)})`])
seriesData = !data.length ? [] : [{ value: metricsData }]
indicatorMax = Math.max(...metricsData)
indicatorMax = indicatorMax + Math.round(indicatorMax * 0.1)
indicator = metrics.map((m) => ({
name: decodeMetricName(m.name),
max: indicatorMax
}))
} else {
legendData = metricsNames
const dimension = dimensions[0]
const indicatorData = {}
const dimensionData = metricsNames.reduce(
(acc, name) => ({
...acc,
[name]: {}
}),
{}
)
data.forEach((row) => {
if (!indicatorData[row[dimension.name]]) {
indicatorData[row[dimension.name]] = -Infinity
}
metrics.forEach((m) => {
const name = decodeMetricName(m.name)
const cellVal = row[`${m.agg}(${name})`]
indicatorMax = Math.max(indicatorMax, cellVal)
if (!dimensionData[name][row[dimension.name]]) {
dimensionData[name][row[dimension.name]] = 0
}
dimensionData[name][row[dimension.name]] += cellVal
})
})
indicator = Object.keys(indicatorData).map((name: string) => ({
name,
max: indicatorMax + Math.round(indicatorMax * 0.1)
}))
seriesData =
data.length > 0
? Object.entries(dimensionData).map(([name, value]) => ({
name,
value: Object.values(value)
}))
: []
}
const tooltip: EChartOption.Tooltip = {
formatter(params: EChartOption.Tooltip.Format) {
const { dataIndex, data, color } = params
let tooltipLabels = []
if (dimensions.length) {
const metric = metrics[dataIndex]
tooltipLabels.push(
getFieldAlias(metric.field, {}) || decodeMetricName(metric.name)
)
tooltipLabels = tooltipLabels.concat(
indicator.map(
({ name }, idx) =>
`${name}: ${getFormattedValue(data.value[idx], metric.format)}`
)
)
if (color) {
tooltipLabels[0] =
`` +
tooltipLabels[0]
}
} else {
tooltipLabels = tooltipLabels.concat(
indicator.map(
({ name }, idx) =>
`${name}: ${getFormattedValue(
data.value[idx],
metrics[idx].format
)}`
)
)
}
return tooltipLabels.join('
')
}
}
return {
tooltip,
legend: legendData && getLegendOption(legend, legendData),
radar: {
// type: 'log',
indicator,
...radar
},
series: [
{
name: '',
type: 'radar',
data: seriesData,
...labelOption
}
]
}
}