"use strict"; 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); }