UNPKG

framework7

Version:

Full featured mobile HTML framework for building iOS & Android apps

290 lines (241 loc) 9.21 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _dom = _interopRequireDefault(require("../../shared/dom7")); var _utils = require("../../shared/utils"); var _class = _interopRequireDefault(require("../../shared/class")); var _$jsx = _interopRequireDefault(require("../../shared/$jsx")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var PieChart = /*#__PURE__*/function (_Framework7Class) { _inheritsLoose(PieChart, _Framework7Class); function PieChart(app, params) { var _this; if (params === void 0) { params = {}; } _this = _Framework7Class.call(this, params, [app]) || this; var self = _assertThisInitialized(_this); var defaults = (0, _utils.extend)({}, app.params.pieChart); // Extend defaults with modules params self.useModulesParams(defaults); self.params = (0, _utils.extend)(defaults, params); var el = self.params.el; if (!el) return self || _assertThisInitialized(_this); var $el = (0, _dom.default)(el); if ($el.length === 0) return self || _assertThisInitialized(_this); if ($el[0].f7PieChart) return $el[0].f7PieChart || _assertThisInitialized(_this); (0, _utils.extend)(self, { app: app, $el: $el, el: $el && $el[0], currentIndex: null, f7Tooltip: null }); $el[0].f7PieChart = self; // Install Modules self.useModules(); self.showTooltip = self.showTooltip.bind(_assertThisInitialized(_this)); self.hideTooltip = self.hideTooltip.bind(_assertThisInitialized(_this)); self.init(); return self || _assertThisInitialized(_this); } var _proto = PieChart.prototype; _proto.getSummValue = function getSummValue() { var datasets = this.params.datasets; var summ = 0; datasets.map(function (d) { return d.value || 0; }).forEach(function (value) { summ += value; }); return summ; }; _proto.getPaths = function getPaths() { var _this2 = this; var _this$params = this.params, datasets = _this$params.datasets, size = _this$params.size; var paths = []; var cumulativePercentage = 0; function getCoordinatesForPercentage(percentage) { var x = Math.cos(2 * Math.PI * percentage) * (size / 3); var y = Math.sin(2 * Math.PI * percentage) * (size / 3); return [x, y]; } datasets.forEach(function (_ref) { var value = _ref.value, label = _ref.label, color = _ref.color; var percentage = value / _this2.getSummValue(); var _getCoordinatesForPer = getCoordinatesForPercentage(cumulativePercentage), startX = _getCoordinatesForPer[0], startY = _getCoordinatesForPer[1]; cumulativePercentage += percentage; var _getCoordinatesForPer2 = getCoordinatesForPercentage(cumulativePercentage), endX = _getCoordinatesForPer2[0], endY = _getCoordinatesForPer2[1]; var largeArcFlag = percentage > 0.5 ? 1 : 0; var points = ["M " + startX + " " + startY, // Move "A " + size / 3 + " " + size / 3 + " 0 " + largeArcFlag + " 1 " + endX + " " + endY, // Arc 'L 0 0' // Line ].join(' '); paths.push({ points: points, label: label, color: color }); }); return paths; }; _proto.formatTooltipText = function formatTooltipText() { var datasets = this.params.datasets; var currentIndex = this.currentIndex; if (currentIndex === null) return ''; var _datasets$currentInde = datasets[currentIndex], value = _datasets$currentInde.value, label = _datasets$currentInde.label, color = _datasets$currentInde.color; var percentage = value / this.getSummValue() * 100; var round = function round(v) { if (parseInt(v, 10) === v) return v; return Math.round(v * 100) / 100; }; if (this.params.formatTooltip) { return this.params.formatTooltip.call(this, { index: currentIndex, value: value, label: label, color: color, percentage: percentage }); } var tooltipText = "" + (label ? label + ": " : '') + round(value) + " (" + round(percentage) + "%)"; return "\n <div class=\"pie-chart-tooltip-label\">\n <span class=\"pie-chart-tooltip-color\" style=\"background-color: " + color + ";\"></span> " + tooltipText + "\n </div>\n "; }; _proto.setTooltip = function setTooltip() { var self = this; var currentIndex = self.currentIndex, el = self.el, app = self.app, params = self.params; var tooltip = params.tooltip; if (currentIndex === null && !self.f7Tooltip) return; if (!tooltip || !el) return; if (currentIndex !== null && !self.f7Tooltip) { self.f7Tooltip = app.tooltip.create({ trigger: 'manual', containerEl: el, targetEl: el.querySelector("path[data-index=\"" + currentIndex + "\"]"), text: self.formatTooltipText(), cssClass: 'pie-chart-tooltip' }); self.f7Tooltip.show(); return; } if (!self.f7Tooltip) return; if (currentIndex !== null) { self.f7Tooltip.setText(self.formatTooltipText()); self.f7Tooltip.setTargetEl(el.querySelector("path[data-index=\"" + currentIndex + "\"]")); self.f7Tooltip.show(); } else { self.f7Tooltip.hide(); } }; _proto.render = function render() { var self = this; var size = self.params.size; var paths = self.getPaths(); return (0, _$jsx.default)("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, viewBox: "-" + size / 3 + " -" + size / 3 + " " + size * 2 / 3 + " " + size * 2 / 3, style: "transform: rotate(-90deg)" }, paths.map(function (path, index) { return (0, _$jsx.default)("path", { d: path.points, fill: path.color, "data-index": index }); })); }; _proto.update = function update(newParams) { if (newParams === void 0) { newParams = {}; } var self = this; var params = self.params; Object.keys(newParams).forEach(function (param) { if (typeof newParams[param] !== 'undefined') { params[param] = newParams[param]; } }); if (self.$svgEl.length === 0) return self; self.$svgEl.remove(); delete self.$svgEl.f7PieChart; var $svgEl = (0, _dom.default)(self.render()).eq(0); $svgEl.f7PieChart = self; (0, _utils.extend)(self, { $svgEl: $svgEl, svgEl: $svgEl && $svgEl[0] }); self.$el.append($svgEl); return self; }; _proto.setCurrentIndex = function setCurrentIndex(index) { var self = this; if (index === self.currentIndex) return; var datasets = self.params.datasets; self.currentIndex = index; self.$el.trigger('piechart:select', { index: index, dataset: datasets[index] }); self.emit('local::select pieChartSelect', self, index, datasets[index]); }; _proto.showTooltip = function showTooltip(e) { var _this3 = this; var newIndex = parseInt(e.target.getAttribute('data-index'), 10); this.setCurrentIndex(newIndex); this.$svgEl.find('path').removeClass('pie-chart-hidden').forEach(function (el, index) { if (index !== _this3.currentIndex) (0, _dom.default)(el).addClass('pie-chart-hidden'); }); this.setTooltip(); }; _proto.hideTooltip = function hideTooltip() { this.setCurrentIndex(null); this.$svgEl.find('path').removeClass('pie-chart-hidden'); this.setTooltip(); }; _proto.init = function init() { var self = this; var $svgEl = (0, _dom.default)(self.render()).eq(0); $svgEl.f7PieChart = self; (0, _utils.extend)(self, { $svgEl: $svgEl, svgEl: $svgEl && $svgEl[0] }); self.$el.append($svgEl); self.$el.on('click mouseenter', 'path', self.showTooltip, true); self.$el.on('mouseleave', 'path', self.hideTooltip, true); return self; }; _proto.destroy = function destroy() { var self = this; if (!self.$el || self.destroyed) return; self.$el.trigger('piechart:beforedestroy'); self.emit('local::beforeDestroy pieChartBeforeDestroy', self); self.$el.off('click mouseenter', 'path', self.showTooltip, true); self.$el.off('mouseleave', 'path', self.hideTooltip, true); self.$svgEl.remove(); if (self.f7Tooltip && self.f7Tooltip.destroy) { self.f7Tooltip.destroy(); } delete self.$el[0].f7PieChart; (0, _utils.deleteProps)(self); self.destroyed = true; }; return PieChart; }(_class.default); var _default = PieChart; exports.default = _default;