UNPKG

ko-charts

Version:
135 lines (122 loc) 4.04 kB
import { itemPoint } from '../constants'; import { getFormated } from '../utils'; function getFunnelTooltip(dataType, digit) { return { trigger: 'item', formatter: function formatter(item) { var tpl = []; tpl.push(itemPoint(item.color)); tpl.push(item.name + ': ' + getFormated(item.data.realValue, dataType, digit)); return tpl.join(''); } }; } function getFunnelLegend(args) { var data = args.data, legendName = args.legendName; return { data: data, formatter: function formatter(name) { return legendName[name] != null ? legendName[name] : name; } }; } function getFunnelSeries(args) { var dimension = args.dimension, metrics = args.metrics, rows = args.rows, sequence = args.sequence, ascending = args.ascending, label = args.label, labelLine = args.labelLine, itemStyle = args.itemStyle, filterZero = args.filterZero, useDefaultOrder = args.useDefaultOrder; var series = { type: 'funnel' }; var innerRows = rows.sort(function (a, b) { return sequence.indexOf(a[dimension]) - sequence.indexOf(b[dimension]); }); if (filterZero) { innerRows = innerRows.filter(function (row) { return row[metrics]; }); } var falseFunnel = false; innerRows.some(function (row, index) { if (index && row[metrics] > innerRows[index - 1][metrics]) { falseFunnel = true; return true; } }); var step = 100 / innerRows.length; if (falseFunnel && !useDefaultOrder) { series.data = innerRows.slice().reverse().map(function (row, index) { return { name: row[dimension], value: (index + 1) * step, realValue: row[metrics] }; }); } else { series.data = innerRows.map(function (row) { return { 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 var funnel = function funnel(outerColumns, outerRows, settings, extra) { var columns = outerColumns.slice(); var rows = outerRows.slice(); var _settings$dataType = settings.dataType, dataType = _settings$dataType === undefined ? 'normal' : _settings$dataType, _settings$dimension = settings.dimension, dimension = _settings$dimension === undefined ? columns[0] : _settings$dimension, _settings$sequence = settings.sequence, sequence = _settings$sequence === undefined ? rows.map(function (row) { return row[dimension]; }) : _settings$sequence, _settings$digit = settings.digit, digit = _settings$digit === undefined ? 2 : _settings$digit, ascending = settings.ascending, label = settings.label, labelLine = settings.labelLine, _settings$legendName = settings.legendName, legendName = _settings$legendName === undefined ? {} : _settings$legendName, itemStyle = settings.itemStyle, filterZero = settings.filterZero, useDefaultOrder = settings.useDefaultOrder; var tooltipVisible = extra.tooltipVisible, legendVisible = extra.legendVisible; var metrics = void 0; if (settings.metrics) { metrics = settings.metrics; } else { var metricsTemp = columns.slice(); metricsTemp.splice(columns.indexOf(dimension), 1); metrics = metricsTemp[0]; } var tooltip = tooltipVisible && getFunnelTooltip(dataType, digit); var legend = legendVisible && getFunnelLegend({ data: sequence, legendName: legendName }); var series = getFunnelSeries({ dimension: dimension, metrics: metrics, rows: rows, sequence: sequence, ascending: ascending, label: label, labelLine: labelLine, itemStyle: itemStyle, filterZero: filterZero, useDefaultOrder: useDefaultOrder }); var options = { tooltip: tooltip, legend: legend, series: series }; return options; };