import { getFormated, getStackMap } from '../../utils'
import { isArray } from 'utils-lite'
function getLineXAxis (args) {
const { dimension, rows, xAxisName, axisVisible, xAxisType } = args
return dimension.map((item, index) => ({
type: xAxisType,
nameLocation: 'middle',
nameGap: 22,
name: xAxisName[index] || '',
axisTick: { show: true, lineStyle: { color: '#eee' } },
data: rows.map(row => row[item]),
show: axisVisible
}))
}
function getLineSeries (args) {
const {
rows,
axisSite,
metrics,
area,
stack,
nullAddZero,
labelMap,
label,
itemStyle,
lineStyle,
areaStyle,
dimension
} = args
let series = []
const dataTemp = {}
const stackMap = stack && getStackMap(stack)
metrics.forEach(item => { dataTemp[item] = [] })
rows.forEach(row => {
metrics.forEach(item => {
let value = null
if (row[item] != null) {
value = row[item]
} else if (nullAddZero) {
value = 0
}
dataTemp[item].push([row[dimension[0]], value])
})
})
metrics.forEach(item => {
let seriesItem = {
name: labelMap[item] != null ? labelMap[item] : item,
type: 'line',
data: dataTemp[item]
}
if (area) seriesItem.areaStyle = { normal: {} }
if (axisSite.right) {
seriesItem.yAxisIndex = ~axisSite.right.indexOf(item) ? 1 : 0
}
if (stack && stackMap[item]) seriesItem.stack = stackMap[item]
if (label) seriesItem.label = label
if (itemStyle) seriesItem.itemStyle = itemStyle
if (lineStyle) seriesItem.lineStyle = lineStyle
if (areaStyle) seriesItem.areaStyle = areaStyle
series.push(seriesItem)
})
return series
}
function getLineYAxis (args) {
const {
yAxisName,
yAxisType,
axisVisible,
scale,
min,
max,
digit
} = args
const yAxisBase = {
type: 'value',
axisTick: {
show: false
},
show: axisVisible
}
let yAxis = []
for (let i = 0; i < 2; i++) {
if (yAxisType[i]) {
yAxis[i] = Object.assign({}, yAxisBase, {
axisLabel: {
formatter (val) {
return getFormated(val, yAxisType[i], digit)
}
}
})
} else {
yAxis[i] = Object.assign({}, yAxisBase)
}
yAxis[i].name = yAxisName[i] || ''
yAxis[i].scale = scale[i] || false
yAxis[i].min = min[i] || null
yAxis[i].max = max[i] || null
}
return yAxis
}
function getLineTooltip (args) {
const { axisSite, yAxisType, digit, labelMap, tooltipFormatter } = args
const rightItems = axisSite.right || []
const rightList = labelMap
? rightItems.map(item => {
return labelMap[item] === undefined ? item : labelMap[item]
})
: rightItems
return {
trigger: 'axis',
formatter (items) {
if (tooltipFormatter) {
return tooltipFormatter.apply(null, arguments)
}
let tpl = []
const { name, axisValueLabel } = items[0]
const title = name || axisValueLabel
tpl.push(`${title}
`)
items.forEach(({ seriesName, data, marker }) => {
let showData = null
const type = ~rightList.indexOf(seriesName) ? yAxisType[1] : yAxisType[0]
const itemData = isArray(data) ? data[1] : data
showData = getFormated(itemData, type, digit)
tpl.push(marker)
tpl.push(`${seriesName}: ${showData}`)
tpl.push('
')
})
return tpl.join('')
}
}
}
function getLegend (args) {
const { metrics, legendName, labelMap } = args
if (!legendName && !labelMap) return { data: metrics }
const data = labelMap
? metrics.map(item => (labelMap[item] == null ? item : labelMap[item]))
: metrics
return {
data,
formatter (name) {
return legendName[name] != null ? legendName[name] : name
}
}
}
export const line = (columns, rows, settings, extra) => {
rows = isArray(rows) ? rows : []
columns = isArray(columns) ? columns : []
const {
axisSite = {},
yAxisType = ['normal', 'normal'],
xAxisType = 'category',
yAxisName = [],
dimension = [columns[0]],
xAxisName = [],
axisVisible = true,
area,
stack,
scale = [false, false],
min = [null, null],
max = [null, null],
nullAddZero = false,
digit = 2,
legendName = {},
labelMap = {},
label,
itemStyle,
lineStyle,
areaStyle
} = settings
const { tooltipVisible, legendVisible, tooltipFormatter } = extra
let metrics = columns.slice()
if (axisSite.left && axisSite.right) {
metrics = axisSite.left.concat(axisSite.right)
} else if (axisSite.left && !axisSite.right) {
metrics = axisSite.left
} else if (settings.metrics) {
metrics = settings.metrics
} else {
metrics.splice(columns.indexOf(dimension[0]), 1)
}
const legend = legendVisible && getLegend({ metrics, legendName, labelMap })
const tooltip = tooltipVisible && getLineTooltip({
axisSite,
yAxisType,
digit,
labelMap,
xAxisType,
tooltipFormatter
})
const xAxis = getLineXAxis({
dimension,
rows,
xAxisName,
axisVisible,
xAxisType
})
const yAxis = getLineYAxis({
yAxisName,
yAxisType,
axisVisible,
scale,
min,
max,
digit
})
const series = getLineSeries({
rows,
axisSite,
metrics,
area,
stack,
nullAddZero,
labelMap,
label,
itemStyle,
lineStyle,
areaStyle,
xAxisType,
dimension
})
let options = { legend, xAxis, series, yAxis, tooltip }
return options
}