main.js
2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import { itemPoint } from '../../constants'
import { getFormated } from '../../utils'
function getFunnelTooltip (dataType, digit) {
return {
trigger: 'item',
formatter (item) {
let tpl = []
tpl.push(itemPoint(item.color))
tpl.push(`${item.name}: ${getFormated(item.data.realValue, dataType, digit)}`)
return tpl.join('')
}
}
}
function getFunnelLegend (args) {
const { data, legendName } = args
return {
data,
formatter (name) {
return legendName[name] != null ? legendName[name] : name
}
}
}
function getFunnelSeries (args) {
const {
dimension,
metrics,
rows,
sequence,
ascending,
label,
labelLine,
itemStyle,
filterZero,
useDefaultOrder
} = args
let series = { type: 'funnel' }
let innerRows = rows.sort((a, b) => {
return sequence.indexOf(a[dimension]) - sequence.indexOf(b[dimension])
})
if (filterZero) {
innerRows = innerRows.filter(row => {
return row[metrics]
})
}
let falseFunnel = false
innerRows.some((row, index) => {
if (index && row[metrics] > innerRows[index - 1][metrics]) {
falseFunnel = true
return true
}
})
const step = 100 / innerRows.length
if (falseFunnel && !useDefaultOrder) {
series.data = innerRows.slice().reverse().map((row, index) => ({
name: row[dimension],
value: (index + 1) * step,
realValue: row[metrics]
}))
} else {
series.data = innerRows.map(row => ({
name: row[dimension],
value: row[metrics],
realValue: row[metrics]
}))
}
if (ascending) series.sort = 'ascending'
if (label) series.label = label
if (labelLine) series.labelLine = labelLine
if (itemStyle) series.itemStyle = itemStyle
return series
}
export const funnel = (outerColumns, outerRows, settings, extra) => {
const columns = outerColumns.slice()
const rows = outerRows.slice()
const {
dataType = 'normal',
dimension = columns[0],
sequence = rows.map(row => row[dimension]),
digit = 2,
ascending,
label,
labelLine,
legendName = {},
itemStyle,
filterZero,
useDefaultOrder
} = settings
const { tooltipVisible, legendVisible } = extra
let metrics
if (settings.metrics) {
metrics = settings.metrics
} else {
let metricsTemp = columns.slice()
metricsTemp.splice(columns.indexOf(dimension), 1)
metrics = metricsTemp[0]
}
const tooltip = tooltipVisible && getFunnelTooltip(dataType, digit)
const legend = legendVisible && getFunnelLegend({ data: sequence, legendName })
const series = getFunnelSeries({
dimension,
metrics,
rows,
sequence,
ascending,
label,
labelLine,
itemStyle,
filterZero,
useDefaultOrder
})
const options = { tooltip, legend, series }
return options
}