208 lines
6.0 KiB
JavaScript
208 lines
6.0 KiB
JavaScript
'use strict';
|
|
|
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|
|
|
var utils = require('./utils');
|
|
require('echarts/lib/chart/bar');
|
|
var Core = _interopDefault(require('./core'));
|
|
|
|
var _extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];
|
|
|
|
for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
return target;
|
|
};
|
|
|
|
function getWaterfallTooltip(dataType, digit) {
|
|
return {
|
|
trigger: 'axis',
|
|
axisPointer: { type: 'shadow' },
|
|
formatter: function formatter(items) {
|
|
var item = items[1];
|
|
return [item.name + '<br/>' + item.seriesName + ' :', '' + utils.getFormated(item.value, dataType, digit)].join('');
|
|
}
|
|
};
|
|
}
|
|
|
|
function getWaterfallXAxis(args) {
|
|
var dimension = args.dimension,
|
|
rows = args.rows,
|
|
remainStatus = args.remainStatus,
|
|
totalName = args.totalName,
|
|
remainName = args.remainName,
|
|
labelMap = args.labelMap,
|
|
xAxisName = args.xAxisName,
|
|
axisVisible = args.axisVisible;
|
|
|
|
var xAxisData = [totalName].concat(rows.map(function (row) {
|
|
return row[dimension];
|
|
}));
|
|
if (remainStatus === 'have-remain') {
|
|
xAxisData = xAxisData.concat([remainName]);
|
|
}
|
|
|
|
return {
|
|
type: 'category',
|
|
name: labelMap && labelMap[xAxisName] || xAxisName,
|
|
splitLine: { show: false },
|
|
data: xAxisData,
|
|
show: axisVisible
|
|
};
|
|
}
|
|
|
|
function getWaterfallYAxis(args) {
|
|
var dataType = args.dataType,
|
|
yAxisName = args.yAxisName,
|
|
axisVisible = args.axisVisible,
|
|
digit = args.digit,
|
|
labelMap = args.labelMap;
|
|
|
|
return {
|
|
type: 'value',
|
|
name: labelMap[yAxisName] != null ? labelMap[yAxisName] : yAxisName,
|
|
axisTick: { show: false },
|
|
axisLabel: {
|
|
formatter: function formatter(val) {
|
|
return utils.getFormated(val, dataType, digit);
|
|
}
|
|
},
|
|
show: axisVisible
|
|
};
|
|
}
|
|
|
|
function getWaterfallSeries(args) {
|
|
var dataType = args.dataType,
|
|
rows = args.rows,
|
|
metrics = args.metrics,
|
|
totalNum = args.totalNum,
|
|
remainStatus = args.remainStatus,
|
|
dataSum = args.dataSum,
|
|
digit = args.digit;
|
|
|
|
var seriesBase = { type: 'bar', stack: '总量' };
|
|
var dataSumTemp = dataSum;
|
|
var totalNumTemp = totalNum;
|
|
var assistData = void 0;
|
|
var mainData = void 0;
|
|
var rowData = rows.map(function (row) {
|
|
return row[metrics];
|
|
});
|
|
|
|
if (remainStatus === 'have-remain') {
|
|
assistData = [0].concat(rows.map(function (row) {
|
|
totalNumTemp -= row[metrics];
|
|
return totalNumTemp;
|
|
})).concat([0]);
|
|
mainData = [totalNum].concat(rowData).concat([totalNum - dataSum]);
|
|
} else {
|
|
assistData = [0].concat(rows.map(function (row) {
|
|
dataSumTemp -= row[metrics];
|
|
return dataSumTemp;
|
|
}));
|
|
mainData = [dataSum].concat(rowData);
|
|
}
|
|
var series = [];
|
|
|
|
series.push(_extends({
|
|
name: '辅助',
|
|
itemStyle: {
|
|
normal: { opacity: 0 },
|
|
emphasis: { opacity: 0 }
|
|
},
|
|
data: assistData
|
|
}, seriesBase));
|
|
|
|
series.push(_extends({
|
|
name: '数值',
|
|
label: {
|
|
normal: {
|
|
show: true,
|
|
position: 'top',
|
|
formatter: function formatter(item) {
|
|
return utils.getFormated(item.value, dataType, digit);
|
|
}
|
|
}
|
|
},
|
|
data: mainData
|
|
}, seriesBase));
|
|
return series;
|
|
}
|
|
|
|
function getWaterfallRemainStatus(dataSum, totalNum) {
|
|
if (!totalNum) return 'not-total';
|
|
return totalNum > dataSum ? 'have-remain' : 'none-remain';
|
|
}
|
|
|
|
var waterfall = function waterfall(columns, rows, settings, extra) {
|
|
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$totalName = settings.totalName,
|
|
totalName = _settings$totalName === undefined ? '总计' : _settings$totalName,
|
|
totalNum = settings.totalNum,
|
|
_settings$remainName = settings.remainName,
|
|
remainName = _settings$remainName === undefined ? '其他' : _settings$remainName,
|
|
_settings$xAxisName = settings.xAxisName,
|
|
xAxisName = _settings$xAxisName === undefined ? dimension : _settings$xAxisName,
|
|
_settings$labelMap = settings.labelMap,
|
|
labelMap = _settings$labelMap === undefined ? {} : _settings$labelMap,
|
|
_settings$axisVisible = settings.axisVisible,
|
|
axisVisible = _settings$axisVisible === undefined ? true : _settings$axisVisible,
|
|
_settings$digit = settings.digit,
|
|
digit = _settings$digit === undefined ? 2 : _settings$digit;
|
|
var tooltipVisible = extra.tooltipVisible;
|
|
|
|
var metricsTemp = columns.slice();
|
|
metricsTemp.splice(metricsTemp.indexOf(dimension), 1);
|
|
var metrics = metricsTemp[0];
|
|
var yAxisName = metrics;
|
|
var tooltip = tooltipVisible && getWaterfallTooltip(dataType, digit);
|
|
var dataSum = parseFloat(rows.reduce(function (pre, cur) {
|
|
return pre + Number(cur[metrics]);
|
|
}, 0).toFixed(digit));
|
|
var remainStatus = getWaterfallRemainStatus(dataSum, totalNum);
|
|
var xAxisParams = {
|
|
dimension: dimension,
|
|
rows: rows,
|
|
remainStatus: remainStatus,
|
|
totalName: totalName,
|
|
remainName: remainName,
|
|
xAxisName: xAxisName,
|
|
labelMap: labelMap,
|
|
axisVisible: axisVisible
|
|
};
|
|
var xAxis = getWaterfallXAxis(xAxisParams);
|
|
var yAxis = getWaterfallYAxis({ dataType: dataType, yAxisName: yAxisName, axisVisible: axisVisible, digit: digit, labelMap: labelMap });
|
|
var seriesParams = {
|
|
dataType: dataType,
|
|
rows: rows,
|
|
dimension: dimension,
|
|
metrics: metrics,
|
|
totalNum: totalNum,
|
|
remainStatus: remainStatus,
|
|
dataSum: dataSum,
|
|
digit: digit
|
|
};
|
|
var series = getWaterfallSeries(seriesParams);
|
|
var options = { tooltip: tooltip, xAxis: xAxis, yAxis: yAxis, series: series };
|
|
return options;
|
|
};
|
|
|
|
var index = _extends({}, Core, {
|
|
name: 'VeWaterfall',
|
|
data: function data() {
|
|
this.chartHandler = waterfall;
|
|
return {};
|
|
}
|
|
});
|
|
|
|
module.exports = index;
|