/* * << * 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 { decodeMetricName, getAggregatorLocale } from '../../components/util' import { getDimetionAxisOption, getMetricAxisOption, getLabelOption, getLegendOption, getGridPositions } from './util' import { EChartOption } from 'echarts' import { getFormattedValue } from '../../components/Config/Format' const defaultTheme = require('assets/json/echartsThemes/default.project.json') const defaultThemeColors = defaultTheme.theme.color export default function (chartProps: IChartProps) { const { data, cols, metrics, chartStyles } = chartProps const { spec, label, xAxis, yAxis, splitLine } = chartStyles const { showVerticalLine, verticalLineColor, verticalLineSize, verticalLineStyle, showHorizontalLine, horizontalLineColor, horizontalLineSize, horizontalLineStyle } = splitLine const labelOption = { label: getLabelOption('waterfall', label, metrics) } const xAxisData = data.map((d) => d[cols[0].name] || '') let sourceData = [] const series = [] metrics.forEach((m) => { const metricName = `${m.agg}(${decodeMetricName(m.name)})` sourceData = data.map((d) => d[metricName]) const baseData = [] const seriesBaseData = [...data] const ascendOrder = [] const discendOrder = [] sourceData.forEach((a, index) => { a = parseFloat(a) if (index > 0) { const result = a - parseFloat(sourceData[index - 1]) if (result >= 0) { ascendOrder.push(result) discendOrder.push('-') baseData.push(parseFloat(sourceData[index - 1])) } else { ascendOrder.push('-') discendOrder.push(Math.abs(result)) baseData.push(parseFloat(sourceData[index - 1]) - Math.abs(result)) } return result } else { ascendOrder.push(a) discendOrder.push('-') baseData.push(0) return a } }) const totalAscend = ascendOrder.reduce((sum, val) => typeof val === 'number' ? sum + val : sum + 0, 0) const totalDiscendOrder = discendOrder.reduce((sum, val) => typeof val === 'number' ? sum + val : sum + 0, 0) const difference = totalAscend - totalDiscendOrder xAxisData.push('累计') baseData.push('-') if (difference > 0) { ascendOrder.push(difference) discendOrder.push('-') } else { discendOrder.push(Math.abs(difference)) ascendOrder.push('-') } const baseDataObj = { name: `[${getAggregatorLocale(m.agg)}] ${decodeMetricName(m.name)}`, type: 'bar', sampling: 'average', stack: 'stack', data: baseData, itemStyle: { normal: { barBorderColor: 'rgba(0,0,0,0)', color: 'rgba(0,0,0,0)' // opacity: interactIndex === undefined ? 1 : 0.25 }, emphasis: { barBorderColor: 'rgba(0,0,0,0)', color: 'rgba(0,0,0,0)' } } } const ascendOrderObj = { name: '升', type: 'bar', sampling: 'average', stack: 'stack', data: ascendOrder, itemStyle: { // normal: { // opacity: interactIndex === undefined ? 1 : 0.25 // } }, ...labelOption } const discendOrderObj = { name: '降', type: 'bar', sampling: 'average', stack: 'stack', data: discendOrder, itemStyle: { // normal: { // opacity: interactIndex === undefined ? 1 : 0.25 // } }, ...labelOption } series.push(baseDataObj) series.push(ascendOrderObj) series.push(discendOrderObj) }) const seriesNames = series.map((s) => s.name) const xAxisSplitLineConfig = { showLine: showVerticalLine, lineColor: verticalLineColor, lineSize: verticalLineSize, lineStyle: verticalLineStyle } const yAxisSplitLineConfig = { showLine: showHorizontalLine, lineColor: horizontalLineColor, lineSize: horizontalLineSize, lineStyle: horizontalLineStyle } const tooltip: EChartOption.Tooltip = { trigger: 'axis', formatter (param: EChartOption.Tooltip.Format[]) { let color const text = param.map((pa, index) => { const data = !index ? parseFloat(sourceData[pa.dataIndex]) : pa.data if (typeof data === 'number') { color = pa.color } const formattedValue = getFormattedValue(data, metrics[0].format) return `${pa.seriesName}: ${formattedValue}` }) const xAxis = param[0]['axisValue'] if (xAxis === '累计') { return '' } else { text.unshift(xAxis as string) if (color) { text[0] = `` + text[0] } return text.join('
') } } } return { xAxis: getDimetionAxisOption(xAxis, xAxisSplitLineConfig, xAxisData), yAxis: getMetricAxisOption(yAxis, yAxisSplitLineConfig, metrics.map((m) => decodeMetricName(m.name)).join(` / `)), series, tooltip, grid: getGridPositions({ showLegend: false }, seriesNames, '', false, yAxis, xAxis, xAxisData) } }