framework7
Version:
Full featured mobile HTML framework for building iOS & Android apps
526 lines (450 loc) • 17.2 kB
JavaScript
"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 AreaChart = /*#__PURE__*/function (_Framework7Class) {
_inheritsLoose(AreaChart, _Framework7Class);
function AreaChart(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.areaChart); // 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].f7AreaChart) return $el[0].f7AreaChart || _assertThisInitialized(_this);
(0, _utils.extend)(self, {
app: app,
$el: $el,
el: $el && $el[0],
currentIndex: null,
hiddenDatasets: [],
f7Tooltip: null,
linesOffsets: null
});
$el[0].f7AreaChart = self; // Install Modules
self.useModules();
self.onMouseEnter = self.onMouseEnter.bind(self);
self.onMouseMove = self.onMouseMove.bind(self);
self.onMouseLeave = self.onMouseLeave.bind(self);
self.onLegendClick = self.onLegendClick.bind(self);
self.init();
return self || _assertThisInitialized(_this);
}
var _proto = AreaChart.prototype;
_proto.getVisibleLabels = function getVisibleLabels() {
var _this$params = this.params,
maxAxisLabels = _this$params.maxAxisLabels,
axisLabels = _this$params.axisLabels;
if (!maxAxisLabels || axisLabels.length <= maxAxisLabels) return axisLabels;
var skipStep = Math.ceil(axisLabels.length / maxAxisLabels);
var filtered = axisLabels.filter(function (label, index) {
return index % skipStep === 0;
});
return filtered;
};
_proto.getSummValues = function getSummValues() {
var datasets = this.params.datasets;
var hiddenDatasets = this.hiddenDatasets;
var summValues = [];
datasets.filter(function (dataset, index) {
return !hiddenDatasets.includes(index);
}).forEach(function (_ref) {
var values = _ref.values;
values.forEach(function (value, valueIndex) {
if (!summValues[valueIndex]) summValues[valueIndex] = 0;
summValues[valueIndex] += value;
});
});
return summValues;
};
_proto.getChartData = function getChartData() {
var _this$params2 = this.params,
datasets = _this$params2.datasets,
lineChart = _this$params2.lineChart,
width = _this$params2.width,
height = _this$params2.height;
var hiddenDatasets = this.hiddenDatasets;
var data = [];
if (!datasets.length) {
return data;
}
var lastValues = datasets[0].values.map(function () {
return 0;
});
var maxValue = 0;
if (lineChart) {
datasets.filter(function (dataset, index) {
return !hiddenDatasets.includes(index);
}).forEach(function (_ref2) {
var values = _ref2.values;
var datasetMaxValue = Math.max.apply(Math, values);
if (datasetMaxValue > maxValue) maxValue = datasetMaxValue;
});
} else {
maxValue = Math.max.apply(Math, this.getSummValues());
}
datasets.filter(function (dataset, index) {
return !hiddenDatasets.includes(index);
}).forEach(function (_ref3) {
var label = _ref3.label,
values = _ref3.values,
color = _ref3.color;
var points = values.map(function (originalValue, valueIndex) {
lastValues[valueIndex] += originalValue;
var value = lineChart ? originalValue : lastValues[valueIndex];
var x = valueIndex / (values.length - 1) * width;
var y = height - value / maxValue * height;
if (lineChart) {
return "" + (valueIndex === 0 ? 'M' : 'L') + x + "," + y;
}
return x + " " + y;
});
if (!lineChart) {
points.push(width + " " + height + " 0 " + height);
}
data.push({
label: label,
points: points.join(' '),
color: color
});
});
return data.reverse();
};
_proto.getVerticalLines = function getVerticalLines() {
var _this$params3 = this.params,
datasets = _this$params3.datasets,
width = _this$params3.width;
var lines = [];
if (!datasets.length) {
return lines;
}
var values = datasets[0].values;
values.forEach(function (value, valueIndex) {
var x = valueIndex / (values.length - 1) * width;
lines.push(x);
});
return lines;
};
_proto.toggleDataset = function toggleDataset(index) {
var _this2 = this;
var hiddenDatasets = this.hiddenDatasets,
toggleDatasets = this.params.toggleDatasets;
if (!toggleDatasets) return;
if (hiddenDatasets.includes(index)) {
hiddenDatasets.splice(hiddenDatasets.indexOf(index), 1);
} else {
hiddenDatasets.push(index);
}
if (this.$legendEl) {
this.$legendEl.find('.area-chart-legend-item').removeClass('area-chart-legend-item-hidden');
hiddenDatasets.forEach(function (i) {
_this2.$legendEl.find(".area-chart-legend-item[data-index=\"" + i + "\"]").addClass('area-chart-legend-item-hidden');
});
}
this.update({}, true);
};
_proto.formatAxisLabel = function formatAxisLabel(label) {
var formatAxisLabel = this.params.formatAxisLabel;
if (formatAxisLabel) return formatAxisLabel.call(this, label);
return label;
};
_proto.formatLegendLabel = function formatLegendLabel(label) {
var formatLegendLabel = this.params.formatLegendLabel;
if (formatLegendLabel) return formatLegendLabel.call(this, label);
return label;
};
_proto.calcLinesOffsets = function calcLinesOffsets() {
var lines = this.svgEl.querySelectorAll('line');
this.linesOffsets = [];
for (var i = 0; i < lines.length; i += 1) {
this.linesOffsets.push(lines[i].getBoundingClientRect().left);
}
};
_proto.formatTooltip = function formatTooltip() {
var self = this;
var currentIndex = self.currentIndex,
hiddenDatasets = self.hiddenDatasets,
_self$params = self.params,
datasets = _self$params.datasets,
axisLabels = _self$params.axisLabels,
formatTooltip = _self$params.formatTooltip,
formatTooltipTotal = _self$params.formatTooltipTotal,
formatTooltipAxisLabel = _self$params.formatTooltipAxisLabel,
formatTooltipDataset = _self$params.formatTooltipDataset;
if (currentIndex === null) return '';
var total = 0;
var currentValues = datasets.filter(function (dataset, index) {
return !hiddenDatasets.includes(index);
}).map(function (dataset) {
return {
color: dataset.color,
label: dataset.label,
value: dataset.values[currentIndex]
};
});
currentValues.forEach(function (dataset) {
total += dataset.value;
});
if (formatTooltip) {
return formatTooltip({
index: currentIndex,
total: total,
datasets: currentValues
});
}
var labelText = formatTooltipAxisLabel ? formatTooltipAxisLabel.call(self, axisLabels[currentIndex]) : this.formatAxisLabel(axisLabels[currentIndex]);
if (!labelText) labelText = '';
var totalText = formatTooltipTotal ? formatTooltipTotal.call(self, total) : total; // prettier-ignore
var datasetsText = currentValues.length > 0 ? "\n <ul class=\"area-chart-tooltip-list\">\n " + currentValues.map(function (_ref4) {
var label = _ref4.label,
color = _ref4.color,
value = _ref4.value;
var valueText = formatTooltipDataset ? formatTooltipDataset.call(self, label, value, color) : "" + (label ? label + ": " : '') + value;
return "\n <li><span style=\"background-color: " + color + ";\"></span>" + valueText + "</li>\n ";
}).join('') + "\n </ul>" : ''; // prettier-ignore
return "\n <div class=\"area-chart-tooltip-label\">" + labelText + "</div>\n <div class=\"area-chart-tooltip-total\">" + totalText + "</div>\n " + datasetsText + "\n ";
};
_proto.setTooltip = function setTooltip() {
var self = this;
var app = self.app,
el = self.el,
svgEl = self.svgEl,
hiddenDatasets = self.hiddenDatasets,
currentIndex = self.currentIndex,
_self$params2 = self.params,
tooltip = _self$params2.tooltip,
datasets = _self$params2.datasets;
if (!tooltip) return;
var hasVisibleDataSets = datasets.filter(function (dataset, index) {
return !hiddenDatasets.includes(index);
}).length > 0;
if (!hasVisibleDataSets) {
if (self.f7Tooltip && self.f7Tooltip.hide) self.f7Tooltip.hide();
return;
}
if (currentIndex !== null && !self.f7Tooltip) {
self.f7Tooltip = app.tooltip.create({
trigger: 'manual',
containerEl: el,
targetEl: svgEl.querySelector("line[data-index=\"" + currentIndex + "\"]"),
text: self.formatTooltip(),
cssClass: 'area-chart-tooltip'
});
if (self.f7Tooltip && self.f7Tooltip.show) {
self.f7Tooltip.show();
}
return;
}
if (!self.f7Tooltip || !self.f7Tooltip.hide || !self.f7Tooltip.show) {
return;
}
if (currentIndex !== null) {
self.f7Tooltip.setText(self.formatTooltip());
self.f7Tooltip.setTargetEl(svgEl.querySelector("line[data-index=\"" + currentIndex + "\"]"));
self.f7Tooltip.show();
} else {
self.f7Tooltip.hide();
}
};
_proto.setCurrentIndex = function setCurrentIndex(index) {
if (index === this.currentIndex) return;
this.currentIndex = index;
this.$el.trigger('areachart:select', {
index: index
});
this.emit('local::select areaChartSelect', this, index);
this.$svgEl.find('line').removeClass('area-chart-current-line');
this.$svgEl.find("line[data-index=\"" + index + "\"]").addClass('area-chart-current-line');
this.setTooltip();
};
_proto.onLegendClick = function onLegendClick(e) {
var index = parseInt((0, _dom.default)(e.target).closest('.area-chart-legend-item').attr('data-index'), 10);
this.toggleDataset(index);
};
_proto.onMouseEnter = function onMouseEnter() {
this.calcLinesOffsets();
};
_proto.onMouseMove = function onMouseMove(e) {
var self = this;
if (!self.linesOffsets) {
self.calcLinesOffsets();
}
var currentLeft = e.pageX;
if (typeof currentLeft === 'undefined') currentLeft = 0;
var distances = self.linesOffsets.map(function (left) {
return Math.abs(currentLeft - left);
});
var minDistance = Math.min.apply(Math, distances);
var closestIndex = distances.indexOf(minDistance);
self.setCurrentIndex(closestIndex);
};
_proto.onMouseLeave = function onMouseLeave() {
this.setCurrentIndex(null);
};
_proto.attachEvents = function attachEvents() {
var svgEl = this.svgEl,
$el = this.$el;
if (!svgEl) return;
svgEl.addEventListener('mouseenter', this.onMouseEnter);
svgEl.addEventListener('mousemove', this.onMouseMove);
svgEl.addEventListener('mouseleave', this.onMouseLeave);
$el.on('click', '.area-chart-legend-item', this.onLegendClick);
};
_proto.detachEvents = function detachEvents() {
var svgEl = this.svgEl,
$el = this.$el;
if (!svgEl) return;
svgEl.removeEventListener('mouseenter', this.onMouseEnter);
svgEl.removeEventListener('mousemove', this.onMouseMove);
svgEl.removeEventListener('mouseleave', this.onMouseLeave);
$el.off('click', '.area-chart-legend-item', this.onLegendClick);
};
_proto.render = function render() {
var self = this;
var _self$params3 = self.params,
lineChart = _self$params3.lineChart,
toggleDatasets = _self$params3.toggleDatasets,
width = _self$params3.width,
height = _self$params3.height,
axis = _self$params3.axis,
axisLabels = _self$params3.axisLabels,
legend = _self$params3.legend,
datasets = _self$params3.datasets;
var chartData = self.getChartData();
var verticalLines = self.getVerticalLines();
var visibleLegends = self.getVisibleLabels();
var LegendItemTag = toggleDatasets ? 'button' : 'span';
return (0, _$jsx.default)("div", null, (0, _$jsx.default)("svg", {
xmlns: "http://www.w3.org/2000/svg",
width: width,
height: height,
viewBox: "0 0 " + width + " " + height,
preserveAspectRatio: "none"
}, chartData.map(function (data) {
return lineChart ? (0, _$jsx.default)("path", {
stroke: data.color,
"fill-rule": "evenodd",
d: data.points
}) : (0, _$jsx.default)("polygon", {
fill: data.color,
"fill-rule": "evenodd",
points: data.points
});
}), verticalLines.map(function (line, index) {
return (0, _$jsx.default)("line", {
"data-index": index,
fill: "#000",
x1: line,
y1: 0,
x2: line,
y2: height
});
})), axis && (0, _$jsx.default)("div", {
class: "area-chart-axis"
}, axisLabels.map(function (label) {
return (0, _$jsx.default)("span", null, visibleLegends.includes(label) && (0, _$jsx.default)("span", null, self.formatAxisLabel(label)));
})), legend && (0, _$jsx.default)("div", {
class: "area-chart-legend"
}, datasets.map(function (dataset, index) {
return (0, _$jsx.default)(LegendItemTag, {
"data-index": index,
class: "area-chart-legend-item " + (toggleDatasets ? 'area-chart-legend-button' : ''),
_type: toggleDatasets ? 'button' : undefined
}, (0, _$jsx.default)("span", {
style: "background-color: " + dataset.color
}), self.formatLegendLabel(dataset.label));
})));
};
_proto.update = function update(newParams, onlySvg) {
if (newParams === void 0) {
newParams = {};
}
if (onlySvg === void 0) {
onlySvg = false;
}
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.detachEvents();
self.$svgEl.remove();
if (!onlySvg) {
self.$axisEl.remove();
self.$legendEl.remove();
}
var $rendered = (0, _dom.default)(self.render());
var $svgEl = $rendered.find('svg');
(0, _utils.extend)(self, {
svgEl: $svgEl && $svgEl[0],
$svgEl: $svgEl
});
if (!onlySvg) {
var $axisEl = $rendered.find('.area-chart-axis');
var $legendEl = $rendered.find('.area-chart-legend');
(0, _utils.extend)(self, {
$axisEl: $axisEl,
$legendEl: $legendEl
});
self.$el.append($axisEl);
self.$el.append($legendEl);
}
self.$el.prepend($svgEl);
self.attachEvents();
return self;
};
_proto.init = function init() {
var self = this;
var $rendered = (0, _dom.default)(self.render());
var $svgEl = $rendered.find('svg');
var $axisEl = $rendered.find('.area-chart-axis');
var $legendEl = $rendered.find('.area-chart-legend');
(0, _utils.extend)(self, {
svgEl: $svgEl && $svgEl[0],
$svgEl: $svgEl,
$axisEl: $axisEl,
$legendEl: $legendEl
});
self.$el.append($svgEl);
self.$el.append($axisEl);
self.$el.append($legendEl);
self.attachEvents();
return self;
};
_proto.destroy = function destroy() {
var self = this;
if (!self.$el || self.destroyed) return;
self.$el.trigger('piechart:beforedestroy');
self.emit('local::beforeDestroy areaChartBeforeDestroy', self);
self.detachEvents();
self.$svgEl.remove();
self.$axisEl.remove();
self.$legendEl.remove();
if (self.f7Tooltip && self.f7Tooltip.destroy) {
self.f7Tooltip.destroy();
}
delete self.$el[0].f7AreaChart;
(0, _utils.deleteProps)(self);
self.destroyed = true;
};
return AreaChart;
}(_class.default);
var _default = AreaChart;
exports.default = _default;