@jiaminghi/charts
Version:
Lightweight charting
621 lines (556 loc) • 19.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.gauge = gauge;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _updater = require("../class/updater.class");
var _gauge = require("../config/gauge");
var _util = require("@jiaminghi/c-render/lib/plugin/util");
var _util2 = require("../util");
var _color = require("@jiaminghi/color");
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; }
function gauge(chart) {
var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var series = option.series;
if (!series) series = [];
var gauges = (0, _util2.initNeedSeries)(series, _gauge.gaugeConfig, 'gauge');
gauges = calcGaugesCenter(gauges, chart);
gauges = calcGaugesRadius(gauges, chart);
gauges = calcGaugesDataRadiusAndLineWidth(gauges, chart);
gauges = calcGaugesDataAngles(gauges, chart);
gauges = calcGaugesDataGradient(gauges, chart);
gauges = calcGaugesAxisTickPosition(gauges, chart);
gauges = calcGaugesLabelPositionAndAlign(gauges, chart);
gauges = calcGaugesLabelData(gauges, chart);
gauges = calcGaugesDetailsPosition(gauges, chart);
gauges = calcGaugesDetailsContent(gauges, chart);
(0, _updater.doUpdate)({
chart: chart,
series: gauges,
key: 'gaugeAxisTick',
getGraphConfig: getAxisTickConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: gauges,
key: 'gaugeAxisLabel',
getGraphConfig: getAxisLabelConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: gauges,
key: 'gaugeBackgroundArc',
getGraphConfig: getBackgroundArcConfig,
getStartGraphConfig: getStartBackgroundArcConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: gauges,
key: 'gaugeArc',
getGraphConfig: getArcConfig,
getStartGraphConfig: getStartArcConfig,
beforeChange: beforeChangeArc
});
(0, _updater.doUpdate)({
chart: chart,
series: gauges,
key: 'gaugePointer',
getGraphConfig: getPointerConfig,
getStartGraphConfig: getStartPointerConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: gauges,
key: 'gaugeDetails',
getGraphConfig: getDetailsConfig
});
}
function calcGaugesCenter(gauges, chart) {
var area = chart.render.area;
gauges.forEach(function (gaugeItem) {
var center = gaugeItem.center;
center = center.map(function (pos, i) {
if (typeof pos === 'number') return pos;
return parseInt(pos) / 100 * area[i];
});
gaugeItem.center = center;
});
return gauges;
}
function calcGaugesRadius(gauges, chart) {
var area = chart.render.area;
var maxRadius = Math.min.apply(Math, (0, _toConsumableArray2["default"])(area)) / 2;
gauges.forEach(function (gaugeItem) {
var radius = gaugeItem.radius;
if (typeof radius !== 'number') {
radius = parseInt(radius) / 100 * maxRadius;
}
gaugeItem.radius = radius;
});
return gauges;
}
function calcGaugesDataRadiusAndLineWidth(gauges, chart) {
var area = chart.render.area;
var maxRadius = Math.min.apply(Math, (0, _toConsumableArray2["default"])(area)) / 2;
gauges.forEach(function (gaugeItem) {
var radius = gaugeItem.radius,
data = gaugeItem.data,
arcLineWidth = gaugeItem.arcLineWidth;
data.forEach(function (item) {
var arcRadius = item.radius,
lineWidth = item.lineWidth;
if (!arcRadius) arcRadius = radius;
if (typeof arcRadius !== 'number') arcRadius = parseInt(arcRadius) / 100 * maxRadius;
item.radius = arcRadius;
if (!lineWidth) lineWidth = arcLineWidth;
item.lineWidth = lineWidth;
});
});
return gauges;
}
function calcGaugesDataAngles(gauges, chart) {
gauges.forEach(function (gaugeItem) {
var startAngle = gaugeItem.startAngle,
endAngle = gaugeItem.endAngle,
data = gaugeItem.data,
min = gaugeItem.min,
max = gaugeItem.max;
var angleMinus = endAngle - startAngle;
var valueMinus = max - min;
data.forEach(function (item) {
var value = item.value;
var itemAngle = Math.abs((value - min) / valueMinus * angleMinus);
item.startAngle = startAngle;
item.endAngle = startAngle + itemAngle;
});
});
return gauges;
}
function calcGaugesDataGradient(gauges, chart) {
gauges.forEach(function (gaugeItem) {
var data = gaugeItem.data;
data.forEach(function (item) {
var color = item.color,
gradient = item.gradient;
if (!gradient || !gradient.length) gradient = color;
if (!(gradient instanceof Array)) gradient = [gradient];
item.gradient = gradient;
});
});
return gauges;
}
function calcGaugesAxisTickPosition(gauges, chart) {
gauges.forEach(function (gaugeItem) {
var startAngle = gaugeItem.startAngle,
endAngle = gaugeItem.endAngle,
splitNum = gaugeItem.splitNum,
center = gaugeItem.center,
radius = gaugeItem.radius,
arcLineWidth = gaugeItem.arcLineWidth,
axisTick = gaugeItem.axisTick;
var tickLength = axisTick.tickLength,
lineWidth = axisTick.style.lineWidth;
var angles = endAngle - startAngle;
var outerRadius = radius - arcLineWidth / 2;
var innerRadius = outerRadius - tickLength;
var angleGap = angles / (splitNum - 1);
var arcLength = 2 * Math.PI * radius * angles / (Math.PI * 2);
var offset = Math.ceil(lineWidth / 2) / arcLength * angles;
gaugeItem.tickAngles = [];
gaugeItem.tickInnerRadius = [];
gaugeItem.tickPosition = new Array(splitNum).fill(0).map(function (foo, i) {
var angle = startAngle + angleGap * i;
if (i === 0) angle += offset;
if (i === splitNum - 1) angle -= offset;
gaugeItem.tickAngles[i] = angle;
gaugeItem.tickInnerRadius[i] = innerRadius;
return [_util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([outerRadius, angle])), _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([innerRadius, angle]))];
});
});
return gauges;
}
function calcGaugesLabelPositionAndAlign(gauges, chart) {
gauges.forEach(function (gaugeItem) {
var center = gaugeItem.center,
tickInnerRadius = gaugeItem.tickInnerRadius,
tickAngles = gaugeItem.tickAngles,
labelGap = gaugeItem.axisLabel.labelGap;
var position = tickAngles.map(function (angle, i) {
return _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([tickInnerRadius[i] - labelGap, tickAngles[i]]));
});
var align = position.map(function (_ref) {
var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
x = _ref2[0],
y = _ref2[1];
return {
textAlign: x > center[0] ? 'right' : 'left',
textBaseline: y > center[1] ? 'bottom' : 'top'
};
});
gaugeItem.labelPosition = position;
gaugeItem.labelAlign = align;
});
return gauges;
}
function calcGaugesLabelData(gauges, chart) {
gauges.forEach(function (gaugeItem) {
var axisLabel = gaugeItem.axisLabel,
min = gaugeItem.min,
max = gaugeItem.max,
splitNum = gaugeItem.splitNum;
var data = axisLabel.data,
formatter = axisLabel.formatter;
var valueGap = (max - min) / (splitNum - 1);
var value = new Array(splitNum).fill(0).map(function (foo, i) {
return parseInt(min + valueGap * i);
});
var formatterType = (0, _typeof2["default"])(formatter);
data = (0, _util2.deepMerge)(value, data).map(function (v, i) {
var label = v;
if (formatterType === 'string') {
label = formatter.replace('{value}', v);
}
if (formatterType === 'function') {
label = formatter({
value: v,
index: i
});
}
return label;
});
axisLabel.data = data;
});
return gauges;
}
function calcGaugesDetailsPosition(gauges, chart) {
gauges.forEach(function (gaugeItem) {
var data = gaugeItem.data,
details = gaugeItem.details,
center = gaugeItem.center;
var position = details.position,
offset = details.offset;
var detailsPosition = data.map(function (_ref3) {
var startAngle = _ref3.startAngle,
endAngle = _ref3.endAngle,
radius = _ref3.radius;
var point = null;
if (position === 'center') {
point = center;
} else if (position === 'start') {
point = _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([radius, startAngle]));
} else if (position === 'end') {
point = _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([radius, endAngle]));
}
return getOffsetedPoint(point, offset);
});
gaugeItem.detailsPosition = detailsPosition;
});
return gauges;
}
function calcGaugesDetailsContent(gauges, chart) {
gauges.forEach(function (gaugeItem) {
var data = gaugeItem.data,
details = gaugeItem.details;
var formatter = details.formatter;
var formatterType = (0, _typeof2["default"])(formatter);
var contents = data.map(function (dataItem) {
var content = dataItem.value;
if (formatterType === 'string') {
content = formatter.replace('{value}', '{nt}');
content = content.replace('{name}', dataItem.name);
}
if (formatterType === 'function') content = formatter(dataItem);
return content.toString();
});
gaugeItem.detailsContent = contents;
});
return gauges;
}
function getOffsetedPoint(_ref4, _ref5) {
var _ref6 = (0, _slicedToArray2["default"])(_ref4, 2),
x = _ref6[0],
y = _ref6[1];
var _ref7 = (0, _slicedToArray2["default"])(_ref5, 2),
ox = _ref7[0],
oy = _ref7[1];
return [x + ox, y + oy];
}
function getAxisTickConfig(gaugeItem) {
var tickPosition = gaugeItem.tickPosition,
animationCurve = gaugeItem.animationCurve,
animationFrame = gaugeItem.animationFrame,
rLevel = gaugeItem.rLevel;
return tickPosition.map(function (foo, i) {
return {
name: 'polyline',
index: rLevel,
visible: gaugeItem.axisTick.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getAxisTickShape(gaugeItem, i),
style: getAxisTickStyle(gaugeItem, i)
};
});
}
function getAxisTickShape(gaugeItem, i) {
var tickPosition = gaugeItem.tickPosition;
return {
points: tickPosition[i]
};
}
function getAxisTickStyle(gaugeItem, i) {
var style = gaugeItem.axisTick.style;
return style;
}
function getAxisLabelConfig(gaugeItem) {
var labelPosition = gaugeItem.labelPosition,
animationCurve = gaugeItem.animationCurve,
animationFrame = gaugeItem.animationFrame,
rLevel = gaugeItem.rLevel;
return labelPosition.map(function (foo, i) {
return {
name: 'text',
index: rLevel,
visible: gaugeItem.axisLabel.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getAxisLabelShape(gaugeItem, i),
style: getAxisLabelStyle(gaugeItem, i)
};
});
}
function getAxisLabelShape(gaugeItem, i) {
var labelPosition = gaugeItem.labelPosition,
data = gaugeItem.axisLabel.data;
return {
content: data[i].toString(),
position: labelPosition[i]
};
}
function getAxisLabelStyle(gaugeItem, i) {
var labelAlign = gaugeItem.labelAlign,
axisLabel = gaugeItem.axisLabel;
var style = axisLabel.style;
return (0, _util2.deepMerge)(_objectSpread({}, labelAlign[i]), style);
}
function getBackgroundArcConfig(gaugeItem) {
var animationCurve = gaugeItem.animationCurve,
animationFrame = gaugeItem.animationFrame,
rLevel = gaugeItem.rLevel;
return [{
name: 'arc',
index: rLevel,
visible: gaugeItem.backgroundArc.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getGaugeBackgroundArcShape(gaugeItem),
style: getGaugeBackgroundArcStyle(gaugeItem)
}];
}
function getGaugeBackgroundArcShape(gaugeItem) {
var startAngle = gaugeItem.startAngle,
endAngle = gaugeItem.endAngle,
center = gaugeItem.center,
radius = gaugeItem.radius;
return {
rx: center[0],
ry: center[1],
r: radius,
startAngle: startAngle,
endAngle: endAngle
};
}
function getGaugeBackgroundArcStyle(gaugeItem) {
var backgroundArc = gaugeItem.backgroundArc,
arcLineWidth = gaugeItem.arcLineWidth;
var style = backgroundArc.style;
return (0, _util2.deepMerge)({
lineWidth: arcLineWidth
}, style);
}
function getStartBackgroundArcConfig(gaugeItem) {
var config = getBackgroundArcConfig(gaugeItem)[0];
var shape = _objectSpread({}, config.shape);
shape.endAngle = config.shape.startAngle;
config.shape = shape;
return [config];
}
function getArcConfig(gaugeItem) {
var data = gaugeItem.data,
animationCurve = gaugeItem.animationCurve,
animationFrame = gaugeItem.animationFrame,
rLevel = gaugeItem.rLevel;
return data.map(function (foo, i) {
return {
name: 'agArc',
index: rLevel,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getGaugeArcShape(gaugeItem, i),
style: getGaugeArcStyle(gaugeItem, i)
};
});
}
function getGaugeArcShape(gaugeItem, i) {
var data = gaugeItem.data,
center = gaugeItem.center,
gradientEndAngle = gaugeItem.endAngle;
var _data$i = data[i],
radius = _data$i.radius,
startAngle = _data$i.startAngle,
endAngle = _data$i.endAngle,
localGradient = _data$i.localGradient;
if (localGradient) gradientEndAngle = endAngle;
return {
rx: center[0],
ry: center[1],
r: radius,
startAngle: startAngle,
endAngle: endAngle,
gradientEndAngle: gradientEndAngle
};
}
function getGaugeArcStyle(gaugeItem, i) {
var data = gaugeItem.data,
dataItemStyle = gaugeItem.dataItemStyle;
var _data$i2 = data[i],
lineWidth = _data$i2.lineWidth,
gradient = _data$i2.gradient;
gradient = gradient.map(function (c) {
return (0, _color.getRgbaValue)(c);
});
return (0, _util2.deepMerge)({
lineWidth: lineWidth,
gradient: gradient
}, dataItemStyle);
}
function getStartArcConfig(gaugeItem) {
var configs = getArcConfig(gaugeItem);
configs.map(function (config) {
var shape = _objectSpread({}, config.shape);
shape.endAngle = config.shape.startAngle;
config.shape = shape;
});
return configs;
}
function beforeChangeArc(graph, config) {
var graphGradient = graph.style.gradient;
var cacheNum = graphGradient.length;
var needNum = config.style.gradient.length;
if (cacheNum > needNum) {
graphGradient.splice(needNum);
} else {
var last = graphGradient.slice(-1)[0];
graphGradient.push.apply(graphGradient, (0, _toConsumableArray2["default"])(new Array(needNum - cacheNum).fill(0).map(function (foo) {
return (0, _toConsumableArray2["default"])(last);
})));
}
}
function getPointerConfig(gaugeItem) {
var animationCurve = gaugeItem.animationCurve,
animationFrame = gaugeItem.animationFrame,
center = gaugeItem.center,
rLevel = gaugeItem.rLevel;
return [{
name: 'polyline',
index: rLevel,
visible: gaugeItem.pointer.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getPointerShape(gaugeItem),
style: getPointerStyle(gaugeItem),
setGraphCenter: function setGraphCenter(foo, graph) {
graph.style.graphCenter = center;
}
}];
}
function getPointerShape(gaugeItem) {
var center = gaugeItem.center;
return {
points: getPointerPoints(center),
close: true
};
}
function getPointerStyle(gaugeItem) {
var startAngle = gaugeItem.startAngle,
endAngle = gaugeItem.endAngle,
min = gaugeItem.min,
max = gaugeItem.max,
data = gaugeItem.data,
pointer = gaugeItem.pointer,
center = gaugeItem.center;
var valueIndex = pointer.valueIndex,
style = pointer.style;
var value = data[valueIndex] ? data[valueIndex].value : 0;
var angle = (value - min) / (max - min) * (endAngle - startAngle) + startAngle + Math.PI / 2;
return (0, _util2.deepMerge)({
rotate: (0, _util2.radianToAngle)(angle),
scale: [1, 1],
graphCenter: center
}, style);
}
function getPointerPoints(_ref8) {
var _ref9 = (0, _slicedToArray2["default"])(_ref8, 2),
x = _ref9[0],
y = _ref9[1];
var point1 = [x, y - 40];
var point2 = [x + 5, y];
var point3 = [x, y + 10];
var point4 = [x - 5, y];
return [point1, point2, point3, point4];
}
function getStartPointerConfig(gaugeItem) {
var startAngle = gaugeItem.startAngle;
var config = getPointerConfig(gaugeItem)[0];
config.style.rotate = (0, _util2.radianToAngle)(startAngle + Math.PI / 2);
return [config];
}
function getDetailsConfig(gaugeItem) {
var detailsPosition = gaugeItem.detailsPosition,
animationCurve = gaugeItem.animationCurve,
animationFrame = gaugeItem.animationFrame,
rLevel = gaugeItem.rLevel;
var visible = gaugeItem.details.show;
return detailsPosition.map(function (foo, i) {
return {
name: 'numberText',
index: rLevel,
visible: visible,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getDetailsShape(gaugeItem, i),
style: getDetailsStyle(gaugeItem, i)
};
});
}
function getDetailsShape(gaugeItem, i) {
var detailsPosition = gaugeItem.detailsPosition,
detailsContent = gaugeItem.detailsContent,
data = gaugeItem.data,
details = gaugeItem.details;
var position = detailsPosition[i];
var content = detailsContent[i];
var dataValue = data[i].value;
var toFixed = details.valueToFixed;
return {
number: [dataValue],
content: content,
position: position,
toFixed: toFixed
};
}
function getDetailsStyle(gaugeItem, i) {
var details = gaugeItem.details,
data = gaugeItem.data;
var style = details.style;
var color = data[i].color;
return (0, _util2.deepMerge)({
fill: color
}, style);
}