@jiaminghi/charts
Version:
Lightweight charting
773 lines (679 loc) • 24.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.axis = axis;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _updater = require("../class/updater.class");
var _config = require("../config");
var _util = require("../util");
var _util2 = require("@jiaminghi/c-render/lib/plugin/util");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var axisConfig = {
xAxisConfig: _config.xAxisConfig,
yAxisConfig: _config.yAxisConfig
};
var min = Math.min,
max = Math.max,
abs = Math.abs,
pow = Math.pow;
function axis(chart) {
var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var xAxis = option.xAxis,
yAxis = option.yAxis,
series = option.series;
var allAxis = [];
if (xAxis && yAxis && series) {
allAxis = getAllAxis(xAxis, yAxis);
allAxis = mergeDefaultAxisConfig(allAxis);
allAxis = allAxis.filter(function (_ref) {
var show = _ref.show;
return show;
});
allAxis = mergeDefaultBoundaryGap(allAxis);
allAxis = calcAxisLabelData(allAxis, series);
allAxis = setAxisPosition(allAxis);
allAxis = calcAxisLinePosition(allAxis, chart);
allAxis = calcAxisTickPosition(allAxis, chart);
allAxis = calcAxisNamePosition(allAxis, chart);
allAxis = calcSplitLinePosition(allAxis, chart);
}
(0, _updater.doUpdate)({
chart: chart,
series: allAxis,
key: 'axisLine',
getGraphConfig: getLineConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: allAxis,
key: 'axisTick',
getGraphConfig: getTickConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: allAxis,
key: 'axisLabel',
getGraphConfig: getLabelConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: allAxis,
key: 'axisName',
getGraphConfig: getNameConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: allAxis,
key: 'splitLine',
getGraphConfig: getSplitLineConfig
});
chart.axisData = allAxis;
}
function getAllAxis(xAxis, yAxis) {
var allXAxis = [],
allYAxis = [];
if (xAxis instanceof Array) {
var _allXAxis;
(_allXAxis = allXAxis).push.apply(_allXAxis, (0, _toConsumableArray2["default"])(xAxis));
} else {
allXAxis.push(xAxis);
}
if (yAxis instanceof Array) {
var _allYAxis;
(_allYAxis = allYAxis).push.apply(_allYAxis, (0, _toConsumableArray2["default"])(yAxis));
} else {
allYAxis.push(yAxis);
}
allXAxis.splice(2);
allYAxis.splice(2);
allXAxis = allXAxis.map(function (axis, i) {
return _objectSpread(_objectSpread({}, axis), {}, {
index: i,
axis: 'x'
});
});
allYAxis = allYAxis.map(function (axis, i) {
return _objectSpread(_objectSpread({}, axis), {}, {
index: i,
axis: 'y'
});
});
return [].concat((0, _toConsumableArray2["default"])(allXAxis), (0, _toConsumableArray2["default"])(allYAxis));
}
function mergeDefaultAxisConfig(allAxis) {
var xAxis = allAxis.filter(function (_ref2) {
var axis = _ref2.axis;
return axis === 'x';
});
var yAxis = allAxis.filter(function (_ref3) {
var axis = _ref3.axis;
return axis === 'y';
});
xAxis = xAxis.map(function (axis) {
return (0, _util.deepMerge)((0, _util2.deepClone)(_config.xAxisConfig), axis);
});
yAxis = yAxis.map(function (axis) {
return (0, _util.deepMerge)((0, _util2.deepClone)(_config.yAxisConfig), axis);
});
return [].concat((0, _toConsumableArray2["default"])(xAxis), (0, _toConsumableArray2["default"])(yAxis));
}
function mergeDefaultBoundaryGap(allAxis) {
var valueAxis = allAxis.filter(function (_ref4) {
var data = _ref4.data;
return data === 'value';
});
var labelAxis = allAxis.filter(function (_ref5) {
var data = _ref5.data;
return data !== 'value';
});
valueAxis.forEach(function (axis) {
if (typeof axis.boundaryGap === 'boolean') return;
axis.boundaryGap = false;
});
labelAxis.forEach(function (axis) {
if (typeof axis.boundaryGap === 'boolean') return;
axis.boundaryGap = true;
});
return [].concat((0, _toConsumableArray2["default"])(valueAxis), (0, _toConsumableArray2["default"])(labelAxis));
}
function calcAxisLabelData(allAxis, series) {
var valueAxis = allAxis.filter(function (_ref6) {
var data = _ref6.data;
return data === 'value';
});
var labelAxis = allAxis.filter(function (_ref7) {
var data = _ref7.data;
return data instanceof Array;
});
valueAxis = calcValueAxisLabelData(valueAxis, series);
labelAxis = calcLabelAxisLabelData(labelAxis);
return [].concat((0, _toConsumableArray2["default"])(valueAxis), (0, _toConsumableArray2["default"])(labelAxis));
}
function calcValueAxisLabelData(valueAxis, series) {
return valueAxis.map(function (axis) {
var minMaxValue = getValueAxisMaxMinValue(axis, series);
var _getTrueMinMax = getTrueMinMax(axis, minMaxValue),
_getTrueMinMax2 = (0, _slicedToArray2["default"])(_getTrueMinMax, 2),
min = _getTrueMinMax2[0],
max = _getTrueMinMax2[1];
var interval = getValueInterval(min, max, axis);
var formatter = axis.axisLabel.formatter;
var label = [];
if (min < 0 && max > 0) {
label = getValueAxisLabelFromZero(min, max, interval);
} else {
label = getValueAxisLabelFromMin(min, max, interval);
}
label = label.map(function (l) {
return parseFloat(l.toFixed(2));
});
return _objectSpread(_objectSpread({}, axis), {}, {
maxValue: label.slice(-1)[0],
minValue: label[0],
label: getAfterFormatterLabel(label, formatter)
});
});
}
function getValueAxisMaxMinValue(axis, series) {
series = series.filter(function (_ref8) {
var show = _ref8.show,
type = _ref8.type;
if (show === false) return false;
if (type === 'pie') return false;
return true;
});
if (series.length === 0) return [0, 0];
var index = axis.index,
axisType = axis.axis;
series = mergeStackData(series);
var axisName = axisType + 'Axis';
var valueSeries = series.filter(function (s) {
return s[axisName] === index;
});
if (!valueSeries.length) valueSeries = series;
return getSeriesMinMaxValue(valueSeries);
}
function getSeriesMinMaxValue(series) {
if (!series) return;
var minValue = Math.min.apply(Math, (0, _toConsumableArray2["default"])(series.map(function (_ref9) {
var data = _ref9.data;
return Math.min.apply(Math, (0, _toConsumableArray2["default"])((0, _util.filterNonNumber)(data)));
})));
var maxValue = Math.max.apply(Math, (0, _toConsumableArray2["default"])(series.map(function (_ref10) {
var data = _ref10.data;
return Math.max.apply(Math, (0, _toConsumableArray2["default"])((0, _util.filterNonNumber)(data)));
})));
return [minValue, maxValue];
}
function mergeStackData(series) {
var seriesCloned = (0, _util2.deepClone)(series, true);
series.forEach(function (item, i) {
var data = (0, _util.mergeSameStackData)(item, series);
seriesCloned[i].data = data;
});
return seriesCloned;
}
function getTrueMinMax(_ref11, _ref12) {
var min = _ref11.min,
max = _ref11.max,
axis = _ref11.axis;
var _ref13 = (0, _slicedToArray2["default"])(_ref12, 2),
minValue = _ref13[0],
maxValue = _ref13[1];
var minType = (0, _typeof2["default"])(min),
maxType = (0, _typeof2["default"])(max);
if (!testMinMaxType(min)) {
min = axisConfig[axis + 'AxisConfig'].min;
minType = 'string';
}
if (!testMinMaxType(max)) {
max = axisConfig[axis + 'AxisConfig'].max;
maxType = 'string';
}
if (minType === 'string') {
min = parseInt(minValue - abs(minValue * parseFloat(min) / 100));
var lever = getValueLever(min);
min = parseFloat((min / lever - 0.1).toFixed(1)) * lever;
}
if (maxType === 'string') {
max = parseInt(maxValue + abs(maxValue * parseFloat(max) / 100));
var _lever = getValueLever(max);
max = parseFloat((max / _lever + 0.1).toFixed(1)) * _lever;
}
return [min, max];
}
function getValueLever(value) {
var valueString = abs(value).toString();
var valueLength = valueString.length;
var firstZeroIndex = valueString.replace(/0*$/g, '').indexOf('0');
var pow10Num = valueLength - 1;
if (firstZeroIndex !== -1) pow10Num -= firstZeroIndex;
return pow(10, pow10Num);
}
function testMinMaxType(val) {
var valType = (0, _typeof2["default"])(val);
var isValidString = valType === 'string' && /^\d+%$/.test(val);
var isValidNumber = valType === 'number';
return isValidString || isValidNumber;
}
function getValueAxisLabelFromZero(min, max, interval) {
var negative = [],
positive = [];
var currentNegative = 0,
currentPositive = 0;
do {
negative.push(currentNegative -= interval);
} while (currentNegative > min);
do {
positive.push(currentPositive += interval);
} while (currentPositive < max);
return [].concat((0, _toConsumableArray2["default"])(negative.reverse()), [0], (0, _toConsumableArray2["default"])(positive));
}
function getValueAxisLabelFromMin(min, max, interval) {
var label = [min],
currentValue = min;
do {
label.push(currentValue += interval);
} while (currentValue < max);
return label;
}
function getAfterFormatterLabel(label, formatter) {
if (!formatter) return label;
if (typeof formatter === 'string') label = label.map(function (l) {
return formatter.replace('{value}', l);
});
if (typeof formatter === 'function') label = label.map(function (value, index) {
return formatter({
value: value,
index: index
});
});
return label;
}
function calcLabelAxisLabelData(labelAxis) {
return labelAxis.map(function (axis) {
var data = axis.data,
formatter = axis.axisLabel.formatter;
return _objectSpread(_objectSpread({}, axis), {}, {
label: getAfterFormatterLabel(data, formatter)
});
});
}
function getValueInterval(min, max, axis) {
var interval = axis.interval,
minInterval = axis.minInterval,
maxInterval = axis.maxInterval,
splitNumber = axis.splitNumber,
axisType = axis.axis;
var config = axisConfig[axisType + 'AxisConfig'];
if (typeof interval !== 'number') interval = config.interval;
if (typeof minInterval !== 'number') minInterval = config.minInterval;
if (typeof maxInterval !== 'number') maxInterval = config.maxInterval;
if (typeof splitNumber !== 'number') splitNumber = config.splitNumber;
if (typeof interval === 'number') return interval;
var valueInterval = parseInt((max - min) / (splitNumber - 1));
if (valueInterval.toString().length > 1) valueInterval = parseInt(valueInterval.toString().replace(/\d$/, '0'));
if (valueInterval === 0) valueInterval = 1;
if (typeof minInterval === 'number' && valueInterval < minInterval) return minInterval;
if (typeof maxInterval === 'number' && valueInterval > maxInterval) return maxInterval;
return valueInterval;
}
function setAxisPosition(allAxis) {
var xAxis = allAxis.filter(function (_ref14) {
var axis = _ref14.axis;
return axis === 'x';
});
var yAxis = allAxis.filter(function (_ref15) {
var axis = _ref15.axis;
return axis === 'y';
});
if (xAxis[0] && !xAxis[0].position) xAxis[0].position = _config.xAxisConfig.position;
if (xAxis[1] && !xAxis[1].position) {
xAxis[1].position = xAxis[0].position === 'bottom' ? 'top' : 'bottom';
}
if (yAxis[0] && !yAxis[0].position) yAxis[0].position = _config.yAxisConfig.position;
if (yAxis[1] && !yAxis[1].position) {
yAxis[1].position = yAxis[0].position === 'left' ? 'right' : 'left';
}
return [].concat((0, _toConsumableArray2["default"])(xAxis), (0, _toConsumableArray2["default"])(yAxis));
}
function calcAxisLinePosition(allAxis, chart) {
var _chart$gridArea = chart.gridArea,
x = _chart$gridArea.x,
y = _chart$gridArea.y,
w = _chart$gridArea.w,
h = _chart$gridArea.h;
allAxis = allAxis.map(function (axis) {
var position = axis.position;
var linePosition = [];
if (position === 'left') {
linePosition = [[x, y], [x, y + h]].reverse();
} else if (position === 'right') {
linePosition = [[x + w, y], [x + w, y + h]].reverse();
} else if (position === 'top') {
linePosition = [[x, y], [x + w, y]];
} else if (position === 'bottom') {
linePosition = [[x, y + h], [x + w, y + h]];
}
return _objectSpread(_objectSpread({}, axis), {}, {
linePosition: linePosition
});
});
return allAxis;
}
function calcAxisTickPosition(allAxis, chart) {
return allAxis.map(function (axisItem) {
var axis = axisItem.axis,
linePosition = axisItem.linePosition,
position = axisItem.position,
label = axisItem.label,
boundaryGap = axisItem.boundaryGap;
if (typeof boundaryGap !== 'boolean') boundaryGap = axisConfig[axis + 'AxisConfig'].boundaryGap;
var labelNum = label.length;
var _linePosition = (0, _slicedToArray2["default"])(linePosition, 2),
_linePosition$ = (0, _slicedToArray2["default"])(_linePosition[0], 2),
startX = _linePosition$[0],
startY = _linePosition$[1],
_linePosition$2 = (0, _slicedToArray2["default"])(_linePosition[1], 2),
endX = _linePosition$2[0],
endY = _linePosition$2[1];
var gapLength = axis === 'x' ? endX - startX : endY - startY;
var gap = gapLength / (boundaryGap ? labelNum : labelNum - 1);
var tickPosition = new Array(labelNum).fill(0).map(function (foo, i) {
if (axis === 'x') {
return [startX + gap * (boundaryGap ? i + 0.5 : i), startY];
}
return [startX, startY + gap * (boundaryGap ? i + 0.5 : i)];
});
var tickLinePosition = getTickLinePosition(axis, boundaryGap, position, tickPosition, gap);
return _objectSpread(_objectSpread({}, axisItem), {}, {
tickPosition: tickPosition,
tickLinePosition: tickLinePosition,
tickGap: gap
});
});
}
function getTickLinePosition(axisType, boundaryGap, position, tickPosition, gap) {
var index = axisType === 'x' ? 1 : 0;
var plus = 5;
if (axisType === 'x' && position === 'top') plus = -5;
if (axisType === 'y' && position === 'left') plus = -5;
var tickLinePosition = tickPosition.map(function (lineStart) {
var lineEnd = (0, _util2.deepClone)(lineStart);
lineEnd[index] += plus;
return [(0, _util2.deepClone)(lineStart), lineEnd];
});
if (!boundaryGap) return tickLinePosition;
index = axisType === 'x' ? 0 : 1;
plus = gap / 2;
tickLinePosition.forEach(function (_ref16) {
var _ref17 = (0, _slicedToArray2["default"])(_ref16, 2),
lineStart = _ref17[0],
lineEnd = _ref17[1];
lineStart[index] += plus;
lineEnd[index] += plus;
});
return tickLinePosition;
}
function calcAxisNamePosition(allAxis, chart) {
return allAxis.map(function (axisItem) {
var nameGap = axisItem.nameGap,
nameLocation = axisItem.nameLocation,
position = axisItem.position,
linePosition = axisItem.linePosition;
var _linePosition2 = (0, _slicedToArray2["default"])(linePosition, 2),
lineStart = _linePosition2[0],
lineEnd = _linePosition2[1];
var namePosition = (0, _toConsumableArray2["default"])(lineStart);
if (nameLocation === 'end') namePosition = (0, _toConsumableArray2["default"])(lineEnd);
if (nameLocation === 'center') {
namePosition[0] = (lineStart[0] + lineEnd[0]) / 2;
namePosition[1] = (lineStart[1] + lineEnd[1]) / 2;
}
var index = 0;
if (position === 'top' && nameLocation === 'center') index = 1;
if (position === 'bottom' && nameLocation === 'center') index = 1;
if (position === 'left' && nameLocation !== 'center') index = 1;
if (position === 'right' && nameLocation !== 'center') index = 1;
var plus = nameGap;
if (position === 'top' && nameLocation !== 'end') plus *= -1;
if (position === 'left' && nameLocation !== 'start') plus *= -1;
if (position === 'bottom' && nameLocation === 'start') plus *= -1;
if (position === 'right' && nameLocation === 'end') plus *= -1;
namePosition[index] += plus;
return _objectSpread(_objectSpread({}, axisItem), {}, {
namePosition: namePosition
});
});
}
function calcSplitLinePosition(allAxis, chart) {
var _chart$gridArea2 = chart.gridArea,
w = _chart$gridArea2.w,
h = _chart$gridArea2.h;
return allAxis.map(function (axisItem) {
var tickLinePosition = axisItem.tickLinePosition,
position = axisItem.position,
boundaryGap = axisItem.boundaryGap;
var index = 0,
plus = w;
if (position === 'top' || position === 'bottom') index = 1;
if (position === 'top' || position === 'bottom') plus = h;
if (position === 'right' || position === 'bottom') plus *= -1;
var splitLinePosition = tickLinePosition.map(function (_ref18) {
var _ref19 = (0, _slicedToArray2["default"])(_ref18, 1),
startPoint = _ref19[0];
var endPoint = (0, _toConsumableArray2["default"])(startPoint);
endPoint[index] += plus;
return [(0, _toConsumableArray2["default"])(startPoint), endPoint];
});
if (!boundaryGap) splitLinePosition.shift();
return _objectSpread(_objectSpread({}, axisItem), {}, {
splitLinePosition: splitLinePosition
});
});
}
function getLineConfig(axisItem) {
var animationCurve = axisItem.animationCurve,
animationFrame = axisItem.animationFrame,
rLevel = axisItem.rLevel;
return [{
name: 'polyline',
index: rLevel,
visible: axisItem.axisLine.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getLineShape(axisItem),
style: getLineStyle(axisItem)
}];
}
function getLineShape(axisItem) {
var linePosition = axisItem.linePosition;
return {
points: linePosition
};
}
function getLineStyle(axisItem) {
return axisItem.axisLine.style;
}
function getTickConfig(axisItem) {
var animationCurve = axisItem.animationCurve,
animationFrame = axisItem.animationFrame,
rLevel = axisItem.rLevel;
var shapes = getTickShapes(axisItem);
var style = getTickStyle(axisItem);
return shapes.map(function (shape) {
return {
name: 'polyline',
index: rLevel,
visible: axisItem.axisTick.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: shape,
style: style
};
});
}
function getTickShapes(axisItem) {
var tickLinePosition = axisItem.tickLinePosition;
return tickLinePosition.map(function (points) {
return {
points: points
};
});
}
function getTickStyle(axisItem) {
return axisItem.axisTick.style;
}
function getLabelConfig(axisItem) {
var animationCurve = axisItem.animationCurve,
animationFrame = axisItem.animationFrame,
rLevel = axisItem.rLevel;
var shapes = getLabelShapes(axisItem);
var styles = getLabelStyle(axisItem, shapes);
return shapes.map(function (shape, i) {
return {
name: 'text',
index: rLevel,
visible: axisItem.axisLabel.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: shape,
style: styles[i],
setGraphCenter: function setGraphCenter() {
return void 0;
}
};
});
}
function getLabelShapes(axisItem) {
var label = axisItem.label,
tickPosition = axisItem.tickPosition,
position = axisItem.position;
return tickPosition.map(function (point, i) {
return {
position: getLabelRealPosition(point, position),
content: label[i].toString()
};
});
}
function getLabelRealPosition(points, position) {
var index = 0,
plus = 10;
if (position === 'top' || position === 'bottom') index = 1;
if (position === 'top' || position === 'left') plus = -10;
points = (0, _util2.deepClone)(points);
points[index] += plus;
return points;
}
function getLabelStyle(axisItem, shapes) {
var position = axisItem.position;
var style = axisItem.axisLabel.style;
var align = getAxisLabelRealAlign(position);
style = (0, _util.deepMerge)(align, style);
var styles = shapes.map(function (_ref20) {
var position = _ref20.position;
return _objectSpread(_objectSpread({}, style), {}, {
graphCenter: position
});
});
return styles;
}
function getAxisLabelRealAlign(position) {
if (position === 'left') return {
textAlign: 'right',
textBaseline: 'middle'
};
if (position === 'right') return {
textAlign: 'left',
textBaseline: 'middle'
};
if (position === 'top') return {
textAlign: 'center',
textBaseline: 'bottom'
};
if (position === 'bottom') return {
textAlign: 'center',
textBaseline: 'top'
};
}
function getNameConfig(axisItem) {
var animationCurve = axisItem.animationCurve,
animationFrame = axisItem.animationFrame,
rLevel = axisItem.rLevel;
return [{
name: 'text',
index: rLevel,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getNameShape(axisItem),
style: getNameStyle(axisItem)
}];
}
function getNameShape(axisItem) {
var name = axisItem.name,
namePosition = axisItem.namePosition;
return {
content: name,
position: namePosition
};
}
function getNameStyle(axisItem) {
var nameLocation = axisItem.nameLocation,
position = axisItem.position,
style = axisItem.nameTextStyle;
var align = getNameRealAlign(position, nameLocation);
return (0, _util.deepMerge)(align, style);
}
function getNameRealAlign(position, location) {
if (position === 'top' && location === 'start' || position === 'bottom' && location === 'start' || position === 'left' && location === 'center') return {
textAlign: 'right',
textBaseline: 'middle'
};
if (position === 'top' && location === 'end' || position === 'bottom' && location === 'end' || position === 'right' && location === 'center') return {
textAlign: 'left',
textBaseline: 'middle'
};
if (position === 'top' && location === 'center' || position === 'left' && location === 'end' || position === 'right' && location === 'end') return {
textAlign: 'center',
textBaseline: 'bottom'
};
if (position === 'bottom' && location === 'center' || position === 'left' && location === 'start' || position === 'right' && location === 'start') return {
textAlign: 'center',
textBaseline: 'top'
};
}
function getSplitLineConfig(axisItem) {
var animationCurve = axisItem.animationCurve,
animationFrame = axisItem.animationFrame,
rLevel = axisItem.rLevel;
var shapes = getSplitLineShapes(axisItem);
var style = getSplitLineStyle(axisItem);
return shapes.map(function (shape) {
return {
name: 'polyline',
index: rLevel,
visible: axisItem.splitLine.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: shape,
style: style
};
});
}
function getSplitLineShapes(axisItem) {
var splitLinePosition = axisItem.splitLinePosition;
return splitLinePosition.map(function (points) {
return {
points: points
};
});
}
function getSplitLineStyle(axisItem) {
return axisItem.splitLine.style;
}