import { itemPoint } from '../../constants' import { getFormated } from '../../utils' function getRadarLegend (rows, dimension, legendName) { let legendData = rows.map(row => row[dimension]) return { data: legendData, formatter (name) { return legendName[name] != null ? legendName[name] : name } } } function getRadarTooltip (dataType, radar, digit) { const typeTemp = [] const nameTemp = [] radar.indicator.map((item, index) => { typeTemp[index] = dataType[item.name] nameTemp[index] = item.name }) return { formatter (item) { const tpl = [] tpl.push(itemPoint(item.color)) tpl.push(`${item.name}
`) item.data.value.forEach((val, index) => { tpl.push(`${nameTemp[index]}: `) tpl.push(`${getFormated(val, typeTemp[index], digit)}
`) }) return tpl.join('') } } } function getRadarSetting (rows, metrics, labelMap) { const settingBase = { indicator: [], shape: 'circle', splitNumber: 5 } let indicatorTemp = {} rows.forEach(items => { metrics.forEach(item => { const key = labelMap[item] != null ? labelMap[item] : item if (!indicatorTemp[key]) { indicatorTemp[key] = [items[item]] } else { indicatorTemp[key].push(items[item]) } }) }) settingBase.indicator = Object.keys(indicatorTemp).map(key => { return { name: key, max: Math.max.apply(null, indicatorTemp[key]) } }) return settingBase } function getRadarSeries (args) { const { rows, dimension, metrics, radar, label, itemStyle, lineStyle, labelMap, areaStyle } = args let radarIndexObj = {} radar.indicator.forEach((item, index) => { const name = item.name radarIndexObj[name] = index }) const seriesData = rows.map(row => { const serieData = { value: [], name: row[dimension] } Object.keys(row).forEach(key => { if (~metrics.indexOf(key)) { let k = labelMap[key] != null ? radarIndexObj[labelMap[key]] : radarIndexObj[key] serieData.value[k] = row[key] } }) return serieData }) const result = { name: dimension, type: 'radar', data: seriesData } if (label) result.label = label if (itemStyle) result.itemStyle = itemStyle if (lineStyle) result.lineStyle = lineStyle if (areaStyle) result.areaStyle = areaStyle return [result] } export const radar = (columns, rows, settings, extra) => { const { dataType = {}, legendName = {}, labelMap = {}, dimension = columns[0], digit = 2, label, itemStyle, lineStyle, areaStyle } = settings const { tooltipVisible, legendVisible } = extra let metrics = columns.slice() if (settings.metrics) { metrics = settings.metrics } else { metrics.splice(columns.indexOf(dimension), 1) } const legend = legendVisible && getRadarLegend(rows, dimension, legendName) const radar = getRadarSetting(rows, metrics, labelMap) const tooltip = tooltipVisible && getRadarTooltip(dataType, radar, digit) const series = getRadarSeries({ rows, dimension, metrics, radar, label, itemStyle, lineStyle, labelMap, areaStyle }) const options = { legend, tooltip, radar, series } return options }