@jiaminghi/charts
Version:
Lightweight charting
585 lines (514 loc) • 17.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.pie = pie;
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 _pie = require("../config/pie");
var _util = require("@jiaminghi/c-render/lib/plugin/util");
var _util2 = require("../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; }
function pie(chart) {
var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var series = option.series;
if (!series) series = [];
var pies = (0, _util2.initNeedSeries)(series, _pie.pieConfig, 'pie');
pies = calcPiesCenter(pies, chart);
pies = calcPiesRadius(pies, chart);
pies = calcRosePiesRadius(pies, chart);
pies = calcPiesPercent(pies);
pies = calcPiesAngle(pies, chart);
pies = calcPiesInsideLabelPos(pies);
pies = calcPiesEdgeCenterPos(pies);
pies = calcPiesOutSideLabelPos(pies);
(0, _updater.doUpdate)({
chart: chart,
series: pies,
key: 'pie',
getGraphConfig: getPieConfig,
getStartGraphConfig: getStartPieConfig,
beforeChange: beforeChangePie
});
(0, _updater.doUpdate)({
chart: chart,
series: pies,
key: 'pieInsideLabel',
getGraphConfig: getInsideLabelConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: pies,
key: 'pieOutsideLabelLine',
getGraphConfig: getOutsideLabelLineConfig,
getStartGraphConfig: getStartOutsideLabelLineConfig
});
(0, _updater.doUpdate)({
chart: chart,
series: pies,
key: 'pieOutsideLabel',
getGraphConfig: getOutsideLabelConfig,
getStartGraphConfig: getStartOutsideLabelConfig
});
}
function calcPiesCenter(pies, chart) {
var area = chart.render.area;
pies.forEach(function (pie) {
var center = pie.center;
center = center.map(function (pos, i) {
if (typeof pos === 'number') return pos;
return parseInt(pos) / 100 * area[i];
});
pie.center = center;
});
return pies;
}
function calcPiesRadius(pies, chart) {
var maxRadius = Math.min.apply(Math, (0, _toConsumableArray2["default"])(chart.render.area)) / 2;
pies.forEach(function (pie) {
var radius = pie.radius,
data = pie.data;
radius = getNumberRadius(radius, maxRadius);
data.forEach(function (item) {
var itemRadius = item.radius;
if (!itemRadius) itemRadius = radius;
itemRadius = getNumberRadius(itemRadius, maxRadius);
item.radius = itemRadius;
});
pie.radius = radius;
});
return pies;
}
function getNumberRadius(radius, maxRadius) {
if (!(radius instanceof Array)) radius = [0, radius];
radius = radius.map(function (r) {
if (typeof r === 'number') return r;
return parseInt(r) / 100 * maxRadius;
});
return radius;
}
function calcRosePiesRadius(pies, chart) {
var rosePie = pies.filter(function (_ref) {
var roseType = _ref.roseType;
return roseType;
});
rosePie.forEach(function (pie) {
var radius = pie.radius,
data = pie.data,
roseSort = pie.roseSort;
var roseIncrement = getRoseIncrement(pie);
var dataCopy = (0, _toConsumableArray2["default"])(data);
data = sortData(data);
data.forEach(function (item, i) {
item.radius[1] = radius[1] - roseIncrement * i;
});
if (roseSort) {
data.reverse();
} else {
pie.data = dataCopy;
}
pie.roseIncrement = roseIncrement;
});
return pies;
}
function sortData(data) {
return data.sort(function (_ref2, _ref3) {
var a = _ref2.value;
var b = _ref3.value;
if (a === b) return 0;
if (a > b) return -1;
if (a < b) return 1;
});
}
function getRoseIncrement(pie) {
var radius = pie.radius,
roseIncrement = pie.roseIncrement;
if (typeof roseIncrement === 'number') return roseIncrement;
if (roseIncrement === 'auto') {
var data = pie.data;
var allRadius = data.reduce(function (all, _ref4) {
var radius = _ref4.radius;
return [].concat((0, _toConsumableArray2["default"])(all), (0, _toConsumableArray2["default"])(radius));
}, []);
var minRadius = Math.min.apply(Math, (0, _toConsumableArray2["default"])(allRadius));
var maxRadius = Math.max.apply(Math, (0, _toConsumableArray2["default"])(allRadius));
return (maxRadius - minRadius) * 0.6 / (data.length - 1 || 1);
}
return parseInt(roseIncrement) / 100 * radius[1];
}
function calcPiesPercent(pies) {
pies.forEach(function (pie) {
var data = pie.data,
percentToFixed = pie.percentToFixed;
var sum = getDataSum(data);
data.forEach(function (item) {
var value = item.value;
item.percent = value / sum * 100;
item.percentForLabel = toFixedNoCeil(value / sum * 100, percentToFixed);
});
var percentSumNoLast = (0, _util2.mulAdd)(data.slice(0, -1).map(function (_ref5) {
var percent = _ref5.percent;
return percent;
}));
data.slice(-1)[0].percent = 100 - percentSumNoLast;
data.slice(-1)[0].percentForLabel = toFixedNoCeil(100 - percentSumNoLast, percentToFixed);
});
return pies;
}
function toFixedNoCeil(number) {
var toFixed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var stringNumber = number.toString();
var splitedNumber = stringNumber.split('.');
var decimal = splitedNumber[1] || '0';
var fixedDecimal = decimal.slice(0, toFixed);
splitedNumber[1] = fixedDecimal;
return parseFloat(splitedNumber.join('.'));
}
function getDataSum(data) {
return (0, _util2.mulAdd)(data.map(function (_ref6) {
var value = _ref6.value;
return value;
}));
}
function calcPiesAngle(pies) {
pies.forEach(function (pie) {
var start = pie.startAngle,
data = pie.data;
data.forEach(function (item, i) {
var _getDataAngle = getDataAngle(data, i),
_getDataAngle2 = (0, _slicedToArray2["default"])(_getDataAngle, 2),
startAngle = _getDataAngle2[0],
endAngle = _getDataAngle2[1];
item.startAngle = start + startAngle;
item.endAngle = start + endAngle;
});
});
return pies;
}
function getDataAngle(data, i) {
var fullAngle = Math.PI * 2;
var needAddData = data.slice(0, i + 1);
var percentSum = (0, _util2.mulAdd)(needAddData.map(function (_ref7) {
var percent = _ref7.percent;
return percent;
}));
var percent = data[i].percent;
var startPercent = percentSum - percent;
return [fullAngle * startPercent / 100, fullAngle * percentSum / 100];
}
function calcPiesInsideLabelPos(pies) {
pies.forEach(function (pieItem) {
var data = pieItem.data;
data.forEach(function (item) {
item.insideLabelPos = getPieInsideLabelPos(pieItem, item);
});
});
return pies;
}
function getPieInsideLabelPos(pieItem, dataItem) {
var center = pieItem.center;
var startAngle = dataItem.startAngle,
endAngle = dataItem.endAngle,
_dataItem$radius = (0, _slicedToArray2["default"])(dataItem.radius, 2),
ir = _dataItem$radius[0],
or = _dataItem$radius[1];
var radius = (ir + or) / 2;
var angle = (startAngle + endAngle) / 2;
return _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([radius, angle]));
}
function calcPiesEdgeCenterPos(pies) {
pies.forEach(function (pie) {
var data = pie.data,
center = pie.center;
data.forEach(function (item) {
var startAngle = item.startAngle,
endAngle = item.endAngle,
radius = item.radius;
var centerAngle = (startAngle + endAngle) / 2;
var pos = _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([radius[1], centerAngle]));
item.edgeCenterPos = pos;
});
});
return pies;
}
function calcPiesOutSideLabelPos(pies) {
pies.forEach(function (pieItem) {
var leftPieDataItems = getLeftOrRightPieDataItems(pieItem);
var rightPieDataItems = getLeftOrRightPieDataItems(pieItem, false);
leftPieDataItems = sortPiesFromTopToBottom(leftPieDataItems);
rightPieDataItems = sortPiesFromTopToBottom(rightPieDataItems);
addLabelLineAndAlign(leftPieDataItems, pieItem);
addLabelLineAndAlign(rightPieDataItems, pieItem, false);
});
return pies;
}
function getLabelLineBendRadius(pieItem) {
var labelLineBendGap = pieItem.outsideLabel.labelLineBendGap;
var maxRadius = getPieMaxRadius(pieItem);
if (typeof labelLineBendGap !== 'number') {
labelLineBendGap = parseInt(labelLineBendGap) / 100 * maxRadius;
}
return labelLineBendGap + maxRadius;
}
function getPieMaxRadius(pieItem) {
var data = pieItem.data;
var radius = data.map(function (_ref8) {
var _ref8$radius = (0, _slicedToArray2["default"])(_ref8.radius, 2),
foo = _ref8$radius[0],
r = _ref8$radius[1];
return r;
});
return Math.max.apply(Math, (0, _toConsumableArray2["default"])(radius));
}
function getLeftOrRightPieDataItems(pieItem) {
var left = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var data = pieItem.data,
center = pieItem.center;
var centerXPos = center[0];
return data.filter(function (_ref9) {
var edgeCenterPos = _ref9.edgeCenterPos;
var xPos = edgeCenterPos[0];
if (left) return xPos <= centerXPos;
return xPos > centerXPos;
});
}
function sortPiesFromTopToBottom(dataItem) {
dataItem.sort(function (_ref10, _ref11) {
var _ref10$edgeCenterPos = (0, _slicedToArray2["default"])(_ref10.edgeCenterPos, 2),
t = _ref10$edgeCenterPos[0],
ay = _ref10$edgeCenterPos[1];
var _ref11$edgeCenterPos = (0, _slicedToArray2["default"])(_ref11.edgeCenterPos, 2),
tt = _ref11$edgeCenterPos[0],
by = _ref11$edgeCenterPos[1];
if (ay > by) return 1;
if (ay < by) return -1;
if (ay === by) return 0;
});
return dataItem;
}
function addLabelLineAndAlign(dataItem, pieItem) {
var left = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var center = pieItem.center,
outsideLabel = pieItem.outsideLabel;
var radius = getLabelLineBendRadius(pieItem);
dataItem.forEach(function (item) {
var edgeCenterPos = item.edgeCenterPos,
startAngle = item.startAngle,
endAngle = item.endAngle;
var labelLineEndLength = outsideLabel.labelLineEndLength;
var angle = (startAngle + endAngle) / 2;
var bendPoint = _util.getCircleRadianPoint.apply(void 0, (0, _toConsumableArray2["default"])(center).concat([radius, angle]));
var endPoint = (0, _toConsumableArray2["default"])(bendPoint);
endPoint[0] += labelLineEndLength * (left ? -1 : 1);
item.labelLine = [edgeCenterPos, bendPoint, endPoint];
item.labelLineLength = (0, _util2.getPolylineLength)(item.labelLine);
item.align = {
textAlign: 'left',
textBaseline: 'middle'
};
if (left) item.align.textAlign = 'right';
});
}
function getPieConfig(pieItem) {
var data = pieItem.data,
animationCurve = pieItem.animationCurve,
animationFrame = pieItem.animationFrame,
rLevel = pieItem.rLevel;
return data.map(function (foo, i) {
return {
name: 'pie',
index: rLevel,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getPieShape(pieItem, i),
style: getPieStyle(pieItem, i)
};
});
}
function getStartPieConfig(pieItem) {
var animationDelayGap = pieItem.animationDelayGap,
startAnimationCurve = pieItem.startAnimationCurve;
var configs = getPieConfig(pieItem);
configs.forEach(function (config, i) {
config.animationCurve = startAnimationCurve;
config.animationDelay = i * animationDelayGap;
config.shape.or = config.shape.ir;
});
return configs;
}
function beforeChangePie(graph) {
graph.animationDelay = 0;
}
function getPieShape(pieItem, i) {
var center = pieItem.center,
data = pieItem.data;
var dataItem = data[i];
var radius = dataItem.radius,
startAngle = dataItem.startAngle,
endAngle = dataItem.endAngle;
return {
startAngle: startAngle,
endAngle: endAngle,
ir: radius[0],
or: radius[1],
rx: center[0],
ry: center[1]
};
}
function getPieStyle(pieItem, i) {
var pieStyle = pieItem.pieStyle,
data = pieItem.data;
var dataItem = data[i];
var color = dataItem.color;
return (0, _util2.deepMerge)({
fill: color
}, pieStyle);
}
function getInsideLabelConfig(pieItem) {
var animationCurve = pieItem.animationCurve,
animationFrame = pieItem.animationFrame,
data = pieItem.data,
rLevel = pieItem.rLevel;
return data.map(function (foo, i) {
return {
name: 'text',
index: rLevel,
visible: pieItem.insideLabel.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getInsideLabelShape(pieItem, i),
style: getInsideLabelStyle(pieItem, i)
};
});
}
function getInsideLabelShape(pieItem, i) {
var insideLabel = pieItem.insideLabel,
data = pieItem.data;
var formatter = insideLabel.formatter;
var dataItem = data[i];
var formatterType = (0, _typeof2["default"])(formatter);
var label = '';
if (formatterType === 'string') {
label = formatter.replace('{name}', dataItem.name);
label = label.replace('{percent}', dataItem.percentForLabel);
label = label.replace('{value}', dataItem.value);
}
if (formatterType === 'function') {
label = formatter(dataItem);
}
return {
content: label,
position: dataItem.insideLabelPos
};
}
function getInsideLabelStyle(pieItem, i) {
var style = pieItem.insideLabel.style;
return style;
}
function getOutsideLabelLineConfig(pieItem) {
var animationCurve = pieItem.animationCurve,
animationFrame = pieItem.animationFrame,
data = pieItem.data,
rLevel = pieItem.rLevel;
return data.map(function (foo, i) {
return {
name: 'polyline',
index: rLevel,
visible: pieItem.outsideLabel.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getOutsideLabelLineShape(pieItem, i),
style: getOutsideLabelLineStyle(pieItem, i)
};
});
}
function getStartOutsideLabelLineConfig(pieItem) {
var data = pieItem.data;
var configs = getOutsideLabelLineConfig(pieItem);
configs.forEach(function (config, i) {
config.style.lineDash = [0, data[i].labelLineLength];
});
return configs;
}
function getOutsideLabelLineShape(pieItem, i) {
var data = pieItem.data;
var dataItem = data[i];
return {
points: dataItem.labelLine
};
}
function getOutsideLabelLineStyle(pieItem, i) {
var outsideLabel = pieItem.outsideLabel,
data = pieItem.data;
var labelLineStyle = outsideLabel.labelLineStyle;
var color = data[i].color;
return (0, _util2.deepMerge)({
stroke: color,
lineDash: [data[i].labelLineLength, 0]
}, labelLineStyle);
}
function getOutsideLabelConfig(pieItem) {
var animationCurve = pieItem.animationCurve,
animationFrame = pieItem.animationFrame,
data = pieItem.data,
rLevel = pieItem.rLevel;
return data.map(function (foo, i) {
return {
name: 'text',
index: rLevel,
visible: pieItem.outsideLabel.show,
animationCurve: animationCurve,
animationFrame: animationFrame,
shape: getOutsideLabelShape(pieItem, i),
style: getOutsideLabelStyle(pieItem, i)
};
});
}
function getStartOutsideLabelConfig(pieItem) {
var data = pieItem.data;
var configs = getOutsideLabelConfig(pieItem);
configs.forEach(function (config, i) {
config.shape.position = data[i].labelLine[1];
});
return configs;
}
function getOutsideLabelShape(pieItem, i) {
var outsideLabel = pieItem.outsideLabel,
data = pieItem.data;
var formatter = outsideLabel.formatter;
var _data$i = data[i],
labelLine = _data$i.labelLine,
name = _data$i.name,
percentForLabel = _data$i.percentForLabel,
value = _data$i.value;
var formatterType = (0, _typeof2["default"])(formatter);
var label = '';
if (formatterType === 'string') {
label = formatter.replace('{name}', name);
label = label.replace('{percent}', percentForLabel);
label = label.replace('{value}', value);
}
if (formatterType === 'function') {
label = formatter(data[i]);
}
return {
content: label,
position: labelLine[2]
};
}
function getOutsideLabelStyle(pieItem, i) {
var outsideLabel = pieItem.outsideLabel,
data = pieItem.data;
var _data$i2 = data[i],
color = _data$i2.color,
align = _data$i2.align;
var style = outsideLabel.style;
return (0, _util2.deepMerge)(_objectSpread({
fill: color
}, align), style);
}