diff --git a/dist/frappe-charts.min.cjs.js b/dist/frappe-charts.min.cjs.js
index 1bfdd2f..bd84d10 100644
--- a/dist/frappe-charts.min.cjs.js
+++ b/dist/frappe-charts.min.cjs.js
@@ -284,15 +284,6 @@ function $(expr, con) {
return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null;
}
-var EASING = {
- ease: "0.25 0.1 0.25 1",
- linear: "0 0 1 1",
- // easein: "0.42 0 1 1",
- easein: "0.1 0.8 0.2 1",
- easeout: "0 0 0.58 1",
- easeinout: "0.42 0 0.58 1"
-};
-
$.findNodeIndex = function (node) {
var i = 0;
while (node.previousSibling) {
@@ -357,112 +348,6 @@ $.createSVG = function (tag, o) {
return element;
};
-$.runSVGAnimation = function (svg_container, elements) {
- // let parent = elements[0][0]['unit'].parentNode;
-
- var new_elements = [];
- var anim_elements = [];
-
- elements.map(function (element) {
- var obj = element[0];
- var parent = obj.unit.parentNode;
- // let index = let findNodeIndex(obj.unit);
-
- var anim_element = void 0,
- new_element = void 0;
-
- element[0] = obj.unit;
-
- var _$$animateSVG = $.animateSVG.apply($, toConsumableArray(element));
-
- var _$$animateSVG2 = slicedToArray(_$$animateSVG, 2);
-
- anim_element = _$$animateSVG2[0];
- new_element = _$$animateSVG2[1];
-
-
- new_elements.push(new_element);
- anim_elements.push([anim_element, parent]);
-
- parent.replaceChild(anim_element, obj.unit);
-
- if (obj.array) {
- obj.array[obj.index] = new_element;
- } else {
- obj.object[obj.key] = new_element;
- }
- });
-
- var anim_svg = svg_container.cloneNode(true);
-
- anim_elements.map(function (anim_element, i) {
- anim_element[1].replaceChild(new_elements[i], anim_element[0]);
- elements[i][0] = new_elements[i];
- });
-
- return anim_svg;
-};
-
-$.transform = function (element, style) {
- element.style.transform = style;
- element.style.webkitTransform = style;
- element.style.msTransform = style;
- element.style.mozTransform = style;
- element.style.oTransform = style;
-};
-
-$.animateSVG = function (element, props, dur) {
- var easing_type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "linear";
- var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;
- var old_values = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
-
-
- var anim_element = element.cloneNode(true);
- var new_element = element.cloneNode(true);
-
- for (var attributeName in props) {
- var animate_element = void 0;
- if (attributeName === 'transform') {
- animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform");
- } else {
- animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animate");
- }
- var current_value = old_values[attributeName] || element.getAttribute(attributeName);
- var value = props[attributeName];
-
- var anim_attr = {
- attributeName: attributeName,
- from: current_value,
- to: value,
- begin: "0s",
- dur: dur / 1000 + "s",
- values: current_value + ";" + value,
- keySplines: EASING[easing_type],
- keyTimes: "0;1",
- calcMode: "spline",
- fill: 'freeze'
- };
-
- if (type) {
- anim_attr["type"] = type;
- }
-
- for (var i in anim_attr) {
- animate_element.setAttribute(i, anim_attr[i]);
- }
-
- anim_element.appendChild(animate_element);
-
- if (type) {
- new_element.setAttribute(attributeName, "translate(" + value + ")");
- } else {
- new_element.setAttribute(attributeName, value);
- }
- }
-
- return [anim_element, new_element];
-};
-
$.offset = function (element) {
var rect = element.getBoundingClientRect();
return {
@@ -519,10 +404,421 @@ $.fire = function (target, type, properties) {
return target.dispatchEvent(evt);
};
+var UnitRenderer = function () {
+ var UnitRenderer = function UnitRenderer(total_height, zero_line, avg_unit_width) {
+ this.total_height = total_height;
+ this.zero_line = zero_line;
+ this.avg_unit_width = avg_unit_width;
+ };
+
+ function get_bar_height_and_y_attr(y_top, zero_line, total_height) {
+ var height = void 0,
+ y = void 0;
+ if (y_top <= zero_line) {
+ height = zero_line - y_top;
+ y = y_top;
+
+ // In case of invisible bars
+ if (height === 0) {
+ height = total_height * 0.01;
+ y -= height;
+ }
+ } else {
+ height = y_top - zero_line;
+ y = zero_line;
+
+ // In case of invisible bars
+ if (height === 0) {
+ height = total_height * 0.01;
+ }
+ }
+
+ return [height, y];
+ }
+
+ UnitRenderer.prototype = {
+ draw_bar: function draw_bar(x, y_top, args, color, index, dataset_index, no_of_datasets) {
+ var total_width = this.avg_unit_width - args.space_width;
+ var start_x = x - total_width / 2;
+
+ var width = total_width / no_of_datasets;
+ var current_x = start_x + width * dataset_index;
+
+ var _get_bar_height_and_y = get_bar_height_and_y_attr(y_top, this.zero_line, this.total_height),
+ _get_bar_height_and_y2 = slicedToArray(_get_bar_height_and_y, 2),
+ height = _get_bar_height_and_y2[0],
+ y = _get_bar_height_and_y2[1];
+
+ return $.createSVG('rect', {
+ className: 'bar mini fill ' + color,
+ 'data-point-index': index,
+ x: current_x,
+ y: y,
+ width: width,
+ height: height
+ });
+ },
+
+ draw_dot: function draw_dot(x, y, args, color, index) {
+ return $.createSVG('circle', {
+ className: 'fill ' + color,
+ 'data-point-index': index,
+ cx: x,
+ cy: y,
+ r: args.radius
+ });
+ },
+
+ animate_bar: function animate_bar(bar_obj, x, y_top, index, no_of_datasets) {
+ var start = x - this.avg_unit_width / 4;
+ var width = this.avg_unit_width / 2 / no_of_datasets;
+
+ var _get_bar_height_and_y3 = get_bar_height_and_y_attr(y_top, this.zero_line, this.total_height),
+ _get_bar_height_and_y4 = slicedToArray(_get_bar_height_and_y3, 2),
+ height = _get_bar_height_and_y4[0],
+ y = _get_bar_height_and_y4[1];
+
+ x = start + width * index;
+
+ return [bar_obj, { width: width, height: height, x: x, y: y }, 350, "easein"];
+ // bar.animate({height: args.new_height, y: y_top}, 350, mina.easein);
+ },
+
+ animate_dot: function animate_dot(dot_obj, x, y_top) {
+ return [dot_obj, { cx: x, cy: y_top }, 350, "easein"];
+ // dot.animate({cy: y_top}, 350, mina.easein);
+ }
+ };
+
+ return UnitRenderer;
+}();
+
+function make_x_line(height, text_start_at, point, label_class, axis_line_class, x_pos) {
+ var line = $.createSVG('line', {
+ x1: 0,
+ x2: 0,
+ y1: 0,
+ y2: height
+ });
+
+ var text = $.createSVG('text', {
+ className: label_class,
+ x: 0,
+ y: text_start_at,
+ dy: '.71em',
+ innerHTML: point
+ });
+
+ var x_line = $.createSVG('g', {
+ className: 'tick ' + axis_line_class,
+ transform: 'translate(' + x_pos + ', 0)'
+ });
+
+ x_line.appendChild(line);
+ x_line.appendChild(text);
+
+ return x_line;
+}
+
+function make_y_line(start_at, width, text_end_at, point, label_class, axis_line_class, y_pos) {
+ var darker = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
+ var line_type = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : "";
+
+ var line = $.createSVG('line', {
+ className: line_type === "dashed" ? "dashed" : "",
+ x1: start_at,
+ x2: width,
+ y1: 0,
+ y2: 0
+ });
+
+ var text = $.createSVG('text', {
+ className: label_class,
+ x: text_end_at,
+ y: 0,
+ dy: '.32em',
+ innerHTML: point + ""
+ });
+
+ var y_line = $.createSVG('g', {
+ className: 'tick ' + axis_line_class,
+ transform: 'translate(0, ' + y_pos + ')',
+ 'stroke-opacity': 1
+ });
+
+ if (darker) {
+ line.style.stroke = "rgba(27, 31, 35, 0.6)";
+ }
+
+ y_line.appendChild(line);
+ y_line.appendChild(text);
+
+ return y_line;
+}
+
+// Leveraging SMIL Animations
+
+var EASING = {
+ ease: "0.25 0.1 0.25 1",
+ linear: "0 0 1 1",
+ // easein: "0.42 0 1 1",
+ easein: "0.1 0.8 0.2 1",
+ easeout: "0 0 0.58 1",
+ easeinout: "0.42 0 0.58 1"
+};
+
+function animateSVG(element, props, dur) {
+ var easing_type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "linear";
+ var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;
+ var old_values = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
+
+
+ var anim_element = element.cloneNode(true);
+ var new_element = element.cloneNode(true);
+
+ for (var attributeName in props) {
+ var animate_element = void 0;
+ if (attributeName === 'transform') {
+ animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform");
+ } else {
+ animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animate");
+ }
+ var current_value = old_values[attributeName] || element.getAttribute(attributeName);
+ var value = props[attributeName];
+
+ var anim_attr = {
+ attributeName: attributeName,
+ from: current_value,
+ to: value,
+ begin: "0s",
+ dur: dur / 1000 + "s",
+ values: current_value + ";" + value,
+ keySplines: EASING[easing_type],
+ keyTimes: "0;1",
+ calcMode: "spline",
+ fill: 'freeze'
+ };
+
+ if (type) {
+ anim_attr["type"] = type;
+ }
+
+ for (var i in anim_attr) {
+ animate_element.setAttribute(i, anim_attr[i]);
+ }
+
+ anim_element.appendChild(animate_element);
+
+ if (type) {
+ new_element.setAttribute(attributeName, "translate(" + value + ")");
+ } else {
+ new_element.setAttribute(attributeName, value);
+ }
+ }
+
+ return [anim_element, new_element];
+}
+
+function transform(element, style) {
+ // eslint-disable-line no-unused-vars
+ element.style.transform = style;
+ element.style.webkitTransform = style;
+ element.style.msTransform = style;
+ element.style.mozTransform = style;
+ element.style.oTransform = style;
+}
+
+function runSVGAnimation(svg_container, elements) {
+ var new_elements = [];
+ var anim_elements = [];
+
+ elements.map(function (element) {
+ var obj = element[0];
+ var parent = obj.unit.parentNode;
+
+ var anim_element = void 0,
+ new_element = void 0;
+
+ element[0] = obj.unit;
+
+ var _animateSVG = animateSVG.apply(undefined, toConsumableArray(element));
+
+ var _animateSVG2 = slicedToArray(_animateSVG, 2);
+
+ anim_element = _animateSVG2[0];
+ new_element = _animateSVG2[1];
+
+
+ new_elements.push(new_element);
+ anim_elements.push([anim_element, parent]);
+
+ parent.replaceChild(anim_element, obj.unit);
+
+ if (obj.array) {
+ obj.array[obj.index] = new_element;
+ } else {
+ obj.object[obj.key] = new_element;
+ }
+ });
+
+ var anim_svg = svg_container.cloneNode(true);
+
+ anim_elements.map(function (anim_element, i) {
+ anim_element[1].replaceChild(new_elements[i], anim_element[0]);
+ elements[i][0] = new_elements[i];
+ });
+
+ return anim_svg;
+}
+
+// export function calc_intervals() {
+// //
+// }
+
+function calc_y_intervals(array) {
+ //*** Where the magic happens ***
+
+ // Calculates best-fit y intervals from given values
+ // and returns the interval array
+
+ // TODO: Fractions
+
+ var max_bound = void 0,
+ min_bound = void 0,
+ pos_no_of_parts = void 0,
+ neg_no_of_parts = void 0,
+ part_size = void 0; // eslint-disable-line no-unused-vars
+
+ // Critical values
+ var max_val = parseInt(Math.max.apply(Math, toConsumableArray(array)));
+ var min_val = parseInt(Math.min.apply(Math, toConsumableArray(array)));
+ if (min_val >= 0) {
+ min_val = 0;
+ }
+
+ var get_params = function get_params(value1, value2) {
+ var bound1 = void 0,
+ bound2 = void 0,
+ no_of_parts_1 = void 0,
+ no_of_parts_2 = void 0,
+ interval_size = void 0;
+ if ((value1 + "").length <= 1) {
+ bound1 = 10;
+ no_of_parts_1 = 5;
+ } else {
+ var _calc_upper_bound_and = calc_upper_bound_and_no_of_parts(value1);
+
+ var _calc_upper_bound_and2 = slicedToArray(_calc_upper_bound_and, 2);
+
+ bound1 = _calc_upper_bound_and2[0];
+ no_of_parts_1 = _calc_upper_bound_and2[1];
+ }
+
+ interval_size = bound1 / no_of_parts_1;
+ no_of_parts_2 = calc_no_of_parts(value2, interval_size);
+ bound2 = no_of_parts_2 * interval_size;
+
+ return [bound1, bound2, no_of_parts_1, no_of_parts_2, interval_size];
+ };
+
+ var abs_min_val = min_val * -1;
+ if (abs_min_val <= max_val) {
+ var _get_params = get_params(max_val, abs_min_val);
+ // Get the positive region intervals
+ // then calc negative ones accordingly
+
+
+ var _get_params2 = slicedToArray(_get_params, 5);
+
+ min_bound = _get_params2[1];
+ pos_no_of_parts = _get_params2[2];
+ neg_no_of_parts = _get_params2[3];
+ part_size = _get_params2[4];
+
+ if (abs_min_val === 0) {
+ min_bound = 0;neg_no_of_parts = 0;
+ }
+ } else {
+ var _get_params3 = get_params(abs_min_val, max_val);
+ // Get the negative region here first
+
+
+ var _get_params4 = slicedToArray(_get_params3, 5);
+
+ min_bound = _get_params4[0];
+ neg_no_of_parts = _get_params4[2];
+ pos_no_of_parts = _get_params4[3];
+ part_size = _get_params4[4];
+ }
+
+ // Make both region parts even
+ if (pos_no_of_parts % 2 !== 0 && neg_no_of_parts > 0) pos_no_of_parts++;
+ if (neg_no_of_parts % 2 !== 0) {
+ // every increase in no_of_parts entails an increase in corresponding bound
+ // except here, it happens implicitly after every calc_no_of_parts() call
+ neg_no_of_parts++;
+ min_bound += part_size;
+ }
+
+ var no_of_parts = pos_no_of_parts + neg_no_of_parts;
+ if (no_of_parts > 5) {
+ no_of_parts /= 2;
+ part_size *= 2;
+
+ pos_no_of_parts /= 2;
+ }
+
+ if (max_val < (pos_no_of_parts - 1) * part_size) {
+ no_of_parts--;
+ }
+
+ return get_intervals(-1 * min_bound, part_size, no_of_parts);
+}
+
+function get_intervals(start, interval_size, count) {
+ var intervals = [];
+ for (var i = 0; i <= count; i++) {
+ intervals.push(start);
+ start += interval_size;
+ }
+ return intervals;
+}
+
+function calc_upper_bound_and_no_of_parts(max_val) {
+ // Given a positive value, calculates a nice-number upper bound
+ // and a consequent optimal number of parts
+
+ var part_size = Math.pow(10, (max_val + "").length - 1);
+ var no_of_parts = calc_no_of_parts(max_val, part_size);
+
+ // Use it to get a nice even upper bound
+ var upper_bound = part_size * no_of_parts;
+
+ return [upper_bound, no_of_parts];
+}
+
+function calc_no_of_parts(value, divisor) {
+ // value should be a positive number, divisor should be greater than 0
+ // returns an even no of parts
+ var no_of_parts = Math.ceil(value / divisor);
+ if (no_of_parts % 2 !== 0) no_of_parts++; // Make it an even number
+
+ return no_of_parts;
+}
+
+/**
+ * Returns the value of a number upto 2 decimal places.
+ * @param {Number} d Any number
+ */
function float_2(d) {
return parseFloat(d.toFixed(2));
}
+/**
+ * Returns whether or not two given arrays are equal.
+ * @param {Array} arr1 First array
+ * @param {Array} arr2 Second array
+ */
function arrays_equal(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
var are_equal = true;
@@ -532,29 +828,21 @@ function arrays_equal(arr1, arr2) {
return are_equal;
}
-function limitColor(r) {
- if (r > 255) return 255;else if (r < 0) return 0;
- return r;
-}
-
-function lightenDarkenColor(col, amt) {
- var usePound = false;
- if (col[0] == "#") {
- col = col.slice(1);
- usePound = true;
- }
- var num = parseInt(col, 16);
- var r = limitColor((num >> 16) + amt);
- var b = limitColor((num >> 8 & 0x00FF) + amt);
- var g = limitColor((num & 0x0000FF) + amt);
- return (usePound ? "#" : "") + (g | b << 8 | r << 16).toString(16);
-}
-
/**
* Shuffles array in place. ES6 version
- * @param {Array} a items An array containing the items.
+ * @param {Array} array An array containing the items.
*/
+
+/**
+ * Returns pixel width of string.
+ * @param {String} string
+ * @param {Number} char_width Width of single char in pixels
+ */
+function get_string_width(string, char_width) {
+ return (string + "").length * char_width;
+}
+
var SvgTip = function () {
function SvgTip(_ref) {
var _ref$parent = _ref.parent,
@@ -696,6 +984,8 @@ var BaseChart = function () {
title = _ref$title === undefined ? '' : _ref$title,
_ref$subtitle = _ref.subtitle,
subtitle = _ref$subtitle === undefined ? '' : _ref$subtitle,
+ _ref$colors = _ref.colors,
+ colors = _ref$colors === undefined ? [] : _ref$colors,
_ref$format_lambdas = _ref.format_lambdas,
format_lambdas = _ref$format_lambdas === undefined ? {} : _ref$format_lambdas,
_ref$summary = _ref.summary,
@@ -728,6 +1018,11 @@ var BaseChart = function () {
}
this.has_legend = has_legend;
+ this.colors = colors;
+ if (!this.colors || this.data.labels && this.colors.length < this.data.labels.length) {
+ this.colors = ['light-blue', 'blue', 'violet', 'red', 'orange', 'yellow', 'green', 'light-green', 'purple', 'magenta'];
+ }
+
this.chart_types = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];
this.set_margins(height);
@@ -826,12 +1121,12 @@ var BaseChart = function () {
}, {
key: 'set_width',
value: function set_width() {
- var _this2 = this;
-
var special_values_width = 0;
+ var char_width = 8;
this.specific_values.map(function (val) {
- if (_this2.get_strwidth(val.title) > special_values_width) {
- special_values_width = _this2.get_strwidth(val.title) - 40;
+ var str_width = get_string_width(val.title + "", char_width);
+ if (str_width > special_values_width) {
+ special_values_width = str_width - 40;
}
});
this.base_width = this.parent.offsetWidth - special_values_width;
@@ -900,20 +1195,20 @@ var BaseChart = function () {
}, {
key: 'show_custom_summary',
value: function show_custom_summary() {
- var _this3 = this;
+ var _this2 = this;
this.summary.map(function (d) {
var stats = $.create('div', {
className: 'stats',
innerHTML: '' + d.title + ': ' + d.value + ''
});
- _this3.stats_wrapper.appendChild(stats);
+ _this2.stats_wrapper.appendChild(stats);
});
}
}, {
key: 'setup_navigation',
value: function setup_navigation() {
- var _this4 = this;
+ var _this3 = this;
var init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
@@ -923,19 +1218,19 @@ var BaseChart = function () {
this.bind_overlay();
document.addEventListener('keydown', function (e) {
- if ($.isElementInViewport(_this4.chart_wrapper)) {
+ if ($.isElementInViewport(_this3.chart_wrapper)) {
e = e || window.event;
if (e.keyCode == '37') {
- _this4.on_left_arrow();
+ _this3.on_left_arrow();
} else if (e.keyCode == '39') {
- _this4.on_right_arrow();
+ _this3.on_right_arrow();
} else if (e.keyCode == '38') {
- _this4.on_up_arrow();
+ _this3.on_up_arrow();
} else if (e.keyCode == '40') {
- _this4.on_down_arrow();
+ _this3.on_down_arrow();
} else if (e.keyCode == '13') {
- _this4.on_enter_key();
+ _this3.on_enter_key();
}
}
});
@@ -993,14 +1288,6 @@ var BaseChart = function () {
$.fire(this.parent, "data-select", this.get_data_point());
}
- // Helpers
-
- }, {
- key: 'get_strwidth',
- value: function get_strwidth(string) {
- return (string + "").length * 8;
- }
-
// Objects
}, {
@@ -1027,9 +1314,9 @@ var AxisChart = function (_BaseChart) {
_this.get_y_tooltip = _this.format_lambdas.y_tooltip;
_this.get_x_tooltip = _this.format_lambdas.x_tooltip;
- _this.colors = ['green', 'blue', 'violet', 'red', 'orange', 'yellow', 'light-blue', 'light-green', 'purple', 'magenta'];
-
_this.zero_line = _this.height;
+
+ _this.old_values = {};
return _this;
}
@@ -1075,7 +1362,7 @@ var AxisChart = function (_BaseChart) {
values = values.concat(this.y_sums);
}
- this.y_axis_values = this.get_y_axis_points(values);
+ this.y_axis_values = calc_y_intervals(values);
if (!this.y_old_axis_values) {
this.y_old_axis_values = this.y_axis_values.slice();
@@ -1150,6 +1437,7 @@ var AxisChart = function (_BaseChart) {
var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ var char_width = 8;
var start_at = void 0,
height = void 0,
text_start_at = void 0,
@@ -1179,7 +1467,7 @@ var AxisChart = function (_BaseChart) {
this.x_axis_group.textContent = '';
this.x.map(function (point, i) {
- var space_taken = _this4.get_strwidth(point) + 2;
+ var space_taken = get_string_width(point, char_width) + 2;
if (space_taken > allowed_space) {
if (_this4.is_series) {
// Skip some axis lines if X axis is a series
@@ -1194,7 +1482,7 @@ var AxisChart = function (_BaseChart) {
point = point.slice(0, allowed_letters - 3) + " ...";
}
}
- _this4.x_axis_group.appendChild(_this4.make_x_line(height, text_start_at, point, 'x-value-text', axis_line_class, _this4.x_axis_positions[i]));
+ _this4.x_axis_group.appendChild(make_x_line(height, text_start_at, point, 'x-value-text', axis_line_class, _this4.x_axis_positions[i]));
});
}
@@ -1222,7 +1510,7 @@ var AxisChart = function (_BaseChart) {
this.y_axis_group.textContent = '';
this.y_axis_values.map(function (value, i) {
- _this5.y_axis_group.appendChild(_this5.make_y_line(start_at, width, text_end_at, value, 'y-value-text', axis_line_class, _this5.zero_line - value * _this5.multiplier, value === 0 && i !== 0 // Non-first Zero line
+ _this5.y_axis_group.appendChild(make_y_line(start_at, width, text_end_at, value, 'y-value-text', axis_line_class, _this5.zero_line - value * _this5.multiplier, value === 0 && i !== 0 // Non-first Zero line
));
});
}
@@ -1318,7 +1606,6 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_new_units_for_dataset',
value: function make_new_units_for_dataset(x_values, y_values, color, dataset_index, no_of_datasets, units_group, units_array, unit) {
- var _this9 = this;
if (!units_group) units_group = this.svg_units_groups[dataset_index];
if (!units_array) units_array = this.y[dataset_index].svg_units;
@@ -1327,8 +1614,10 @@ var AxisChart = function (_BaseChart) {
units_group.textContent = '';
units_array.length = 0;
+ var unit_renderer = new UnitRenderer(this.height, this.zero_line, this.avg_unit_width);
+
y_values.map(function (y, i) {
- var data_unit = _this9.draw[unit.type](x_values[i], y, unit.args, color, i, dataset_index, no_of_datasets);
+ var data_unit = unit_renderer['draw_' + unit.type](x_values[i], y, unit.args, color, i, dataset_index, no_of_datasets);
units_group.appendChild(data_unit);
units_array.push(data_unit);
});
@@ -1340,35 +1629,35 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_y_specifics',
value: function make_y_specifics() {
- var _this10 = this;
+ var _this9 = this;
this.specific_y_group.textContent = '';
this.specific_values.map(function (d) {
- _this10.specific_y_group.appendChild(_this10.make_y_line(0, _this10.width, _this10.width + 5, d.title.toUpperCase(), 'specific-value', 'specific-value', _this10.zero_line - d.value * _this10.multiplier, false, d.line_type));
+ _this9.specific_y_group.appendChild(make_y_line(0, _this9.width, _this9.width + 5, d.title.toUpperCase(), 'specific-value', 'specific-value', _this9.zero_line - d.value * _this9.multiplier, false, d.line_type));
});
}
}, {
key: 'bind_tooltip',
value: function bind_tooltip() {
- var _this11 = this;
+ var _this10 = this;
// TODO: could be in tooltip itself, as it is a given functionality for its parent
this.chart_wrapper.addEventListener('mousemove', function (e) {
- var offset = $.offset(_this11.chart_wrapper);
- var relX = e.pageX - offset.left - _this11.translate_x;
- var relY = e.pageY - offset.top - _this11.translate_y;
+ var offset = $.offset(_this10.chart_wrapper);
+ var relX = e.pageX - offset.left - _this10.translate_x;
+ var relY = e.pageY - offset.top - _this10.translate_y;
- if (relY < _this11.height + _this11.translate_y * 2) {
- _this11.map_tooltip_x_position_and_show(relX);
+ if (relY < _this10.height + _this10.translate_y * 2) {
+ _this10.map_tooltip_x_position_and_show(relX);
} else {
- _this11.tip.hide_tip();
+ _this10.tip.hide_tip();
}
});
}
}, {
key: 'map_tooltip_x_position_and_show',
value: function map_tooltip_x_position_and_show(relX) {
- var _this12 = this;
+ var _this11 = this;
if (!this.y_min_tops) return;
for (var i = this.x_axis_positions.length - 1; i >= 0; i--) {
@@ -1383,7 +1672,7 @@ var AxisChart = function (_BaseChart) {
return {
title: set$$1.title,
value: set$$1.formatted ? set$$1.formatted[i] : set$$1.values[i],
- color: set$$1.color || _this12.colors[j]
+ color: set$$1.color || _this11.colors[j]
};
});
@@ -1400,14 +1689,14 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'show_sums',
value: function show_sums() {
- var _this13 = this;
+ var _this12 = this;
this.updating = true;
this.y_sums = new Array(this.x_axis_positions.length).fill(0);
this.y.map(function (d) {
d.values.map(function (value, i) {
- _this13.y_sums[i] += value;
+ _this12.y_sums[i] += value;
});
});
@@ -1418,7 +1707,7 @@ var AxisChart = function (_BaseChart) {
this.sum_units = [];
this.make_new_units_for_dataset(this.x_axis_positions, this.y_sums.map(function (val) {
- return float_2(_this13.zero_line - val * _this13.multiplier);
+ return float_2(_this12.zero_line - val * _this12.multiplier);
}), 'light-grey', 0, 1, this.sum_group, this.sum_units);
// this.make_path && this.make_path(d, i, old_x, old_y, d.color || this.colors[i]);
@@ -1437,7 +1726,7 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'show_averages',
value: function show_averages() {
- var _this14 = this;
+ var _this13 = this;
this.old_specific_values = this.specific_values.slice();
this.y.map(function (d, i) {
@@ -1447,7 +1736,7 @@ var AxisChart = function (_BaseChart) {
});
var average = sum / d.values.length;
- _this14.specific_values.push({
+ _this13.specific_values.push({
title: "AVG" + " " + (i + 1),
line_type: "dashed",
value: average,
@@ -1460,7 +1749,7 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'hide_averages',
value: function hide_averages() {
- var _this15 = this;
+ var _this14 = this;
this.old_specific_values = this.specific_values.slice();
@@ -1470,7 +1759,7 @@ var AxisChart = function (_BaseChart) {
});
indices_to_remove.map(function (index) {
- _this15.specific_values.splice(index, 1);
+ _this14.specific_values.splice(index, 1);
});
this.update_values();
@@ -1478,7 +1767,7 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'update_values',
value: function update_values(new_y, new_x) {
- var _this16 = this;
+ var _this15 = this;
if (!new_x) {
new_x = this.x;
@@ -1510,7 +1799,7 @@ var AxisChart = function (_BaseChart) {
if (!arrays_equal(this.x_old_axis_positions, this.x_axis_positions)) {
this.make_x_axis(true);
setTimeout(function () {
- if (!_this16.updating) _this16.make_x_axis();
+ if (!_this15.updating) _this15.make_x_axis();
}, 350);
}
@@ -1518,9 +1807,9 @@ var AxisChart = function (_BaseChart) {
this.make_y_axis(true);
setTimeout(function () {
- if (!_this16.updating) {
- _this16.make_y_axis();
- _this16.make_y_specifics();
+ if (!_this15.updating) {
+ _this15.make_y_axis();
+ _this15.make_y_specifics();
}
}, 350);
}
@@ -1572,9 +1861,9 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'run_animation',
value: function run_animation() {
- var _this17 = this;
+ var _this16 = this;
- var anim_svg = $.runSVGAnimation(this.svg, this.elements_to_animate);
+ var anim_svg = runSVGAnimation(this.svg, this.elements_to_animate);
if (this.svg.parentNode == this.chart_wrapper) {
this.chart_wrapper.removeChild(this.svg);
@@ -1583,39 +1872,39 @@ var AxisChart = function (_BaseChart) {
// Replace the new svg (data has long been replaced)
setTimeout(function () {
- if (anim_svg.parentNode == _this17.chart_wrapper) {
- _this17.chart_wrapper.removeChild(anim_svg);
- _this17.chart_wrapper.appendChild(_this17.svg);
+ if (anim_svg.parentNode == _this16.chart_wrapper) {
+ _this16.chart_wrapper.removeChild(anim_svg);
+ _this16.chart_wrapper.appendChild(_this16.svg);
}
}, 250);
}
}, {
key: 'animate_graphs',
value: function animate_graphs() {
- var _this18 = this;
+ var _this17 = this;
this.y.map(function (d, i) {
// Pre-prep, equilize no of positions between old and new
- var _calc_old_and_new_pos = _this18.calc_old_and_new_postions(d, i),
+ var _calc_old_and_new_pos = _this17.calc_old_and_new_postions(d, i),
_calc_old_and_new_pos2 = slicedToArray(_calc_old_and_new_pos, 4),
old_x = _calc_old_and_new_pos2[0],
old_y = _calc_old_and_new_pos2[1],
new_x = _calc_old_and_new_pos2[2],
new_y = _calc_old_and_new_pos2[3];
- if (_this18.no_of_extra_pts >= 0) {
- _this18.make_path && _this18.make_path(d, i, old_x, old_y, d.color || _this18.colors[i]);
- _this18.make_new_units_for_dataset(old_x, old_y, d.color || _this18.colors[i], i, _this18.y.length);
+ if (_this17.no_of_extra_pts >= 0) {
+ _this17.make_path && _this17.make_path(d, i, old_x, old_y, d.color || _this17.colors[i]);
+ _this17.make_new_units_for_dataset(old_x, old_y, d.color || _this17.colors[i], i, _this17.y.length);
}
- d.path && _this18.animate_path(d, i, old_x, old_y, new_x, new_y);
- _this18.animate_units(d, i, old_x, old_y, new_x, new_y);
+ d.path && _this17.animate_path(d, i, old_x, old_y, new_x, new_y);
+ _this17.animate_units(d, i, old_x, old_y, new_x, new_y);
});
// TODO: replace with real units
setTimeout(function () {
- _this18.y.map(function (d, i) {
- _this18.make_path && _this18.make_path(d, i, _this18.x_axis_positions, d.y_tops, d.color || _this18.colors[i]);
- _this18.make_new_units(d, i);
+ _this17.y.map(function (d, i) {
+ _this17.make_path && _this17.make_path(d, i, _this17.x_axis_positions, d.y_tops, d.color || _this17.colors[i]);
+ _this17.make_new_units(d, i);
});
}, 400);
}
@@ -1643,14 +1932,15 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'animate_units',
value: function animate_units(d, index, old_x, old_y, new_x, new_y) {
- var _this19 = this;
+ var _this18 = this;
var type = this.unit_args.type;
+ var unit_renderer = new UnitRenderer(this.height, this.zero_line, this.avg_unit_width);
d.svg_units.map(function (unit, i) {
if (new_x[i] === undefined || new_y[i] === undefined) return;
- _this19.elements_to_animate.push(_this19.animate[type]({ unit: unit, array: d.svg_units, index: i }, // unit, with info to replace where it came from in the data
- new_x[i], new_y[i], index));
+ _this18.elements_to_animate.push(unit_renderer['animate_' + type]({ unit: unit, array: d.svg_units, index: i }, // unit, with info to replace where it came from in the data
+ new_x[i], new_y[i], index, _this18.y.length));
});
}
}, {
@@ -1695,7 +1985,7 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_anim_x_axis',
value: function make_anim_x_axis(height, text_start_at, axis_line_class) {
- var _this20 = this;
+ var _this19 = this;
// Animate X AXIS to account for more or less axis lines
@@ -1711,12 +2001,12 @@ var AxisChart = function (_BaseChart) {
if (typeof new_pos === 'string') {
new_pos = parseInt(new_pos.substring(0, new_pos.length - 1));
}
- var x_line = _this20.make_x_line(height, text_start_at, value, // new value
+ var x_line = make_x_line(height, text_start_at, value, // new value
'x-value-text', axis_line_class, old_pos // old position
);
- _this20.x_axis_group.appendChild(x_line);
+ _this19.x_axis_group.appendChild(x_line);
- _this20.elements_to_animate && _this20.elements_to_animate.push([{ unit: x_line, array: [0], index: 0 }, { transform: new_pos + ', 0' }, 350, "easein", "translate", { transform: old_pos + ', 0' }]);
+ _this19.elements_to_animate && _this19.elements_to_animate.push([{ unit: x_line, array: [0], index: 0 }, { transform: new_pos + ', 0' }, 350, "easein", "translate", { transform: old_pos + ', 0' }]);
};
this.x_axis_group.textContent = '';
@@ -1726,15 +2016,15 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_anim_y_axis',
value: function make_anim_y_axis() {
- var _this21 = this;
+ var _this20 = this;
// Animate Y AXIS to account for more or less axis lines
var old_pos = this.y_old_axis_values.map(function (value) {
- return _this21.zero_line - value * _this21.multiplier;
+ return _this20.zero_line - value * _this20.multiplier;
});
var new_pos = this.y_axis_values.map(function (value) {
- return _this21.zero_line - value * _this21.multiplier;
+ return _this20.zero_line - value * _this20.multiplier;
});
var old_vals = this.y_old_axis_values;
@@ -1749,11 +2039,11 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_anim_y_specifics',
value: function make_anim_y_specifics() {
- var _this22 = this;
+ var _this21 = this;
this.specific_y_group.textContent = '';
this.specific_values.map(function (d) {
- _this22.add_and_animate_y_line(d.title, _this22.old_zero_line - d.value * _this22.old_multiplier, _this22.zero_line - d.value * _this22.multiplier, 0, _this22.specific_y_group, d.line_type, true);
+ _this21.add_and_animate_y_line(d.title, _this21.old_zero_line - d.value * _this21.old_multiplier, _this21.zero_line - d.value * _this21.multiplier, 0, _this21.specific_y_group, d.line_type, true);
});
}
}, {
@@ -1794,71 +2084,6 @@ var AxisChart = function (_BaseChart) {
});
}
}
- }, {
- key: 'make_x_line',
- value: function make_x_line(height, text_start_at, point, label_class, axis_line_class, x_pos) {
- var line = $.createSVG('line', {
- x1: 0,
- x2: 0,
- y1: 0,
- y2: height
- });
-
- var text = $.createSVG('text', {
- className: label_class,
- x: 0,
- y: text_start_at,
- dy: '.71em',
- innerHTML: point
- });
-
- var x_level = $.createSVG('g', {
- className: 'tick ' + axis_line_class,
- transform: 'translate(' + x_pos + ', 0)'
- });
-
- x_level.appendChild(line);
- x_level.appendChild(text);
-
- return x_level;
- }
- }, {
- key: 'make_y_line',
- value: function make_y_line(start_at, width, text_end_at, point, label_class, axis_line_class, y_pos) {
- var darker = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
- var line_type = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : "";
-
- var line = $.createSVG('line', {
- className: line_type === "dashed" ? "dashed" : "",
- x1: start_at,
- x2: width,
- y1: 0,
- y2: 0
- });
-
- var text = $.createSVG('text', {
- className: label_class,
- x: text_end_at,
- y: 0,
- dy: '.32em',
- innerHTML: point + ""
- });
-
- var y_level = $.createSVG('g', {
- className: 'tick ' + axis_line_class,
- transform: 'translate(0, ' + y_pos + ')',
- 'stroke-opacity': 1
- });
-
- if (darker) {
- line.style.stroke = "rgba(27, 31, 35, 0.6)";
- }
-
- y_level.appendChild(line);
- y_level.appendChild(text);
-
- return y_level;
- }
}, {
key: 'add_and_animate_y_line',
value: function add_and_animate_y_line(value, old_pos, new_pos, i, group, type) {
@@ -1886,7 +2111,7 @@ var AxisChart = function (_BaseChart) {
var axis_label_class = !specific ? 'y-value-text' : 'specific-value';
value = !specific ? value : (value + "").toUpperCase();
- var y_line = this.make_y_line(start_at, width, text_end_at, value, axis_label_class, axis_line_class, old_pos, // old position
+ var y_line = make_y_line(start_at, width, text_end_at, value, axis_label_class, axis_line_class, old_pos, // old position
value === 0 && i !== 0, // Non-first Zero line
type);
@@ -1894,149 +2119,6 @@ var AxisChart = function (_BaseChart) {
this.elements_to_animate && this.elements_to_animate.push([{ unit: y_line, array: [0], index: 0 }, new_props, 350, "easein", "translate", old_props]);
}
- }, {
- key: 'get_y_axis_points',
- value: function get_y_axis_points(array) {
- var _this23 = this;
-
- //*** Where the magic happens ***
-
- // Calculates best-fit y intervals from given values
- // and returns the interval array
-
- // TODO: Fractions
-
- var max_bound = void 0,
- min_bound = void 0,
- pos_no_of_parts = void 0,
- neg_no_of_parts = void 0,
- part_size = void 0; // eslint-disable-line no-unused-vars
-
- // Critical values
- var max_val = parseInt(Math.max.apply(Math, toConsumableArray(array)));
- var min_val = parseInt(Math.min.apply(Math, toConsumableArray(array)));
- if (min_val >= 0) {
- min_val = 0;
- }
-
- var get_params = function get_params(value1, value2) {
- var bound1 = void 0,
- bound2 = void 0,
- no_of_parts_1 = void 0,
- no_of_parts_2 = void 0,
- interval_size = void 0;
- if ((value1 + "").length <= 1) {
- bound1 = 10;
- no_of_parts_1 = 5;
- } else {
- var _calc_upper_bound_and = _this23.calc_upper_bound_and_no_of_parts(value1);
-
- var _calc_upper_bound_and2 = slicedToArray(_calc_upper_bound_and, 2);
-
- bound1 = _calc_upper_bound_and2[0];
- no_of_parts_1 = _calc_upper_bound_and2[1];
- }
-
- interval_size = bound1 / no_of_parts_1;
- no_of_parts_2 = _this23.calc_no_of_parts(value2, interval_size);
- bound2 = no_of_parts_2 * interval_size;
-
- return [bound1, bound2, no_of_parts_1, no_of_parts_2, interval_size];
- };
-
- var abs_min_val = min_val * -1;
- if (abs_min_val <= max_val) {
- var _get_params = get_params(max_val, abs_min_val);
- // Get the positive region intervals
- // then calc negative ones accordingly
-
-
- var _get_params2 = slicedToArray(_get_params, 5);
-
- min_bound = _get_params2[1];
- pos_no_of_parts = _get_params2[2];
- neg_no_of_parts = _get_params2[3];
- part_size = _get_params2[4];
-
- if (abs_min_val === 0) {
- min_bound = 0;neg_no_of_parts = 0;
- }
- } else {
- var _get_params3 = get_params(abs_min_val, max_val);
- // Get the negative region here first
-
-
- var _get_params4 = slicedToArray(_get_params3, 5);
-
- min_bound = _get_params4[0];
- neg_no_of_parts = _get_params4[2];
- pos_no_of_parts = _get_params4[3];
- part_size = _get_params4[4];
- }
-
- // Make both region parts even
- if (pos_no_of_parts % 2 !== 0 && neg_no_of_parts > 0) pos_no_of_parts++;
- if (neg_no_of_parts % 2 !== 0) {
- // every increase in no_of_parts entails an increase in corresponding bound
- // except here, it happens implicitly after every calc_no_of_parts() call
- neg_no_of_parts++;
- min_bound += part_size;
- }
-
- var no_of_parts = pos_no_of_parts + neg_no_of_parts;
- if (no_of_parts > 5) {
- no_of_parts /= 2;
- part_size *= 2;
-
- pos_no_of_parts /= 2;
- }
-
- if (max_val < (pos_no_of_parts - 1) * part_size) {
- no_of_parts--;
- }
-
- return this.get_intervals(-1 * min_bound, part_size, no_of_parts);
- }
- }, {
- key: 'get_intervals',
- value: function get_intervals(start, interval_size, count) {
- var intervals = [];
- for (var i = 0; i <= count; i++) {
- intervals.push(start);
- start += interval_size;
- }
- return intervals;
- }
- }, {
- key: 'calc_upper_bound_and_no_of_parts',
- value: function calc_upper_bound_and_no_of_parts(max_val) {
- // Given a positive value, calculates a nice-number upper bound
- // and a consequent optimal number of parts
-
- var part_size = Math.pow(10, (max_val + "").length - 1);
- var no_of_parts = this.calc_no_of_parts(max_val, part_size);
-
- // Use it to get a nice even upper bound
- var upper_bound = part_size * no_of_parts;
-
- return [upper_bound, no_of_parts];
- }
- }, {
- key: 'calc_no_of_parts',
- value: function calc_no_of_parts(value, divisor) {
- // value should be a positive number, divisor should be greater than 0
- // returns an even no of parts
- var no_of_parts = Math.ceil(value / divisor);
- if (no_of_parts % 2 !== 0) no_of_parts++; // Make it an even number
-
- return no_of_parts;
- }
- }, {
- key: 'get_optimal_no_of_parts',
- value: function get_optimal_no_of_parts(no_of_parts) {
- // aka Divide by 2 if too large
- return no_of_parts < 5 ? no_of_parts : no_of_parts / 2;
- }
}, {
key: 'set_avg_unit_width_and_x_offset',
value: function set_avg_unit_width_and_x_offset() {
@@ -2062,107 +2144,22 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'calc_y_dependencies',
value: function calc_y_dependencies() {
- var _this24 = this;
+ var _this22 = this;
this.y_min_tops = new Array(this.x_axis_positions.length).fill(9999);
this.y.map(function (d) {
d.y_tops = d.values.map(function (val) {
- return float_2(_this24.zero_line - val * _this24.multiplier);
+ return float_2(_this22.zero_line - val * _this22.multiplier);
});
d.y_tops.map(function (y_top, i) {
- if (y_top < _this24.y_min_tops[i]) {
- _this24.y_min_tops[i] = y_top;
+ if (y_top < _this22.y_min_tops[i]) {
+ _this22.y_min_tops[i] = y_top;
}
});
});
// this.chart_wrapper.removeChild(this.tip.container);
// this.make_tooltip();
}
- }, {
- key: 'get_bar_height_and_y_attr',
- value: function get_bar_height_and_y_attr(y_top) {
- var height = void 0,
- y = void 0;
- if (y_top <= this.zero_line) {
- height = this.zero_line - y_top;
- y = y_top;
-
- // In case of invisible bars
- if (height === 0) {
- height = this.height * 0.01;
- y -= height;
- }
- } else {
- height = y_top - this.zero_line;
- y = this.zero_line;
-
- // In case of invisible bars
- if (height === 0) {
- height = this.height * 0.01;
- }
- }
-
- return [height, y];
- }
- }, {
- key: 'setup_utils',
- value: function setup_utils() {
- var _this25 = this;
-
- this.draw = {
- 'bar': function bar(x, y_top, args, color, index, dataset_index, no_of_datasets) {
- var total_width = _this25.avg_unit_width - args.space_width;
- var start_x = x - total_width / 2;
-
- var width = total_width / no_of_datasets;
- var current_x = start_x + width * dataset_index;
-
- var _get_bar_height_and_y = _this25.get_bar_height_and_y_attr(y_top),
- _get_bar_height_and_y2 = slicedToArray(_get_bar_height_and_y, 2),
- height = _get_bar_height_and_y2[0],
- y = _get_bar_height_and_y2[1];
-
- return $.createSVG('rect', {
- className: 'bar mini fill ' + color,
- 'data-point-index': index,
- x: current_x,
- y: y,
- width: width,
- height: height
- });
- },
- 'dot': function dot(x, y, args, color, index) {
- return $.createSVG('circle', {
- className: 'fill ' + color,
- 'data-point-index': index,
- cx: x,
- cy: y,
- r: args.radius
- });
- }
- };
-
- this.animate = {
- 'bar': function bar(bar_obj, x, y_top, index) {
- var start = x - _this25.avg_unit_width / 4;
- var width = _this25.avg_unit_width / 2 / _this25.y.length;
-
- var _get_bar_height_and_y3 = _this25.get_bar_height_and_y_attr(y_top),
- _get_bar_height_and_y4 = slicedToArray(_get_bar_height_and_y3, 2),
- height = _get_bar_height_and_y4[0],
- y = _get_bar_height_and_y4[1];
-
- x = start + width * index;
-
- return [bar_obj, { width: width, height: height, x: x, y: y }, 350, "easein"];
- // bar.animate({height: args.new_height, y: y_top}, 350, mina.easein);
- },
- 'dot': function dot(dot_obj, x, y_top) {
- return [dot_obj, { cx: x, cy: y_top }, 350, "easein"];
- // dot.animate({cy: y_top}, 350, mina.easein);
- }
- };
- }
}]);
return AxisChart;
}(BaseChart);
@@ -2487,12 +2484,6 @@ var PercentageChart = function (_BaseChart) {
_this.max_slices = 10;
_this.max_legend_points = 6;
- _this.colors = args.colors;
-
- if (!_this.colors || _this.colors.length < _this.data.labels.length) {
- _this.colors = ['light-blue', 'blue', 'violet', 'red', 'orange', 'yellow', 'green', 'light-green', 'purple', 'magenta'];
- }
-
_this.setup();
return _this;
}
@@ -2572,9 +2563,6 @@ var PercentageChart = function (_BaseChart) {
this.legend_totals = this.slice_totals.slice(0, this.max_legend_points);
}
- }, {
- key: 'setup_utils',
- value: function setup_utils() {}
}, {
key: 'make_graph_components',
value: function make_graph_components() {
@@ -2635,6 +2623,24 @@ var PercentageChart = function (_BaseChart) {
return PercentageChart;
}(BaseChart);
+function limit_color(r) {
+ if (r > 255) return 255;else if (r < 0) return 0;
+ return r;
+}
+
+function lighten_darken_color(col, amt) {
+ var usePound = false;
+ if (col[0] == "#") {
+ col = col.slice(1);
+ usePound = true;
+ }
+ var num = parseInt(col, 16);
+ var r = limit_color((num >> 16) + amt);
+ var b = limit_color((num >> 8 & 0x00FF) + amt);
+ var g = limit_color((num & 0x0000FF) + amt);
+ return (usePound ? "#" : "") + (g | b << 8 | r << 16).toString(16);
+}
+
var ANGLE_RATIO = Math.PI / 180;
var FULL_ANGLE = 360;
@@ -2714,9 +2720,6 @@ var PieChart = function (_BaseChart) {
this.legend_totals = this.slice_totals.slice(0, this.max_legend_points);
}
- }, {
- key: 'setup_utils',
- value: function setup_utils() {}
}, {
key: 'makeArcPath',
value: function makeArcPath(startPosition, endPosition) {
@@ -2796,7 +2799,7 @@ var PieChart = function (_BaseChart) {
// if(this.isAnimate) return ;
// this.isAnimate = true;
if (!this.elements_to_animate || this.elements_to_animate.length === 0) return;
- var anim_svg = $.runSVGAnimation(this.svg, this.elements_to_animate);
+ var anim_svg = runSVGAnimation(this.svg, this.elements_to_animate);
if (this.svg.parentNode == this.chart_wrapper) {
this.chart_wrapper.removeChild(this.svg);
@@ -2826,8 +2829,8 @@ var PieChart = function (_BaseChart) {
value: function hoverSlice(path, i, flag, e) {
if (!path) return;
if (flag) {
- $.transform(path, this.calTranslateByAngle(this.slicesProperties[i]));
- path.setAttribute('fill', lightenDarkenColor(this.colors[i], 50));
+ transform(path, this.calTranslateByAngle(this.slicesProperties[i]));
+ path.setAttribute('fill', lighten_darken_color(this.colors[i], 50));
var g_off = $.offset(this.svg);
var x = e.pageX - g_off.left + 10;
var y = e.pageY - g_off.top - 10;
@@ -2836,7 +2839,7 @@ var PieChart = function (_BaseChart) {
this.tip.set_values(x, y, title, percent + "%");
this.tip.show_tip();
} else {
- $.transform(path, 'translate3d(0,0,0)');
+ transform(path, 'translate3d(0,0,0)');
this.tip.hide_tip();
path.setAttribute('fill', this.colors[i]);
}
@@ -2896,6 +2899,37 @@ var PieChart = function (_BaseChart) {
return PieChart;
}(BaseChart);
+// Playing around with dates
+
+// https://stackoverflow.com/a/11252167/6495043
+function treat_as_utc(date_str) {
+ var result = new Date(date_str);
+ result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
+ return result;
+}
+
+function get_dd_mm_yyyy(date) {
+ var dd = date.getDate();
+ var mm = date.getMonth() + 1; // getMonth() is zero-based
+ return [(dd > 9 ? '' : '0') + dd, (mm > 9 ? '' : '0') + mm, date.getFullYear()].join('-');
+}
+
+function get_weeks_between(start_date_str, end_date_str) {
+ return Math.ceil(get_days_between(start_date_str, end_date_str) / 7);
+}
+
+function get_days_between(start_date_str, end_date_str) {
+ var milliseconds_per_day = 24 * 60 * 60 * 1000;
+ return (treat_as_utc(end_date_str) - treat_as_utc(start_date_str)) / milliseconds_per_day;
+}
+
+// mutates
+function add_days(date, number_of_days) {
+ date.setDate(date.getDate() + number_of_days);
+}
+
+// export function get_month_name() {}
+
var Heatmap = function (_BaseChart) {
inherits(Heatmap, _BaseChart);
@@ -2925,7 +2959,7 @@ var Heatmap = function (_BaseChart) {
_this.count_label = count_label;
var today = new Date();
- _this.start = start || _this.add_days(today, 365);
+ _this.start = start || add_days(today, 365);
_this.legend_colors = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];
@@ -2946,12 +2980,12 @@ var Heatmap = function (_BaseChart) {
this.first_week_start = new Date(this.start.toDateString());
this.last_week_start = new Date(this.today.toDateString());
if (this.first_week_start.getDay() !== 7) {
- this.add_days(this.first_week_start, -1 * this.first_week_start.getDay());
+ add_days(this.first_week_start, -1 * this.first_week_start.getDay());
}
if (this.last_week_start.getDay() !== 7) {
- this.add_days(this.last_week_start, -1 * this.last_week_start.getDay());
+ add_days(this.last_week_start, -1 * this.last_week_start.getDay());
}
- this.no_of_cols = this.get_weeks_between(this.first_week_start + '', this.last_week_start + '') + 1;
+ this.no_of_cols = get_weeks_between(this.first_week_start + '', this.last_week_start + '') + 1;
}
}, {
key: 'set_width',
@@ -3017,7 +3051,7 @@ var Heatmap = function (_BaseChart) {
this.months.push(this.current_month + '');
this.month_weeks[this.current_month] = 1;
}
- this.add_days(current_week_sunday, 7);
+ add_days(current_week_sunday, 7);
}
this.render_month_labels();
}
@@ -3065,13 +3099,13 @@ var Heatmap = function (_BaseChart) {
width: square_side,
height: square_side,
fill: this.legend_colors[color_index],
- 'data-date': this.get_dd_mm_yyyy(current_date),
+ 'data-date': get_dd_mm_yyyy(current_date),
'data-value': data_value,
'data-day': current_date.getDay()
});
var next_date = new Date(current_date);
- this.add_days(next_date, 1);
+ add_days(next_date, 1);
if (next_date.getTime() > today_time) break;
if (next_date.getMonth() - current_date.getMonth()) {
@@ -3197,47 +3231,6 @@ var Heatmap = function (_BaseChart) {
return d <= value;
}).length - 1;
}
-
- // TODO: date utils, move these out
-
- // https://stackoverflow.com/a/11252167/6495043
-
- }, {
- key: 'treat_as_utc',
- value: function treat_as_utc(date_str) {
- var result = new Date(date_str);
- result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
- return result;
- }
- }, {
- key: 'get_dd_mm_yyyy',
- value: function get_dd_mm_yyyy(date) {
- var dd = date.getDate();
- var mm = date.getMonth() + 1; // getMonth() is zero-based
- return [(dd > 9 ? '' : '0') + dd, (mm > 9 ? '' : '0') + mm, date.getFullYear()].join('-');
- }
- }, {
- key: 'get_weeks_between',
- value: function get_weeks_between(start_date_str, end_date_str) {
- return Math.ceil(this.get_days_between(start_date_str, end_date_str) / 7);
- }
- }, {
- key: 'get_days_between',
- value: function get_days_between(start_date_str, end_date_str) {
- var milliseconds_per_day = 24 * 60 * 60 * 1000;
- return (this.treat_as_utc(end_date_str) - this.treat_as_utc(start_date_str)) / milliseconds_per_day;
- }
-
- // mutates
-
- }, {
- key: 'add_days',
- value: function add_days(date, number_of_days) {
- date.setDate(date.getDate() + number_of_days);
- }
- }, {
- key: 'get_month_name',
- value: function get_month_name() {}
}]);
return Heatmap;
}(BaseChart);
diff --git a/dist/frappe-charts.min.esm.js b/dist/frappe-charts.min.esm.js
index 22186fe..eb5af9a 100644
--- a/dist/frappe-charts.min.esm.js
+++ b/dist/frappe-charts.min.esm.js
@@ -282,15 +282,6 @@ function $(expr, con) {
return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null;
}
-var EASING = {
- ease: "0.25 0.1 0.25 1",
- linear: "0 0 1 1",
- // easein: "0.42 0 1 1",
- easein: "0.1 0.8 0.2 1",
- easeout: "0 0 0.58 1",
- easeinout: "0.42 0 0.58 1"
-};
-
$.findNodeIndex = function (node) {
var i = 0;
while (node.previousSibling) {
@@ -355,112 +346,6 @@ $.createSVG = function (tag, o) {
return element;
};
-$.runSVGAnimation = function (svg_container, elements) {
- // let parent = elements[0][0]['unit'].parentNode;
-
- var new_elements = [];
- var anim_elements = [];
-
- elements.map(function (element) {
- var obj = element[0];
- var parent = obj.unit.parentNode;
- // let index = let findNodeIndex(obj.unit);
-
- var anim_element = void 0,
- new_element = void 0;
-
- element[0] = obj.unit;
-
- var _$$animateSVG = $.animateSVG.apply($, toConsumableArray(element));
-
- var _$$animateSVG2 = slicedToArray(_$$animateSVG, 2);
-
- anim_element = _$$animateSVG2[0];
- new_element = _$$animateSVG2[1];
-
-
- new_elements.push(new_element);
- anim_elements.push([anim_element, parent]);
-
- parent.replaceChild(anim_element, obj.unit);
-
- if (obj.array) {
- obj.array[obj.index] = new_element;
- } else {
- obj.object[obj.key] = new_element;
- }
- });
-
- var anim_svg = svg_container.cloneNode(true);
-
- anim_elements.map(function (anim_element, i) {
- anim_element[1].replaceChild(new_elements[i], anim_element[0]);
- elements[i][0] = new_elements[i];
- });
-
- return anim_svg;
-};
-
-$.transform = function (element, style) {
- element.style.transform = style;
- element.style.webkitTransform = style;
- element.style.msTransform = style;
- element.style.mozTransform = style;
- element.style.oTransform = style;
-};
-
-$.animateSVG = function (element, props, dur) {
- var easing_type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "linear";
- var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;
- var old_values = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
-
-
- var anim_element = element.cloneNode(true);
- var new_element = element.cloneNode(true);
-
- for (var attributeName in props) {
- var animate_element = void 0;
- if (attributeName === 'transform') {
- animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform");
- } else {
- animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animate");
- }
- var current_value = old_values[attributeName] || element.getAttribute(attributeName);
- var value = props[attributeName];
-
- var anim_attr = {
- attributeName: attributeName,
- from: current_value,
- to: value,
- begin: "0s",
- dur: dur / 1000 + "s",
- values: current_value + ";" + value,
- keySplines: EASING[easing_type],
- keyTimes: "0;1",
- calcMode: "spline",
- fill: 'freeze'
- };
-
- if (type) {
- anim_attr["type"] = type;
- }
-
- for (var i in anim_attr) {
- animate_element.setAttribute(i, anim_attr[i]);
- }
-
- anim_element.appendChild(animate_element);
-
- if (type) {
- new_element.setAttribute(attributeName, "translate(" + value + ")");
- } else {
- new_element.setAttribute(attributeName, value);
- }
- }
-
- return [anim_element, new_element];
-};
-
$.offset = function (element) {
var rect = element.getBoundingClientRect();
return {
@@ -517,10 +402,421 @@ $.fire = function (target, type, properties) {
return target.dispatchEvent(evt);
};
+var UnitRenderer = function () {
+ var UnitRenderer = function UnitRenderer(total_height, zero_line, avg_unit_width) {
+ this.total_height = total_height;
+ this.zero_line = zero_line;
+ this.avg_unit_width = avg_unit_width;
+ };
+
+ function get_bar_height_and_y_attr(y_top, zero_line, total_height) {
+ var height = void 0,
+ y = void 0;
+ if (y_top <= zero_line) {
+ height = zero_line - y_top;
+ y = y_top;
+
+ // In case of invisible bars
+ if (height === 0) {
+ height = total_height * 0.01;
+ y -= height;
+ }
+ } else {
+ height = y_top - zero_line;
+ y = zero_line;
+
+ // In case of invisible bars
+ if (height === 0) {
+ height = total_height * 0.01;
+ }
+ }
+
+ return [height, y];
+ }
+
+ UnitRenderer.prototype = {
+ draw_bar: function draw_bar(x, y_top, args, color, index, dataset_index, no_of_datasets) {
+ var total_width = this.avg_unit_width - args.space_width;
+ var start_x = x - total_width / 2;
+
+ var width = total_width / no_of_datasets;
+ var current_x = start_x + width * dataset_index;
+
+ var _get_bar_height_and_y = get_bar_height_and_y_attr(y_top, this.zero_line, this.total_height),
+ _get_bar_height_and_y2 = slicedToArray(_get_bar_height_and_y, 2),
+ height = _get_bar_height_and_y2[0],
+ y = _get_bar_height_and_y2[1];
+
+ return $.createSVG('rect', {
+ className: 'bar mini fill ' + color,
+ 'data-point-index': index,
+ x: current_x,
+ y: y,
+ width: width,
+ height: height
+ });
+ },
+
+ draw_dot: function draw_dot(x, y, args, color, index) {
+ return $.createSVG('circle', {
+ className: 'fill ' + color,
+ 'data-point-index': index,
+ cx: x,
+ cy: y,
+ r: args.radius
+ });
+ },
+
+ animate_bar: function animate_bar(bar_obj, x, y_top, index, no_of_datasets) {
+ var start = x - this.avg_unit_width / 4;
+ var width = this.avg_unit_width / 2 / no_of_datasets;
+
+ var _get_bar_height_and_y3 = get_bar_height_and_y_attr(y_top, this.zero_line, this.total_height),
+ _get_bar_height_and_y4 = slicedToArray(_get_bar_height_and_y3, 2),
+ height = _get_bar_height_and_y4[0],
+ y = _get_bar_height_and_y4[1];
+
+ x = start + width * index;
+
+ return [bar_obj, { width: width, height: height, x: x, y: y }, 350, "easein"];
+ // bar.animate({height: args.new_height, y: y_top}, 350, mina.easein);
+ },
+
+ animate_dot: function animate_dot(dot_obj, x, y_top) {
+ return [dot_obj, { cx: x, cy: y_top }, 350, "easein"];
+ // dot.animate({cy: y_top}, 350, mina.easein);
+ }
+ };
+
+ return UnitRenderer;
+}();
+
+function make_x_line(height, text_start_at, point, label_class, axis_line_class, x_pos) {
+ var line = $.createSVG('line', {
+ x1: 0,
+ x2: 0,
+ y1: 0,
+ y2: height
+ });
+
+ var text = $.createSVG('text', {
+ className: label_class,
+ x: 0,
+ y: text_start_at,
+ dy: '.71em',
+ innerHTML: point
+ });
+
+ var x_line = $.createSVG('g', {
+ className: 'tick ' + axis_line_class,
+ transform: 'translate(' + x_pos + ', 0)'
+ });
+
+ x_line.appendChild(line);
+ x_line.appendChild(text);
+
+ return x_line;
+}
+
+function make_y_line(start_at, width, text_end_at, point, label_class, axis_line_class, y_pos) {
+ var darker = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
+ var line_type = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : "";
+
+ var line = $.createSVG('line', {
+ className: line_type === "dashed" ? "dashed" : "",
+ x1: start_at,
+ x2: width,
+ y1: 0,
+ y2: 0
+ });
+
+ var text = $.createSVG('text', {
+ className: label_class,
+ x: text_end_at,
+ y: 0,
+ dy: '.32em',
+ innerHTML: point + ""
+ });
+
+ var y_line = $.createSVG('g', {
+ className: 'tick ' + axis_line_class,
+ transform: 'translate(0, ' + y_pos + ')',
+ 'stroke-opacity': 1
+ });
+
+ if (darker) {
+ line.style.stroke = "rgba(27, 31, 35, 0.6)";
+ }
+
+ y_line.appendChild(line);
+ y_line.appendChild(text);
+
+ return y_line;
+}
+
+// Leveraging SMIL Animations
+
+var EASING = {
+ ease: "0.25 0.1 0.25 1",
+ linear: "0 0 1 1",
+ // easein: "0.42 0 1 1",
+ easein: "0.1 0.8 0.2 1",
+ easeout: "0 0 0.58 1",
+ easeinout: "0.42 0 0.58 1"
+};
+
+function animateSVG(element, props, dur) {
+ var easing_type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "linear";
+ var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;
+ var old_values = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
+
+
+ var anim_element = element.cloneNode(true);
+ var new_element = element.cloneNode(true);
+
+ for (var attributeName in props) {
+ var animate_element = void 0;
+ if (attributeName === 'transform') {
+ animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform");
+ } else {
+ animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animate");
+ }
+ var current_value = old_values[attributeName] || element.getAttribute(attributeName);
+ var value = props[attributeName];
+
+ var anim_attr = {
+ attributeName: attributeName,
+ from: current_value,
+ to: value,
+ begin: "0s",
+ dur: dur / 1000 + "s",
+ values: current_value + ";" + value,
+ keySplines: EASING[easing_type],
+ keyTimes: "0;1",
+ calcMode: "spline",
+ fill: 'freeze'
+ };
+
+ if (type) {
+ anim_attr["type"] = type;
+ }
+
+ for (var i in anim_attr) {
+ animate_element.setAttribute(i, anim_attr[i]);
+ }
+
+ anim_element.appendChild(animate_element);
+
+ if (type) {
+ new_element.setAttribute(attributeName, "translate(" + value + ")");
+ } else {
+ new_element.setAttribute(attributeName, value);
+ }
+ }
+
+ return [anim_element, new_element];
+}
+
+function transform(element, style) {
+ // eslint-disable-line no-unused-vars
+ element.style.transform = style;
+ element.style.webkitTransform = style;
+ element.style.msTransform = style;
+ element.style.mozTransform = style;
+ element.style.oTransform = style;
+}
+
+function runSVGAnimation(svg_container, elements) {
+ var new_elements = [];
+ var anim_elements = [];
+
+ elements.map(function (element) {
+ var obj = element[0];
+ var parent = obj.unit.parentNode;
+
+ var anim_element = void 0,
+ new_element = void 0;
+
+ element[0] = obj.unit;
+
+ var _animateSVG = animateSVG.apply(undefined, toConsumableArray(element));
+
+ var _animateSVG2 = slicedToArray(_animateSVG, 2);
+
+ anim_element = _animateSVG2[0];
+ new_element = _animateSVG2[1];
+
+
+ new_elements.push(new_element);
+ anim_elements.push([anim_element, parent]);
+
+ parent.replaceChild(anim_element, obj.unit);
+
+ if (obj.array) {
+ obj.array[obj.index] = new_element;
+ } else {
+ obj.object[obj.key] = new_element;
+ }
+ });
+
+ var anim_svg = svg_container.cloneNode(true);
+
+ anim_elements.map(function (anim_element, i) {
+ anim_element[1].replaceChild(new_elements[i], anim_element[0]);
+ elements[i][0] = new_elements[i];
+ });
+
+ return anim_svg;
+}
+
+// export function calc_intervals() {
+// //
+// }
+
+function calc_y_intervals(array) {
+ //*** Where the magic happens ***
+
+ // Calculates best-fit y intervals from given values
+ // and returns the interval array
+
+ // TODO: Fractions
+
+ var max_bound = void 0,
+ min_bound = void 0,
+ pos_no_of_parts = void 0,
+ neg_no_of_parts = void 0,
+ part_size = void 0; // eslint-disable-line no-unused-vars
+
+ // Critical values
+ var max_val = parseInt(Math.max.apply(Math, toConsumableArray(array)));
+ var min_val = parseInt(Math.min.apply(Math, toConsumableArray(array)));
+ if (min_val >= 0) {
+ min_val = 0;
+ }
+
+ var get_params = function get_params(value1, value2) {
+ var bound1 = void 0,
+ bound2 = void 0,
+ no_of_parts_1 = void 0,
+ no_of_parts_2 = void 0,
+ interval_size = void 0;
+ if ((value1 + "").length <= 1) {
+ bound1 = 10;
+ no_of_parts_1 = 5;
+ } else {
+ var _calc_upper_bound_and = calc_upper_bound_and_no_of_parts(value1);
+
+ var _calc_upper_bound_and2 = slicedToArray(_calc_upper_bound_and, 2);
+
+ bound1 = _calc_upper_bound_and2[0];
+ no_of_parts_1 = _calc_upper_bound_and2[1];
+ }
+
+ interval_size = bound1 / no_of_parts_1;
+ no_of_parts_2 = calc_no_of_parts(value2, interval_size);
+ bound2 = no_of_parts_2 * interval_size;
+
+ return [bound1, bound2, no_of_parts_1, no_of_parts_2, interval_size];
+ };
+
+ var abs_min_val = min_val * -1;
+ if (abs_min_val <= max_val) {
+ var _get_params = get_params(max_val, abs_min_val);
+ // Get the positive region intervals
+ // then calc negative ones accordingly
+
+
+ var _get_params2 = slicedToArray(_get_params, 5);
+
+ min_bound = _get_params2[1];
+ pos_no_of_parts = _get_params2[2];
+ neg_no_of_parts = _get_params2[3];
+ part_size = _get_params2[4];
+
+ if (abs_min_val === 0) {
+ min_bound = 0;neg_no_of_parts = 0;
+ }
+ } else {
+ var _get_params3 = get_params(abs_min_val, max_val);
+ // Get the negative region here first
+
+
+ var _get_params4 = slicedToArray(_get_params3, 5);
+
+ min_bound = _get_params4[0];
+ neg_no_of_parts = _get_params4[2];
+ pos_no_of_parts = _get_params4[3];
+ part_size = _get_params4[4];
+ }
+
+ // Make both region parts even
+ if (pos_no_of_parts % 2 !== 0 && neg_no_of_parts > 0) pos_no_of_parts++;
+ if (neg_no_of_parts % 2 !== 0) {
+ // every increase in no_of_parts entails an increase in corresponding bound
+ // except here, it happens implicitly after every calc_no_of_parts() call
+ neg_no_of_parts++;
+ min_bound += part_size;
+ }
+
+ var no_of_parts = pos_no_of_parts + neg_no_of_parts;
+ if (no_of_parts > 5) {
+ no_of_parts /= 2;
+ part_size *= 2;
+
+ pos_no_of_parts /= 2;
+ }
+
+ if (max_val < (pos_no_of_parts - 1) * part_size) {
+ no_of_parts--;
+ }
+
+ return get_intervals(-1 * min_bound, part_size, no_of_parts);
+}
+
+function get_intervals(start, interval_size, count) {
+ var intervals = [];
+ for (var i = 0; i <= count; i++) {
+ intervals.push(start);
+ start += interval_size;
+ }
+ return intervals;
+}
+
+function calc_upper_bound_and_no_of_parts(max_val) {
+ // Given a positive value, calculates a nice-number upper bound
+ // and a consequent optimal number of parts
+
+ var part_size = Math.pow(10, (max_val + "").length - 1);
+ var no_of_parts = calc_no_of_parts(max_val, part_size);
+
+ // Use it to get a nice even upper bound
+ var upper_bound = part_size * no_of_parts;
+
+ return [upper_bound, no_of_parts];
+}
+
+function calc_no_of_parts(value, divisor) {
+ // value should be a positive number, divisor should be greater than 0
+ // returns an even no of parts
+ var no_of_parts = Math.ceil(value / divisor);
+ if (no_of_parts % 2 !== 0) no_of_parts++; // Make it an even number
+
+ return no_of_parts;
+}
+
+/**
+ * Returns the value of a number upto 2 decimal places.
+ * @param {Number} d Any number
+ */
function float_2(d) {
return parseFloat(d.toFixed(2));
}
+/**
+ * Returns whether or not two given arrays are equal.
+ * @param {Array} arr1 First array
+ * @param {Array} arr2 Second array
+ */
function arrays_equal(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
var are_equal = true;
@@ -530,29 +826,21 @@ function arrays_equal(arr1, arr2) {
return are_equal;
}
-function limitColor(r) {
- if (r > 255) return 255;else if (r < 0) return 0;
- return r;
-}
-
-function lightenDarkenColor(col, amt) {
- var usePound = false;
- if (col[0] == "#") {
- col = col.slice(1);
- usePound = true;
- }
- var num = parseInt(col, 16);
- var r = limitColor((num >> 16) + amt);
- var b = limitColor((num >> 8 & 0x00FF) + amt);
- var g = limitColor((num & 0x0000FF) + amt);
- return (usePound ? "#" : "") + (g | b << 8 | r << 16).toString(16);
-}
-
/**
* Shuffles array in place. ES6 version
- * @param {Array} a items An array containing the items.
+ * @param {Array} array An array containing the items.
*/
+
+/**
+ * Returns pixel width of string.
+ * @param {String} string
+ * @param {Number} char_width Width of single char in pixels
+ */
+function get_string_width(string, char_width) {
+ return (string + "").length * char_width;
+}
+
var SvgTip = function () {
function SvgTip(_ref) {
var _ref$parent = _ref.parent,
@@ -694,6 +982,8 @@ var BaseChart = function () {
title = _ref$title === undefined ? '' : _ref$title,
_ref$subtitle = _ref.subtitle,
subtitle = _ref$subtitle === undefined ? '' : _ref$subtitle,
+ _ref$colors = _ref.colors,
+ colors = _ref$colors === undefined ? [] : _ref$colors,
_ref$format_lambdas = _ref.format_lambdas,
format_lambdas = _ref$format_lambdas === undefined ? {} : _ref$format_lambdas,
_ref$summary = _ref.summary,
@@ -726,6 +1016,11 @@ var BaseChart = function () {
}
this.has_legend = has_legend;
+ this.colors = colors;
+ if (!this.colors || this.data.labels && this.colors.length < this.data.labels.length) {
+ this.colors = ['light-blue', 'blue', 'violet', 'red', 'orange', 'yellow', 'green', 'light-green', 'purple', 'magenta'];
+ }
+
this.chart_types = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];
this.set_margins(height);
@@ -824,12 +1119,12 @@ var BaseChart = function () {
}, {
key: 'set_width',
value: function set_width() {
- var _this2 = this;
-
var special_values_width = 0;
+ var char_width = 8;
this.specific_values.map(function (val) {
- if (_this2.get_strwidth(val.title) > special_values_width) {
- special_values_width = _this2.get_strwidth(val.title) - 40;
+ var str_width = get_string_width(val.title + "", char_width);
+ if (str_width > special_values_width) {
+ special_values_width = str_width - 40;
}
});
this.base_width = this.parent.offsetWidth - special_values_width;
@@ -898,20 +1193,20 @@ var BaseChart = function () {
}, {
key: 'show_custom_summary',
value: function show_custom_summary() {
- var _this3 = this;
+ var _this2 = this;
this.summary.map(function (d) {
var stats = $.create('div', {
className: 'stats',
innerHTML: '' + d.title + ': ' + d.value + ''
});
- _this3.stats_wrapper.appendChild(stats);
+ _this2.stats_wrapper.appendChild(stats);
});
}
}, {
key: 'setup_navigation',
value: function setup_navigation() {
- var _this4 = this;
+ var _this3 = this;
var init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
@@ -921,19 +1216,19 @@ var BaseChart = function () {
this.bind_overlay();
document.addEventListener('keydown', function (e) {
- if ($.isElementInViewport(_this4.chart_wrapper)) {
+ if ($.isElementInViewport(_this3.chart_wrapper)) {
e = e || window.event;
if (e.keyCode == '37') {
- _this4.on_left_arrow();
+ _this3.on_left_arrow();
} else if (e.keyCode == '39') {
- _this4.on_right_arrow();
+ _this3.on_right_arrow();
} else if (e.keyCode == '38') {
- _this4.on_up_arrow();
+ _this3.on_up_arrow();
} else if (e.keyCode == '40') {
- _this4.on_down_arrow();
+ _this3.on_down_arrow();
} else if (e.keyCode == '13') {
- _this4.on_enter_key();
+ _this3.on_enter_key();
}
}
});
@@ -991,14 +1286,6 @@ var BaseChart = function () {
$.fire(this.parent, "data-select", this.get_data_point());
}
- // Helpers
-
- }, {
- key: 'get_strwidth',
- value: function get_strwidth(string) {
- return (string + "").length * 8;
- }
-
// Objects
}, {
@@ -1025,9 +1312,9 @@ var AxisChart = function (_BaseChart) {
_this.get_y_tooltip = _this.format_lambdas.y_tooltip;
_this.get_x_tooltip = _this.format_lambdas.x_tooltip;
- _this.colors = ['green', 'blue', 'violet', 'red', 'orange', 'yellow', 'light-blue', 'light-green', 'purple', 'magenta'];
-
_this.zero_line = _this.height;
+
+ _this.old_values = {};
return _this;
}
@@ -1073,7 +1360,7 @@ var AxisChart = function (_BaseChart) {
values = values.concat(this.y_sums);
}
- this.y_axis_values = this.get_y_axis_points(values);
+ this.y_axis_values = calc_y_intervals(values);
if (!this.y_old_axis_values) {
this.y_old_axis_values = this.y_axis_values.slice();
@@ -1148,6 +1435,7 @@ var AxisChart = function (_BaseChart) {
var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ var char_width = 8;
var start_at = void 0,
height = void 0,
text_start_at = void 0,
@@ -1177,7 +1465,7 @@ var AxisChart = function (_BaseChart) {
this.x_axis_group.textContent = '';
this.x.map(function (point, i) {
- var space_taken = _this4.get_strwidth(point) + 2;
+ var space_taken = get_string_width(point, char_width) + 2;
if (space_taken > allowed_space) {
if (_this4.is_series) {
// Skip some axis lines if X axis is a series
@@ -1192,7 +1480,7 @@ var AxisChart = function (_BaseChart) {
point = point.slice(0, allowed_letters - 3) + " ...";
}
}
- _this4.x_axis_group.appendChild(_this4.make_x_line(height, text_start_at, point, 'x-value-text', axis_line_class, _this4.x_axis_positions[i]));
+ _this4.x_axis_group.appendChild(make_x_line(height, text_start_at, point, 'x-value-text', axis_line_class, _this4.x_axis_positions[i]));
});
}
@@ -1220,7 +1508,7 @@ var AxisChart = function (_BaseChart) {
this.y_axis_group.textContent = '';
this.y_axis_values.map(function (value, i) {
- _this5.y_axis_group.appendChild(_this5.make_y_line(start_at, width, text_end_at, value, 'y-value-text', axis_line_class, _this5.zero_line - value * _this5.multiplier, value === 0 && i !== 0 // Non-first Zero line
+ _this5.y_axis_group.appendChild(make_y_line(start_at, width, text_end_at, value, 'y-value-text', axis_line_class, _this5.zero_line - value * _this5.multiplier, value === 0 && i !== 0 // Non-first Zero line
));
});
}
@@ -1316,7 +1604,6 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_new_units_for_dataset',
value: function make_new_units_for_dataset(x_values, y_values, color, dataset_index, no_of_datasets, units_group, units_array, unit) {
- var _this9 = this;
if (!units_group) units_group = this.svg_units_groups[dataset_index];
if (!units_array) units_array = this.y[dataset_index].svg_units;
@@ -1325,8 +1612,10 @@ var AxisChart = function (_BaseChart) {
units_group.textContent = '';
units_array.length = 0;
+ var unit_renderer = new UnitRenderer(this.height, this.zero_line, this.avg_unit_width);
+
y_values.map(function (y, i) {
- var data_unit = _this9.draw[unit.type](x_values[i], y, unit.args, color, i, dataset_index, no_of_datasets);
+ var data_unit = unit_renderer['draw_' + unit.type](x_values[i], y, unit.args, color, i, dataset_index, no_of_datasets);
units_group.appendChild(data_unit);
units_array.push(data_unit);
});
@@ -1338,35 +1627,35 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_y_specifics',
value: function make_y_specifics() {
- var _this10 = this;
+ var _this9 = this;
this.specific_y_group.textContent = '';
this.specific_values.map(function (d) {
- _this10.specific_y_group.appendChild(_this10.make_y_line(0, _this10.width, _this10.width + 5, d.title.toUpperCase(), 'specific-value', 'specific-value', _this10.zero_line - d.value * _this10.multiplier, false, d.line_type));
+ _this9.specific_y_group.appendChild(make_y_line(0, _this9.width, _this9.width + 5, d.title.toUpperCase(), 'specific-value', 'specific-value', _this9.zero_line - d.value * _this9.multiplier, false, d.line_type));
});
}
}, {
key: 'bind_tooltip',
value: function bind_tooltip() {
- var _this11 = this;
+ var _this10 = this;
// TODO: could be in tooltip itself, as it is a given functionality for its parent
this.chart_wrapper.addEventListener('mousemove', function (e) {
- var offset = $.offset(_this11.chart_wrapper);
- var relX = e.pageX - offset.left - _this11.translate_x;
- var relY = e.pageY - offset.top - _this11.translate_y;
+ var offset = $.offset(_this10.chart_wrapper);
+ var relX = e.pageX - offset.left - _this10.translate_x;
+ var relY = e.pageY - offset.top - _this10.translate_y;
- if (relY < _this11.height + _this11.translate_y * 2) {
- _this11.map_tooltip_x_position_and_show(relX);
+ if (relY < _this10.height + _this10.translate_y * 2) {
+ _this10.map_tooltip_x_position_and_show(relX);
} else {
- _this11.tip.hide_tip();
+ _this10.tip.hide_tip();
}
});
}
}, {
key: 'map_tooltip_x_position_and_show',
value: function map_tooltip_x_position_and_show(relX) {
- var _this12 = this;
+ var _this11 = this;
if (!this.y_min_tops) return;
for (var i = this.x_axis_positions.length - 1; i >= 0; i--) {
@@ -1381,7 +1670,7 @@ var AxisChart = function (_BaseChart) {
return {
title: set$$1.title,
value: set$$1.formatted ? set$$1.formatted[i] : set$$1.values[i],
- color: set$$1.color || _this12.colors[j]
+ color: set$$1.color || _this11.colors[j]
};
});
@@ -1398,14 +1687,14 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'show_sums',
value: function show_sums() {
- var _this13 = this;
+ var _this12 = this;
this.updating = true;
this.y_sums = new Array(this.x_axis_positions.length).fill(0);
this.y.map(function (d) {
d.values.map(function (value, i) {
- _this13.y_sums[i] += value;
+ _this12.y_sums[i] += value;
});
});
@@ -1416,7 +1705,7 @@ var AxisChart = function (_BaseChart) {
this.sum_units = [];
this.make_new_units_for_dataset(this.x_axis_positions, this.y_sums.map(function (val) {
- return float_2(_this13.zero_line - val * _this13.multiplier);
+ return float_2(_this12.zero_line - val * _this12.multiplier);
}), 'light-grey', 0, 1, this.sum_group, this.sum_units);
// this.make_path && this.make_path(d, i, old_x, old_y, d.color || this.colors[i]);
@@ -1435,7 +1724,7 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'show_averages',
value: function show_averages() {
- var _this14 = this;
+ var _this13 = this;
this.old_specific_values = this.specific_values.slice();
this.y.map(function (d, i) {
@@ -1445,7 +1734,7 @@ var AxisChart = function (_BaseChart) {
});
var average = sum / d.values.length;
- _this14.specific_values.push({
+ _this13.specific_values.push({
title: "AVG" + " " + (i + 1),
line_type: "dashed",
value: average,
@@ -1458,7 +1747,7 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'hide_averages',
value: function hide_averages() {
- var _this15 = this;
+ var _this14 = this;
this.old_specific_values = this.specific_values.slice();
@@ -1468,7 +1757,7 @@ var AxisChart = function (_BaseChart) {
});
indices_to_remove.map(function (index) {
- _this15.specific_values.splice(index, 1);
+ _this14.specific_values.splice(index, 1);
});
this.update_values();
@@ -1476,7 +1765,7 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'update_values',
value: function update_values(new_y, new_x) {
- var _this16 = this;
+ var _this15 = this;
if (!new_x) {
new_x = this.x;
@@ -1508,7 +1797,7 @@ var AxisChart = function (_BaseChart) {
if (!arrays_equal(this.x_old_axis_positions, this.x_axis_positions)) {
this.make_x_axis(true);
setTimeout(function () {
- if (!_this16.updating) _this16.make_x_axis();
+ if (!_this15.updating) _this15.make_x_axis();
}, 350);
}
@@ -1516,9 +1805,9 @@ var AxisChart = function (_BaseChart) {
this.make_y_axis(true);
setTimeout(function () {
- if (!_this16.updating) {
- _this16.make_y_axis();
- _this16.make_y_specifics();
+ if (!_this15.updating) {
+ _this15.make_y_axis();
+ _this15.make_y_specifics();
}
}, 350);
}
@@ -1570,9 +1859,9 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'run_animation',
value: function run_animation() {
- var _this17 = this;
+ var _this16 = this;
- var anim_svg = $.runSVGAnimation(this.svg, this.elements_to_animate);
+ var anim_svg = runSVGAnimation(this.svg, this.elements_to_animate);
if (this.svg.parentNode == this.chart_wrapper) {
this.chart_wrapper.removeChild(this.svg);
@@ -1581,39 +1870,39 @@ var AxisChart = function (_BaseChart) {
// Replace the new svg (data has long been replaced)
setTimeout(function () {
- if (anim_svg.parentNode == _this17.chart_wrapper) {
- _this17.chart_wrapper.removeChild(anim_svg);
- _this17.chart_wrapper.appendChild(_this17.svg);
+ if (anim_svg.parentNode == _this16.chart_wrapper) {
+ _this16.chart_wrapper.removeChild(anim_svg);
+ _this16.chart_wrapper.appendChild(_this16.svg);
}
}, 250);
}
}, {
key: 'animate_graphs',
value: function animate_graphs() {
- var _this18 = this;
+ var _this17 = this;
this.y.map(function (d, i) {
// Pre-prep, equilize no of positions between old and new
- var _calc_old_and_new_pos = _this18.calc_old_and_new_postions(d, i),
+ var _calc_old_and_new_pos = _this17.calc_old_and_new_postions(d, i),
_calc_old_and_new_pos2 = slicedToArray(_calc_old_and_new_pos, 4),
old_x = _calc_old_and_new_pos2[0],
old_y = _calc_old_and_new_pos2[1],
new_x = _calc_old_and_new_pos2[2],
new_y = _calc_old_and_new_pos2[3];
- if (_this18.no_of_extra_pts >= 0) {
- _this18.make_path && _this18.make_path(d, i, old_x, old_y, d.color || _this18.colors[i]);
- _this18.make_new_units_for_dataset(old_x, old_y, d.color || _this18.colors[i], i, _this18.y.length);
+ if (_this17.no_of_extra_pts >= 0) {
+ _this17.make_path && _this17.make_path(d, i, old_x, old_y, d.color || _this17.colors[i]);
+ _this17.make_new_units_for_dataset(old_x, old_y, d.color || _this17.colors[i], i, _this17.y.length);
}
- d.path && _this18.animate_path(d, i, old_x, old_y, new_x, new_y);
- _this18.animate_units(d, i, old_x, old_y, new_x, new_y);
+ d.path && _this17.animate_path(d, i, old_x, old_y, new_x, new_y);
+ _this17.animate_units(d, i, old_x, old_y, new_x, new_y);
});
// TODO: replace with real units
setTimeout(function () {
- _this18.y.map(function (d, i) {
- _this18.make_path && _this18.make_path(d, i, _this18.x_axis_positions, d.y_tops, d.color || _this18.colors[i]);
- _this18.make_new_units(d, i);
+ _this17.y.map(function (d, i) {
+ _this17.make_path && _this17.make_path(d, i, _this17.x_axis_positions, d.y_tops, d.color || _this17.colors[i]);
+ _this17.make_new_units(d, i);
});
}, 400);
}
@@ -1641,14 +1930,15 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'animate_units',
value: function animate_units(d, index, old_x, old_y, new_x, new_y) {
- var _this19 = this;
+ var _this18 = this;
var type = this.unit_args.type;
+ var unit_renderer = new UnitRenderer(this.height, this.zero_line, this.avg_unit_width);
d.svg_units.map(function (unit, i) {
if (new_x[i] === undefined || new_y[i] === undefined) return;
- _this19.elements_to_animate.push(_this19.animate[type]({ unit: unit, array: d.svg_units, index: i }, // unit, with info to replace where it came from in the data
- new_x[i], new_y[i], index));
+ _this18.elements_to_animate.push(unit_renderer['animate_' + type]({ unit: unit, array: d.svg_units, index: i }, // unit, with info to replace where it came from in the data
+ new_x[i], new_y[i], index, _this18.y.length));
});
}
}, {
@@ -1693,7 +1983,7 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_anim_x_axis',
value: function make_anim_x_axis(height, text_start_at, axis_line_class) {
- var _this20 = this;
+ var _this19 = this;
// Animate X AXIS to account for more or less axis lines
@@ -1709,12 +1999,12 @@ var AxisChart = function (_BaseChart) {
if (typeof new_pos === 'string') {
new_pos = parseInt(new_pos.substring(0, new_pos.length - 1));
}
- var x_line = _this20.make_x_line(height, text_start_at, value, // new value
+ var x_line = make_x_line(height, text_start_at, value, // new value
'x-value-text', axis_line_class, old_pos // old position
);
- _this20.x_axis_group.appendChild(x_line);
+ _this19.x_axis_group.appendChild(x_line);
- _this20.elements_to_animate && _this20.elements_to_animate.push([{ unit: x_line, array: [0], index: 0 }, { transform: new_pos + ', 0' }, 350, "easein", "translate", { transform: old_pos + ', 0' }]);
+ _this19.elements_to_animate && _this19.elements_to_animate.push([{ unit: x_line, array: [0], index: 0 }, { transform: new_pos + ', 0' }, 350, "easein", "translate", { transform: old_pos + ', 0' }]);
};
this.x_axis_group.textContent = '';
@@ -1724,15 +2014,15 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_anim_y_axis',
value: function make_anim_y_axis() {
- var _this21 = this;
+ var _this20 = this;
// Animate Y AXIS to account for more or less axis lines
var old_pos = this.y_old_axis_values.map(function (value) {
- return _this21.zero_line - value * _this21.multiplier;
+ return _this20.zero_line - value * _this20.multiplier;
});
var new_pos = this.y_axis_values.map(function (value) {
- return _this21.zero_line - value * _this21.multiplier;
+ return _this20.zero_line - value * _this20.multiplier;
});
var old_vals = this.y_old_axis_values;
@@ -1747,11 +2037,11 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'make_anim_y_specifics',
value: function make_anim_y_specifics() {
- var _this22 = this;
+ var _this21 = this;
this.specific_y_group.textContent = '';
this.specific_values.map(function (d) {
- _this22.add_and_animate_y_line(d.title, _this22.old_zero_line - d.value * _this22.old_multiplier, _this22.zero_line - d.value * _this22.multiplier, 0, _this22.specific_y_group, d.line_type, true);
+ _this21.add_and_animate_y_line(d.title, _this21.old_zero_line - d.value * _this21.old_multiplier, _this21.zero_line - d.value * _this21.multiplier, 0, _this21.specific_y_group, d.line_type, true);
});
}
}, {
@@ -1792,71 +2082,6 @@ var AxisChart = function (_BaseChart) {
});
}
}
- }, {
- key: 'make_x_line',
- value: function make_x_line(height, text_start_at, point, label_class, axis_line_class, x_pos) {
- var line = $.createSVG('line', {
- x1: 0,
- x2: 0,
- y1: 0,
- y2: height
- });
-
- var text = $.createSVG('text', {
- className: label_class,
- x: 0,
- y: text_start_at,
- dy: '.71em',
- innerHTML: point
- });
-
- var x_level = $.createSVG('g', {
- className: 'tick ' + axis_line_class,
- transform: 'translate(' + x_pos + ', 0)'
- });
-
- x_level.appendChild(line);
- x_level.appendChild(text);
-
- return x_level;
- }
- }, {
- key: 'make_y_line',
- value: function make_y_line(start_at, width, text_end_at, point, label_class, axis_line_class, y_pos) {
- var darker = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
- var line_type = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : "";
-
- var line = $.createSVG('line', {
- className: line_type === "dashed" ? "dashed" : "",
- x1: start_at,
- x2: width,
- y1: 0,
- y2: 0
- });
-
- var text = $.createSVG('text', {
- className: label_class,
- x: text_end_at,
- y: 0,
- dy: '.32em',
- innerHTML: point + ""
- });
-
- var y_level = $.createSVG('g', {
- className: 'tick ' + axis_line_class,
- transform: 'translate(0, ' + y_pos + ')',
- 'stroke-opacity': 1
- });
-
- if (darker) {
- line.style.stroke = "rgba(27, 31, 35, 0.6)";
- }
-
- y_level.appendChild(line);
- y_level.appendChild(text);
-
- return y_level;
- }
}, {
key: 'add_and_animate_y_line',
value: function add_and_animate_y_line(value, old_pos, new_pos, i, group, type) {
@@ -1884,7 +2109,7 @@ var AxisChart = function (_BaseChart) {
var axis_label_class = !specific ? 'y-value-text' : 'specific-value';
value = !specific ? value : (value + "").toUpperCase();
- var y_line = this.make_y_line(start_at, width, text_end_at, value, axis_label_class, axis_line_class, old_pos, // old position
+ var y_line = make_y_line(start_at, width, text_end_at, value, axis_label_class, axis_line_class, old_pos, // old position
value === 0 && i !== 0, // Non-first Zero line
type);
@@ -1892,149 +2117,6 @@ var AxisChart = function (_BaseChart) {
this.elements_to_animate && this.elements_to_animate.push([{ unit: y_line, array: [0], index: 0 }, new_props, 350, "easein", "translate", old_props]);
}
- }, {
- key: 'get_y_axis_points',
- value: function get_y_axis_points(array) {
- var _this23 = this;
-
- //*** Where the magic happens ***
-
- // Calculates best-fit y intervals from given values
- // and returns the interval array
-
- // TODO: Fractions
-
- var max_bound = void 0,
- min_bound = void 0,
- pos_no_of_parts = void 0,
- neg_no_of_parts = void 0,
- part_size = void 0; // eslint-disable-line no-unused-vars
-
- // Critical values
- var max_val = parseInt(Math.max.apply(Math, toConsumableArray(array)));
- var min_val = parseInt(Math.min.apply(Math, toConsumableArray(array)));
- if (min_val >= 0) {
- min_val = 0;
- }
-
- var get_params = function get_params(value1, value2) {
- var bound1 = void 0,
- bound2 = void 0,
- no_of_parts_1 = void 0,
- no_of_parts_2 = void 0,
- interval_size = void 0;
- if ((value1 + "").length <= 1) {
- bound1 = 10;
- no_of_parts_1 = 5;
- } else {
- var _calc_upper_bound_and = _this23.calc_upper_bound_and_no_of_parts(value1);
-
- var _calc_upper_bound_and2 = slicedToArray(_calc_upper_bound_and, 2);
-
- bound1 = _calc_upper_bound_and2[0];
- no_of_parts_1 = _calc_upper_bound_and2[1];
- }
-
- interval_size = bound1 / no_of_parts_1;
- no_of_parts_2 = _this23.calc_no_of_parts(value2, interval_size);
- bound2 = no_of_parts_2 * interval_size;
-
- return [bound1, bound2, no_of_parts_1, no_of_parts_2, interval_size];
- };
-
- var abs_min_val = min_val * -1;
- if (abs_min_val <= max_val) {
- var _get_params = get_params(max_val, abs_min_val);
- // Get the positive region intervals
- // then calc negative ones accordingly
-
-
- var _get_params2 = slicedToArray(_get_params, 5);
-
- min_bound = _get_params2[1];
- pos_no_of_parts = _get_params2[2];
- neg_no_of_parts = _get_params2[3];
- part_size = _get_params2[4];
-
- if (abs_min_val === 0) {
- min_bound = 0;neg_no_of_parts = 0;
- }
- } else {
- var _get_params3 = get_params(abs_min_val, max_val);
- // Get the negative region here first
-
-
- var _get_params4 = slicedToArray(_get_params3, 5);
-
- min_bound = _get_params4[0];
- neg_no_of_parts = _get_params4[2];
- pos_no_of_parts = _get_params4[3];
- part_size = _get_params4[4];
- }
-
- // Make both region parts even
- if (pos_no_of_parts % 2 !== 0 && neg_no_of_parts > 0) pos_no_of_parts++;
- if (neg_no_of_parts % 2 !== 0) {
- // every increase in no_of_parts entails an increase in corresponding bound
- // except here, it happens implicitly after every calc_no_of_parts() call
- neg_no_of_parts++;
- min_bound += part_size;
- }
-
- var no_of_parts = pos_no_of_parts + neg_no_of_parts;
- if (no_of_parts > 5) {
- no_of_parts /= 2;
- part_size *= 2;
-
- pos_no_of_parts /= 2;
- }
-
- if (max_val < (pos_no_of_parts - 1) * part_size) {
- no_of_parts--;
- }
-
- return this.get_intervals(-1 * min_bound, part_size, no_of_parts);
- }
- }, {
- key: 'get_intervals',
- value: function get_intervals(start, interval_size, count) {
- var intervals = [];
- for (var i = 0; i <= count; i++) {
- intervals.push(start);
- start += interval_size;
- }
- return intervals;
- }
- }, {
- key: 'calc_upper_bound_and_no_of_parts',
- value: function calc_upper_bound_and_no_of_parts(max_val) {
- // Given a positive value, calculates a nice-number upper bound
- // and a consequent optimal number of parts
-
- var part_size = Math.pow(10, (max_val + "").length - 1);
- var no_of_parts = this.calc_no_of_parts(max_val, part_size);
-
- // Use it to get a nice even upper bound
- var upper_bound = part_size * no_of_parts;
-
- return [upper_bound, no_of_parts];
- }
- }, {
- key: 'calc_no_of_parts',
- value: function calc_no_of_parts(value, divisor) {
- // value should be a positive number, divisor should be greater than 0
- // returns an even no of parts
- var no_of_parts = Math.ceil(value / divisor);
- if (no_of_parts % 2 !== 0) no_of_parts++; // Make it an even number
-
- return no_of_parts;
- }
- }, {
- key: 'get_optimal_no_of_parts',
- value: function get_optimal_no_of_parts(no_of_parts) {
- // aka Divide by 2 if too large
- return no_of_parts < 5 ? no_of_parts : no_of_parts / 2;
- }
}, {
key: 'set_avg_unit_width_and_x_offset',
value: function set_avg_unit_width_and_x_offset() {
@@ -2060,107 +2142,22 @@ var AxisChart = function (_BaseChart) {
}, {
key: 'calc_y_dependencies',
value: function calc_y_dependencies() {
- var _this24 = this;
+ var _this22 = this;
this.y_min_tops = new Array(this.x_axis_positions.length).fill(9999);
this.y.map(function (d) {
d.y_tops = d.values.map(function (val) {
- return float_2(_this24.zero_line - val * _this24.multiplier);
+ return float_2(_this22.zero_line - val * _this22.multiplier);
});
d.y_tops.map(function (y_top, i) {
- if (y_top < _this24.y_min_tops[i]) {
- _this24.y_min_tops[i] = y_top;
+ if (y_top < _this22.y_min_tops[i]) {
+ _this22.y_min_tops[i] = y_top;
}
});
});
// this.chart_wrapper.removeChild(this.tip.container);
// this.make_tooltip();
}
- }, {
- key: 'get_bar_height_and_y_attr',
- value: function get_bar_height_and_y_attr(y_top) {
- var height = void 0,
- y = void 0;
- if (y_top <= this.zero_line) {
- height = this.zero_line - y_top;
- y = y_top;
-
- // In case of invisible bars
- if (height === 0) {
- height = this.height * 0.01;
- y -= height;
- }
- } else {
- height = y_top - this.zero_line;
- y = this.zero_line;
-
- // In case of invisible bars
- if (height === 0) {
- height = this.height * 0.01;
- }
- }
-
- return [height, y];
- }
- }, {
- key: 'setup_utils',
- value: function setup_utils() {
- var _this25 = this;
-
- this.draw = {
- 'bar': function bar(x, y_top, args, color, index, dataset_index, no_of_datasets) {
- var total_width = _this25.avg_unit_width - args.space_width;
- var start_x = x - total_width / 2;
-
- var width = total_width / no_of_datasets;
- var current_x = start_x + width * dataset_index;
-
- var _get_bar_height_and_y = _this25.get_bar_height_and_y_attr(y_top),
- _get_bar_height_and_y2 = slicedToArray(_get_bar_height_and_y, 2),
- height = _get_bar_height_and_y2[0],
- y = _get_bar_height_and_y2[1];
-
- return $.createSVG('rect', {
- className: 'bar mini fill ' + color,
- 'data-point-index': index,
- x: current_x,
- y: y,
- width: width,
- height: height
- });
- },
- 'dot': function dot(x, y, args, color, index) {
- return $.createSVG('circle', {
- className: 'fill ' + color,
- 'data-point-index': index,
- cx: x,
- cy: y,
- r: args.radius
- });
- }
- };
-
- this.animate = {
- 'bar': function bar(bar_obj, x, y_top, index) {
- var start = x - _this25.avg_unit_width / 4;
- var width = _this25.avg_unit_width / 2 / _this25.y.length;
-
- var _get_bar_height_and_y3 = _this25.get_bar_height_and_y_attr(y_top),
- _get_bar_height_and_y4 = slicedToArray(_get_bar_height_and_y3, 2),
- height = _get_bar_height_and_y4[0],
- y = _get_bar_height_and_y4[1];
-
- x = start + width * index;
-
- return [bar_obj, { width: width, height: height, x: x, y: y }, 350, "easein"];
- // bar.animate({height: args.new_height, y: y_top}, 350, mina.easein);
- },
- 'dot': function dot(dot_obj, x, y_top) {
- return [dot_obj, { cx: x, cy: y_top }, 350, "easein"];
- // dot.animate({cy: y_top}, 350, mina.easein);
- }
- };
- }
}]);
return AxisChart;
}(BaseChart);
@@ -2485,12 +2482,6 @@ var PercentageChart = function (_BaseChart) {
_this.max_slices = 10;
_this.max_legend_points = 6;
- _this.colors = args.colors;
-
- if (!_this.colors || _this.colors.length < _this.data.labels.length) {
- _this.colors = ['light-blue', 'blue', 'violet', 'red', 'orange', 'yellow', 'green', 'light-green', 'purple', 'magenta'];
- }
-
_this.setup();
return _this;
}
@@ -2570,9 +2561,6 @@ var PercentageChart = function (_BaseChart) {
this.legend_totals = this.slice_totals.slice(0, this.max_legend_points);
}
- }, {
- key: 'setup_utils',
- value: function setup_utils() {}
}, {
key: 'make_graph_components',
value: function make_graph_components() {
@@ -2633,6 +2621,24 @@ var PercentageChart = function (_BaseChart) {
return PercentageChart;
}(BaseChart);
+function limit_color(r) {
+ if (r > 255) return 255;else if (r < 0) return 0;
+ return r;
+}
+
+function lighten_darken_color(col, amt) {
+ var usePound = false;
+ if (col[0] == "#") {
+ col = col.slice(1);
+ usePound = true;
+ }
+ var num = parseInt(col, 16);
+ var r = limit_color((num >> 16) + amt);
+ var b = limit_color((num >> 8 & 0x00FF) + amt);
+ var g = limit_color((num & 0x0000FF) + amt);
+ return (usePound ? "#" : "") + (g | b << 8 | r << 16).toString(16);
+}
+
var ANGLE_RATIO = Math.PI / 180;
var FULL_ANGLE = 360;
@@ -2712,9 +2718,6 @@ var PieChart = function (_BaseChart) {
this.legend_totals = this.slice_totals.slice(0, this.max_legend_points);
}
- }, {
- key: 'setup_utils',
- value: function setup_utils() {}
}, {
key: 'makeArcPath',
value: function makeArcPath(startPosition, endPosition) {
@@ -2794,7 +2797,7 @@ var PieChart = function (_BaseChart) {
// if(this.isAnimate) return ;
// this.isAnimate = true;
if (!this.elements_to_animate || this.elements_to_animate.length === 0) return;
- var anim_svg = $.runSVGAnimation(this.svg, this.elements_to_animate);
+ var anim_svg = runSVGAnimation(this.svg, this.elements_to_animate);
if (this.svg.parentNode == this.chart_wrapper) {
this.chart_wrapper.removeChild(this.svg);
@@ -2824,8 +2827,8 @@ var PieChart = function (_BaseChart) {
value: function hoverSlice(path, i, flag, e) {
if (!path) return;
if (flag) {
- $.transform(path, this.calTranslateByAngle(this.slicesProperties[i]));
- path.setAttribute('fill', lightenDarkenColor(this.colors[i], 50));
+ transform(path, this.calTranslateByAngle(this.slicesProperties[i]));
+ path.setAttribute('fill', lighten_darken_color(this.colors[i], 50));
var g_off = $.offset(this.svg);
var x = e.pageX - g_off.left + 10;
var y = e.pageY - g_off.top - 10;
@@ -2834,7 +2837,7 @@ var PieChart = function (_BaseChart) {
this.tip.set_values(x, y, title, percent + "%");
this.tip.show_tip();
} else {
- $.transform(path, 'translate3d(0,0,0)');
+ transform(path, 'translate3d(0,0,0)');
this.tip.hide_tip();
path.setAttribute('fill', this.colors[i]);
}
@@ -2894,6 +2897,37 @@ var PieChart = function (_BaseChart) {
return PieChart;
}(BaseChart);
+// Playing around with dates
+
+// https://stackoverflow.com/a/11252167/6495043
+function treat_as_utc(date_str) {
+ var result = new Date(date_str);
+ result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
+ return result;
+}
+
+function get_dd_mm_yyyy(date) {
+ var dd = date.getDate();
+ var mm = date.getMonth() + 1; // getMonth() is zero-based
+ return [(dd > 9 ? '' : '0') + dd, (mm > 9 ? '' : '0') + mm, date.getFullYear()].join('-');
+}
+
+function get_weeks_between(start_date_str, end_date_str) {
+ return Math.ceil(get_days_between(start_date_str, end_date_str) / 7);
+}
+
+function get_days_between(start_date_str, end_date_str) {
+ var milliseconds_per_day = 24 * 60 * 60 * 1000;
+ return (treat_as_utc(end_date_str) - treat_as_utc(start_date_str)) / milliseconds_per_day;
+}
+
+// mutates
+function add_days(date, number_of_days) {
+ date.setDate(date.getDate() + number_of_days);
+}
+
+// export function get_month_name() {}
+
var Heatmap = function (_BaseChart) {
inherits(Heatmap, _BaseChart);
@@ -2923,7 +2957,7 @@ var Heatmap = function (_BaseChart) {
_this.count_label = count_label;
var today = new Date();
- _this.start = start || _this.add_days(today, 365);
+ _this.start = start || add_days(today, 365);
_this.legend_colors = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];
@@ -2944,12 +2978,12 @@ var Heatmap = function (_BaseChart) {
this.first_week_start = new Date(this.start.toDateString());
this.last_week_start = new Date(this.today.toDateString());
if (this.first_week_start.getDay() !== 7) {
- this.add_days(this.first_week_start, -1 * this.first_week_start.getDay());
+ add_days(this.first_week_start, -1 * this.first_week_start.getDay());
}
if (this.last_week_start.getDay() !== 7) {
- this.add_days(this.last_week_start, -1 * this.last_week_start.getDay());
+ add_days(this.last_week_start, -1 * this.last_week_start.getDay());
}
- this.no_of_cols = this.get_weeks_between(this.first_week_start + '', this.last_week_start + '') + 1;
+ this.no_of_cols = get_weeks_between(this.first_week_start + '', this.last_week_start + '') + 1;
}
}, {
key: 'set_width',
@@ -3015,7 +3049,7 @@ var Heatmap = function (_BaseChart) {
this.months.push(this.current_month + '');
this.month_weeks[this.current_month] = 1;
}
- this.add_days(current_week_sunday, 7);
+ add_days(current_week_sunday, 7);
}
this.render_month_labels();
}
@@ -3063,13 +3097,13 @@ var Heatmap = function (_BaseChart) {
width: square_side,
height: square_side,
fill: this.legend_colors[color_index],
- 'data-date': this.get_dd_mm_yyyy(current_date),
+ 'data-date': get_dd_mm_yyyy(current_date),
'data-value': data_value,
'data-day': current_date.getDay()
});
var next_date = new Date(current_date);
- this.add_days(next_date, 1);
+ add_days(next_date, 1);
if (next_date.getTime() > today_time) break;
if (next_date.getMonth() - current_date.getMonth()) {
@@ -3195,47 +3229,6 @@ var Heatmap = function (_BaseChart) {
return d <= value;
}).length - 1;
}
-
- // TODO: date utils, move these out
-
- // https://stackoverflow.com/a/11252167/6495043
-
- }, {
- key: 'treat_as_utc',
- value: function treat_as_utc(date_str) {
- var result = new Date(date_str);
- result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
- return result;
- }
- }, {
- key: 'get_dd_mm_yyyy',
- value: function get_dd_mm_yyyy(date) {
- var dd = date.getDate();
- var mm = date.getMonth() + 1; // getMonth() is zero-based
- return [(dd > 9 ? '' : '0') + dd, (mm > 9 ? '' : '0') + mm, date.getFullYear()].join('-');
- }
- }, {
- key: 'get_weeks_between',
- value: function get_weeks_between(start_date_str, end_date_str) {
- return Math.ceil(this.get_days_between(start_date_str, end_date_str) / 7);
- }
- }, {
- key: 'get_days_between',
- value: function get_days_between(start_date_str, end_date_str) {
- var milliseconds_per_day = 24 * 60 * 60 * 1000;
- return (this.treat_as_utc(end_date_str) - this.treat_as_utc(start_date_str)) / milliseconds_per_day;
- }
-
- // mutates
-
- }, {
- key: 'add_days',
- value: function add_days(date, number_of_days) {
- date.setDate(date.getDate() + number_of_days);
- }
- }, {
- key: 'get_month_name',
- value: function get_month_name() {}
}]);
return Heatmap;
}(BaseChart);
diff --git a/dist/frappe-charts.min.iife.js b/dist/frappe-charts.min.iife.js
index 8282a4d..179c225 100644
--- a/dist/frappe-charts.min.iife.js
+++ b/dist/frappe-charts.min.iife.js
@@ -1 +1 @@
-var Chart=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){return parseFloat(t.toFixed(2))}function i(t,e){if(t.length!==e.length)return!1;var i=!0;return t.map(function(t,a){e[a]!==t&&(i=!1)}),i}function a(t){return t>255?255:t<0?0:t}function n(t,e){var i=!1;"#"==t[0]&&(t=t.slice(1),i=!0);var n=parseInt(t,16),r=a((n>>16)+e),s=a((n>>8&255)+e),o=a((255&n)+e);return(i?"#":"")+(o|s<<8|r<<16).toString(16)}function r(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1];return A[t]?new A[t](e):new y(e)}!function(t,e){if("undefined"==typeof document)return e;t=t||"";var i=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",i.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}('.chart-container{font-family:Roboto,Geneva,Tahoma,sans-serif}.chart-container .graph-focus-margin{margin:0 5%}.chart-container>.title{margin-top:25px;margin-left:25px;text-align:left;font-weight:400;font-size:12px;color:#6c7680}.chart-container .graphics{margin-top:10px;padding-top:10px;padding-bottom:10px;position:relative}.chart-container .graph-stats-group{-ms-flex-pack:distribute;-webkit-box-flex:1;-ms-flex:1;flex:1}.chart-container .graph-stats-container,.chart-container .graph-stats-group{display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-around}.chart-container .graph-stats-container{-ms-flex-pack:distribute;padding-top:10px}.chart-container .graph-stats-container .stats{padding-bottom:15px}.chart-container .graph-stats-container .stats-title{color:#8d99a6}.chart-container .graph-stats-container .stats-value{font-size:20px;font-weight:300}.chart-container .graph-stats-container .stats-description{font-size:12px;color:#8d99a6}.chart-container .graph-stats-container .graph-data .stats-value{color:#98d85b}.chart-container .axis,.chart-container .chart-label{font-size:11px;fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .percentage-graph .progress{margin-bottom:0}.chart-container .data-points circle{stroke:#fff;stroke-width:2}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .tick.x-axis-label{display:block}.chart-container .tick .specific-value{text-anchor:start}.chart-container .tick .y-value-text{text-anchor:end}.chart-container .tick .x-value-text{text-anchor:middle}.chart-container .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.chart-container .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#36414c;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.chart-container .graph-svg-tip{position:absolute;z-index:1;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.chart-container .graph-svg-tip ol,.chart-container .graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.chart-container .graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.chart-container .graph-svg-tip strong{color:#dfe2e5;font-weight:600}.chart-container .graph-svg-tip .svg-pointer{position:absolute;bottom:-10px;left:50%;width:5px;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.chart-container .graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.chart-container .graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.chart-container .graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.chart-container .graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}.chart-container .indicator,.chart-container .indicator-right{background:none;font-size:12px;vertical-align:middle;font-weight:700;color:#6c7680}.chart-container .indicator-right:after,.chart-container .indicator:before,.chart-container .indicator i{content:"";display:inline-block;height:8px;width:8px;border-radius:8px}.chart-container .indicator:before,.chart-container .indicator i{margin:0 4px 0 0}.chart-container .indicator-right:after{margin:0 0 0 4px}.chart-container .background.grey,.chart-container .indicator-right.grey:after,.chart-container .indicator.grey:before,.chart-container .indicator.grey i{background:#bdd3e6}.chart-container .background.light-grey,.chart-container .indicator-right.light-grey:after,.chart-container .indicator.light-grey:before,.chart-container .indicator.light-grey i{background:#f0f4f7}.chart-container .background.blue,.chart-container .indicator-right.blue:after,.chart-container .indicator.blue:before,.chart-container .indicator.blue i{background:#5e64ff}.chart-container .background.red,.chart-container .indicator-right.red:after,.chart-container .indicator.red:before,.chart-container .indicator.red i{background:#ff5858}.chart-container .background.green,.chart-container .indicator-right.green:after,.chart-container .indicator.green:before,.chart-container .indicator.green i{background:#28a745}.chart-container .background.light-green,.chart-container .indicator-right.light-green:after,.chart-container .indicator.light-green:before,.chart-container .indicator.light-green i{background:#98d85b}.chart-container .background.orange,.chart-container .indicator-right.orange:after,.chart-container .indicator.orange:before,.chart-container .indicator.orange i{background:#ffa00a}.chart-container .background.violet,.chart-container .indicator-right.violet:after,.chart-container .indicator.violet:before,.chart-container .indicator.violet i{background:#743ee2}.chart-container .background.dark-grey,.chart-container .indicator-right.dark-grey:after,.chart-container .indicator.dark-grey:before,.chart-container .indicator.dark-grey i{background:#b8c2cc}.chart-container .background.black,.chart-container .indicator-right.black:after,.chart-container .indicator.black:before,.chart-container .indicator.black i{background:#36414c}.chart-container .background.yellow,.chart-container .indicator-right.yellow:after,.chart-container .indicator.yellow:before,.chart-container .indicator.yellow i{background:#feef72}.chart-container .background.light-blue,.chart-container .indicator-right.light-blue:after,.chart-container .indicator.light-blue:before,.chart-container .indicator.light-blue i{background:#7cd6fd}.chart-container .background.purple,.chart-container .indicator-right.purple:after,.chart-container .indicator.purple:before,.chart-container .indicator.purple i{background:#b554ff}.chart-container .background.magenta,.chart-container .indicator-right.magenta:after,.chart-container .indicator.magenta:before,.chart-container .indicator.magenta i{background:#ffa3ef}.chart-container .stroke.grey{stroke:#bdd3e6}.chart-container .stroke.light-grey{stroke:#f0f4f7}.chart-container .stroke.blue{stroke:#5e64ff}.chart-container .stroke.red{stroke:#ff5858}.chart-container .stroke.light-green{stroke:#98d85b}.chart-container .stroke.green{stroke:#28a745}.chart-container .stroke.orange{stroke:#ffa00a}.chart-container .stroke.violet{stroke:#743ee2}.chart-container .stroke.dark-grey{stroke:#b8c2cc}.chart-container .stroke.black{stroke:#36414c}.chart-container .stroke.yellow{stroke:#feef72}.chart-container .stroke.light-blue{stroke:#7cd6fd}.chart-container .stroke.purple{stroke:#b554ff}.chart-container .stroke.magenta{stroke:#ffa3ef}.chart-container .fill.grey{fill:#bdd3e6}.chart-container .fill.light-grey{fill:#f0f4f7}.chart-container .fill.blue{fill:#5e64ff}.chart-container .fill.red{fill:#ff5858}.chart-container .fill.light-green{fill:#98d85b}.chart-container .fill.green{fill:#28a745}.chart-container .fill.orange{fill:#ffa00a}.chart-container .fill.violet{fill:#743ee2}.chart-container .fill.dark-grey{fill:#b8c2cc}.chart-container .fill.black{fill:#36414c}.chart-container .fill.yellow{fill:#feef72}.chart-container .fill.light-blue{fill:#7cd6fd}.chart-container .fill.purple{fill:#b554ff}.chart-container .fill.magenta{fill:#ffa3ef}.chart-container .border-top.grey{border-top:3px solid #bdd3e6}.chart-container .border-top.light-grey{border-top:3px solid #f0f4f7}.chart-container .border-top.blue{border-top:3px solid #5e64ff}.chart-container .border-top.red{border-top:3px solid #ff5858}.chart-container .border-top.light-green{border-top:3px solid #98d85b}.chart-container .border-top.green{border-top:3px solid #28a745}.chart-container .border-top.orange{border-top:3px solid #ffa00a}.chart-container .border-top.violet{border-top:3px solid #743ee2}.chart-container .border-top.dark-grey{border-top:3px solid #b8c2cc}.chart-container .border-top.black{border-top:3px solid #36414c}.chart-container .border-top.yellow{border-top:3px solid #feef72}.chart-container .border-top.light-blue{border-top:3px solid #7cd6fd}.chart-container .border-top.purple{border-top:3px solid #b554ff}.chart-container .border-top.magenta{border-top:3px solid #ffa3ef}.chart-container .stop-color.grey{stop-color:#bdd3e6}.chart-container .stop-color.light-grey{stop-color:#f0f4f7}.chart-container .stop-color.blue{stop-color:#5e64ff}.chart-container .stop-color.red{stop-color:#ff5858}.chart-container .stop-color.light-green{stop-color:#98d85b}.chart-container .stop-color.green{stop-color:#28a745}.chart-container .stop-color.orange{stop-color:#ffa00a}.chart-container .stop-color.violet{stop-color:#743ee2}.chart-container .stop-color.dark-grey{stop-color:#b8c2cc}.chart-container .stop-color.black{stop-color:#36414c}.chart-container .stop-color.yellow{stop-color:#feef72}.chart-container .stop-color.light-blue{stop-color:#7cd6fd}.chart-container .stop-color.purple{stop-color:#b554ff}.chart-container .stop-color.magenta{stop-color:#ffa3ef}',void 0);var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=(function(){function t(t){this.value=t}function e(e){function i(n,r){try{var s=e[n](r),o=s.value;o instanceof t?Promise.resolve(o.value).then(function(t){i("next",t)},function(t){i("throw",t)}):a(s.done?"return":"normal",s.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":n.resolve({value:e,done:!0});break;case"throw":n.reject(e);break;default:n.resolve({value:e,done:!1})}(n=n.next)?i(n.key,n.arg):r=null}var n,r;this._invoke=function(t,e){return new Promise(function(a,s){var o={key:t,arg:e,resolve:a,reject:s,next:null};r?r=r.next=o:(n=r=o,i(t,e))})},"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),l=function(){function t(t,e){for(var i=0;i3&&void 0!==arguments[3]?arguments[3]:"linear",n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},s=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var c=void 0;c="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=r[l]||t.getAttribute(l),u=e[l],_={attributeName:l,from:h,to:u,begin:"0s",dur:i/1e3+"s",values:h+";"+u,keySplines:d[a],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};n&&(_.type=n);for(var p in _)c.setAttribute(p,_[p]);s.appendChild(c),n?o.setAttribute(l,"translate("+u+")"):o.setAttribute(l,u)}return[s,o]},t.offset=function(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}},t.isElementInViewport=function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)},t.bind=function(t,e){if(t)for(var i in e){var a=e[i];i.split(/\s+/).forEach(function(e){t.addEventListener(e,a)})}},t.unbind=function(t,e){if(t)for(var i in e){var a=e[i];i.split(/\s+/).forEach(function(e){t.removeEventListener(e,a)})}},t.fire=function(t,e,i){var a=document.createEvent("HTMLEvents");a.initEvent(e,!0,!0);for(var n in i)a[n]=i[n];return t.dispatchEvent(a)};var f=function(){function e(t){var i=t.parent,a=void 0===i?null:i;o(this,e),this.parent=a,this.title_name="",this.title_value="",this.list_values=[],this.title_value_first=0,this.x=0,this.y=0,this.top=0,this.left=0,this.setup()}return l(e,[{key:"setup",value:function(){this.make_tooltip()}},{key:"refresh",value:function(){this.fill(),this.calc_position()}},{key:"make_tooltip",value:function(){var e=this;this.container=t.create("div",{inside:this.parent,className:"graph-svg-tip comparison",innerHTML:'\n\t\t\t\t\n\t\t\t\t'}),this.hide_tip(),this.title=this.container.querySelector(".title"),this.data_point_list=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hide_tip()})}},{key:"fill",value:function(){var e=this,i=void 0;i=this.title_value_first?""+this.title_value+""+this.title_name:this.title_name+""+this.title_value+"",this.title.innerHTML=i,this.data_point_list.innerHTML="",this.list_values.map(function(i){var a=t.create("li",{className:"border-top "+(i.color||"black"),innerHTML:''+(0===i.value||i.value?i.value:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.data_point_list.appendChild(a)})}},{key:"calc_position",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var a="calc(50% + "+(this.left-e)+"px)";i.style.left=a,this.left=e}else i.style.left="50%"}},{key:"set_values",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;this.title_name=i,this.title_value=a,this.list_values=n,this.x=t,this.y=e,this.title_value_first=r,this.refresh()}},{key:"hide_tip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"show_tip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),v=function(){function e(t){var i=t.height,a=void 0===i?240:i,n=t.title,r=void 0===n?"":n,s=t.subtitle,l=void 0===s?"":s,c=t.format_lambdas,h=void 0===c?{}:c,u=t.summary,_=void 0===u?[]:u,p=t.is_navigable,d=void 0===p?0:p,f=t.has_legend,v=void 0===f?0:f,g=(t.type,t.parent),m=t.data;o(this,e),this.raw_chart_args=arguments[0],this.parent="string"==typeof g?document.querySelector(g):g,this.title=r,this.subtitle=l,this.data=m,this.format_lambdas=h,this.specific_values=m.specific_values||[],this.summary=_,this.is_navigable=d,this.is_navigable&&(this.current_index=0),this.has_legend=v,this.chart_types=["line","scatter","bar","percentage","heatmap","pie"],this.set_margins(a)}return l(e,[{key:"get_different_chart",value:function(t){if(this.chart_types.includes(t)||console.error("'"+t+"' is not a valid chart type."),t!==this.type){return{bar:["line","scatter","percentage","pie"],line:["scatter","bar","percentage","pie"],pie:["line","scatter","percentage","bar"],scatter:["line","bar","percentage","pie"],percentage:["bar","line","scatter","pie"],heatmap:[]}[this.type].includes(t)||console.error("'"+this.type+"' chart cannot be converted to a '"+t+"' chart."),new N({parent:this.raw_chart_args.parent,title:this.title,data:this.raw_chart_args.data,type:t,height:this.raw_chart_args.height})}}},{key:"set_margins",value:function(t){this.base_height=t,this.height=t-40,this.translate_x=60,this.translate_y=10}},{key:"setup",value:function(){this.parent?(this.bind_window_events(),this.refresh(!0)):console.error("No parent element to render on was provided.")}},{key:"bind_window_events",value:function(){var t=this;window.addEventListener("resize",function(){return t.refresh()}),window.addEventListener("orientationchange",function(){return t.refresh()})}},{key:"refresh",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.setup_base_values(),this.set_width(),this.setup_container(),this.setup_components(),this.setup_values(),this.setup_utils(),this.make_graph_components(t),this.make_tooltip(),this.summary.length>0?this.show_custom_summary():this.show_summary(),this.is_navigable&&this.setup_navigation(t)}},{key:"set_width",value:function(){var t=this,e=0;this.specific_values.map(function(i){t.get_strwidth(i.title)>e&&(e=t.get_strwidth(i.title)-40)}),this.base_width=this.parent.offsetWidth-e,this.width=this.base_width-2*this.translate_x}},{key:"setup_base_values",value:function(){}},{key:"setup_container",value:function(){this.container=t.create("div",{className:"chart-container",innerHTML:''+this.title+'
\n\t\t\t\t'+this.subtitle+'
\n\t\t\t\t\n\t\t\t\t'}),this.parent.innerHTML="",this.parent.appendChild(this.container),this.chart_wrapper=this.container.querySelector(".frappe-chart"),this.stats_wrapper=this.container.querySelector(".graph-stats-container"),this.make_chart_area(),this.make_draw_area()}},{key:"make_chart_area",value:function(){return this.svg=t.createSVG("svg",{className:"chart",inside:this.chart_wrapper,width:this.base_width,height:this.base_height}),this.svg_defs=t.createSVG("defs",{inside:this.svg}),this.svg}},{key:"make_draw_area",value:function(){this.draw_area=t.createSVG("g",{className:this.type+"-chart",inside:this.svg,transform:"translate("+this.translate_x+", "+this.translate_y+")"})}},{key:"setup_components",value:function(){}},{key:"make_tooltip",value:function(){this.tip=new f({parent:this.chart_wrapper}),this.bind_tooltip()}},{key:"show_summary",value:function(){}},{key:"show_custom_summary",value:function(){var e=this;this.summary.map(function(i){var a=t.create("div",{className:"stats",innerHTML:''+i.title+": "+i.value+""});e.stats_wrapper.appendChild(a)})}},{key:"setup_navigation",value:function(){var e=this,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.make_overlay(),i&&(this.bind_overlay(),document.addEventListener("keydown",function(i){t.isElementInViewport(e.chart_wrapper)&&("37"==(i=i||window.event).keyCode?e.on_left_arrow():"39"==i.keyCode?e.on_right_arrow():"38"==i.keyCode?e.on_up_arrow():"40"==i.keyCode?e.on_down_arrow():"13"==i.keyCode&&e.on_enter_key())}))}},{key:"make_overlay",value:function(){}},{key:"bind_overlay",value:function(){}},{key:"bind_units",value:function(){}},{key:"on_left_arrow",value:function(){}},{key:"on_right_arrow",value:function(){}},{key:"on_up_arrow",value:function(){}},{key:"on_down_arrow",value:function(){}},{key:"on_enter_key",value:function(){}},{key:"get_data_point",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.current_index,e={index:t},i=this.y[0];return["svg_units","y_tops","values"].map(function(a){var n=a.slice(0,a.length-1);e[n]=i[a][t]}),e.label=this.x[t],e}},{key:"update_current_data_point",value:function(e){(e=parseInt(e))<0&&(e=0),e>=this.x.length&&(e=this.x.length-1),e!==this.current_index&&(this.current_index=e,t.fire(this.parent,"data-select",this.get_data_point()))}},{key:"get_strwidth",value:function(t){return 8*(t+"").length}},{key:"setup_utils",value:function(){}}]),e}(),g=function(a){function n(t){o(this,n);var e=u(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,t));return e.x=e.data.labels,e.y=e.data.datasets,e.is_series=t.is_series,e.get_y_label=e.format_lambdas.y_label,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.colors=["green","blue","violet","red","orange","yellow","light-blue","light-green","purple","magenta"],e.zero_line=e.height,e}return h(n,v),l(n,[{key:"setup_values",value:function(){this.data.datasets.map(function(t){t.values=t.values.map(function(t){return isNaN(t)?0:t})}),this.setup_x(),this.setup_y()}},{key:"setup_x",value:function(){var t=this;this.set_avg_unit_width_and_x_offset(),this.x_axis_positions&&(this.x_old_axis_positions=this.x_axis_positions.slice()),this.x_axis_positions=this.x.map(function(i,a){return e(t.x_offset+a*t.avg_unit_width)}),this.x_old_axis_positions||(this.x_old_axis_positions=this.x_axis_positions.slice())}},{key:"setup_y",value:function(){this.y_axis_values&&(this.y_old_axis_values=this.y_axis_values.slice());var t=this.get_all_y_values();this.y_sums&&this.y_sums.length>0&&(t=t.concat(this.y_sums)),this.y_axis_values=this.get_y_axis_points(t),this.y_old_axis_values||(this.y_old_axis_values=this.y_axis_values.slice());var e=this.y_axis_values,i=e[e.length-1]-e[0];this.multiplier&&(this.old_multiplier=this.multiplier),this.multiplier=this.height/i,this.old_multiplier||(this.old_multiplier=this.multiplier);var a=e.indexOf(0),n=(e[1]-e[0])*this.multiplier;this.zero_line&&(this.old_zero_line=this.zero_line),this.zero_line=this.height-a*n,this.old_zero_line||(this.old_zero_line=this.zero_line)}},{key:"setup_components",value:function(){c(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_components",this).call(this),this.setup_marker_components(),this.setup_aggregation_components(),this.setup_graph_components()}},{key:"setup_marker_components",value:function(){this.y_axis_group=t.createSVG("g",{className:"y axis",inside:this.draw_area}),this.x_axis_group=t.createSVG("g",{className:"x axis",inside:this.draw_area}),this.specific_y_group=t.createSVG("g",{className:"specific axis",inside:this.draw_area})}},{key:"setup_aggregation_components",value:function(){this.sum_group=t.createSVG("g",{className:"data-points",inside:this.draw_area}),this.average_group=t.createSVG("g",{className:"chart-area",inside:this.draw_area})}},{key:"setup_graph_components",value:function(){var e=this;this.svg_units_groups=[],this.y.map(function(i,a){e.svg_units_groups[a]=t.createSVG("g",{className:"data-points data-points-"+a,inside:e.draw_area})})}},{key:"make_graph_components",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.make_y_axis(),this.make_x_axis(),this.draw_graph(t),this.make_y_specifics()}},{key:"make_x_axis",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=void 0,a=void 0,n=void 0,r="";if("span"===this.x_axis_mode?(i=-7,a=this.height+15,n=this.height+25):"tick"===this.x_axis_mode&&(i=this.height,a=6,n=9,r="x-axis-label"),this.x_axis_group.setAttribute("transform","translate(0,"+i+")"),e)this.make_anim_x_axis(a,n,r);else{var s=1.5*this.avg_unit_width,o=s/8;this.x_axis_group.textContent="",this.x.map(function(e,i){var l=t.get_strwidth(e)+2;if(l>s)if(t.is_series){for(var c=1;l/c*2>s;)c++;if(i%c!=0)return}else e=e.slice(0,o-3)+" ...";t.x_axis_group.appendChild(t.make_x_line(a,n,e,"x-value-text",r,t.x_axis_positions[i]))})}}},{key:"make_y_axis",value:function(){var t=this;if(arguments.length>0&&void 0!==arguments[0]&&arguments[0])return this.make_anim_y_axis(),void this.make_anim_y_specifics();var e=this.get_y_axis_line_props(),i=_(e,4),a=i[0],n=i[1],r=i[2],s=i[3];this.y_axis_group.textContent="",this.y_axis_values.map(function(e,i){t.y_axis_group.appendChild(t.make_y_line(s,a,n,e,"y-value-text",r,t.zero_line-e*t.multiplier,0===e&&0!==i))})}},{key:"get_y_axis_line_props",value:function(){if(arguments.length>0&&void 0!==arguments[0]&&arguments[0])return[this.width,this.width+5,"specific-value",0];var t=void 0,e="",i=0;return"span"===this.y_axis_mode?(t=this.width+6,i=-6):"tick"===this.y_axis_mode&&(t=-6,e="y-axis-label"),[t,-9,e,i]}},{key:"draw_graph",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];!this.raw_chart_args.hasOwnProperty("init")||this.raw_chart_args.init?e?this.draw_new_graph_and_animate():this.y.map(function(e,i){e.svg_units=[],t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i)}):this.y.map(function(e,i){e.svg_units=[],t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i),t.calc_y_dependencies()})}},{key:"draw_new_graph_and_animate",value:function(){var t=this,e=[];this.y.map(function(i,a){i.y_tops=new Array(i.values.length).fill(t.zero_line),e.push({values:i.values}),i.svg_units=[],t.make_path&&t.make_path(i,a,t.x_axis_positions,i.y_tops,i.color||t.colors[a]),t.make_new_units(i,a)}),setTimeout(function(){t.update_values(e)},350)}},{key:"setup_navigation",value:function(t){var e=this;t?setTimeout(function(){c(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_navigation",e).call(e,t)},500):c(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_navigation",this).call(this,t)}},{key:"make_new_units",value:function(t,e){this.make_new_units_for_dataset(this.x_axis_positions,t.y_tops,t.color||this.colors[e],e,this.y.length)}},{key:"make_new_units_for_dataset",value:function(t,e,i,a,n,r,s,o){var l=this;r||(r=this.svg_units_groups[a]),s||(s=this.y[a].svg_units),o||(o=this.unit_args),r.textContent="",s.length=0,e.map(function(e,c){var h=l.draw[o.type](t[c],e,o.args,i,c,a,n);r.appendChild(h),s.push(h)}),this.is_navigable&&this.bind_units(s)}},{key:"make_y_specifics",value:function(){var t=this;this.specific_y_group.textContent="",this.specific_values.map(function(e){t.specific_y_group.appendChild(t.make_y_line(0,t.width,t.width+5,e.title.toUpperCase(),"specific-value","specific-value",t.zero_line-e.value*t.multiplier,!1,e.line_type))})}},{key:"bind_tooltip",value:function(){var e=this;this.chart_wrapper.addEventListener("mousemove",function(i){var a=t.offset(e.chart_wrapper),n=i.pageX-a.left-e.translate_x;i.pageY-a.top-e.translate_y=0;i--){var a=this.x_axis_positions[i];if(t>a-this.avg_unit_width/2){var n=a+this.translate_x,r=this.y_min_tops[i]+this.translate_y,s=this.x.formatted&&this.x.formatted.length>0?this.x.formatted[i]:this.x[i],o=this.y.map(function(t,a){return{title:t.title,value:t.formatted?t.formatted[i]:t.values[i],color:t.color||e.colors[a]}});this.tip.set_values(n,r,s,"",o),this.tip.show_tip();break}}}},{key:"show_sums",value:function(){var t=this;this.updating=!0,this.y_sums=new Array(this.x_axis_positions.length).fill(0),this.y.map(function(e){e.values.map(function(e,i){t.y_sums[i]+=e})}),this.update_values(),this.sum_units=[],this.make_new_units_for_dataset(this.x_axis_positions,this.y_sums.map(function(i){return e(t.zero_line-i*t.multiplier)}),"light-grey",0,1,this.sum_group,this.sum_units),this.updating=!1}},{key:"hide_sums",value:function(){this.updating||(this.y_sums=[],this.sum_group.textContent="",this.sum_units=[],this.update_values())}},{key:"show_averages",value:function(){var t=this;this.old_specific_values=this.specific_values.slice(),this.y.map(function(e,i){var a=0;e.values.map(function(t){a+=t});var n=a/e.values.length;t.specific_values.push({title:"AVG "+(i+1),line_type:"dashed",value:n,auto:1})}),this.update_values()}},{key:"hide_averages",value:function(){var t=this;this.old_specific_values=this.specific_values.slice();var e=[];this.specific_values.map(function(t,i){t.auto&&e.unshift(i)}),e.map(function(e){t.specific_values.splice(e,1)}),this.update_values()}},{key:"update_values",value:function(t,e){var a=this;e||(e=this.x),this.elements_to_animate=[],this.updating=!0,this.old_x_values=this.x.slice(),this.old_y_axis_tops=this.y.map(function(t){return t.y_tops.slice()}),this.old_y_values=this.y.map(function(t){return t.values}),this.no_of_extra_pts=e.length-this.x.length,t&&this.y.map(function(e,i){e.values=t[i].values}),e&&(this.x=e),this.setup_x(),this.setup_y(),i(this.x_old_axis_positions,this.x_axis_positions)||(this.make_x_axis(!0),setTimeout(function(){a.updating||a.make_x_axis()},350)),(!i(this.y_old_axis_values,this.y_axis_values)||this.old_specific_values&&!i(this.old_specific_values,this.specific_values))&&(this.make_y_axis(!0),setTimeout(function(){a.updating||(a.make_y_axis(),a.make_y_specifics())},350)),this.calc_y_dependencies(),this.animate_graphs(),this.run_animation(),this.updating=!1}},{key:"add_data_point",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.x.length,a=this.y.map(function(t){return{values:t.values}});a.map(function(e,a){e.values.splice(i,0,t[a])});var n=this.x.slice();n.splice(i,0,e),this.update_values(a,n)}},{key:"remove_data_point",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.x.length-1;if(!(this.x.length<3)){var e=this.y.map(function(t){return{values:t.values}});e.map(function(e){e.values.splice(t,1)});var i=this.x.slice();i.splice(t,1),this.update_values(e,i)}}},{key:"run_animation",value:function(){var e=this,i=t.runSVGAnimation(this.svg,this.elements_to_animate);this.svg.parentNode==this.chart_wrapper&&(this.chart_wrapper.removeChild(this.svg),this.chart_wrapper.appendChild(i)),setTimeout(function(){i.parentNode==e.chart_wrapper&&(e.chart_wrapper.removeChild(i),e.chart_wrapper.appendChild(e.svg))},250)}},{key:"animate_graphs",value:function(){var t=this;this.y.map(function(e,i){var a=t.calc_old_and_new_postions(e,i),n=_(a,4),r=n[0],s=n[1],o=n[2],l=n[3];t.no_of_extra_pts>=0&&(t.make_path&&t.make_path(e,i,r,s,e.color||t.colors[i]),t.make_new_units_for_dataset(r,s,e.color||t.colors[i],i,t.y.length)),e.path&&t.animate_path(e,i,r,s,o,l),t.animate_units(e,i,r,s,o,l)}),setTimeout(function(){t.y.map(function(e,i){t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i)})},400)}},{key:"animate_path",value:function(t,e,i,a,n,r){var s=r.map(function(t,e){return n[e]+","+t}).join("L"),o=[{unit:t.path,object:t,key:"path"},{d:"M"+s},350,"easein"];if(this.elements_to_animate.push(o),t.region_path){var l="0,"+this.zero_line+"L",c="L"+this.width+","+this.zero_line,h=[{unit:t.region_path,object:t,key:"region_path"},{d:"M"+l+s+c},350,"easein"];this.elements_to_animate.push(h)}}},{key:"animate_units",value:function(t,e,i,a,n,r){var s=this,o=this.unit_args.type;t.svg_units.map(function(i,a){void 0!==n[a]&&void 0!==r[a]&&s.elements_to_animate.push(s.animate[o]({unit:i,array:t.svg_units,index:a},n[a],r[a],e))})}},{key:"calc_old_and_new_postions",value:function(t,e){var i=this.x_old_axis_positions.slice(),a=this.x_axis_positions.slice(),n=this.old_y_axis_tops[e].slice(),r=t.y_tops.slice(),s=i[i.length-1],o=n[n.length-1],l=a[a.length-1],c=r[r.length-1];if(this.no_of_extra_pts>=0){var h=new Array(Math.abs(this.no_of_extra_pts)).fill(s),u=new Array(Math.abs(this.no_of_extra_pts)).fill(o);i=i.concat(h),n=n.concat(u)}else{var _=new Array(Math.abs(this.no_of_extra_pts)).fill(l),p=new Array(Math.abs(this.no_of_extra_pts)).fill(c);a=a.concat(_),r=r.concat(p)}return[i,n,a,r]}},{key:"make_anim_x_axis",value:function(t,e,i){var a=this,n=this.x_old_axis_positions,r=this.x_axis_positions,s=this.old_x_values,o=this.x,l=n[n.length-1];this.x_axis_group.textContent="",this.make_new_axis_anim_lines(n,r,s,o,l,function(n,r,s){"string"==typeof s&&(s=parseInt(s.substring(0,s.length-1)));var o=a.make_x_line(t,e,n,"x-value-text",i,r);a.x_axis_group.appendChild(o),a.elements_to_animate&&a.elements_to_animate.push([{unit:o,array:[0],index:0},{transform:s+", 0"},350,"easein","translate",{transform:r+", 0"}])})}},{key:"make_anim_y_axis",value:function(){var t=this,e=this.y_old_axis_values.map(function(e){return t.zero_line-e*t.multiplier}),i=this.y_axis_values.map(function(e){return t.zero_line-e*t.multiplier}),a=this.y_old_axis_values,n=this.y_axis_values,r=e[e.length-1];this.y_axis_group.textContent="",this.make_new_axis_anim_lines(e,i,a,n,r,this.add_and_animate_y_line.bind(this),this.y_axis_group)}},{key:"make_anim_y_specifics",value:function(){var t=this;this.specific_y_group.textContent="",this.specific_values.map(function(e){t.add_and_animate_y_line(e.title,t.old_zero_line-e.value*t.old_multiplier,t.zero_line-e.value*t.multiplier,0,t.specific_y_group,e.line_type,!0)})}},{key:"make_new_axis_anim_lines",value:function(t,e,i,a,n,r,s){var o=void 0,l=void 0,c=a.length-i.length;if(c>0)o=e.slice(0,t.length),l=a.slice(0,i.length);else{var h=new Array(Math.abs(c)).fill("");l=a.concat(h);var u=new Array(Math.abs(c)).fill(n+"F");o=e.concat(u)}if(l.map(function(e,i){r(e,t[i],o[i],i,s)}),c>0){var _=a.slice(i.length),p=e.slice(t.length);_.map(function(t,e){r(t,n,p[e],e,s)})}}},{key:"make_x_line",value:function(e,i,a,n,r,s){var o=t.createSVG("line",{x1:0,x2:0,y1:0,y2:e}),l=t.createSVG("text",{className:n,x:0,y:i,dy:".71em",innerHTML:a}),c=t.createSVG("g",{className:"tick "+r,transform:"translate("+s+", 0)"});return c.appendChild(o),c.appendChild(l),c}},{key:"make_y_line",value:function(e,i,a,n,r,s,o){var l=arguments.length>7&&void 0!==arguments[7]&&arguments[7],c=arguments.length>8&&void 0!==arguments[8]?arguments[8]:"",h=t.createSVG("line",{className:"dashed"===c?"dashed":"",x1:e,x2:i,y1:0,y2:0}),u=t.createSVG("text",{className:r,x:a,y:0,dy:".32em",innerHTML:n+""}),_=t.createSVG("g",{className:"tick "+s,transform:"translate(0, "+o+")","stroke-opacity":1});return l&&(h.style.stroke="rgba(27, 31, 35, 0.6)"),_.appendChild(h),_.appendChild(u),_}},{key:"add_and_animate_y_line",value:function(t,e,i,a,n,r){var s=arguments.length>6&&void 0!==arguments[6]&&arguments[6],o=!1;"string"==typeof i&&(i=parseInt(i.substring(0,i.length-1)),o=!0);var l={transform:"0, "+i},c={transform:"0, "+e};o&&(l["stroke-opacity"]=0);var h=this.get_y_axis_line_props(s),u=_(h,4),p=u[0],d=u[1],f=u[2],v=u[3],g=s?"specific-value":"y-value-text";t=s?(t+"").toUpperCase():t;var m=this.make_y_line(v,p,d,t,g,f,e,0===t&&0!==a,r);n.appendChild(m),this.elements_to_animate&&this.elements_to_animate.push([{unit:m,array:[0],index:0},l,350,"easein","translate",c])}},{key:"get_y_axis_points",value:function(t){var e=this,i=void 0,a=void 0,n=void 0,r=void 0,s=parseInt(Math.max.apply(Math,p(t))),o=parseInt(Math.min.apply(Math,p(t)));o>=0&&(o=0);var l=function(t,i){var a=void 0,n=void 0,r=void 0,s=void 0,o=void 0;if((t+"").length<=1)a=10,r=5;else{var l=e.calc_upper_bound_and_no_of_parts(t),c=_(l,2);a=c[0],r=c[1]}return o=a/r,s=e.calc_no_of_parts(i,o),n=s*o,[a,n,r,s,o]},c=-1*o;if(c<=s){var h=l(s,c),u=_(h,5);i=u[1],a=u[2],n=u[3],r=u[4],0===c&&(i=0,n=0)}else{var d=l(c,s),f=_(d,5);i=f[0],n=f[2],a=f[3],r=f[4]}a%2!=0&&n>0&&a++,n%2!=0&&(n++,i+=r);var v=a+n;return v>5&&(v/=2,r*=2,a/=2),s<(a-1)*r&&v--,this.get_intervals(-1*i,r,v)}},{key:"get_intervals",value:function(t,e,i){for(var a=[],n=0;n<=i;n++)a.push(t),t+=e;return a}},{key:"calc_upper_bound_and_no_of_parts",value:function(t){var e=Math.pow(10,(t+"").length-1),i=this.calc_no_of_parts(t,e);return[e*i,i]}},{key:"calc_no_of_parts",value:function(t,e){var i=Math.ceil(t/e);return i%2!=0&&i++,i}},{key:"get_optimal_no_of_parts",value:function(t){return t<5?t:t/2}},{key:"set_avg_unit_width_and_x_offset",value:function(){this.avg_unit_width=this.width/(this.x.length-1),this.x_offset=0}},{key:"get_all_y_values",value:function(){var t=[];return this.y.map(function(e){t=t.concat(e.values)}),t.concat(this.specific_values.map(function(t){return t.value}))}},{key:"calc_y_dependencies",value:function(){var t=this;this.y_min_tops=new Array(this.x_axis_positions.length).fill(9999),this.y.map(function(i){i.y_tops=i.values.map(function(i){return e(t.zero_line-i*t.multiplier)}),i.y_tops.map(function(e,i){e1&&void 0!==arguments[1]&&arguments[1],a="path-fill-gradient-"+e,n=t.createSVG("linearGradient",{inside:this.svg_defs,id:a,x1:0,x2:0,y1:0,y2:1}),r=function(e,i,a,n){t.createSVG("stop",{className:"stop-color "+a,inside:e,offset:i,"stop-opacity":n})},s=[1,.6,.2];return i&&(s=[.4,.2,0]),r(n,"0%",e,s[0]),r(n,"50%",e,s[1]),r(n,"100%",e,s[2]),a}}]),i}(),b=function(t){function e(t){o(this,e);var i=u(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return i.type="scatter",t.dot_radius?i.dot_radius=t.dot_radius:i.dot_radius=8,i.setup(),i}return h(e,y),l(e,[{key:"setup_graph_components",value:function(){this.setup_path_groups(),c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setup_graph_components",this).call(this)}},{key:"setup_path_groups",value:function(){}},{key:"setup_values",value:function(){c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setup_values",this).call(this),this.unit_args={type:"dot",args:{radius:this.dot_radius}}}},{key:"make_paths",value:function(){}},{key:"make_path",value:function(){}}]),e}(),x=function(e){function i(t){o(this,i);var e=u(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return e.type="percentage",e.get_y_label=e.format_lambdas.y_label,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.max_slices=10,e.max_legend_points=6,e.colors=t.colors,(!e.colors||e.colors.length0}),i=e;if(e.length>this.max_slices){e.sort(function(t,e){return e[0]-t[0]}),i=e.slice(0,this.max_slices-1);var a=0;e.slice(this.max_slices-1).map(function(t){a+=t[0]}),i.push([a,"Rest"]),this.colors[this.max_slices-1]="grey"}this.labels=[],i.map(function(e){t.slice_totals.push(e[0]),t.labels.push(e[1])}),this.legend_totals=this.slice_totals.slice(0,this.max_legend_points)}},{key:"setup_utils",value:function(){}},{key:"make_graph_components",value:function(){var e=this;this.grand_total=this.slice_totals.reduce(function(t,e){return t+e},0),this.slices=[],this.slice_totals.map(function(i,a){var n=t.create("div",{className:"progress-bar background "+e.colors[a],inside:e.percentage_bar,styles:{width:100*i/e.grand_total+"%"}});e.slices.push(n)})}},{key:"bind_tooltip",value:function(){var e=this;this.slices.map(function(i,a){i.addEventListener("mouseenter",function(){var n=t.offset(e.chart_wrapper),r=t.offset(i),s=r.left-n.left+i.offsetWidth/2,o=r.top-n.top-6,l=(e.formatted_labels&&e.formatted_labels.length>0?e.formatted_labels[a]:e.labels[a])+": ",c=(100*e.slice_totals[a]/e.grand_total).toFixed(1);e.tip.set_values(s,o,l,c+"%"),e.tip.show_tip()})})}},{key:"show_summary",value:function(){var e=this,i=this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels:this.labels;this.legend_totals.map(function(a,n){a&&(t.create("div",{className:"stats",inside:e.stats_wrapper}).innerHTML='\n\t\t\t\t\t'+i[n]+":\n\t\t\t\t\t"+a+"\n\t\t\t\t")})}}]),i}(),k=Math.PI/180,w=function(e){function i(t){o(this,i);var e=u(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return e.type="pie",e.get_y_label=e.format_lambdas.y_label,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.elements_to_animate=null,e.hoverRadio=t.hoverRadio||.1,e.max_slices=10,e.max_legend_points=6,e.isAnimate=!1,e.colors=t.colors,e.startAngle=t.startAngle||0,e.clockWise=t.clockWise||!1,(!e.colors||e.colors.lengththis.width?this.centerX:this.centerY,this.slice_totals=[];var e=this.data.labels.map(function(e,i){var a=0;return t.data.datasets.map(function(t){a+=t.values[i]}),[a,e]}).filter(function(t){return t[0]>0}),i=e;if(e.length>this.max_slices){e.sort(function(t,e){return e[0]-t[0]}),i=e.slice(0,this.max_slices-1);var a=0;e.slice(this.max_slices-1).map(function(t){a+=t[0]}),i.push([a,"Rest"]),this.colors[this.max_slices-1]="grey"}this.labels=[],i.map(function(e){t.slice_totals.push(e[0]),t.labels.push(e[1])}),this.legend_totals=this.slice_totals.slice(0,this.max_legend_points)}},{key:"setup_utils",value:function(){}},{key:"makeArcPath",value:function(t,e){var i=this.centerX,a=this.centerY,n=this.radius,r=this.clockWise;return"M"+i+" "+a+" L"+(i+t.x)+" "+(a+t.y)+" A "+n+" "+n+" 0 0 "+(r?1:0)+" "+(i+e.x)+" "+(a+e.y)+" z"}},{key:"make_graph_components",value:function(e){var a=this,n=this.radius,r=this.clockWise;this.grand_total=this.slice_totals.reduce(function(t,e){return t+e},0);var s=this.slicesProperties||[];this.slices=[],this.elements_to_animate=[],this.slicesProperties=[];var o=180-this.startAngle;this.slice_totals.map(function(l,c){var h=o,u=l/a.grand_total*360,_=r?-u:u,p=o+=_,d=i.getPositionByAngle(h,n),f=i.getPositionByAngle(p,n),v=e&&s[c],g=void 0,m=void 0;e?(g=v?v.startPosition:d,m=v?v.endPosition:d):(g=d,m=f);var y=a.makeArcPath(g,m),b=t.createSVG("path",{inside:a.draw_area,className:"pie-path",style:"transition:transform .3s;",d:y,fill:a.colors[c]});a.slices.push(b),a.slicesProperties.push({startPosition:d,endPosition:f,value:l,total:a.grand_total,startAngle:h,endAngle:p,angle:_}),e&&a.elements_to_animate.push([{unit:b,array:a.slices,index:a.slices.length-1},{d:a.makeArcPath(d,f)},650,"easein",null,{d:y}])}),e&&this.run_animation()}},{key:"run_animation",value:function(){var e=this;if(this.elements_to_animate&&0!==this.elements_to_animate.length){var i=t.runSVGAnimation(this.svg,this.elements_to_animate);this.svg.parentNode==this.chart_wrapper&&(this.chart_wrapper.removeChild(this.svg),this.chart_wrapper.appendChild(i)),setTimeout(function(){i.parentNode==e.chart_wrapper&&(e.chart_wrapper.removeChild(i),e.chart_wrapper.appendChild(e.svg))},650)}}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,a=this.hoverRadio,n=i.getPositionByAngle(t.startAngle+t.angle/2,e);return"translate3d("+n.x*a+"px,"+n.y*a+"px,0)"}},{key:"hoverSlice",value:function(e,i,a,r){if(e)if(a){t.transform(e,this.calTranslateByAngle(this.slicesProperties[i])),e.setAttribute("fill",n(this.colors[i],50));var s=t.offset(this.svg),o=r.pageX-s.left+10,l=r.pageY-s.top-10,c=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.labels[i])+": ",h=(100*this.slice_totals[i]/this.grand_total).toFixed(1);this.tip.set_values(o,l,c,h+"%"),this.tip.show_tip()}else t.transform(e,"translate3d(0,0,0)"),this.tip.hide_tip(),e.setAttribute("fill",this.colors[i])}},{key:"mouseMove",value:function(t){for(var e=t.target,i=this.curActiveSliceIndex,a=this.curActiveSlice,n=0;n0?this.formatted_labels:this.labels;this.legend_totals.map(function(a,n){a&&(t.create("div",{className:"stats",inside:e.stats_wrapper}).innerHTML='\n\t\t\t\t\t\n\t\t\t\t\t'+i[n]+":\n\t\t\t\t\t"+a+"\n\t\t\t\t")})}}],[{key:"getPositionByAngle",value:function(t,e){return{x:Math.sin(t*k)*e,y:Math.cos(t*k)*e}}}]),i}(),S=function(e){function i(t){var e=t.start,a=void 0===e?"":e,n=t.domain,r=void 0===n?"":n,s=t.subdomain,l=void 0===s?"":s,c=t.data,h=void 0===c?{}:c,_=t.discrete_domains,p=void 0===_?0:_,d=t.count_label,f=void 0===d?"":d;o(this,i);var v=u(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,arguments[0]));v.type="heatmap",v.domain=r,v.subdomain=l,v.data=h,v.discrete_domains=p,v.count_label=f;var g=new Date;return v.start=a||v.add_days(g,365),v.legend_colors=["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],v.translate_x=0,v.setup(),v}return h(i,v),l(i,[{key:"setup_base_values",value:function(){this.today=new Date,this.start||(this.start=new Date,this.start.setFullYear(this.start.getFullYear()-1)),this.first_week_start=new Date(this.start.toDateString()),this.last_week_start=new Date(this.today.toDateString()),7!==this.first_week_start.getDay()&&this.add_days(this.first_week_start,-1*this.first_week_start.getDay()),7!==this.last_week_start.getDay()&&this.add_days(this.last_week_start,-1*this.last_week_start.getDay()),this.no_of_cols=this.get_weeks_between(this.first_week_start+"",this.last_week_start+"")+1}},{key:"set_width",value:function(){this.base_width=12*(this.no_of_cols+3),this.discrete_domains&&(this.base_width+=144)}},{key:"setup_components",value:function(){this.domain_label_group=t.createSVG("g",{className:"domain-label-group chart-label",inside:this.draw_area}),this.data_groups=t.createSVG("g",{className:"data-groups",inside:this.draw_area,transform:"translate(0, 20)"})}},{key:"setup_values",value:function(){this.domain_label_group.textContent="",this.data_groups.textContent="",this.distribution=this.get_distribution(this.data,this.legend_colors),this.month_names=["January","February","March","April","May","June","July","August","September","October","November","December"],this.render_all_weeks_and_store_x_values(this.no_of_cols)}},{key:"render_all_weeks_and_store_x_values",value:function(t){var e=new Date(this.first_week_start);this.week_col=0,this.current_month=e.getMonth(),this.months=[this.current_month+""],this.month_weeks={},this.month_start_points=[],this.month_weeks[this.current_month]=0,this.month_start_points.push(13);for(var i=0;ia)break;p.getMonth()-e.getMonth()&&(n=1,this.discrete_domains&&(r=1),this.month_start_points.push(13+12*(i+r))),e=p}return[s,n]}},{key:"render_month_labels",value:function(){var e=this;this.months.shift(),this.month_start_points.shift(),this.months.pop(),this.month_start_points.pop(),this.month_start_points.map(function(i,a){var n=e.month_names[e.months[a]].substring(0,3);t.createSVG("text",{className:"y-value-text",inside:e.domain_label_group,x:i+12,y:10,dy:".32em",innerHTML:n})})}},{key:"make_graph_components",value:function(){Array.prototype.slice.call(this.container.querySelectorAll(".graph-stats-container, .sub-title, .title")).map(function(t){t.style.display="None"}),this.chart_wrapper.style.marginTop="0px",this.chart_wrapper.style.paddingTop="0px"}},{key:"bind_tooltip",value:function(){var t=this;Array.prototype.slice.call(document.querySelectorAll(".data-group .day")).map(function(e){e.addEventListener("mouseenter",function(e){var i=e.target.getAttribute("data-value"),a=e.target.getAttribute("data-date").split("-"),n=t.month_names[parseInt(a[1])-1].substring(0,3),r=t.chart_wrapper.getBoundingClientRect(),s=e.target.getBoundingClientRect(),o=parseInt(e.target.getAttribute("width")),l=s.left-r.left+(o+2)/2,c=s.top-r.top-(o+2)/2,h=i+" "+t.count_label,u=" on "+n+" "+a[0]+", "+a[2];t.tip.set_values(l,c,u,h,[],1),t.tip.show_tip()})})}},{key:"update",value:function(t){this.data=t,this.setup_values(),this.bind_tooltip()}},{key:"get_distribution",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments[1],i=Object.keys(t).map(function(e){return t[e]}),a=Math.max.apply(Math,p(i)),n=1/(e.length-1),r=[];return e.map(function(t,e){var i=a*(n*e);r.push(i)}),r}},{key:"get_max_checkpoint",value:function(t,e){return e.filter(function(i,a){return 1===a?e[0]9?"":"0")+e,(i>9?"":"0")+i,t.getFullYear()].join("-")}},{key:"get_weeks_between",value:function(t,e){return Math.ceil(this.get_days_between(t,e)/7)}},{key:"get_days_between",value:function(t,e){return(this.treat_as_utc(e)-this.treat_as_utc(t))/864e5}},{key:"add_days",value:function(t,e){t.setDate(t.getDate()+e)}},{key:"get_month_name",value:function(){}}]),i}(),A={line:y,bar:m,scatter:b,percentage:x,heatmap:S,pie:w},N=function t(e){return o(this,t),r(e.type,arguments[0])};return N}();
+var Chart=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(e,i,a,n,r,s){var o=t.createSVG("line",{x1:0,x2:0,y1:0,y2:e}),l=t.createSVG("text",{className:n,x:0,y:i,dy:".71em",innerHTML:a}),c=t.createSVG("g",{className:"tick "+r,transform:"translate("+s+", 0)"});return c.appendChild(o),c.appendChild(l),c}function i(e,i,a,n,r,s,o){var l=arguments.length>7&&void 0!==arguments[7]&&arguments[7],c=arguments.length>8&&void 0!==arguments[8]?arguments[8]:"",h=t.createSVG("line",{className:"dashed"===c?"dashed":"",x1:e,x2:i,y1:0,y2:0}),u=t.createSVG("text",{className:r,x:a,y:0,dy:".32em",innerHTML:n+""}),_=t.createSVG("g",{className:"tick "+s,transform:"translate(0, "+o+")","stroke-opacity":1});return l&&(h.style.stroke="rgba(27, 31, 35, 0.6)"),_.appendChild(h),_.appendChild(u),_}function a(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},s=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var c=void 0;c="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=r[l]||t.getAttribute(l),u=e[l],_={attributeName:l,from:h,to:u,begin:"0s",dur:i/1e3+"s",values:h+";"+u,keySplines:T[a],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};n&&(_.type=n);for(var p in _)c.setAttribute(p,_[p]);s.appendChild(c),n?o.setAttribute(l,"translate("+u+")"):o.setAttribute(l,u)}return[s,o]}function n(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function r(t,e){var i=[],n=[];e.map(function(t){var e=t[0],r=e.unit.parentNode,s=void 0,o=void 0;t[0]=e.unit;var l=a.apply(void 0,M(t)),c=C(l,2);s=c[0],o=c[1],i.push(o),n.push([s,r]),r.replaceChild(s,e.unit),e.array?e.array[e.index]=o:e.object[e.key]=o});var r=t.cloneNode(!0);return n.map(function(t,a){t[1].replaceChild(i[a],t[0]),e[a][0]=i[a]}),r}function s(t){var e=void 0,i=void 0,a=void 0,n=void 0,r=parseInt(Math.max.apply(Math,M(t))),s=parseInt(Math.min.apply(Math,M(t)));s>=0&&(s=0);var h=function(t,e){var i=void 0,a=void 0,n=void 0,r=void 0,s=void 0;if((t+"").length<=1)i=10,n=5;else{var o=l(t),h=C(o,2);i=h[0],n=h[1]}return s=i/n,r=c(e,s),a=r*s,[i,a,n,r,s]},u=-1*s;if(u<=r){var _=h(r,u),p=C(_,5);e=p[1],i=p[2],a=p[3],n=p[4],0===u&&(e=0,a=0)}else{var d=h(u,r),f=C(d,5);e=f[0],a=f[2],i=f[3],n=f[4]}i%2!=0&&a>0&&i++,a%2!=0&&(a++,e+=n);var v=i+a;return v>5&&(v/=2,n*=2,i/=2),r<(i-1)*n&&v--,o(-1*e,n,v)}function o(t,e,i){for(var a=[],n=0;n<=i;n++)a.push(t),t+=e;return a}function l(t){var e=Math.pow(10,(t+"").length-1),i=c(t,e);return[e*i,i]}function c(t,e){var i=Math.ceil(t/e);return i%2!=0&&i++,i}function h(t){return parseFloat(t.toFixed(2))}function u(t,e){if(t.length!==e.length)return!1;var i=!0;return t.map(function(t,a){e[a]!==t&&(i=!1)}),i}function _(t,e){return(t+"").length*e}function p(t){return t>255?255:t<0?0:t}function d(t,e){var i=!1;"#"==t[0]&&(t=t.slice(1),i=!0);var a=parseInt(t,16),n=p((a>>16)+e),r=p((a>>8&255)+e),s=p((255&a)+e);return(i?"#":"")+(s|r<<8|n<<16).toString(16)}function f(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function v(t){var e=t.getDate(),i=t.getMonth()+1;return[(e>9?"":"0")+e,(i>9?"":"0")+i,t.getFullYear()].join("-")}function g(t,e){return Math.ceil(m(t,e)/7)}function m(t,e){return(f(e)-f(t))/864e5}function y(t,e){t.setDate(t.getDate()+e)}function b(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1];return B[t]?new B[t](e):new E(e)}!function(t,e){if("undefined"==typeof document)return e;t=t||"";var i=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",i.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}('.chart-container{font-family:Roboto,Geneva,Tahoma,sans-serif}.chart-container .graph-focus-margin{margin:0 5%}.chart-container>.title{margin-top:25px;margin-left:25px;text-align:left;font-weight:400;font-size:12px;color:#6c7680}.chart-container .graphics{margin-top:10px;padding-top:10px;padding-bottom:10px;position:relative}.chart-container .graph-stats-group{-ms-flex-pack:distribute;-webkit-box-flex:1;-ms-flex:1;flex:1}.chart-container .graph-stats-container,.chart-container .graph-stats-group{display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-around}.chart-container .graph-stats-container{-ms-flex-pack:distribute;padding-top:10px}.chart-container .graph-stats-container .stats{padding-bottom:15px}.chart-container .graph-stats-container .stats-title{color:#8d99a6}.chart-container .graph-stats-container .stats-value{font-size:20px;font-weight:300}.chart-container .graph-stats-container .stats-description{font-size:12px;color:#8d99a6}.chart-container .graph-stats-container .graph-data .stats-value{color:#98d85b}.chart-container .axis,.chart-container .chart-label{font-size:11px;fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .percentage-graph .progress{margin-bottom:0}.chart-container .data-points circle{stroke:#fff;stroke-width:2}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .tick.x-axis-label{display:block}.chart-container .tick .specific-value{text-anchor:start}.chart-container .tick .y-value-text{text-anchor:end}.chart-container .tick .x-value-text{text-anchor:middle}.chart-container .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.chart-container .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#36414c;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.chart-container .graph-svg-tip{position:absolute;z-index:1;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.chart-container .graph-svg-tip ol,.chart-container .graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.chart-container .graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.chart-container .graph-svg-tip strong{color:#dfe2e5;font-weight:600}.chart-container .graph-svg-tip .svg-pointer{position:absolute;bottom:-10px;left:50%;width:5px;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.chart-container .graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.chart-container .graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.chart-container .graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.chart-container .graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}.chart-container .indicator,.chart-container .indicator-right{background:none;font-size:12px;vertical-align:middle;font-weight:700;color:#6c7680}.chart-container .indicator-right:after,.chart-container .indicator:before,.chart-container .indicator i{content:"";display:inline-block;height:8px;width:8px;border-radius:8px}.chart-container .indicator:before,.chart-container .indicator i{margin:0 4px 0 0}.chart-container .indicator-right:after{margin:0 0 0 4px}.chart-container .background.grey,.chart-container .indicator-right.grey:after,.chart-container .indicator.grey:before,.chart-container .indicator.grey i{background:#bdd3e6}.chart-container .background.light-grey,.chart-container .indicator-right.light-grey:after,.chart-container .indicator.light-grey:before,.chart-container .indicator.light-grey i{background:#f0f4f7}.chart-container .background.blue,.chart-container .indicator-right.blue:after,.chart-container .indicator.blue:before,.chart-container .indicator.blue i{background:#5e64ff}.chart-container .background.red,.chart-container .indicator-right.red:after,.chart-container .indicator.red:before,.chart-container .indicator.red i{background:#ff5858}.chart-container .background.green,.chart-container .indicator-right.green:after,.chart-container .indicator.green:before,.chart-container .indicator.green i{background:#28a745}.chart-container .background.light-green,.chart-container .indicator-right.light-green:after,.chart-container .indicator.light-green:before,.chart-container .indicator.light-green i{background:#98d85b}.chart-container .background.orange,.chart-container .indicator-right.orange:after,.chart-container .indicator.orange:before,.chart-container .indicator.orange i{background:#ffa00a}.chart-container .background.violet,.chart-container .indicator-right.violet:after,.chart-container .indicator.violet:before,.chart-container .indicator.violet i{background:#743ee2}.chart-container .background.dark-grey,.chart-container .indicator-right.dark-grey:after,.chart-container .indicator.dark-grey:before,.chart-container .indicator.dark-grey i{background:#b8c2cc}.chart-container .background.black,.chart-container .indicator-right.black:after,.chart-container .indicator.black:before,.chart-container .indicator.black i{background:#36414c}.chart-container .background.yellow,.chart-container .indicator-right.yellow:after,.chart-container .indicator.yellow:before,.chart-container .indicator.yellow i{background:#feef72}.chart-container .background.light-blue,.chart-container .indicator-right.light-blue:after,.chart-container .indicator.light-blue:before,.chart-container .indicator.light-blue i{background:#7cd6fd}.chart-container .background.purple,.chart-container .indicator-right.purple:after,.chart-container .indicator.purple:before,.chart-container .indicator.purple i{background:#b554ff}.chart-container .background.magenta,.chart-container .indicator-right.magenta:after,.chart-container .indicator.magenta:before,.chart-container .indicator.magenta i{background:#ffa3ef}.chart-container .stroke.grey{stroke:#bdd3e6}.chart-container .stroke.light-grey{stroke:#f0f4f7}.chart-container .stroke.blue{stroke:#5e64ff}.chart-container .stroke.red{stroke:#ff5858}.chart-container .stroke.light-green{stroke:#98d85b}.chart-container .stroke.green{stroke:#28a745}.chart-container .stroke.orange{stroke:#ffa00a}.chart-container .stroke.violet{stroke:#743ee2}.chart-container .stroke.dark-grey{stroke:#b8c2cc}.chart-container .stroke.black{stroke:#36414c}.chart-container .stroke.yellow{stroke:#feef72}.chart-container .stroke.light-blue{stroke:#7cd6fd}.chart-container .stroke.purple{stroke:#b554ff}.chart-container .stroke.magenta{stroke:#ffa3ef}.chart-container .fill.grey{fill:#bdd3e6}.chart-container .fill.light-grey{fill:#f0f4f7}.chart-container .fill.blue{fill:#5e64ff}.chart-container .fill.red{fill:#ff5858}.chart-container .fill.light-green{fill:#98d85b}.chart-container .fill.green{fill:#28a745}.chart-container .fill.orange{fill:#ffa00a}.chart-container .fill.violet{fill:#743ee2}.chart-container .fill.dark-grey{fill:#b8c2cc}.chart-container .fill.black{fill:#36414c}.chart-container .fill.yellow{fill:#feef72}.chart-container .fill.light-blue{fill:#7cd6fd}.chart-container .fill.purple{fill:#b554ff}.chart-container .fill.magenta{fill:#ffa3ef}.chart-container .border-top.grey{border-top:3px solid #bdd3e6}.chart-container .border-top.light-grey{border-top:3px solid #f0f4f7}.chart-container .border-top.blue{border-top:3px solid #5e64ff}.chart-container .border-top.red{border-top:3px solid #ff5858}.chart-container .border-top.light-green{border-top:3px solid #98d85b}.chart-container .border-top.green{border-top:3px solid #28a745}.chart-container .border-top.orange{border-top:3px solid #ffa00a}.chart-container .border-top.violet{border-top:3px solid #743ee2}.chart-container .border-top.dark-grey{border-top:3px solid #b8c2cc}.chart-container .border-top.black{border-top:3px solid #36414c}.chart-container .border-top.yellow{border-top:3px solid #feef72}.chart-container .border-top.light-blue{border-top:3px solid #7cd6fd}.chart-container .border-top.purple{border-top:3px solid #b554ff}.chart-container .border-top.magenta{border-top:3px solid #ffa3ef}.chart-container .stop-color.grey{stop-color:#bdd3e6}.chart-container .stop-color.light-grey{stop-color:#f0f4f7}.chart-container .stop-color.blue{stop-color:#5e64ff}.chart-container .stop-color.red{stop-color:#ff5858}.chart-container .stop-color.light-green{stop-color:#98d85b}.chart-container .stop-color.green{stop-color:#28a745}.chart-container .stop-color.orange{stop-color:#ffa00a}.chart-container .stop-color.violet{stop-color:#743ee2}.chart-container .stop-color.dark-grey{stop-color:#b8c2cc}.chart-container .stop-color.black{stop-color:#36414c}.chart-container .stop-color.yellow{stop-color:#feef72}.chart-container .stop-color.light-blue{stop-color:#7cd6fd}.chart-container .stop-color.purple{stop-color:#b554ff}.chart-container .stop-color.magenta{stop-color:#ffa3ef}',void 0);var x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},k=(function(){function t(t){this.value=t}function e(e){function i(n,r){try{var s=e[n](r),o=s.value;o instanceof t?Promise.resolve(o.value).then(function(t){i("next",t)},function(t){i("throw",t)}):a(s.done?"return":"normal",s.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":n.resolve({value:e,done:!0});break;case"throw":n.reject(e);break;default:n.resolve({value:e,done:!1})}(n=n.next)?i(n.key,n.arg):r=null}var n,r;this._invoke=function(t,e){return new Promise(function(a,s){var o={key:t,arg:e,resolve:a,reject:s,next:null};r?r=r.next=o:(n=r=o,i(t,e))})},"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),w=function(){function t(t,e){for(var i=0;i=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)},t.bind=function(t,e){if(t)for(var i in e){var a=e[i];i.split(/\s+/).forEach(function(e){t.addEventListener(e,a)})}},t.unbind=function(t,e){if(t)for(var i in e){var a=e[i];i.split(/\s+/).forEach(function(e){t.removeEventListener(e,a)})}},t.fire=function(t,e,i){var a=document.createEvent("HTMLEvents");a.initEvent(e,!0,!0);for(var n in i)a[n]=i[n];return t.dispatchEvent(a)};var O=function(){function e(t,e,i){var a=void 0,n=void 0;return t<=e?(n=t,0===(a=e-t)&&(n-=a=.01*i)):(n=e,0===(a=t-e)&&(a=.01*i)),[a,n]}var i=function(t,e,i){this.total_height=t,this.zero_line=e,this.avg_unit_width=i};return i.prototype={draw_bar:function(i,a,n,r,s,o,l){var c=this.avg_unit_width-n.space_width,h=c/l,u=i-c/2+h*o,_=e(a,this.zero_line,this.total_height),p=C(_,2),d=p[0],f=p[1];return t.createSVG("rect",{className:"bar mini fill "+r,"data-point-index":s,x:u,y:f,width:h,height:d})},draw_dot:function(e,i,a,n,r){return t.createSVG("circle",{className:"fill "+n,"data-point-index":r,cx:e,cy:i,r:a.radius})},animate_bar:function(t,i,a,n,r){var s=i-this.avg_unit_width/4,o=this.avg_unit_width/2/r,l=e(a,this.zero_line,this.total_height),c=C(l,2);return i=s+o*n,[t,{width:o,height:c[0],x:i,y:c[1]},350,"easein"]},animate_dot:function(t,e,i){return[t,{cx:e,cy:i},350,"easein"]}},i}(),T={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},P=function(){function e(t){var i=t.parent,a=void 0===i?null:i;k(this,e),this.parent=a,this.title_name="",this.title_value="",this.list_values=[],this.title_value_first=0,this.x=0,this.y=0,this.top=0,this.left=0,this.setup()}return w(e,[{key:"setup",value:function(){this.make_tooltip()}},{key:"refresh",value:function(){this.fill(),this.calc_position()}},{key:"make_tooltip",value:function(){var e=this;this.container=t.create("div",{inside:this.parent,className:"graph-svg-tip comparison",innerHTML:'\n\t\t\t\t\n\t\t\t\t'}),this.hide_tip(),this.title=this.container.querySelector(".title"),this.data_point_list=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hide_tip()})}},{key:"fill",value:function(){var e=this,i=void 0;i=this.title_value_first?""+this.title_value+""+this.title_name:this.title_name+""+this.title_value+"",this.title.innerHTML=i,this.data_point_list.innerHTML="",this.list_values.map(function(i){var a=t.create("li",{className:"border-top "+(i.color||"black"),innerHTML:''+(0===i.value||i.value?i.value:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.data_point_list.appendChild(a)})}},{key:"calc_position",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var a="calc(50% + "+(this.left-e)+"px)";i.style.left=a,this.left=e}else i.style.left="50%"}},{key:"set_values",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;this.title_name=i,this.title_value=a,this.list_values=n,this.x=t,this.y=e,this.title_value_first=r,this.refresh()}},{key:"hide_tip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"show_tip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),L=function(){function e(t){var i=t.height,a=void 0===i?240:i,n=t.title,r=void 0===n?"":n,s=t.subtitle,o=void 0===s?"":s,l=t.colors,c=void 0===l?[]:l,h=t.format_lambdas,u=void 0===h?{}:h,_=t.summary,p=void 0===_?[]:_,d=t.is_navigable,f=void 0===d?0:d,v=t.has_legend,g=void 0===v?0:v,m=(t.type,t.parent),y=t.data;k(this,e),this.raw_chart_args=arguments[0],this.parent="string"==typeof m?document.querySelector(m):m,this.title=r,this.subtitle=o,this.data=y,this.format_lambdas=u,this.specific_values=y.specific_values||[],this.summary=p,this.is_navigable=f,this.is_navigable&&(this.current_index=0),this.has_legend=g,this.colors=c,(!this.colors||this.data.labels&&this.colors.length0&&void 0!==arguments[0]&&arguments[0];this.setup_base_values(),this.set_width(),this.setup_container(),this.setup_components(),this.setup_values(),this.setup_utils(),this.make_graph_components(t),this.make_tooltip(),this.summary.length>0?this.show_custom_summary():this.show_summary(),this.is_navigable&&this.setup_navigation(t)}},{key:"set_width",value:function(){var t=0;this.specific_values.map(function(e){var i=_(e.title+"",8);i>t&&(t=i-40)}),this.base_width=this.parent.offsetWidth-t,this.width=this.base_width-2*this.translate_x}},{key:"setup_base_values",value:function(){}},{key:"setup_container",value:function(){this.container=t.create("div",{className:"chart-container",innerHTML:''+this.title+'
\n\t\t\t\t'+this.subtitle+'
\n\t\t\t\t\n\t\t\t\t'}),this.parent.innerHTML="",this.parent.appendChild(this.container),this.chart_wrapper=this.container.querySelector(".frappe-chart"),this.stats_wrapper=this.container.querySelector(".graph-stats-container"),this.make_chart_area(),this.make_draw_area()}},{key:"make_chart_area",value:function(){return this.svg=t.createSVG("svg",{className:"chart",inside:this.chart_wrapper,width:this.base_width,height:this.base_height}),this.svg_defs=t.createSVG("defs",{inside:this.svg}),this.svg}},{key:"make_draw_area",value:function(){this.draw_area=t.createSVG("g",{className:this.type+"-chart",inside:this.svg,transform:"translate("+this.translate_x+", "+this.translate_y+")"})}},{key:"setup_components",value:function(){}},{key:"make_tooltip",value:function(){this.tip=new P({parent:this.chart_wrapper}),this.bind_tooltip()}},{key:"show_summary",value:function(){}},{key:"show_custom_summary",value:function(){var e=this;this.summary.map(function(i){var a=t.create("div",{className:"stats",innerHTML:''+i.title+": "+i.value+""});e.stats_wrapper.appendChild(a)})}},{key:"setup_navigation",value:function(){var e=this,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.make_overlay(),i&&(this.bind_overlay(),document.addEventListener("keydown",function(i){t.isElementInViewport(e.chart_wrapper)&&("37"==(i=i||window.event).keyCode?e.on_left_arrow():"39"==i.keyCode?e.on_right_arrow():"38"==i.keyCode?e.on_up_arrow():"40"==i.keyCode?e.on_down_arrow():"13"==i.keyCode&&e.on_enter_key())}))}},{key:"make_overlay",value:function(){}},{key:"bind_overlay",value:function(){}},{key:"bind_units",value:function(){}},{key:"on_left_arrow",value:function(){}},{key:"on_right_arrow",value:function(){}},{key:"on_up_arrow",value:function(){}},{key:"on_down_arrow",value:function(){}},{key:"on_enter_key",value:function(){}},{key:"get_data_point",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.current_index,e={index:t},i=this.y[0];return["svg_units","y_tops","values"].map(function(a){var n=a.slice(0,a.length-1);e[n]=i[a][t]}),e.label=this.x[t],e}},{key:"update_current_data_point",value:function(e){(e=parseInt(e))<0&&(e=0),e>=this.x.length&&(e=this.x.length-1),e!==this.current_index&&(this.current_index=e,t.fire(this.parent,"data-select",this.get_data_point()))}},{key:"setup_utils",value:function(){}}]),e}(),z=function(a){function n(t){k(this,n);var e=A(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,t));return e.x=e.data.labels,e.y=e.data.datasets,e.is_series=t.is_series,e.get_y_label=e.format_lambdas.y_label,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.zero_line=e.height,e.old_values={},e}return N(n,L),w(n,[{key:"setup_values",value:function(){this.data.datasets.map(function(t){t.values=t.values.map(function(t){return isNaN(t)?0:t})}),this.setup_x(),this.setup_y()}},{key:"setup_x",value:function(){var t=this;this.set_avg_unit_width_and_x_offset(),this.x_axis_positions&&(this.x_old_axis_positions=this.x_axis_positions.slice()),this.x_axis_positions=this.x.map(function(e,i){return h(t.x_offset+i*t.avg_unit_width)}),this.x_old_axis_positions||(this.x_old_axis_positions=this.x_axis_positions.slice())}},{key:"setup_y",value:function(){this.y_axis_values&&(this.y_old_axis_values=this.y_axis_values.slice());var t=this.get_all_y_values();this.y_sums&&this.y_sums.length>0&&(t=t.concat(this.y_sums)),this.y_axis_values=s(t),this.y_old_axis_values||(this.y_old_axis_values=this.y_axis_values.slice());var e=this.y_axis_values,i=e[e.length-1]-e[0];this.multiplier&&(this.old_multiplier=this.multiplier),this.multiplier=this.height/i,this.old_multiplier||(this.old_multiplier=this.multiplier);var a=e.indexOf(0),n=(e[1]-e[0])*this.multiplier;this.zero_line&&(this.old_zero_line=this.zero_line),this.zero_line=this.height-a*n,this.old_zero_line||(this.old_zero_line=this.zero_line)}},{key:"setup_components",value:function(){S(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_components",this).call(this),this.setup_marker_components(),this.setup_aggregation_components(),this.setup_graph_components()}},{key:"setup_marker_components",value:function(){this.y_axis_group=t.createSVG("g",{className:"y axis",inside:this.draw_area}),this.x_axis_group=t.createSVG("g",{className:"x axis",inside:this.draw_area}),this.specific_y_group=t.createSVG("g",{className:"specific axis",inside:this.draw_area})}},{key:"setup_aggregation_components",value:function(){this.sum_group=t.createSVG("g",{className:"data-points",inside:this.draw_area}),this.average_group=t.createSVG("g",{className:"chart-area",inside:this.draw_area})}},{key:"setup_graph_components",value:function(){var e=this;this.svg_units_groups=[],this.y.map(function(i,a){e.svg_units_groups[a]=t.createSVG("g",{className:"data-points data-points-"+a,inside:e.draw_area})})}},{key:"make_graph_components",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.make_y_axis(),this.make_x_axis(),this.draw_graph(t),this.make_y_specifics()}},{key:"make_x_axis",value:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0],a=void 0,n=void 0,r=void 0,s="";if("span"===this.x_axis_mode?(a=-7,n=this.height+15,r=this.height+25):"tick"===this.x_axis_mode&&(a=this.height,n=6,r=9,s="x-axis-label"),this.x_axis_group.setAttribute("transform","translate(0,"+a+")"),i)this.make_anim_x_axis(n,r,s);else{var o=1.5*this.avg_unit_width,l=o/8;this.x_axis_group.textContent="",this.x.map(function(i,a){var c=_(i,8)+2;if(c>o)if(t.is_series){for(var h=1;c/h*2>o;)h++;if(a%h!=0)return}else i=i.slice(0,l-3)+" ...";t.x_axis_group.appendChild(e(n,r,i,"x-value-text",s,t.x_axis_positions[a]))})}}},{key:"make_y_axis",value:function(){var t=this;if(arguments.length>0&&void 0!==arguments[0]&&arguments[0])return this.make_anim_y_axis(),void this.make_anim_y_specifics();var e=this.get_y_axis_line_props(),a=C(e,4),n=a[0],r=a[1],s=a[2],o=a[3];this.y_axis_group.textContent="",this.y_axis_values.map(function(e,a){t.y_axis_group.appendChild(i(o,n,r,e,"y-value-text",s,t.zero_line-e*t.multiplier,0===e&&0!==a))})}},{key:"get_y_axis_line_props",value:function(){if(arguments.length>0&&void 0!==arguments[0]&&arguments[0])return[this.width,this.width+5,"specific-value",0];var t=void 0,e="",i=0;return"span"===this.y_axis_mode?(t=this.width+6,i=-6):"tick"===this.y_axis_mode&&(t=-6,e="y-axis-label"),[t,-9,e,i]}},{key:"draw_graph",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];!this.raw_chart_args.hasOwnProperty("init")||this.raw_chart_args.init?e?this.draw_new_graph_and_animate():this.y.map(function(e,i){e.svg_units=[],t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i)}):this.y.map(function(e,i){e.svg_units=[],t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i),t.calc_y_dependencies()})}},{key:"draw_new_graph_and_animate",value:function(){var t=this,e=[];this.y.map(function(i,a){i.y_tops=new Array(i.values.length).fill(t.zero_line),e.push({values:i.values}),i.svg_units=[],t.make_path&&t.make_path(i,a,t.x_axis_positions,i.y_tops,i.color||t.colors[a]),t.make_new_units(i,a)}),setTimeout(function(){t.update_values(e)},350)}},{key:"setup_navigation",value:function(t){var e=this;t?setTimeout(function(){S(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_navigation",e).call(e,t)},500):S(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_navigation",this).call(this,t)}},{key:"make_new_units",value:function(t,e){this.make_new_units_for_dataset(this.x_axis_positions,t.y_tops,t.color||this.colors[e],e,this.y.length)}},{key:"make_new_units_for_dataset",value:function(t,e,i,a,n,r,s,o){r||(r=this.svg_units_groups[a]),s||(s=this.y[a].svg_units),o||(o=this.unit_args),r.textContent="",s.length=0;var l=new O(this.height,this.zero_line,this.avg_unit_width);e.map(function(e,c){var h=l["draw_"+o.type](t[c],e,o.args,i,c,a,n);r.appendChild(h),s.push(h)}),this.is_navigable&&this.bind_units(s)}},{key:"make_y_specifics",value:function(){var t=this;this.specific_y_group.textContent="",this.specific_values.map(function(e){t.specific_y_group.appendChild(i(0,t.width,t.width+5,e.title.toUpperCase(),"specific-value","specific-value",t.zero_line-e.value*t.multiplier,!1,e.line_type))})}},{key:"bind_tooltip",value:function(){var e=this;this.chart_wrapper.addEventListener("mousemove",function(i){var a=t.offset(e.chart_wrapper),n=i.pageX-a.left-e.translate_x;i.pageY-a.top-e.translate_y=0;i--){var a=this.x_axis_positions[i];if(t>a-this.avg_unit_width/2){var n=a+this.translate_x,r=this.y_min_tops[i]+this.translate_y,s=this.x.formatted&&this.x.formatted.length>0?this.x.formatted[i]:this.x[i],o=this.y.map(function(t,a){return{title:t.title,value:t.formatted?t.formatted[i]:t.values[i],color:t.color||e.colors[a]}});this.tip.set_values(n,r,s,"",o),this.tip.show_tip();break}}}},{key:"show_sums",value:function(){var t=this;this.updating=!0,this.y_sums=new Array(this.x_axis_positions.length).fill(0),this.y.map(function(e){e.values.map(function(e,i){t.y_sums[i]+=e})}),this.update_values(),this.sum_units=[],this.make_new_units_for_dataset(this.x_axis_positions,this.y_sums.map(function(e){return h(t.zero_line-e*t.multiplier)}),"light-grey",0,1,this.sum_group,this.sum_units),this.updating=!1}},{key:"hide_sums",value:function(){this.updating||(this.y_sums=[],this.sum_group.textContent="",this.sum_units=[],this.update_values())}},{key:"show_averages",value:function(){var t=this;this.old_specific_values=this.specific_values.slice(),this.y.map(function(e,i){var a=0;e.values.map(function(t){a+=t});var n=a/e.values.length;t.specific_values.push({title:"AVG "+(i+1),line_type:"dashed",value:n,auto:1})}),this.update_values()}},{key:"hide_averages",value:function(){var t=this;this.old_specific_values=this.specific_values.slice();var e=[];this.specific_values.map(function(t,i){t.auto&&e.unshift(i)}),e.map(function(e){t.specific_values.splice(e,1)}),this.update_values()}},{key:"update_values",value:function(t,e){var i=this;e||(e=this.x),this.elements_to_animate=[],this.updating=!0,this.old_x_values=this.x.slice(),this.old_y_axis_tops=this.y.map(function(t){return t.y_tops.slice()}),this.old_y_values=this.y.map(function(t){return t.values}),this.no_of_extra_pts=e.length-this.x.length,t&&this.y.map(function(e,i){e.values=t[i].values}),e&&(this.x=e),this.setup_x(),this.setup_y(),u(this.x_old_axis_positions,this.x_axis_positions)||(this.make_x_axis(!0),setTimeout(function(){i.updating||i.make_x_axis()},350)),(!u(this.y_old_axis_values,this.y_axis_values)||this.old_specific_values&&!u(this.old_specific_values,this.specific_values))&&(this.make_y_axis(!0),setTimeout(function(){i.updating||(i.make_y_axis(),i.make_y_specifics())},350)),this.calc_y_dependencies(),this.animate_graphs(),this.run_animation(),this.updating=!1}},{key:"add_data_point",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.x.length,a=this.y.map(function(t){return{values:t.values}});a.map(function(e,a){e.values.splice(i,0,t[a])});var n=this.x.slice();n.splice(i,0,e),this.update_values(a,n)}},{key:"remove_data_point",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.x.length-1;if(!(this.x.length<3)){var e=this.y.map(function(t){return{values:t.values}});e.map(function(e){e.values.splice(t,1)});var i=this.x.slice();i.splice(t,1),this.update_values(e,i)}}},{key:"run_animation",value:function(){var t=this,e=r(this.svg,this.elements_to_animate);this.svg.parentNode==this.chart_wrapper&&(this.chart_wrapper.removeChild(this.svg),this.chart_wrapper.appendChild(e)),setTimeout(function(){e.parentNode==t.chart_wrapper&&(t.chart_wrapper.removeChild(e),t.chart_wrapper.appendChild(t.svg))},250)}},{key:"animate_graphs",value:function(){var t=this;this.y.map(function(e,i){var a=t.calc_old_and_new_postions(e,i),n=C(a,4),r=n[0],s=n[1],o=n[2],l=n[3];t.no_of_extra_pts>=0&&(t.make_path&&t.make_path(e,i,r,s,e.color||t.colors[i]),t.make_new_units_for_dataset(r,s,e.color||t.colors[i],i,t.y.length)),e.path&&t.animate_path(e,i,r,s,o,l),t.animate_units(e,i,r,s,o,l)}),setTimeout(function(){t.y.map(function(e,i){t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i)})},400)}},{key:"animate_path",value:function(t,e,i,a,n,r){var s=r.map(function(t,e){return n[e]+","+t}).join("L"),o=[{unit:t.path,object:t,key:"path"},{d:"M"+s},350,"easein"];if(this.elements_to_animate.push(o),t.region_path){var l="0,"+this.zero_line+"L",c="L"+this.width+","+this.zero_line,h=[{unit:t.region_path,object:t,key:"region_path"},{d:"M"+l+s+c},350,"easein"];this.elements_to_animate.push(h)}}},{key:"animate_units",value:function(t,e,i,a,n,r){var s=this,o=this.unit_args.type,l=new O(this.height,this.zero_line,this.avg_unit_width);t.svg_units.map(function(i,a){void 0!==n[a]&&void 0!==r[a]&&s.elements_to_animate.push(l["animate_"+o]({unit:i,array:t.svg_units,index:a},n[a],r[a],e,s.y.length))})}},{key:"calc_old_and_new_postions",value:function(t,e){var i=this.x_old_axis_positions.slice(),a=this.x_axis_positions.slice(),n=this.old_y_axis_tops[e].slice(),r=t.y_tops.slice(),s=i[i.length-1],o=n[n.length-1],l=a[a.length-1],c=r[r.length-1];if(this.no_of_extra_pts>=0){var h=new Array(Math.abs(this.no_of_extra_pts)).fill(s),u=new Array(Math.abs(this.no_of_extra_pts)).fill(o);i=i.concat(h),n=n.concat(u)}else{var _=new Array(Math.abs(this.no_of_extra_pts)).fill(l),p=new Array(Math.abs(this.no_of_extra_pts)).fill(c);a=a.concat(_),r=r.concat(p)}return[i,n,a,r]}},{key:"make_anim_x_axis",value:function(t,i,a){var n=this,r=this.x_old_axis_positions,s=this.x_axis_positions,o=this.old_x_values,l=this.x,c=r[r.length-1];this.x_axis_group.textContent="",this.make_new_axis_anim_lines(r,s,o,l,c,function(r,s,o){"string"==typeof o&&(o=parseInt(o.substring(0,o.length-1)));var l=e(t,i,r,"x-value-text",a,s);n.x_axis_group.appendChild(l),n.elements_to_animate&&n.elements_to_animate.push([{unit:l,array:[0],index:0},{transform:o+", 0"},350,"easein","translate",{transform:s+", 0"}])})}},{key:"make_anim_y_axis",value:function(){var t=this,e=this.y_old_axis_values.map(function(e){return t.zero_line-e*t.multiplier}),i=this.y_axis_values.map(function(e){return t.zero_line-e*t.multiplier}),a=this.y_old_axis_values,n=this.y_axis_values,r=e[e.length-1];this.y_axis_group.textContent="",this.make_new_axis_anim_lines(e,i,a,n,r,this.add_and_animate_y_line.bind(this),this.y_axis_group)}},{key:"make_anim_y_specifics",value:function(){var t=this;this.specific_y_group.textContent="",this.specific_values.map(function(e){t.add_and_animate_y_line(e.title,t.old_zero_line-e.value*t.old_multiplier,t.zero_line-e.value*t.multiplier,0,t.specific_y_group,e.line_type,!0)})}},{key:"make_new_axis_anim_lines",value:function(t,e,i,a,n,r,s){var o=void 0,l=void 0,c=a.length-i.length;if(c>0)o=e.slice(0,t.length),l=a.slice(0,i.length);else{var h=new Array(Math.abs(c)).fill("");l=a.concat(h);var u=new Array(Math.abs(c)).fill(n+"F");o=e.concat(u)}if(l.map(function(e,i){r(e,t[i],o[i],i,s)}),c>0){var _=a.slice(i.length),p=e.slice(t.length);_.map(function(t,e){r(t,n,p[e],e,s)})}}},{key:"add_and_animate_y_line",value:function(t,e,a,n,r,s){var o=arguments.length>6&&void 0!==arguments[6]&&arguments[6],l=!1;"string"==typeof a&&(a=parseInt(a.substring(0,a.length-1)),l=!0);var c={transform:"0, "+a},h={transform:"0, "+e};l&&(c["stroke-opacity"]=0);var u=this.get_y_axis_line_props(o),_=C(u,4),p=_[0],d=_[1],f=_[2],v=_[3],g=o?"specific-value":"y-value-text",m=i(v,p,d,t=o?(t+"").toUpperCase():t,g,f,e,0===t&&0!==n,s);r.appendChild(m),this.elements_to_animate&&this.elements_to_animate.push([{unit:m,array:[0],index:0},c,350,"easein","translate",h])}},{key:"set_avg_unit_width_and_x_offset",value:function(){this.avg_unit_width=this.width/(this.x.length-1),this.x_offset=0}},{key:"get_all_y_values",value:function(){var t=[];return this.y.map(function(e){t=t.concat(e.values)}),t.concat(this.specific_values.map(function(t){return t.value}))}},{key:"calc_y_dependencies",value:function(){var t=this;this.y_min_tops=new Array(this.x_axis_positions.length).fill(9999),this.y.map(function(e){e.y_tops=e.values.map(function(e){return h(t.zero_line-e*t.multiplier)}),e.y_tops.map(function(e,i){e1&&void 0!==arguments[1]&&arguments[1],a="path-fill-gradient-"+e,n=t.createSVG("linearGradient",{inside:this.svg_defs,id:a,x1:0,x2:0,y1:0,y2:1}),r=function(e,i,a,n){t.createSVG("stop",{className:"stop-color "+a,inside:e,offset:i,"stop-opacity":n})},s=[1,.6,.2];return i&&(s=[.4,.2,0]),r(n,"0%",e,s[0]),r(n,"50%",e,s[1]),r(n,"100%",e,s[2]),a}}]),i}(),V=function(t){function e(t){k(this,e);var i=A(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return i.type="scatter",t.dot_radius?i.dot_radius=t.dot_radius:i.dot_radius=8,i.setup(),i}return N(e,E),w(e,[{key:"setup_graph_components",value:function(){this.setup_path_groups(),S(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setup_graph_components",this).call(this)}},{key:"setup_path_groups",value:function(){}},{key:"setup_values",value:function(){S(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setup_values",this).call(this),this.unit_args={type:"dot",args:{radius:this.dot_radius}}}},{key:"make_paths",value:function(){}},{key:"make_path",value:function(){}}]),e}(),G=function(e){function i(t){k(this,i);var e=A(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return e.type="percentage",e.get_y_label=e.format_lambdas.y_label,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.max_slices=10,e.max_legend_points=6,e.setup(),e}return N(i,L),w(i,[{key:"make_chart_area",value:function(){this.chart_wrapper.className+=" graph-focus-margin",this.chart_wrapper.style.marginTop="45px",this.stats_wrapper.className+=" graph-focus-margin",this.stats_wrapper.style.marginBottom="30px",this.stats_wrapper.style.paddingTop="0px"}},{key:"make_draw_area",value:function(){this.chart_div=t.create("div",{className:"div",inside:this.chart_wrapper}),this.chart=t.create("div",{className:"progress-chart",inside:this.chart_div})}},{key:"setup_components",value:function(){this.percentage_bar=t.create("div",{className:"progress",inside:this.chart})}},{key:"setup_values",value:function(){var t=this;this.slice_totals=[];var e=this.data.labels.map(function(e,i){var a=0;return t.data.datasets.map(function(t){a+=t.values[i]}),[a,e]}).filter(function(t){return t[0]>0}),i=e;if(e.length>this.max_slices){e.sort(function(t,e){return e[0]-t[0]}),i=e.slice(0,this.max_slices-1);var a=0;e.slice(this.max_slices-1).map(function(t){a+=t[0]}),i.push([a,"Rest"]),this.colors[this.max_slices-1]="grey"}this.labels=[],i.map(function(e){t.slice_totals.push(e[0]),t.labels.push(e[1])}),this.legend_totals=this.slice_totals.slice(0,this.max_legend_points)}},{key:"make_graph_components",value:function(){var e=this;this.grand_total=this.slice_totals.reduce(function(t,e){return t+e},0),this.slices=[],this.slice_totals.map(function(i,a){var n=t.create("div",{className:"progress-bar background "+e.colors[a],inside:e.percentage_bar,styles:{width:100*i/e.grand_total+"%"}});e.slices.push(n)})}},{key:"bind_tooltip",value:function(){var e=this;this.slices.map(function(i,a){i.addEventListener("mouseenter",function(){var n=t.offset(e.chart_wrapper),r=t.offset(i),s=r.left-n.left+i.offsetWidth/2,o=r.top-n.top-6,l=(e.formatted_labels&&e.formatted_labels.length>0?e.formatted_labels[a]:e.labels[a])+": ",c=(100*e.slice_totals[a]/e.grand_total).toFixed(1);e.tip.set_values(s,o,l,c+"%"),e.tip.show_tip()})})}},{key:"show_summary",value:function(){var e=this,i=this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels:this.labels;this.legend_totals.map(function(a,n){a&&(t.create("div",{className:"stats",inside:e.stats_wrapper}).innerHTML='\n\t\t\t\t\t'+i[n]+":\n\t\t\t\t\t"+a+"\n\t\t\t\t")})}}]),i}(),D=Math.PI/180,I=function(e){function i(t){k(this,i);var e=A(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return e.type="pie",e.get_y_label=e.format_lambdas.y_label,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.elements_to_animate=null,e.hoverRadio=t.hoverRadio||.1,e.max_slices=10,e.max_legend_points=6,e.isAnimate=!1,e.colors=t.colors,e.startAngle=t.startAngle||0,e.clockWise=t.clockWise||!1,(!e.colors||e.colors.lengththis.width?this.centerX:this.centerY,this.slice_totals=[];var e=this.data.labels.map(function(e,i){var a=0;return t.data.datasets.map(function(t){a+=t.values[i]}),[a,e]}).filter(function(t){return t[0]>0}),i=e;if(e.length>this.max_slices){e.sort(function(t,e){return e[0]-t[0]}),i=e.slice(0,this.max_slices-1);var a=0;e.slice(this.max_slices-1).map(function(t){a+=t[0]}),i.push([a,"Rest"]),this.colors[this.max_slices-1]="grey"}this.labels=[],i.map(function(e){t.slice_totals.push(e[0]),t.labels.push(e[1])}),this.legend_totals=this.slice_totals.slice(0,this.max_legend_points)}},{key:"makeArcPath",value:function(t,e){var i=this.centerX,a=this.centerY,n=this.radius,r=this.clockWise;return"M"+i+" "+a+" L"+(i+t.x)+" "+(a+t.y)+" A "+n+" "+n+" 0 0 "+(r?1:0)+" "+(i+e.x)+" "+(a+e.y)+" z"}},{key:"make_graph_components",value:function(e){var a=this,n=this.radius,r=this.clockWise;this.grand_total=this.slice_totals.reduce(function(t,e){return t+e},0);var s=this.slicesProperties||[];this.slices=[],this.elements_to_animate=[],this.slicesProperties=[];var o=180-this.startAngle;this.slice_totals.map(function(l,c){var h=o,u=l/a.grand_total*360,_=r?-u:u,p=o+=_,d=i.getPositionByAngle(h,n),f=i.getPositionByAngle(p,n),v=e&&s[c],g=void 0,m=void 0;e?(g=v?v.startPosition:d,m=v?v.endPosition:d):(g=d,m=f);var y=a.makeArcPath(g,m),b=t.createSVG("path",{inside:a.draw_area,className:"pie-path",style:"transition:transform .3s;",d:y,fill:a.colors[c]});a.slices.push(b),a.slicesProperties.push({startPosition:d,endPosition:f,value:l,total:a.grand_total,startAngle:h,endAngle:p,angle:_}),e&&a.elements_to_animate.push([{unit:b,array:a.slices,index:a.slices.length-1},{d:a.makeArcPath(d,f)},650,"easein",null,{d:y}])}),e&&this.run_animation()}},{key:"run_animation",value:function(){var t=this;if(this.elements_to_animate&&0!==this.elements_to_animate.length){var e=r(this.svg,this.elements_to_animate);this.svg.parentNode==this.chart_wrapper&&(this.chart_wrapper.removeChild(this.svg),this.chart_wrapper.appendChild(e)),setTimeout(function(){e.parentNode==t.chart_wrapper&&(t.chart_wrapper.removeChild(e),t.chart_wrapper.appendChild(t.svg))},650)}}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,a=this.hoverRadio,n=i.getPositionByAngle(t.startAngle+t.angle/2,e);return"translate3d("+n.x*a+"px,"+n.y*a+"px,0)"}},{key:"hoverSlice",value:function(e,i,a,r){if(e)if(a){n(e,this.calTranslateByAngle(this.slicesProperties[i])),e.setAttribute("fill",d(this.colors[i],50));var s=t.offset(this.svg),o=r.pageX-s.left+10,l=r.pageY-s.top-10,c=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.labels[i])+": ",h=(100*this.slice_totals[i]/this.grand_total).toFixed(1);this.tip.set_values(o,l,c,h+"%"),this.tip.show_tip()}else n(e,"translate3d(0,0,0)"),this.tip.hide_tip(),e.setAttribute("fill",this.colors[i])}},{key:"mouseMove",value:function(t){for(var e=t.target,i=this.curActiveSliceIndex,a=this.curActiveSlice,n=0;n0?this.formatted_labels:this.labels;this.legend_totals.map(function(a,n){a&&(t.create("div",{className:"stats",inside:e.stats_wrapper}).innerHTML='\n\t\t\t\t\t\n\t\t\t\t\t'+i[n]+":\n\t\t\t\t\t"+a+"\n\t\t\t\t")})}}],[{key:"getPositionByAngle",value:function(t,e){return{x:Math.sin(t*D)*e,y:Math.cos(t*D)*e}}}]),i}(),H=function(e){function i(t){var e=t.start,a=void 0===e?"":e,n=t.domain,r=void 0===n?"":n,s=t.subdomain,o=void 0===s?"":s,l=t.data,c=void 0===l?{}:l,h=t.discrete_domains,u=void 0===h?0:h,_=t.count_label,p=void 0===_?"":_;k(this,i);var d=A(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,arguments[0]));d.type="heatmap",d.domain=r,d.subdomain=o,d.data=c,d.discrete_domains=u,d.count_label=p;var f=new Date;return d.start=a||y(f,365),d.legend_colors=["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],d.translate_x=0,d.setup(),d}return N(i,L),w(i,[{key:"setup_base_values",value:function(){this.today=new Date,this.start||(this.start=new Date,this.start.setFullYear(this.start.getFullYear()-1)),this.first_week_start=new Date(this.start.toDateString()),this.last_week_start=new Date(this.today.toDateString()),7!==this.first_week_start.getDay()&&y(this.first_week_start,-1*this.first_week_start.getDay()),7!==this.last_week_start.getDay()&&y(this.last_week_start,-1*this.last_week_start.getDay()),this.no_of_cols=g(this.first_week_start+"",this.last_week_start+"")+1}},{key:"set_width",value:function(){this.base_width=12*(this.no_of_cols+3),this.discrete_domains&&(this.base_width+=144)}},{key:"setup_components",value:function(){this.domain_label_group=t.createSVG("g",{className:"domain-label-group chart-label",inside:this.draw_area}),this.data_groups=t.createSVG("g",{className:"data-groups",inside:this.draw_area,transform:"translate(0, 20)"})}},{key:"setup_values",value:function(){this.domain_label_group.textContent="",this.data_groups.textContent="",this.distribution=this.get_distribution(this.data,this.legend_colors),this.month_names=["January","February","March","April","May","June","July","August","September","October","November","December"],this.render_all_weeks_and_store_x_values(this.no_of_cols)}},{key:"render_all_weeks_and_store_x_values",value:function(t){var e=new Date(this.first_week_start);this.week_col=0,this.current_month=e.getMonth(),this.months=[this.current_month+""],this.month_weeks={},this.month_start_points=[],this.month_weeks[this.current_month]=0,this.month_start_points.push(13);for(var i=0;ia)break;d.getMonth()-e.getMonth()&&(n=1,this.discrete_domains&&(r=1),this.month_start_points.push(13+12*(i+r))),e=d}return[s,n]}},{key:"render_month_labels",value:function(){var e=this;this.months.shift(),this.month_start_points.shift(),this.months.pop(),this.month_start_points.pop(),this.month_start_points.map(function(i,a){var n=e.month_names[e.months[a]].substring(0,3);t.createSVG("text",{className:"y-value-text",inside:e.domain_label_group,x:i+12,y:10,dy:".32em",innerHTML:n})})}},{key:"make_graph_components",value:function(){Array.prototype.slice.call(this.container.querySelectorAll(".graph-stats-container, .sub-title, .title")).map(function(t){t.style.display="None"}),this.chart_wrapper.style.marginTop="0px",this.chart_wrapper.style.paddingTop="0px"}},{key:"bind_tooltip",value:function(){var t=this;Array.prototype.slice.call(document.querySelectorAll(".data-group .day")).map(function(e){e.addEventListener("mouseenter",function(e){var i=e.target.getAttribute("data-value"),a=e.target.getAttribute("data-date").split("-"),n=t.month_names[parseInt(a[1])-1].substring(0,3),r=t.chart_wrapper.getBoundingClientRect(),s=e.target.getBoundingClientRect(),o=parseInt(e.target.getAttribute("width")),l=s.left-r.left+(o+2)/2,c=s.top-r.top-(o+2)/2,h=i+" "+t.count_label,u=" on "+n+" "+a[0]+", "+a[2];t.tip.set_values(l,c,u,h,[],1),t.tip.show_tip()})})}},{key:"update",value:function(t){this.data=t,this.setup_values(),this.bind_tooltip()}},{key:"get_distribution",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments[1],i=Object.keys(t).map(function(e){return t[e]}),a=Math.max.apply(Math,M(i)),n=1/(e.length-1),r=[];return e.map(function(t,e){var i=a*(n*e);r.push(i)}),r}},{key:"get_max_checkpoint",value:function(t,e){return e.filter(function(i,a){return 1===a?e[0]255?255:t<0?0:t}function n(t,e){var i=!1;"#"==t[0]&&(t=t.slice(1),i=!0);var n=parseInt(t,16),r=a((n>>16)+e),s=a((n>>8&255)+e),o=a((255&n)+e);return(i?"#":"")+(o|s<<8|r<<16).toString(16)}function r(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1];return A[t]?new A[t](e):new y(e)}!function(t,e){if("undefined"==typeof document)return e;t=t||"";var i=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",i.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}('.chart-container{font-family:Roboto,Geneva,Tahoma,sans-serif}.chart-container .graph-focus-margin{margin:0 5%}.chart-container>.title{margin-top:25px;margin-left:25px;text-align:left;font-weight:400;font-size:12px;color:#6c7680}.chart-container .graphics{margin-top:10px;padding-top:10px;padding-bottom:10px;position:relative}.chart-container .graph-stats-group{-ms-flex-pack:distribute;-webkit-box-flex:1;-ms-flex:1;flex:1}.chart-container .graph-stats-container,.chart-container .graph-stats-group{display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-around}.chart-container .graph-stats-container{-ms-flex-pack:distribute;padding-top:10px}.chart-container .graph-stats-container .stats{padding-bottom:15px}.chart-container .graph-stats-container .stats-title{color:#8d99a6}.chart-container .graph-stats-container .stats-value{font-size:20px;font-weight:300}.chart-container .graph-stats-container .stats-description{font-size:12px;color:#8d99a6}.chart-container .graph-stats-container .graph-data .stats-value{color:#98d85b}.chart-container .axis,.chart-container .chart-label{font-size:11px;fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .percentage-graph .progress{margin-bottom:0}.chart-container .data-points circle{stroke:#fff;stroke-width:2}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .tick.x-axis-label{display:block}.chart-container .tick .specific-value{text-anchor:start}.chart-container .tick .y-value-text{text-anchor:end}.chart-container .tick .x-value-text{text-anchor:middle}.chart-container .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.chart-container .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#36414c;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.chart-container .graph-svg-tip{position:absolute;z-index:1;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.chart-container .graph-svg-tip ol,.chart-container .graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.chart-container .graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.chart-container .graph-svg-tip strong{color:#dfe2e5;font-weight:600}.chart-container .graph-svg-tip .svg-pointer{position:absolute;bottom:-10px;left:50%;width:5px;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.chart-container .graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.chart-container .graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.chart-container .graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.chart-container .graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}.chart-container .indicator,.chart-container .indicator-right{background:none;font-size:12px;vertical-align:middle;font-weight:700;color:#6c7680}.chart-container .indicator-right:after,.chart-container .indicator:before,.chart-container .indicator i{content:"";display:inline-block;height:8px;width:8px;border-radius:8px}.chart-container .indicator:before,.chart-container .indicator i{margin:0 4px 0 0}.chart-container .indicator-right:after{margin:0 0 0 4px}.chart-container .background.grey,.chart-container .indicator-right.grey:after,.chart-container .indicator.grey:before,.chart-container .indicator.grey i{background:#bdd3e6}.chart-container .background.light-grey,.chart-container .indicator-right.light-grey:after,.chart-container .indicator.light-grey:before,.chart-container .indicator.light-grey i{background:#f0f4f7}.chart-container .background.blue,.chart-container .indicator-right.blue:after,.chart-container .indicator.blue:before,.chart-container .indicator.blue i{background:#5e64ff}.chart-container .background.red,.chart-container .indicator-right.red:after,.chart-container .indicator.red:before,.chart-container .indicator.red i{background:#ff5858}.chart-container .background.green,.chart-container .indicator-right.green:after,.chart-container .indicator.green:before,.chart-container .indicator.green i{background:#28a745}.chart-container .background.light-green,.chart-container .indicator-right.light-green:after,.chart-container .indicator.light-green:before,.chart-container .indicator.light-green i{background:#98d85b}.chart-container .background.orange,.chart-container .indicator-right.orange:after,.chart-container .indicator.orange:before,.chart-container .indicator.orange i{background:#ffa00a}.chart-container .background.violet,.chart-container .indicator-right.violet:after,.chart-container .indicator.violet:before,.chart-container .indicator.violet i{background:#743ee2}.chart-container .background.dark-grey,.chart-container .indicator-right.dark-grey:after,.chart-container .indicator.dark-grey:before,.chart-container .indicator.dark-grey i{background:#b8c2cc}.chart-container .background.black,.chart-container .indicator-right.black:after,.chart-container .indicator.black:before,.chart-container .indicator.black i{background:#36414c}.chart-container .background.yellow,.chart-container .indicator-right.yellow:after,.chart-container .indicator.yellow:before,.chart-container .indicator.yellow i{background:#feef72}.chart-container .background.light-blue,.chart-container .indicator-right.light-blue:after,.chart-container .indicator.light-blue:before,.chart-container .indicator.light-blue i{background:#7cd6fd}.chart-container .background.purple,.chart-container .indicator-right.purple:after,.chart-container .indicator.purple:before,.chart-container .indicator.purple i{background:#b554ff}.chart-container .background.magenta,.chart-container .indicator-right.magenta:after,.chart-container .indicator.magenta:before,.chart-container .indicator.magenta i{background:#ffa3ef}.chart-container .stroke.grey{stroke:#bdd3e6}.chart-container .stroke.light-grey{stroke:#f0f4f7}.chart-container .stroke.blue{stroke:#5e64ff}.chart-container .stroke.red{stroke:#ff5858}.chart-container .stroke.light-green{stroke:#98d85b}.chart-container .stroke.green{stroke:#28a745}.chart-container .stroke.orange{stroke:#ffa00a}.chart-container .stroke.violet{stroke:#743ee2}.chart-container .stroke.dark-grey{stroke:#b8c2cc}.chart-container .stroke.black{stroke:#36414c}.chart-container .stroke.yellow{stroke:#feef72}.chart-container .stroke.light-blue{stroke:#7cd6fd}.chart-container .stroke.purple{stroke:#b554ff}.chart-container .stroke.magenta{stroke:#ffa3ef}.chart-container .fill.grey{fill:#bdd3e6}.chart-container .fill.light-grey{fill:#f0f4f7}.chart-container .fill.blue{fill:#5e64ff}.chart-container .fill.red{fill:#ff5858}.chart-container .fill.light-green{fill:#98d85b}.chart-container .fill.green{fill:#28a745}.chart-container .fill.orange{fill:#ffa00a}.chart-container .fill.violet{fill:#743ee2}.chart-container .fill.dark-grey{fill:#b8c2cc}.chart-container .fill.black{fill:#36414c}.chart-container .fill.yellow{fill:#feef72}.chart-container .fill.light-blue{fill:#7cd6fd}.chart-container .fill.purple{fill:#b554ff}.chart-container .fill.magenta{fill:#ffa3ef}.chart-container .border-top.grey{border-top:3px solid #bdd3e6}.chart-container .border-top.light-grey{border-top:3px solid #f0f4f7}.chart-container .border-top.blue{border-top:3px solid #5e64ff}.chart-container .border-top.red{border-top:3px solid #ff5858}.chart-container .border-top.light-green{border-top:3px solid #98d85b}.chart-container .border-top.green{border-top:3px solid #28a745}.chart-container .border-top.orange{border-top:3px solid #ffa00a}.chart-container .border-top.violet{border-top:3px solid #743ee2}.chart-container .border-top.dark-grey{border-top:3px solid #b8c2cc}.chart-container .border-top.black{border-top:3px solid #36414c}.chart-container .border-top.yellow{border-top:3px solid #feef72}.chart-container .border-top.light-blue{border-top:3px solid #7cd6fd}.chart-container .border-top.purple{border-top:3px solid #b554ff}.chart-container .border-top.magenta{border-top:3px solid #ffa3ef}.chart-container .stop-color.grey{stop-color:#bdd3e6}.chart-container .stop-color.light-grey{stop-color:#f0f4f7}.chart-container .stop-color.blue{stop-color:#5e64ff}.chart-container .stop-color.red{stop-color:#ff5858}.chart-container .stop-color.light-green{stop-color:#98d85b}.chart-container .stop-color.green{stop-color:#28a745}.chart-container .stop-color.orange{stop-color:#ffa00a}.chart-container .stop-color.violet{stop-color:#743ee2}.chart-container .stop-color.dark-grey{stop-color:#b8c2cc}.chart-container .stop-color.black{stop-color:#36414c}.chart-container .stop-color.yellow{stop-color:#feef72}.chart-container .stop-color.light-blue{stop-color:#7cd6fd}.chart-container .stop-color.purple{stop-color:#b554ff}.chart-container .stop-color.magenta{stop-color:#ffa3ef}',void 0);var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=(function(){function t(t){this.value=t}function e(e){function i(n,r){try{var s=e[n](r),o=s.value;o instanceof t?Promise.resolve(o.value).then(function(t){i("next",t)},function(t){i("throw",t)}):a(s.done?"return":"normal",s.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":n.resolve({value:e,done:!0});break;case"throw":n.reject(e);break;default:n.resolve({value:e,done:!1})}(n=n.next)?i(n.key,n.arg):r=null}var n,r;this._invoke=function(t,e){return new Promise(function(a,s){var o={key:t,arg:e,resolve:a,reject:s,next:null};r?r=r.next=o:(n=r=o,i(t,e))})},"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),l=function(){function t(t,e){for(var i=0;i3&&void 0!==arguments[3]?arguments[3]:"linear",n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},s=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var c=void 0;c="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=r[l]||t.getAttribute(l),u=e[l],_={attributeName:l,from:h,to:u,begin:"0s",dur:i/1e3+"s",values:h+";"+u,keySplines:d[a],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};n&&(_.type=n);for(var p in _)c.setAttribute(p,_[p]);s.appendChild(c),n?o.setAttribute(l,"translate("+u+")"):o.setAttribute(l,u)}return[s,o]},t.offset=function(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}},t.isElementInViewport=function(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)},t.bind=function(t,e){if(t)for(var i in e){var a=e[i];i.split(/\s+/).forEach(function(e){t.addEventListener(e,a)})}},t.unbind=function(t,e){if(t)for(var i in e){var a=e[i];i.split(/\s+/).forEach(function(e){t.removeEventListener(e,a)})}},t.fire=function(t,e,i){var a=document.createEvent("HTMLEvents");a.initEvent(e,!0,!0);for(var n in i)a[n]=i[n];return t.dispatchEvent(a)};var f=function(){function e(t){var i=t.parent,a=void 0===i?null:i;o(this,e),this.parent=a,this.title_name="",this.title_value="",this.list_values=[],this.title_value_first=0,this.x=0,this.y=0,this.top=0,this.left=0,this.setup()}return l(e,[{key:"setup",value:function(){this.make_tooltip()}},{key:"refresh",value:function(){this.fill(),this.calc_position()}},{key:"make_tooltip",value:function(){var e=this;this.container=t.create("div",{inside:this.parent,className:"graph-svg-tip comparison",innerHTML:'\n\t\t\t\t\n\t\t\t\t'}),this.hide_tip(),this.title=this.container.querySelector(".title"),this.data_point_list=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hide_tip()})}},{key:"fill",value:function(){var e=this,i=void 0;i=this.title_value_first?""+this.title_value+""+this.title_name:this.title_name+""+this.title_value+"",this.title.innerHTML=i,this.data_point_list.innerHTML="",this.list_values.map(function(i){var a=t.create("li",{className:"border-top "+(i.color||"black"),innerHTML:''+(0===i.value||i.value?i.value:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.data_point_list.appendChild(a)})}},{key:"calc_position",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var a="calc(50% + "+(this.left-e)+"px)";i.style.left=a,this.left=e}else i.style.left="50%"}},{key:"set_values",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;this.title_name=i,this.title_value=a,this.list_values=n,this.x=t,this.y=e,this.title_value_first=r,this.refresh()}},{key:"hide_tip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"show_tip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),v=function(){function e(t){var i=t.height,a=void 0===i?240:i,n=t.title,r=void 0===n?"":n,s=t.subtitle,l=void 0===s?"":s,c=t.format_lambdas,h=void 0===c?{}:c,u=t.summary,_=void 0===u?[]:u,p=t.is_navigable,d=void 0===p?0:p,f=t.has_legend,v=void 0===f?0:f,g=(t.type,t.parent),m=t.data;o(this,e),this.raw_chart_args=arguments[0],this.parent="string"==typeof g?document.querySelector(g):g,this.title=r,this.subtitle=l,this.data=m,this.format_lambdas=h,this.specific_values=m.specific_values||[],this.summary=_,this.is_navigable=d,this.is_navigable&&(this.current_index=0),this.has_legend=v,this.chart_types=["line","scatter","bar","percentage","heatmap","pie"],this.set_margins(a)}return l(e,[{key:"get_different_chart",value:function(t){if(this.chart_types.includes(t)||console.error("'"+t+"' is not a valid chart type."),t!==this.type){return{bar:["line","scatter","percentage","pie"],line:["scatter","bar","percentage","pie"],pie:["line","scatter","percentage","bar"],scatter:["line","bar","percentage","pie"],percentage:["bar","line","scatter","pie"],heatmap:[]}[this.type].includes(t)||console.error("'"+this.type+"' chart cannot be converted to a '"+t+"' chart."),new N({parent:this.raw_chart_args.parent,title:this.title,data:this.raw_chart_args.data,type:t,height:this.raw_chart_args.height})}}},{key:"set_margins",value:function(t){this.base_height=t,this.height=t-40,this.translate_x=60,this.translate_y=10}},{key:"setup",value:function(){this.parent?(this.bind_window_events(),this.refresh(!0)):console.error("No parent element to render on was provided.")}},{key:"bind_window_events",value:function(){var t=this;window.addEventListener("resize",function(){return t.refresh()}),window.addEventListener("orientationchange",function(){return t.refresh()})}},{key:"refresh",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.setup_base_values(),this.set_width(),this.setup_container(),this.setup_components(),this.setup_values(),this.setup_utils(),this.make_graph_components(t),this.make_tooltip(),this.summary.length>0?this.show_custom_summary():this.show_summary(),this.is_navigable&&this.setup_navigation(t)}},{key:"set_width",value:function(){var t=this,e=0;this.specific_values.map(function(i){t.get_strwidth(i.title)>e&&(e=t.get_strwidth(i.title)-40)}),this.base_width=this.parent.offsetWidth-e,this.width=this.base_width-2*this.translate_x}},{key:"setup_base_values",value:function(){}},{key:"setup_container",value:function(){this.container=t.create("div",{className:"chart-container",innerHTML:''+this.title+'
\n\t\t\t\t'+this.subtitle+'
\n\t\t\t\t\n\t\t\t\t'}),this.parent.innerHTML="",this.parent.appendChild(this.container),this.chart_wrapper=this.container.querySelector(".frappe-chart"),this.stats_wrapper=this.container.querySelector(".graph-stats-container"),this.make_chart_area(),this.make_draw_area()}},{key:"make_chart_area",value:function(){return this.svg=t.createSVG("svg",{className:"chart",inside:this.chart_wrapper,width:this.base_width,height:this.base_height}),this.svg_defs=t.createSVG("defs",{inside:this.svg}),this.svg}},{key:"make_draw_area",value:function(){this.draw_area=t.createSVG("g",{className:this.type+"-chart",inside:this.svg,transform:"translate("+this.translate_x+", "+this.translate_y+")"})}},{key:"setup_components",value:function(){}},{key:"make_tooltip",value:function(){this.tip=new f({parent:this.chart_wrapper}),this.bind_tooltip()}},{key:"show_summary",value:function(){}},{key:"show_custom_summary",value:function(){var e=this;this.summary.map(function(i){var a=t.create("div",{className:"stats",innerHTML:''+i.title+": "+i.value+""});e.stats_wrapper.appendChild(a)})}},{key:"setup_navigation",value:function(){var e=this,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.make_overlay(),i&&(this.bind_overlay(),document.addEventListener("keydown",function(i){t.isElementInViewport(e.chart_wrapper)&&("37"==(i=i||window.event).keyCode?e.on_left_arrow():"39"==i.keyCode?e.on_right_arrow():"38"==i.keyCode?e.on_up_arrow():"40"==i.keyCode?e.on_down_arrow():"13"==i.keyCode&&e.on_enter_key())}))}},{key:"make_overlay",value:function(){}},{key:"bind_overlay",value:function(){}},{key:"bind_units",value:function(){}},{key:"on_left_arrow",value:function(){}},{key:"on_right_arrow",value:function(){}},{key:"on_up_arrow",value:function(){}},{key:"on_down_arrow",value:function(){}},{key:"on_enter_key",value:function(){}},{key:"get_data_point",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.current_index,e={index:t},i=this.y[0];return["svg_units","y_tops","values"].map(function(a){var n=a.slice(0,a.length-1);e[n]=i[a][t]}),e.label=this.x[t],e}},{key:"update_current_data_point",value:function(e){(e=parseInt(e))<0&&(e=0),e>=this.x.length&&(e=this.x.length-1),e!==this.current_index&&(this.current_index=e,t.fire(this.parent,"data-select",this.get_data_point()))}},{key:"get_strwidth",value:function(t){return 8*(t+"").length}},{key:"setup_utils",value:function(){}}]),e}(),g=function(a){function n(t){o(this,n);var e=u(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,t));return e.x=e.data.labels,e.y=e.data.datasets,e.is_series=t.is_series,e.get_y_label=e.format_lambdas.y_label,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.colors=["green","blue","violet","red","orange","yellow","light-blue","light-green","purple","magenta"],e.zero_line=e.height,e}return h(n,v),l(n,[{key:"setup_values",value:function(){this.data.datasets.map(function(t){t.values=t.values.map(function(t){return isNaN(t)?0:t})}),this.setup_x(),this.setup_y()}},{key:"setup_x",value:function(){var t=this;this.set_avg_unit_width_and_x_offset(),this.x_axis_positions&&(this.x_old_axis_positions=this.x_axis_positions.slice()),this.x_axis_positions=this.x.map(function(i,a){return e(t.x_offset+a*t.avg_unit_width)}),this.x_old_axis_positions||(this.x_old_axis_positions=this.x_axis_positions.slice())}},{key:"setup_y",value:function(){this.y_axis_values&&(this.y_old_axis_values=this.y_axis_values.slice());var t=this.get_all_y_values();this.y_sums&&this.y_sums.length>0&&(t=t.concat(this.y_sums)),this.y_axis_values=this.get_y_axis_points(t),this.y_old_axis_values||(this.y_old_axis_values=this.y_axis_values.slice());var e=this.y_axis_values,i=e[e.length-1]-e[0];this.multiplier&&(this.old_multiplier=this.multiplier),this.multiplier=this.height/i,this.old_multiplier||(this.old_multiplier=this.multiplier);var a=e.indexOf(0),n=(e[1]-e[0])*this.multiplier;this.zero_line&&(this.old_zero_line=this.zero_line),this.zero_line=this.height-a*n,this.old_zero_line||(this.old_zero_line=this.zero_line)}},{key:"setup_components",value:function(){c(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_components",this).call(this),this.setup_marker_components(),this.setup_aggregation_components(),this.setup_graph_components()}},{key:"setup_marker_components",value:function(){this.y_axis_group=t.createSVG("g",{className:"y axis",inside:this.draw_area}),this.x_axis_group=t.createSVG("g",{className:"x axis",inside:this.draw_area}),this.specific_y_group=t.createSVG("g",{className:"specific axis",inside:this.draw_area})}},{key:"setup_aggregation_components",value:function(){this.sum_group=t.createSVG("g",{className:"data-points",inside:this.draw_area}),this.average_group=t.createSVG("g",{className:"chart-area",inside:this.draw_area})}},{key:"setup_graph_components",value:function(){var e=this;this.svg_units_groups=[],this.y.map(function(i,a){e.svg_units_groups[a]=t.createSVG("g",{className:"data-points data-points-"+a,inside:e.draw_area})})}},{key:"make_graph_components",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.make_y_axis(),this.make_x_axis(),this.draw_graph(t),this.make_y_specifics()}},{key:"make_x_axis",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=void 0,a=void 0,n=void 0,r="";if("span"===this.x_axis_mode?(i=-7,a=this.height+15,n=this.height+25):"tick"===this.x_axis_mode&&(i=this.height,a=6,n=9,r="x-axis-label"),this.x_axis_group.setAttribute("transform","translate(0,"+i+")"),e)this.make_anim_x_axis(a,n,r);else{var s=1.5*this.avg_unit_width,o=s/8;this.x_axis_group.textContent="",this.x.map(function(e,i){var l=t.get_strwidth(e)+2;if(l>s)if(t.is_series){for(var c=1;l/c*2>s;)c++;if(i%c!=0)return}else e=e.slice(0,o-3)+" ...";t.x_axis_group.appendChild(t.make_x_line(a,n,e,"x-value-text",r,t.x_axis_positions[i]))})}}},{key:"make_y_axis",value:function(){var t=this;if(arguments.length>0&&void 0!==arguments[0]&&arguments[0])return this.make_anim_y_axis(),void this.make_anim_y_specifics();var e=this.get_y_axis_line_props(),i=_(e,4),a=i[0],n=i[1],r=i[2],s=i[3];this.y_axis_group.textContent="",this.y_axis_values.map(function(e,i){t.y_axis_group.appendChild(t.make_y_line(s,a,n,e,"y-value-text",r,t.zero_line-e*t.multiplier,0===e&&0!==i))})}},{key:"get_y_axis_line_props",value:function(){if(arguments.length>0&&void 0!==arguments[0]&&arguments[0])return[this.width,this.width+5,"specific-value",0];var t=void 0,e="",i=0;return"span"===this.y_axis_mode?(t=this.width+6,i=-6):"tick"===this.y_axis_mode&&(t=-6,e="y-axis-label"),[t,-9,e,i]}},{key:"draw_graph",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];!this.raw_chart_args.hasOwnProperty("init")||this.raw_chart_args.init?e?this.draw_new_graph_and_animate():this.y.map(function(e,i){e.svg_units=[],t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i)}):this.y.map(function(e,i){e.svg_units=[],t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i),t.calc_y_dependencies()})}},{key:"draw_new_graph_and_animate",value:function(){var t=this,e=[];this.y.map(function(i,a){i.y_tops=new Array(i.values.length).fill(t.zero_line),e.push({values:i.values}),i.svg_units=[],t.make_path&&t.make_path(i,a,t.x_axis_positions,i.y_tops,i.color||t.colors[a]),t.make_new_units(i,a)}),setTimeout(function(){t.update_values(e)},350)}},{key:"setup_navigation",value:function(t){var e=this;t?setTimeout(function(){c(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_navigation",e).call(e,t)},500):c(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_navigation",this).call(this,t)}},{key:"make_new_units",value:function(t,e){this.make_new_units_for_dataset(this.x_axis_positions,t.y_tops,t.color||this.colors[e],e,this.y.length)}},{key:"make_new_units_for_dataset",value:function(t,e,i,a,n,r,s,o){var l=this;r||(r=this.svg_units_groups[a]),s||(s=this.y[a].svg_units),o||(o=this.unit_args),r.textContent="",s.length=0,e.map(function(e,c){var h=l.draw[o.type](t[c],e,o.args,i,c,a,n);r.appendChild(h),s.push(h)}),this.is_navigable&&this.bind_units(s)}},{key:"make_y_specifics",value:function(){var t=this;this.specific_y_group.textContent="",this.specific_values.map(function(e){t.specific_y_group.appendChild(t.make_y_line(0,t.width,t.width+5,e.title.toUpperCase(),"specific-value","specific-value",t.zero_line-e.value*t.multiplier,!1,e.line_type))})}},{key:"bind_tooltip",value:function(){var e=this;this.chart_wrapper.addEventListener("mousemove",function(i){var a=t.offset(e.chart_wrapper),n=i.pageX-a.left-e.translate_x;i.pageY-a.top-e.translate_y=0;i--){var a=this.x_axis_positions[i];if(t>a-this.avg_unit_width/2){var n=a+this.translate_x,r=this.y_min_tops[i]+this.translate_y,s=this.x.formatted&&this.x.formatted.length>0?this.x.formatted[i]:this.x[i],o=this.y.map(function(t,a){return{title:t.title,value:t.formatted?t.formatted[i]:t.values[i],color:t.color||e.colors[a]}});this.tip.set_values(n,r,s,"",o),this.tip.show_tip();break}}}},{key:"show_sums",value:function(){var t=this;this.updating=!0,this.y_sums=new Array(this.x_axis_positions.length).fill(0),this.y.map(function(e){e.values.map(function(e,i){t.y_sums[i]+=e})}),this.update_values(),this.sum_units=[],this.make_new_units_for_dataset(this.x_axis_positions,this.y_sums.map(function(i){return e(t.zero_line-i*t.multiplier)}),"light-grey",0,1,this.sum_group,this.sum_units),this.updating=!1}},{key:"hide_sums",value:function(){this.updating||(this.y_sums=[],this.sum_group.textContent="",this.sum_units=[],this.update_values())}},{key:"show_averages",value:function(){var t=this;this.old_specific_values=this.specific_values.slice(),this.y.map(function(e,i){var a=0;e.values.map(function(t){a+=t});var n=a/e.values.length;t.specific_values.push({title:"AVG "+(i+1),line_type:"dashed",value:n,auto:1})}),this.update_values()}},{key:"hide_averages",value:function(){var t=this;this.old_specific_values=this.specific_values.slice();var e=[];this.specific_values.map(function(t,i){t.auto&&e.unshift(i)}),e.map(function(e){t.specific_values.splice(e,1)}),this.update_values()}},{key:"update_values",value:function(t,e){var a=this;e||(e=this.x),this.elements_to_animate=[],this.updating=!0,this.old_x_values=this.x.slice(),this.old_y_axis_tops=this.y.map(function(t){return t.y_tops.slice()}),this.old_y_values=this.y.map(function(t){return t.values}),this.no_of_extra_pts=e.length-this.x.length,t&&this.y.map(function(e,i){e.values=t[i].values}),e&&(this.x=e),this.setup_x(),this.setup_y(),i(this.x_old_axis_positions,this.x_axis_positions)||(this.make_x_axis(!0),setTimeout(function(){a.updating||a.make_x_axis()},350)),(!i(this.y_old_axis_values,this.y_axis_values)||this.old_specific_values&&!i(this.old_specific_values,this.specific_values))&&(this.make_y_axis(!0),setTimeout(function(){a.updating||(a.make_y_axis(),a.make_y_specifics())},350)),this.calc_y_dependencies(),this.animate_graphs(),this.run_animation(),this.updating=!1}},{key:"add_data_point",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.x.length,a=this.y.map(function(t){return{values:t.values}});a.map(function(e,a){e.values.splice(i,0,t[a])});var n=this.x.slice();n.splice(i,0,e),this.update_values(a,n)}},{key:"remove_data_point",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.x.length-1;if(!(this.x.length<3)){var e=this.y.map(function(t){return{values:t.values}});e.map(function(e){e.values.splice(t,1)});var i=this.x.slice();i.splice(t,1),this.update_values(e,i)}}},{key:"run_animation",value:function(){var e=this,i=t.runSVGAnimation(this.svg,this.elements_to_animate);this.svg.parentNode==this.chart_wrapper&&(this.chart_wrapper.removeChild(this.svg),this.chart_wrapper.appendChild(i)),setTimeout(function(){i.parentNode==e.chart_wrapper&&(e.chart_wrapper.removeChild(i),e.chart_wrapper.appendChild(e.svg))},250)}},{key:"animate_graphs",value:function(){var t=this;this.y.map(function(e,i){var a=t.calc_old_and_new_postions(e,i),n=_(a,4),r=n[0],s=n[1],o=n[2],l=n[3];t.no_of_extra_pts>=0&&(t.make_path&&t.make_path(e,i,r,s,e.color||t.colors[i]),t.make_new_units_for_dataset(r,s,e.color||t.colors[i],i,t.y.length)),e.path&&t.animate_path(e,i,r,s,o,l),t.animate_units(e,i,r,s,o,l)}),setTimeout(function(){t.y.map(function(e,i){t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i)})},400)}},{key:"animate_path",value:function(t,e,i,a,n,r){var s=r.map(function(t,e){return n[e]+","+t}).join("L"),o=[{unit:t.path,object:t,key:"path"},{d:"M"+s},350,"easein"];if(this.elements_to_animate.push(o),t.region_path){var l="0,"+this.zero_line+"L",c="L"+this.width+","+this.zero_line,h=[{unit:t.region_path,object:t,key:"region_path"},{d:"M"+l+s+c},350,"easein"];this.elements_to_animate.push(h)}}},{key:"animate_units",value:function(t,e,i,a,n,r){var s=this,o=this.unit_args.type;t.svg_units.map(function(i,a){void 0!==n[a]&&void 0!==r[a]&&s.elements_to_animate.push(s.animate[o]({unit:i,array:t.svg_units,index:a},n[a],r[a],e))})}},{key:"calc_old_and_new_postions",value:function(t,e){var i=this.x_old_axis_positions.slice(),a=this.x_axis_positions.slice(),n=this.old_y_axis_tops[e].slice(),r=t.y_tops.slice(),s=i[i.length-1],o=n[n.length-1],l=a[a.length-1],c=r[r.length-1];if(this.no_of_extra_pts>=0){var h=new Array(Math.abs(this.no_of_extra_pts)).fill(s),u=new Array(Math.abs(this.no_of_extra_pts)).fill(o);i=i.concat(h),n=n.concat(u)}else{var _=new Array(Math.abs(this.no_of_extra_pts)).fill(l),p=new Array(Math.abs(this.no_of_extra_pts)).fill(c);a=a.concat(_),r=r.concat(p)}return[i,n,a,r]}},{key:"make_anim_x_axis",value:function(t,e,i){var a=this,n=this.x_old_axis_positions,r=this.x_axis_positions,s=this.old_x_values,o=this.x,l=n[n.length-1];this.x_axis_group.textContent="",this.make_new_axis_anim_lines(n,r,s,o,l,function(n,r,s){"string"==typeof s&&(s=parseInt(s.substring(0,s.length-1)));var o=a.make_x_line(t,e,n,"x-value-text",i,r);a.x_axis_group.appendChild(o),a.elements_to_animate&&a.elements_to_animate.push([{unit:o,array:[0],index:0},{transform:s+", 0"},350,"easein","translate",{transform:r+", 0"}])})}},{key:"make_anim_y_axis",value:function(){var t=this,e=this.y_old_axis_values.map(function(e){return t.zero_line-e*t.multiplier}),i=this.y_axis_values.map(function(e){return t.zero_line-e*t.multiplier}),a=this.y_old_axis_values,n=this.y_axis_values,r=e[e.length-1];this.y_axis_group.textContent="",this.make_new_axis_anim_lines(e,i,a,n,r,this.add_and_animate_y_line.bind(this),this.y_axis_group)}},{key:"make_anim_y_specifics",value:function(){var t=this;this.specific_y_group.textContent="",this.specific_values.map(function(e){t.add_and_animate_y_line(e.title,t.old_zero_line-e.value*t.old_multiplier,t.zero_line-e.value*t.multiplier,0,t.specific_y_group,e.line_type,!0)})}},{key:"make_new_axis_anim_lines",value:function(t,e,i,a,n,r,s){var o=void 0,l=void 0,c=a.length-i.length;if(c>0)o=e.slice(0,t.length),l=a.slice(0,i.length);else{var h=new Array(Math.abs(c)).fill("");l=a.concat(h);var u=new Array(Math.abs(c)).fill(n+"F");o=e.concat(u)}if(l.map(function(e,i){r(e,t[i],o[i],i,s)}),c>0){var _=a.slice(i.length),p=e.slice(t.length);_.map(function(t,e){r(t,n,p[e],e,s)})}}},{key:"make_x_line",value:function(e,i,a,n,r,s){var o=t.createSVG("line",{x1:0,x2:0,y1:0,y2:e}),l=t.createSVG("text",{className:n,x:0,y:i,dy:".71em",innerHTML:a}),c=t.createSVG("g",{className:"tick "+r,transform:"translate("+s+", 0)"});return c.appendChild(o),c.appendChild(l),c}},{key:"make_y_line",value:function(e,i,a,n,r,s,o){var l=arguments.length>7&&void 0!==arguments[7]&&arguments[7],c=arguments.length>8&&void 0!==arguments[8]?arguments[8]:"",h=t.createSVG("line",{className:"dashed"===c?"dashed":"",x1:e,x2:i,y1:0,y2:0}),u=t.createSVG("text",{className:r,x:a,y:0,dy:".32em",innerHTML:n+""}),_=t.createSVG("g",{className:"tick "+s,transform:"translate(0, "+o+")","stroke-opacity":1});return l&&(h.style.stroke="rgba(27, 31, 35, 0.6)"),_.appendChild(h),_.appendChild(u),_}},{key:"add_and_animate_y_line",value:function(t,e,i,a,n,r){var s=arguments.length>6&&void 0!==arguments[6]&&arguments[6],o=!1;"string"==typeof i&&(i=parseInt(i.substring(0,i.length-1)),o=!0);var l={transform:"0, "+i},c={transform:"0, "+e};o&&(l["stroke-opacity"]=0);var h=this.get_y_axis_line_props(s),u=_(h,4),p=u[0],d=u[1],f=u[2],v=u[3],g=s?"specific-value":"y-value-text";t=s?(t+"").toUpperCase():t;var m=this.make_y_line(v,p,d,t,g,f,e,0===t&&0!==a,r);n.appendChild(m),this.elements_to_animate&&this.elements_to_animate.push([{unit:m,array:[0],index:0},l,350,"easein","translate",c])}},{key:"get_y_axis_points",value:function(t){var e=this,i=void 0,a=void 0,n=void 0,r=void 0,s=parseInt(Math.max.apply(Math,p(t))),o=parseInt(Math.min.apply(Math,p(t)));o>=0&&(o=0);var l=function(t,i){var a=void 0,n=void 0,r=void 0,s=void 0,o=void 0;if((t+"").length<=1)a=10,r=5;else{var l=e.calc_upper_bound_and_no_of_parts(t),c=_(l,2);a=c[0],r=c[1]}return o=a/r,s=e.calc_no_of_parts(i,o),n=s*o,[a,n,r,s,o]},c=-1*o;if(c<=s){var h=l(s,c),u=_(h,5);i=u[1],a=u[2],n=u[3],r=u[4],0===c&&(i=0,n=0)}else{var d=l(c,s),f=_(d,5);i=f[0],n=f[2],a=f[3],r=f[4]}a%2!=0&&n>0&&a++,n%2!=0&&(n++,i+=r);var v=a+n;return v>5&&(v/=2,r*=2,a/=2),s<(a-1)*r&&v--,this.get_intervals(-1*i,r,v)}},{key:"get_intervals",value:function(t,e,i){for(var a=[],n=0;n<=i;n++)a.push(t),t+=e;return a}},{key:"calc_upper_bound_and_no_of_parts",value:function(t){var e=Math.pow(10,(t+"").length-1),i=this.calc_no_of_parts(t,e);return[e*i,i]}},{key:"calc_no_of_parts",value:function(t,e){var i=Math.ceil(t/e);return i%2!=0&&i++,i}},{key:"get_optimal_no_of_parts",value:function(t){return t<5?t:t/2}},{key:"set_avg_unit_width_and_x_offset",value:function(){this.avg_unit_width=this.width/(this.x.length-1),this.x_offset=0}},{key:"get_all_y_values",value:function(){var t=[];return this.y.map(function(e){t=t.concat(e.values)}),t.concat(this.specific_values.map(function(t){return t.value}))}},{key:"calc_y_dependencies",value:function(){var t=this;this.y_min_tops=new Array(this.x_axis_positions.length).fill(9999),this.y.map(function(i){i.y_tops=i.values.map(function(i){return e(t.zero_line-i*t.multiplier)}),i.y_tops.map(function(e,i){e1&&void 0!==arguments[1]&&arguments[1],a="path-fill-gradient-"+e,n=t.createSVG("linearGradient",{inside:this.svg_defs,id:a,x1:0,x2:0,y1:0,y2:1}),r=function(e,i,a,n){t.createSVG("stop",{className:"stop-color "+a,inside:e,offset:i,"stop-opacity":n})},s=[1,.6,.2];return i&&(s=[.4,.2,0]),r(n,"0%",e,s[0]),r(n,"50%",e,s[1]),r(n,"100%",e,s[2]),a}}]),i}(),b=function(t){function e(t){o(this,e);var i=u(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return i.type="scatter",t.dot_radius?i.dot_radius=t.dot_radius:i.dot_radius=8,i.setup(),i}return h(e,y),l(e,[{key:"setup_graph_components",value:function(){this.setup_path_groups(),c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setup_graph_components",this).call(this)}},{key:"setup_path_groups",value:function(){}},{key:"setup_values",value:function(){c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setup_values",this).call(this),this.unit_args={type:"dot",args:{radius:this.dot_radius}}}},{key:"make_paths",value:function(){}},{key:"make_path",value:function(){}}]),e}(),x=function(e){function i(t){o(this,i);var e=u(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return e.type="percentage",e.get_y_label=e.format_lambdas.y_label,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.max_slices=10,e.max_legend_points=6,e.colors=t.colors,(!e.colors||e.colors.length0}),i=e;if(e.length>this.max_slices){e.sort(function(t,e){return e[0]-t[0]}),i=e.slice(0,this.max_slices-1);var a=0;e.slice(this.max_slices-1).map(function(t){a+=t[0]}),i.push([a,"Rest"]),this.colors[this.max_slices-1]="grey"}this.labels=[],i.map(function(e){t.slice_totals.push(e[0]),t.labels.push(e[1])}),this.legend_totals=this.slice_totals.slice(0,this.max_legend_points)}},{key:"setup_utils",value:function(){}},{key:"make_graph_components",value:function(){var e=this;this.grand_total=this.slice_totals.reduce(function(t,e){return t+e},0),this.slices=[],this.slice_totals.map(function(i,a){var n=t.create("div",{className:"progress-bar background "+e.colors[a],inside:e.percentage_bar,styles:{width:100*i/e.grand_total+"%"}});e.slices.push(n)})}},{key:"bind_tooltip",value:function(){var e=this;this.slices.map(function(i,a){i.addEventListener("mouseenter",function(){var n=t.offset(e.chart_wrapper),r=t.offset(i),s=r.left-n.left+i.offsetWidth/2,o=r.top-n.top-6,l=(e.formatted_labels&&e.formatted_labels.length>0?e.formatted_labels[a]:e.labels[a])+": ",c=(100*e.slice_totals[a]/e.grand_total).toFixed(1);e.tip.set_values(s,o,l,c+"%"),e.tip.show_tip()})})}},{key:"show_summary",value:function(){var e=this,i=this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels:this.labels;this.legend_totals.map(function(a,n){a&&(t.create("div",{className:"stats",inside:e.stats_wrapper}).innerHTML='\n\t\t\t\t\t'+i[n]+":\n\t\t\t\t\t"+a+"\n\t\t\t\t")})}}]),i}(),k=Math.PI/180,w=function(e){function i(t){o(this,i);var e=u(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return e.type="pie",e.get_y_label=e.format_lambdas.y_label,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.elements_to_animate=null,e.hoverRadio=t.hoverRadio||.1,e.max_slices=10,e.max_legend_points=6,e.isAnimate=!1,e.colors=t.colors,e.startAngle=t.startAngle||0,e.clockWise=t.clockWise||!1,(!e.colors||e.colors.lengththis.width?this.centerX:this.centerY,this.slice_totals=[];var e=this.data.labels.map(function(e,i){var a=0;return t.data.datasets.map(function(t){a+=t.values[i]}),[a,e]}).filter(function(t){return t[0]>0}),i=e;if(e.length>this.max_slices){e.sort(function(t,e){return e[0]-t[0]}),i=e.slice(0,this.max_slices-1);var a=0;e.slice(this.max_slices-1).map(function(t){a+=t[0]}),i.push([a,"Rest"]),this.colors[this.max_slices-1]="grey"}this.labels=[],i.map(function(e){t.slice_totals.push(e[0]),t.labels.push(e[1])}),this.legend_totals=this.slice_totals.slice(0,this.max_legend_points)}},{key:"setup_utils",value:function(){}},{key:"makeArcPath",value:function(t,e){var i=this.centerX,a=this.centerY,n=this.radius,r=this.clockWise;return"M"+i+" "+a+" L"+(i+t.x)+" "+(a+t.y)+" A "+n+" "+n+" 0 0 "+(r?1:0)+" "+(i+e.x)+" "+(a+e.y)+" z"}},{key:"make_graph_components",value:function(e){var a=this,n=this.radius,r=this.clockWise;this.grand_total=this.slice_totals.reduce(function(t,e){return t+e},0);var s=this.slicesProperties||[];this.slices=[],this.elements_to_animate=[],this.slicesProperties=[];var o=180-this.startAngle;this.slice_totals.map(function(l,c){var h=o,u=l/a.grand_total*360,_=r?-u:u,p=o+=_,d=i.getPositionByAngle(h,n),f=i.getPositionByAngle(p,n),v=e&&s[c],g=void 0,m=void 0;e?(g=v?v.startPosition:d,m=v?v.endPosition:d):(g=d,m=f);var y=a.makeArcPath(g,m),b=t.createSVG("path",{inside:a.draw_area,className:"pie-path",style:"transition:transform .3s;",d:y,fill:a.colors[c]});a.slices.push(b),a.slicesProperties.push({startPosition:d,endPosition:f,value:l,total:a.grand_total,startAngle:h,endAngle:p,angle:_}),e&&a.elements_to_animate.push([{unit:b,array:a.slices,index:a.slices.length-1},{d:a.makeArcPath(d,f)},650,"easein",null,{d:y}])}),e&&this.run_animation()}},{key:"run_animation",value:function(){var e=this;if(this.elements_to_animate&&0!==this.elements_to_animate.length){var i=t.runSVGAnimation(this.svg,this.elements_to_animate);this.svg.parentNode==this.chart_wrapper&&(this.chart_wrapper.removeChild(this.svg),this.chart_wrapper.appendChild(i)),setTimeout(function(){i.parentNode==e.chart_wrapper&&(e.chart_wrapper.removeChild(i),e.chart_wrapper.appendChild(e.svg))},650)}}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,a=this.hoverRadio,n=i.getPositionByAngle(t.startAngle+t.angle/2,e);return"translate3d("+n.x*a+"px,"+n.y*a+"px,0)"}},{key:"hoverSlice",value:function(e,i,a,r){if(e)if(a){t.transform(e,this.calTranslateByAngle(this.slicesProperties[i])),e.setAttribute("fill",n(this.colors[i],50));var s=t.offset(this.svg),o=r.pageX-s.left+10,l=r.pageY-s.top-10,c=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.labels[i])+": ",h=(100*this.slice_totals[i]/this.grand_total).toFixed(1);this.tip.set_values(o,l,c,h+"%"),this.tip.show_tip()}else t.transform(e,"translate3d(0,0,0)"),this.tip.hide_tip(),e.setAttribute("fill",this.colors[i])}},{key:"mouseMove",value:function(t){for(var e=t.target,i=this.curActiveSliceIndex,a=this.curActiveSlice,n=0;n0?this.formatted_labels:this.labels;this.legend_totals.map(function(a,n){a&&(t.create("div",{className:"stats",inside:e.stats_wrapper}).innerHTML='\n\t\t\t\t\t\n\t\t\t\t\t'+i[n]+":\n\t\t\t\t\t"+a+"\n\t\t\t\t")})}}],[{key:"getPositionByAngle",value:function(t,e){return{x:Math.sin(t*k)*e,y:Math.cos(t*k)*e}}}]),i}(),S=function(e){function i(t){var e=t.start,a=void 0===e?"":e,n=t.domain,r=void 0===n?"":n,s=t.subdomain,l=void 0===s?"":s,c=t.data,h=void 0===c?{}:c,_=t.discrete_domains,p=void 0===_?0:_,d=t.count_label,f=void 0===d?"":d;o(this,i);var v=u(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,arguments[0]));v.type="heatmap",v.domain=r,v.subdomain=l,v.data=h,v.discrete_domains=p,v.count_label=f;var g=new Date;return v.start=a||v.add_days(g,365),v.legend_colors=["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],v.translate_x=0,v.setup(),v}return h(i,v),l(i,[{key:"setup_base_values",value:function(){this.today=new Date,this.start||(this.start=new Date,this.start.setFullYear(this.start.getFullYear()-1)),this.first_week_start=new Date(this.start.toDateString()),this.last_week_start=new Date(this.today.toDateString()),7!==this.first_week_start.getDay()&&this.add_days(this.first_week_start,-1*this.first_week_start.getDay()),7!==this.last_week_start.getDay()&&this.add_days(this.last_week_start,-1*this.last_week_start.getDay()),this.no_of_cols=this.get_weeks_between(this.first_week_start+"",this.last_week_start+"")+1}},{key:"set_width",value:function(){this.base_width=12*(this.no_of_cols+3),this.discrete_domains&&(this.base_width+=144)}},{key:"setup_components",value:function(){this.domain_label_group=t.createSVG("g",{className:"domain-label-group chart-label",inside:this.draw_area}),this.data_groups=t.createSVG("g",{className:"data-groups",inside:this.draw_area,transform:"translate(0, 20)"})}},{key:"setup_values",value:function(){this.domain_label_group.textContent="",this.data_groups.textContent="",this.distribution=this.get_distribution(this.data,this.legend_colors),this.month_names=["January","February","March","April","May","June","July","August","September","October","November","December"],this.render_all_weeks_and_store_x_values(this.no_of_cols)}},{key:"render_all_weeks_and_store_x_values",value:function(t){var e=new Date(this.first_week_start);this.week_col=0,this.current_month=e.getMonth(),this.months=[this.current_month+""],this.month_weeks={},this.month_start_points=[],this.month_weeks[this.current_month]=0,this.month_start_points.push(13);for(var i=0;ia)break;p.getMonth()-e.getMonth()&&(n=1,this.discrete_domains&&(r=1),this.month_start_points.push(13+12*(i+r))),e=p}return[s,n]}},{key:"render_month_labels",value:function(){var e=this;this.months.shift(),this.month_start_points.shift(),this.months.pop(),this.month_start_points.pop(),this.month_start_points.map(function(i,a){var n=e.month_names[e.months[a]].substring(0,3);t.createSVG("text",{className:"y-value-text",inside:e.domain_label_group,x:i+12,y:10,dy:".32em",innerHTML:n})})}},{key:"make_graph_components",value:function(){Array.prototype.slice.call(this.container.querySelectorAll(".graph-stats-container, .sub-title, .title")).map(function(t){t.style.display="None"}),this.chart_wrapper.style.marginTop="0px",this.chart_wrapper.style.paddingTop="0px"}},{key:"bind_tooltip",value:function(){var t=this;Array.prototype.slice.call(document.querySelectorAll(".data-group .day")).map(function(e){e.addEventListener("mouseenter",function(e){var i=e.target.getAttribute("data-value"),a=e.target.getAttribute("data-date").split("-"),n=t.month_names[parseInt(a[1])-1].substring(0,3),r=t.chart_wrapper.getBoundingClientRect(),s=e.target.getBoundingClientRect(),o=parseInt(e.target.getAttribute("width")),l=s.left-r.left+(o+2)/2,c=s.top-r.top-(o+2)/2,h=i+" "+t.count_label,u=" on "+n+" "+a[0]+", "+a[2];t.tip.set_values(l,c,u,h,[],1),t.tip.show_tip()})})}},{key:"update",value:function(t){this.data=t,this.setup_values(),this.bind_tooltip()}},{key:"get_distribution",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments[1],i=Object.keys(t).map(function(e){return t[e]}),a=Math.max.apply(Math,p(i)),n=1/(e.length-1),r=[];return e.map(function(t,e){var i=a*(n*e);r.push(i)}),r}},{key:"get_max_checkpoint",value:function(t,e){return e.filter(function(i,a){return 1===a?e[0]9?"":"0")+e,(i>9?"":"0")+i,t.getFullYear()].join("-")}},{key:"get_weeks_between",value:function(t,e){return Math.ceil(this.get_days_between(t,e)/7)}},{key:"get_days_between",value:function(t,e){return(this.treat_as_utc(e)-this.treat_as_utc(t))/864e5}},{key:"add_days",value:function(t,e){t.setDate(t.getDate()+e)}},{key:"get_month_name",value:function(){}}]),i}(),A={line:y,bar:m,scatter:b,percentage:x,heatmap:S,pie:w},N=function t(e){return o(this,t),r(e.type,arguments[0])};return N}();
+var Chart=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(e,i,a,n,r,s){var o=t.createSVG("line",{x1:0,x2:0,y1:0,y2:e}),l=t.createSVG("text",{className:n,x:0,y:i,dy:".71em",innerHTML:a}),c=t.createSVG("g",{className:"tick "+r,transform:"translate("+s+", 0)"});return c.appendChild(o),c.appendChild(l),c}function i(e,i,a,n,r,s,o){var l=arguments.length>7&&void 0!==arguments[7]&&arguments[7],c=arguments.length>8&&void 0!==arguments[8]?arguments[8]:"",h=t.createSVG("line",{className:"dashed"===c?"dashed":"",x1:e,x2:i,y1:0,y2:0}),u=t.createSVG("text",{className:r,x:a,y:0,dy:".32em",innerHTML:n+""}),_=t.createSVG("g",{className:"tick "+s,transform:"translate(0, "+o+")","stroke-opacity":1});return l&&(h.style.stroke="rgba(27, 31, 35, 0.6)"),_.appendChild(h),_.appendChild(u),_}function a(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},s=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var c=void 0;c="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=r[l]||t.getAttribute(l),u=e[l],_={attributeName:l,from:h,to:u,begin:"0s",dur:i/1e3+"s",values:h+";"+u,keySplines:T[a],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};n&&(_.type=n);for(var p in _)c.setAttribute(p,_[p]);s.appendChild(c),n?o.setAttribute(l,"translate("+u+")"):o.setAttribute(l,u)}return[s,o]}function n(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function r(t,e){var i=[],n=[];e.map(function(t){var e=t[0],r=e.unit.parentNode,s=void 0,o=void 0;t[0]=e.unit;var l=a.apply(void 0,M(t)),c=C(l,2);s=c[0],o=c[1],i.push(o),n.push([s,r]),r.replaceChild(s,e.unit),e.array?e.array[e.index]=o:e.object[e.key]=o});var r=t.cloneNode(!0);return n.map(function(t,a){t[1].replaceChild(i[a],t[0]),e[a][0]=i[a]}),r}function s(t){var e=void 0,i=void 0,a=void 0,n=void 0,r=parseInt(Math.max.apply(Math,M(t))),s=parseInt(Math.min.apply(Math,M(t)));s>=0&&(s=0);var h=function(t,e){var i=void 0,a=void 0,n=void 0,r=void 0,s=void 0;if((t+"").length<=1)i=10,n=5;else{var o=l(t),h=C(o,2);i=h[0],n=h[1]}return s=i/n,r=c(e,s),a=r*s,[i,a,n,r,s]},u=-1*s;if(u<=r){var _=h(r,u),p=C(_,5);e=p[1],i=p[2],a=p[3],n=p[4],0===u&&(e=0,a=0)}else{var d=h(u,r),f=C(d,5);e=f[0],a=f[2],i=f[3],n=f[4]}i%2!=0&&a>0&&i++,a%2!=0&&(a++,e+=n);var v=i+a;return v>5&&(v/=2,n*=2,i/=2),r<(i-1)*n&&v--,o(-1*e,n,v)}function o(t,e,i){for(var a=[],n=0;n<=i;n++)a.push(t),t+=e;return a}function l(t){var e=Math.pow(10,(t+"").length-1),i=c(t,e);return[e*i,i]}function c(t,e){var i=Math.ceil(t/e);return i%2!=0&&i++,i}function h(t){return parseFloat(t.toFixed(2))}function u(t,e){if(t.length!==e.length)return!1;var i=!0;return t.map(function(t,a){e[a]!==t&&(i=!1)}),i}function _(t,e){return(t+"").length*e}function p(t){return t>255?255:t<0?0:t}function d(t,e){var i=!1;"#"==t[0]&&(t=t.slice(1),i=!0);var a=parseInt(t,16),n=p((a>>16)+e),r=p((a>>8&255)+e),s=p((255&a)+e);return(i?"#":"")+(s|r<<8|n<<16).toString(16)}function f(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function v(t){var e=t.getDate(),i=t.getMonth()+1;return[(e>9?"":"0")+e,(i>9?"":"0")+i,t.getFullYear()].join("-")}function g(t,e){return Math.ceil(m(t,e)/7)}function m(t,e){return(f(e)-f(t))/864e5}function y(t,e){t.setDate(t.getDate()+e)}function b(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1];return B[t]?new B[t](e):new E(e)}!function(t,e){if("undefined"==typeof document)return e;t=t||"";var i=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",i.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}('.chart-container{font-family:Roboto,Geneva,Tahoma,sans-serif}.chart-container .graph-focus-margin{margin:0 5%}.chart-container>.title{margin-top:25px;margin-left:25px;text-align:left;font-weight:400;font-size:12px;color:#6c7680}.chart-container .graphics{margin-top:10px;padding-top:10px;padding-bottom:10px;position:relative}.chart-container .graph-stats-group{-ms-flex-pack:distribute;-webkit-box-flex:1;-ms-flex:1;flex:1}.chart-container .graph-stats-container,.chart-container .graph-stats-group{display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-around}.chart-container .graph-stats-container{-ms-flex-pack:distribute;padding-top:10px}.chart-container .graph-stats-container .stats{padding-bottom:15px}.chart-container .graph-stats-container .stats-title{color:#8d99a6}.chart-container .graph-stats-container .stats-value{font-size:20px;font-weight:300}.chart-container .graph-stats-container .stats-description{font-size:12px;color:#8d99a6}.chart-container .graph-stats-container .graph-data .stats-value{color:#98d85b}.chart-container .axis,.chart-container .chart-label{font-size:11px;fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .percentage-graph .progress{margin-bottom:0}.chart-container .data-points circle{stroke:#fff;stroke-width:2}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .tick.x-axis-label{display:block}.chart-container .tick .specific-value{text-anchor:start}.chart-container .tick .y-value-text{text-anchor:end}.chart-container .tick .x-value-text{text-anchor:middle}.chart-container .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.chart-container .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#36414c;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.chart-container .graph-svg-tip{position:absolute;z-index:1;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.chart-container .graph-svg-tip ol,.chart-container .graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.chart-container .graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.chart-container .graph-svg-tip strong{color:#dfe2e5;font-weight:600}.chart-container .graph-svg-tip .svg-pointer{position:absolute;bottom:-10px;left:50%;width:5px;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.chart-container .graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.chart-container .graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.chart-container .graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.chart-container .graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}.chart-container .indicator,.chart-container .indicator-right{background:none;font-size:12px;vertical-align:middle;font-weight:700;color:#6c7680}.chart-container .indicator-right:after,.chart-container .indicator:before,.chart-container .indicator i{content:"";display:inline-block;height:8px;width:8px;border-radius:8px}.chart-container .indicator:before,.chart-container .indicator i{margin:0 4px 0 0}.chart-container .indicator-right:after{margin:0 0 0 4px}.chart-container .background.grey,.chart-container .indicator-right.grey:after,.chart-container .indicator.grey:before,.chart-container .indicator.grey i{background:#bdd3e6}.chart-container .background.light-grey,.chart-container .indicator-right.light-grey:after,.chart-container .indicator.light-grey:before,.chart-container .indicator.light-grey i{background:#f0f4f7}.chart-container .background.blue,.chart-container .indicator-right.blue:after,.chart-container .indicator.blue:before,.chart-container .indicator.blue i{background:#5e64ff}.chart-container .background.red,.chart-container .indicator-right.red:after,.chart-container .indicator.red:before,.chart-container .indicator.red i{background:#ff5858}.chart-container .background.green,.chart-container .indicator-right.green:after,.chart-container .indicator.green:before,.chart-container .indicator.green i{background:#28a745}.chart-container .background.light-green,.chart-container .indicator-right.light-green:after,.chart-container .indicator.light-green:before,.chart-container .indicator.light-green i{background:#98d85b}.chart-container .background.orange,.chart-container .indicator-right.orange:after,.chart-container .indicator.orange:before,.chart-container .indicator.orange i{background:#ffa00a}.chart-container .background.violet,.chart-container .indicator-right.violet:after,.chart-container .indicator.violet:before,.chart-container .indicator.violet i{background:#743ee2}.chart-container .background.dark-grey,.chart-container .indicator-right.dark-grey:after,.chart-container .indicator.dark-grey:before,.chart-container .indicator.dark-grey i{background:#b8c2cc}.chart-container .background.black,.chart-container .indicator-right.black:after,.chart-container .indicator.black:before,.chart-container .indicator.black i{background:#36414c}.chart-container .background.yellow,.chart-container .indicator-right.yellow:after,.chart-container .indicator.yellow:before,.chart-container .indicator.yellow i{background:#feef72}.chart-container .background.light-blue,.chart-container .indicator-right.light-blue:after,.chart-container .indicator.light-blue:before,.chart-container .indicator.light-blue i{background:#7cd6fd}.chart-container .background.purple,.chart-container .indicator-right.purple:after,.chart-container .indicator.purple:before,.chart-container .indicator.purple i{background:#b554ff}.chart-container .background.magenta,.chart-container .indicator-right.magenta:after,.chart-container .indicator.magenta:before,.chart-container .indicator.magenta i{background:#ffa3ef}.chart-container .stroke.grey{stroke:#bdd3e6}.chart-container .stroke.light-grey{stroke:#f0f4f7}.chart-container .stroke.blue{stroke:#5e64ff}.chart-container .stroke.red{stroke:#ff5858}.chart-container .stroke.light-green{stroke:#98d85b}.chart-container .stroke.green{stroke:#28a745}.chart-container .stroke.orange{stroke:#ffa00a}.chart-container .stroke.violet{stroke:#743ee2}.chart-container .stroke.dark-grey{stroke:#b8c2cc}.chart-container .stroke.black{stroke:#36414c}.chart-container .stroke.yellow{stroke:#feef72}.chart-container .stroke.light-blue{stroke:#7cd6fd}.chart-container .stroke.purple{stroke:#b554ff}.chart-container .stroke.magenta{stroke:#ffa3ef}.chart-container .fill.grey{fill:#bdd3e6}.chart-container .fill.light-grey{fill:#f0f4f7}.chart-container .fill.blue{fill:#5e64ff}.chart-container .fill.red{fill:#ff5858}.chart-container .fill.light-green{fill:#98d85b}.chart-container .fill.green{fill:#28a745}.chart-container .fill.orange{fill:#ffa00a}.chart-container .fill.violet{fill:#743ee2}.chart-container .fill.dark-grey{fill:#b8c2cc}.chart-container .fill.black{fill:#36414c}.chart-container .fill.yellow{fill:#feef72}.chart-container .fill.light-blue{fill:#7cd6fd}.chart-container .fill.purple{fill:#b554ff}.chart-container .fill.magenta{fill:#ffa3ef}.chart-container .border-top.grey{border-top:3px solid #bdd3e6}.chart-container .border-top.light-grey{border-top:3px solid #f0f4f7}.chart-container .border-top.blue{border-top:3px solid #5e64ff}.chart-container .border-top.red{border-top:3px solid #ff5858}.chart-container .border-top.light-green{border-top:3px solid #98d85b}.chart-container .border-top.green{border-top:3px solid #28a745}.chart-container .border-top.orange{border-top:3px solid #ffa00a}.chart-container .border-top.violet{border-top:3px solid #743ee2}.chart-container .border-top.dark-grey{border-top:3px solid #b8c2cc}.chart-container .border-top.black{border-top:3px solid #36414c}.chart-container .border-top.yellow{border-top:3px solid #feef72}.chart-container .border-top.light-blue{border-top:3px solid #7cd6fd}.chart-container .border-top.purple{border-top:3px solid #b554ff}.chart-container .border-top.magenta{border-top:3px solid #ffa3ef}.chart-container .stop-color.grey{stop-color:#bdd3e6}.chart-container .stop-color.light-grey{stop-color:#f0f4f7}.chart-container .stop-color.blue{stop-color:#5e64ff}.chart-container .stop-color.red{stop-color:#ff5858}.chart-container .stop-color.light-green{stop-color:#98d85b}.chart-container .stop-color.green{stop-color:#28a745}.chart-container .stop-color.orange{stop-color:#ffa00a}.chart-container .stop-color.violet{stop-color:#743ee2}.chart-container .stop-color.dark-grey{stop-color:#b8c2cc}.chart-container .stop-color.black{stop-color:#36414c}.chart-container .stop-color.yellow{stop-color:#feef72}.chart-container .stop-color.light-blue{stop-color:#7cd6fd}.chart-container .stop-color.purple{stop-color:#b554ff}.chart-container .stop-color.magenta{stop-color:#ffa3ef}',void 0);var x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},k=(function(){function t(t){this.value=t}function e(e){function i(n,r){try{var s=e[n](r),o=s.value;o instanceof t?Promise.resolve(o.value).then(function(t){i("next",t)},function(t){i("throw",t)}):a(s.done?"return":"normal",s.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":n.resolve({value:e,done:!0});break;case"throw":n.reject(e);break;default:n.resolve({value:e,done:!1})}(n=n.next)?i(n.key,n.arg):r=null}var n,r;this._invoke=function(t,e){return new Promise(function(a,s){var o={key:t,arg:e,resolve:a,reject:s,next:null};r?r=r.next=o:(n=r=o,i(t,e))})},"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),w=function(){function t(t,e){for(var i=0;i=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)},t.bind=function(t,e){if(t)for(var i in e){var a=e[i];i.split(/\s+/).forEach(function(e){t.addEventListener(e,a)})}},t.unbind=function(t,e){if(t)for(var i in e){var a=e[i];i.split(/\s+/).forEach(function(e){t.removeEventListener(e,a)})}},t.fire=function(t,e,i){var a=document.createEvent("HTMLEvents");a.initEvent(e,!0,!0);for(var n in i)a[n]=i[n];return t.dispatchEvent(a)};var O=function(){function e(t,e,i){var a=void 0,n=void 0;return t<=e?(n=t,0===(a=e-t)&&(n-=a=.01*i)):(n=e,0===(a=t-e)&&(a=.01*i)),[a,n]}var i=function(t,e,i){this.total_height=t,this.zero_line=e,this.avg_unit_width=i};return i.prototype={draw_bar:function(i,a,n,r,s,o,l){var c=this.avg_unit_width-n.space_width,h=c/l,u=i-c/2+h*o,_=e(a,this.zero_line,this.total_height),p=C(_,2),d=p[0],f=p[1];return t.createSVG("rect",{className:"bar mini fill "+r,"data-point-index":s,x:u,y:f,width:h,height:d})},draw_dot:function(e,i,a,n,r){return t.createSVG("circle",{className:"fill "+n,"data-point-index":r,cx:e,cy:i,r:a.radius})},animate_bar:function(t,i,a,n,r){var s=i-this.avg_unit_width/4,o=this.avg_unit_width/2/r,l=e(a,this.zero_line,this.total_height),c=C(l,2);return i=s+o*n,[t,{width:o,height:c[0],x:i,y:c[1]},350,"easein"]},animate_dot:function(t,e,i){return[t,{cx:e,cy:i},350,"easein"]}},i}(),T={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},P=function(){function e(t){var i=t.parent,a=void 0===i?null:i;k(this,e),this.parent=a,this.title_name="",this.title_value="",this.list_values=[],this.title_value_first=0,this.x=0,this.y=0,this.top=0,this.left=0,this.setup()}return w(e,[{key:"setup",value:function(){this.make_tooltip()}},{key:"refresh",value:function(){this.fill(),this.calc_position()}},{key:"make_tooltip",value:function(){var e=this;this.container=t.create("div",{inside:this.parent,className:"graph-svg-tip comparison",innerHTML:'\n\t\t\t\t\n\t\t\t\t'}),this.hide_tip(),this.title=this.container.querySelector(".title"),this.data_point_list=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hide_tip()})}},{key:"fill",value:function(){var e=this,i=void 0;i=this.title_value_first?""+this.title_value+""+this.title_name:this.title_name+""+this.title_value+"",this.title.innerHTML=i,this.data_point_list.innerHTML="",this.list_values.map(function(i){var a=t.create("li",{className:"border-top "+(i.color||"black"),innerHTML:''+(0===i.value||i.value?i.value:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.data_point_list.appendChild(a)})}},{key:"calc_position",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var a="calc(50% + "+(this.left-e)+"px)";i.style.left=a,this.left=e}else i.style.left="50%"}},{key:"set_values",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;this.title_name=i,this.title_value=a,this.list_values=n,this.x=t,this.y=e,this.title_value_first=r,this.refresh()}},{key:"hide_tip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"show_tip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),L=function(){function e(t){var i=t.height,a=void 0===i?240:i,n=t.title,r=void 0===n?"":n,s=t.subtitle,o=void 0===s?"":s,l=t.colors,c=void 0===l?[]:l,h=t.format_lambdas,u=void 0===h?{}:h,_=t.summary,p=void 0===_?[]:_,d=t.is_navigable,f=void 0===d?0:d,v=t.has_legend,g=void 0===v?0:v,m=(t.type,t.parent),y=t.data;k(this,e),this.raw_chart_args=arguments[0],this.parent="string"==typeof m?document.querySelector(m):m,this.title=r,this.subtitle=o,this.data=y,this.format_lambdas=u,this.specific_values=y.specific_values||[],this.summary=p,this.is_navigable=f,this.is_navigable&&(this.current_index=0),this.has_legend=g,this.colors=c,(!this.colors||this.data.labels&&this.colors.length0&&void 0!==arguments[0]&&arguments[0];this.setup_base_values(),this.set_width(),this.setup_container(),this.setup_components(),this.setup_values(),this.setup_utils(),this.make_graph_components(t),this.make_tooltip(),this.summary.length>0?this.show_custom_summary():this.show_summary(),this.is_navigable&&this.setup_navigation(t)}},{key:"set_width",value:function(){var t=0;this.specific_values.map(function(e){var i=_(e.title+"",8);i>t&&(t=i-40)}),this.base_width=this.parent.offsetWidth-t,this.width=this.base_width-2*this.translate_x}},{key:"setup_base_values",value:function(){}},{key:"setup_container",value:function(){this.container=t.create("div",{className:"chart-container",innerHTML:''+this.title+'
\n\t\t\t\t'+this.subtitle+'
\n\t\t\t\t\n\t\t\t\t'}),this.parent.innerHTML="",this.parent.appendChild(this.container),this.chart_wrapper=this.container.querySelector(".frappe-chart"),this.stats_wrapper=this.container.querySelector(".graph-stats-container"),this.make_chart_area(),this.make_draw_area()}},{key:"make_chart_area",value:function(){return this.svg=t.createSVG("svg",{className:"chart",inside:this.chart_wrapper,width:this.base_width,height:this.base_height}),this.svg_defs=t.createSVG("defs",{inside:this.svg}),this.svg}},{key:"make_draw_area",value:function(){this.draw_area=t.createSVG("g",{className:this.type+"-chart",inside:this.svg,transform:"translate("+this.translate_x+", "+this.translate_y+")"})}},{key:"setup_components",value:function(){}},{key:"make_tooltip",value:function(){this.tip=new P({parent:this.chart_wrapper}),this.bind_tooltip()}},{key:"show_summary",value:function(){}},{key:"show_custom_summary",value:function(){var e=this;this.summary.map(function(i){var a=t.create("div",{className:"stats",innerHTML:''+i.title+": "+i.value+""});e.stats_wrapper.appendChild(a)})}},{key:"setup_navigation",value:function(){var e=this,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.make_overlay(),i&&(this.bind_overlay(),document.addEventListener("keydown",function(i){t.isElementInViewport(e.chart_wrapper)&&("37"==(i=i||window.event).keyCode?e.on_left_arrow():"39"==i.keyCode?e.on_right_arrow():"38"==i.keyCode?e.on_up_arrow():"40"==i.keyCode?e.on_down_arrow():"13"==i.keyCode&&e.on_enter_key())}))}},{key:"make_overlay",value:function(){}},{key:"bind_overlay",value:function(){}},{key:"bind_units",value:function(){}},{key:"on_left_arrow",value:function(){}},{key:"on_right_arrow",value:function(){}},{key:"on_up_arrow",value:function(){}},{key:"on_down_arrow",value:function(){}},{key:"on_enter_key",value:function(){}},{key:"get_data_point",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.current_index,e={index:t},i=this.y[0];return["svg_units","y_tops","values"].map(function(a){var n=a.slice(0,a.length-1);e[n]=i[a][t]}),e.label=this.x[t],e}},{key:"update_current_data_point",value:function(e){(e=parseInt(e))<0&&(e=0),e>=this.x.length&&(e=this.x.length-1),e!==this.current_index&&(this.current_index=e,t.fire(this.parent,"data-select",this.get_data_point()))}},{key:"setup_utils",value:function(){}}]),e}(),z=function(a){function n(t){k(this,n);var e=A(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,t));return e.x=e.data.labels,e.y=e.data.datasets,e.is_series=t.is_series,e.get_y_label=e.format_lambdas.y_label,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.zero_line=e.height,e.old_values={},e}return N(n,L),w(n,[{key:"setup_values",value:function(){this.data.datasets.map(function(t){t.values=t.values.map(function(t){return isNaN(t)?0:t})}),this.setup_x(),this.setup_y()}},{key:"setup_x",value:function(){var t=this;this.set_avg_unit_width_and_x_offset(),this.x_axis_positions&&(this.x_old_axis_positions=this.x_axis_positions.slice()),this.x_axis_positions=this.x.map(function(e,i){return h(t.x_offset+i*t.avg_unit_width)}),this.x_old_axis_positions||(this.x_old_axis_positions=this.x_axis_positions.slice())}},{key:"setup_y",value:function(){this.y_axis_values&&(this.y_old_axis_values=this.y_axis_values.slice());var t=this.get_all_y_values();this.y_sums&&this.y_sums.length>0&&(t=t.concat(this.y_sums)),this.y_axis_values=s(t),this.y_old_axis_values||(this.y_old_axis_values=this.y_axis_values.slice());var e=this.y_axis_values,i=e[e.length-1]-e[0];this.multiplier&&(this.old_multiplier=this.multiplier),this.multiplier=this.height/i,this.old_multiplier||(this.old_multiplier=this.multiplier);var a=e.indexOf(0),n=(e[1]-e[0])*this.multiplier;this.zero_line&&(this.old_zero_line=this.zero_line),this.zero_line=this.height-a*n,this.old_zero_line||(this.old_zero_line=this.zero_line)}},{key:"setup_components",value:function(){S(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_components",this).call(this),this.setup_marker_components(),this.setup_aggregation_components(),this.setup_graph_components()}},{key:"setup_marker_components",value:function(){this.y_axis_group=t.createSVG("g",{className:"y axis",inside:this.draw_area}),this.x_axis_group=t.createSVG("g",{className:"x axis",inside:this.draw_area}),this.specific_y_group=t.createSVG("g",{className:"specific axis",inside:this.draw_area})}},{key:"setup_aggregation_components",value:function(){this.sum_group=t.createSVG("g",{className:"data-points",inside:this.draw_area}),this.average_group=t.createSVG("g",{className:"chart-area",inside:this.draw_area})}},{key:"setup_graph_components",value:function(){var e=this;this.svg_units_groups=[],this.y.map(function(i,a){e.svg_units_groups[a]=t.createSVG("g",{className:"data-points data-points-"+a,inside:e.draw_area})})}},{key:"make_graph_components",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.make_y_axis(),this.make_x_axis(),this.draw_graph(t),this.make_y_specifics()}},{key:"make_x_axis",value:function(){var t=this,i=arguments.length>0&&void 0!==arguments[0]&&arguments[0],a=void 0,n=void 0,r=void 0,s="";if("span"===this.x_axis_mode?(a=-7,n=this.height+15,r=this.height+25):"tick"===this.x_axis_mode&&(a=this.height,n=6,r=9,s="x-axis-label"),this.x_axis_group.setAttribute("transform","translate(0,"+a+")"),i)this.make_anim_x_axis(n,r,s);else{var o=1.5*this.avg_unit_width,l=o/8;this.x_axis_group.textContent="",this.x.map(function(i,a){var c=_(i,8)+2;if(c>o)if(t.is_series){for(var h=1;c/h*2>o;)h++;if(a%h!=0)return}else i=i.slice(0,l-3)+" ...";t.x_axis_group.appendChild(e(n,r,i,"x-value-text",s,t.x_axis_positions[a]))})}}},{key:"make_y_axis",value:function(){var t=this;if(arguments.length>0&&void 0!==arguments[0]&&arguments[0])return this.make_anim_y_axis(),void this.make_anim_y_specifics();var e=this.get_y_axis_line_props(),a=C(e,4),n=a[0],r=a[1],s=a[2],o=a[3];this.y_axis_group.textContent="",this.y_axis_values.map(function(e,a){t.y_axis_group.appendChild(i(o,n,r,e,"y-value-text",s,t.zero_line-e*t.multiplier,0===e&&0!==a))})}},{key:"get_y_axis_line_props",value:function(){if(arguments.length>0&&void 0!==arguments[0]&&arguments[0])return[this.width,this.width+5,"specific-value",0];var t=void 0,e="",i=0;return"span"===this.y_axis_mode?(t=this.width+6,i=-6):"tick"===this.y_axis_mode&&(t=-6,e="y-axis-label"),[t,-9,e,i]}},{key:"draw_graph",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];!this.raw_chart_args.hasOwnProperty("init")||this.raw_chart_args.init?e?this.draw_new_graph_and_animate():this.y.map(function(e,i){e.svg_units=[],t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i)}):this.y.map(function(e,i){e.svg_units=[],t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i),t.calc_y_dependencies()})}},{key:"draw_new_graph_and_animate",value:function(){var t=this,e=[];this.y.map(function(i,a){i.y_tops=new Array(i.values.length).fill(t.zero_line),e.push({values:i.values}),i.svg_units=[],t.make_path&&t.make_path(i,a,t.x_axis_positions,i.y_tops,i.color||t.colors[a]),t.make_new_units(i,a)}),setTimeout(function(){t.update_values(e)},350)}},{key:"setup_navigation",value:function(t){var e=this;t?setTimeout(function(){S(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_navigation",e).call(e,t)},500):S(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"setup_navigation",this).call(this,t)}},{key:"make_new_units",value:function(t,e){this.make_new_units_for_dataset(this.x_axis_positions,t.y_tops,t.color||this.colors[e],e,this.y.length)}},{key:"make_new_units_for_dataset",value:function(t,e,i,a,n,r,s,o){r||(r=this.svg_units_groups[a]),s||(s=this.y[a].svg_units),o||(o=this.unit_args),r.textContent="",s.length=0;var l=new O(this.height,this.zero_line,this.avg_unit_width);e.map(function(e,c){var h=l["draw_"+o.type](t[c],e,o.args,i,c,a,n);r.appendChild(h),s.push(h)}),this.is_navigable&&this.bind_units(s)}},{key:"make_y_specifics",value:function(){var t=this;this.specific_y_group.textContent="",this.specific_values.map(function(e){t.specific_y_group.appendChild(i(0,t.width,t.width+5,e.title.toUpperCase(),"specific-value","specific-value",t.zero_line-e.value*t.multiplier,!1,e.line_type))})}},{key:"bind_tooltip",value:function(){var e=this;this.chart_wrapper.addEventListener("mousemove",function(i){var a=t.offset(e.chart_wrapper),n=i.pageX-a.left-e.translate_x;i.pageY-a.top-e.translate_y=0;i--){var a=this.x_axis_positions[i];if(t>a-this.avg_unit_width/2){var n=a+this.translate_x,r=this.y_min_tops[i]+this.translate_y,s=this.x.formatted&&this.x.formatted.length>0?this.x.formatted[i]:this.x[i],o=this.y.map(function(t,a){return{title:t.title,value:t.formatted?t.formatted[i]:t.values[i],color:t.color||e.colors[a]}});this.tip.set_values(n,r,s,"",o),this.tip.show_tip();break}}}},{key:"show_sums",value:function(){var t=this;this.updating=!0,this.y_sums=new Array(this.x_axis_positions.length).fill(0),this.y.map(function(e){e.values.map(function(e,i){t.y_sums[i]+=e})}),this.update_values(),this.sum_units=[],this.make_new_units_for_dataset(this.x_axis_positions,this.y_sums.map(function(e){return h(t.zero_line-e*t.multiplier)}),"light-grey",0,1,this.sum_group,this.sum_units),this.updating=!1}},{key:"hide_sums",value:function(){this.updating||(this.y_sums=[],this.sum_group.textContent="",this.sum_units=[],this.update_values())}},{key:"show_averages",value:function(){var t=this;this.old_specific_values=this.specific_values.slice(),this.y.map(function(e,i){var a=0;e.values.map(function(t){a+=t});var n=a/e.values.length;t.specific_values.push({title:"AVG "+(i+1),line_type:"dashed",value:n,auto:1})}),this.update_values()}},{key:"hide_averages",value:function(){var t=this;this.old_specific_values=this.specific_values.slice();var e=[];this.specific_values.map(function(t,i){t.auto&&e.unshift(i)}),e.map(function(e){t.specific_values.splice(e,1)}),this.update_values()}},{key:"update_values",value:function(t,e){var i=this;e||(e=this.x),this.elements_to_animate=[],this.updating=!0,this.old_x_values=this.x.slice(),this.old_y_axis_tops=this.y.map(function(t){return t.y_tops.slice()}),this.old_y_values=this.y.map(function(t){return t.values}),this.no_of_extra_pts=e.length-this.x.length,t&&this.y.map(function(e,i){e.values=t[i].values}),e&&(this.x=e),this.setup_x(),this.setup_y(),u(this.x_old_axis_positions,this.x_axis_positions)||(this.make_x_axis(!0),setTimeout(function(){i.updating||i.make_x_axis()},350)),(!u(this.y_old_axis_values,this.y_axis_values)||this.old_specific_values&&!u(this.old_specific_values,this.specific_values))&&(this.make_y_axis(!0),setTimeout(function(){i.updating||(i.make_y_axis(),i.make_y_specifics())},350)),this.calc_y_dependencies(),this.animate_graphs(),this.run_animation(),this.updating=!1}},{key:"add_data_point",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.x.length,a=this.y.map(function(t){return{values:t.values}});a.map(function(e,a){e.values.splice(i,0,t[a])});var n=this.x.slice();n.splice(i,0,e),this.update_values(a,n)}},{key:"remove_data_point",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.x.length-1;if(!(this.x.length<3)){var e=this.y.map(function(t){return{values:t.values}});e.map(function(e){e.values.splice(t,1)});var i=this.x.slice();i.splice(t,1),this.update_values(e,i)}}},{key:"run_animation",value:function(){var t=this,e=r(this.svg,this.elements_to_animate);this.svg.parentNode==this.chart_wrapper&&(this.chart_wrapper.removeChild(this.svg),this.chart_wrapper.appendChild(e)),setTimeout(function(){e.parentNode==t.chart_wrapper&&(t.chart_wrapper.removeChild(e),t.chart_wrapper.appendChild(t.svg))},250)}},{key:"animate_graphs",value:function(){var t=this;this.y.map(function(e,i){var a=t.calc_old_and_new_postions(e,i),n=C(a,4),r=n[0],s=n[1],o=n[2],l=n[3];t.no_of_extra_pts>=0&&(t.make_path&&t.make_path(e,i,r,s,e.color||t.colors[i]),t.make_new_units_for_dataset(r,s,e.color||t.colors[i],i,t.y.length)),e.path&&t.animate_path(e,i,r,s,o,l),t.animate_units(e,i,r,s,o,l)}),setTimeout(function(){t.y.map(function(e,i){t.make_path&&t.make_path(e,i,t.x_axis_positions,e.y_tops,e.color||t.colors[i]),t.make_new_units(e,i)})},400)}},{key:"animate_path",value:function(t,e,i,a,n,r){var s=r.map(function(t,e){return n[e]+","+t}).join("L"),o=[{unit:t.path,object:t,key:"path"},{d:"M"+s},350,"easein"];if(this.elements_to_animate.push(o),t.region_path){var l="0,"+this.zero_line+"L",c="L"+this.width+","+this.zero_line,h=[{unit:t.region_path,object:t,key:"region_path"},{d:"M"+l+s+c},350,"easein"];this.elements_to_animate.push(h)}}},{key:"animate_units",value:function(t,e,i,a,n,r){var s=this,o=this.unit_args.type,l=new O(this.height,this.zero_line,this.avg_unit_width);t.svg_units.map(function(i,a){void 0!==n[a]&&void 0!==r[a]&&s.elements_to_animate.push(l["animate_"+o]({unit:i,array:t.svg_units,index:a},n[a],r[a],e,s.y.length))})}},{key:"calc_old_and_new_postions",value:function(t,e){var i=this.x_old_axis_positions.slice(),a=this.x_axis_positions.slice(),n=this.old_y_axis_tops[e].slice(),r=t.y_tops.slice(),s=i[i.length-1],o=n[n.length-1],l=a[a.length-1],c=r[r.length-1];if(this.no_of_extra_pts>=0){var h=new Array(Math.abs(this.no_of_extra_pts)).fill(s),u=new Array(Math.abs(this.no_of_extra_pts)).fill(o);i=i.concat(h),n=n.concat(u)}else{var _=new Array(Math.abs(this.no_of_extra_pts)).fill(l),p=new Array(Math.abs(this.no_of_extra_pts)).fill(c);a=a.concat(_),r=r.concat(p)}return[i,n,a,r]}},{key:"make_anim_x_axis",value:function(t,i,a){var n=this,r=this.x_old_axis_positions,s=this.x_axis_positions,o=this.old_x_values,l=this.x,c=r[r.length-1];this.x_axis_group.textContent="",this.make_new_axis_anim_lines(r,s,o,l,c,function(r,s,o){"string"==typeof o&&(o=parseInt(o.substring(0,o.length-1)));var l=e(t,i,r,"x-value-text",a,s);n.x_axis_group.appendChild(l),n.elements_to_animate&&n.elements_to_animate.push([{unit:l,array:[0],index:0},{transform:o+", 0"},350,"easein","translate",{transform:s+", 0"}])})}},{key:"make_anim_y_axis",value:function(){var t=this,e=this.y_old_axis_values.map(function(e){return t.zero_line-e*t.multiplier}),i=this.y_axis_values.map(function(e){return t.zero_line-e*t.multiplier}),a=this.y_old_axis_values,n=this.y_axis_values,r=e[e.length-1];this.y_axis_group.textContent="",this.make_new_axis_anim_lines(e,i,a,n,r,this.add_and_animate_y_line.bind(this),this.y_axis_group)}},{key:"make_anim_y_specifics",value:function(){var t=this;this.specific_y_group.textContent="",this.specific_values.map(function(e){t.add_and_animate_y_line(e.title,t.old_zero_line-e.value*t.old_multiplier,t.zero_line-e.value*t.multiplier,0,t.specific_y_group,e.line_type,!0)})}},{key:"make_new_axis_anim_lines",value:function(t,e,i,a,n,r,s){var o=void 0,l=void 0,c=a.length-i.length;if(c>0)o=e.slice(0,t.length),l=a.slice(0,i.length);else{var h=new Array(Math.abs(c)).fill("");l=a.concat(h);var u=new Array(Math.abs(c)).fill(n+"F");o=e.concat(u)}if(l.map(function(e,i){r(e,t[i],o[i],i,s)}),c>0){var _=a.slice(i.length),p=e.slice(t.length);_.map(function(t,e){r(t,n,p[e],e,s)})}}},{key:"add_and_animate_y_line",value:function(t,e,a,n,r,s){var o=arguments.length>6&&void 0!==arguments[6]&&arguments[6],l=!1;"string"==typeof a&&(a=parseInt(a.substring(0,a.length-1)),l=!0);var c={transform:"0, "+a},h={transform:"0, "+e};l&&(c["stroke-opacity"]=0);var u=this.get_y_axis_line_props(o),_=C(u,4),p=_[0],d=_[1],f=_[2],v=_[3],g=o?"specific-value":"y-value-text",m=i(v,p,d,t=o?(t+"").toUpperCase():t,g,f,e,0===t&&0!==n,s);r.appendChild(m),this.elements_to_animate&&this.elements_to_animate.push([{unit:m,array:[0],index:0},c,350,"easein","translate",h])}},{key:"set_avg_unit_width_and_x_offset",value:function(){this.avg_unit_width=this.width/(this.x.length-1),this.x_offset=0}},{key:"get_all_y_values",value:function(){var t=[];return this.y.map(function(e){t=t.concat(e.values)}),t.concat(this.specific_values.map(function(t){return t.value}))}},{key:"calc_y_dependencies",value:function(){var t=this;this.y_min_tops=new Array(this.x_axis_positions.length).fill(9999),this.y.map(function(e){e.y_tops=e.values.map(function(e){return h(t.zero_line-e*t.multiplier)}),e.y_tops.map(function(e,i){e1&&void 0!==arguments[1]&&arguments[1],a="path-fill-gradient-"+e,n=t.createSVG("linearGradient",{inside:this.svg_defs,id:a,x1:0,x2:0,y1:0,y2:1}),r=function(e,i,a,n){t.createSVG("stop",{className:"stop-color "+a,inside:e,offset:i,"stop-opacity":n})},s=[1,.6,.2];return i&&(s=[.4,.2,0]),r(n,"0%",e,s[0]),r(n,"50%",e,s[1]),r(n,"100%",e,s[2]),a}}]),i}(),V=function(t){function e(t){k(this,e);var i=A(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return i.type="scatter",t.dot_radius?i.dot_radius=t.dot_radius:i.dot_radius=8,i.setup(),i}return N(e,E),w(e,[{key:"setup_graph_components",value:function(){this.setup_path_groups(),S(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setup_graph_components",this).call(this)}},{key:"setup_path_groups",value:function(){}},{key:"setup_values",value:function(){S(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setup_values",this).call(this),this.unit_args={type:"dot",args:{radius:this.dot_radius}}}},{key:"make_paths",value:function(){}},{key:"make_path",value:function(){}}]),e}(),G=function(e){function i(t){k(this,i);var e=A(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return e.type="percentage",e.get_y_label=e.format_lambdas.y_label,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.max_slices=10,e.max_legend_points=6,e.setup(),e}return N(i,L),w(i,[{key:"make_chart_area",value:function(){this.chart_wrapper.className+=" graph-focus-margin",this.chart_wrapper.style.marginTop="45px",this.stats_wrapper.className+=" graph-focus-margin",this.stats_wrapper.style.marginBottom="30px",this.stats_wrapper.style.paddingTop="0px"}},{key:"make_draw_area",value:function(){this.chart_div=t.create("div",{className:"div",inside:this.chart_wrapper}),this.chart=t.create("div",{className:"progress-chart",inside:this.chart_div})}},{key:"setup_components",value:function(){this.percentage_bar=t.create("div",{className:"progress",inside:this.chart})}},{key:"setup_values",value:function(){var t=this;this.slice_totals=[];var e=this.data.labels.map(function(e,i){var a=0;return t.data.datasets.map(function(t){a+=t.values[i]}),[a,e]}).filter(function(t){return t[0]>0}),i=e;if(e.length>this.max_slices){e.sort(function(t,e){return e[0]-t[0]}),i=e.slice(0,this.max_slices-1);var a=0;e.slice(this.max_slices-1).map(function(t){a+=t[0]}),i.push([a,"Rest"]),this.colors[this.max_slices-1]="grey"}this.labels=[],i.map(function(e){t.slice_totals.push(e[0]),t.labels.push(e[1])}),this.legend_totals=this.slice_totals.slice(0,this.max_legend_points)}},{key:"make_graph_components",value:function(){var e=this;this.grand_total=this.slice_totals.reduce(function(t,e){return t+e},0),this.slices=[],this.slice_totals.map(function(i,a){var n=t.create("div",{className:"progress-bar background "+e.colors[a],inside:e.percentage_bar,styles:{width:100*i/e.grand_total+"%"}});e.slices.push(n)})}},{key:"bind_tooltip",value:function(){var e=this;this.slices.map(function(i,a){i.addEventListener("mouseenter",function(){var n=t.offset(e.chart_wrapper),r=t.offset(i),s=r.left-n.left+i.offsetWidth/2,o=r.top-n.top-6,l=(e.formatted_labels&&e.formatted_labels.length>0?e.formatted_labels[a]:e.labels[a])+": ",c=(100*e.slice_totals[a]/e.grand_total).toFixed(1);e.tip.set_values(s,o,l,c+"%"),e.tip.show_tip()})})}},{key:"show_summary",value:function(){var e=this,i=this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels:this.labels;this.legend_totals.map(function(a,n){a&&(t.create("div",{className:"stats",inside:e.stats_wrapper}).innerHTML='\n\t\t\t\t\t'+i[n]+":\n\t\t\t\t\t"+a+"\n\t\t\t\t")})}}]),i}(),D=Math.PI/180,I=function(e){function i(t){k(this,i);var e=A(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return e.type="pie",e.get_y_label=e.format_lambdas.y_label,e.get_x_tooltip=e.format_lambdas.x_tooltip,e.get_y_tooltip=e.format_lambdas.y_tooltip,e.elements_to_animate=null,e.hoverRadio=t.hoverRadio||.1,e.max_slices=10,e.max_legend_points=6,e.isAnimate=!1,e.colors=t.colors,e.startAngle=t.startAngle||0,e.clockWise=t.clockWise||!1,(!e.colors||e.colors.lengththis.width?this.centerX:this.centerY,this.slice_totals=[];var e=this.data.labels.map(function(e,i){var a=0;return t.data.datasets.map(function(t){a+=t.values[i]}),[a,e]}).filter(function(t){return t[0]>0}),i=e;if(e.length>this.max_slices){e.sort(function(t,e){return e[0]-t[0]}),i=e.slice(0,this.max_slices-1);var a=0;e.slice(this.max_slices-1).map(function(t){a+=t[0]}),i.push([a,"Rest"]),this.colors[this.max_slices-1]="grey"}this.labels=[],i.map(function(e){t.slice_totals.push(e[0]),t.labels.push(e[1])}),this.legend_totals=this.slice_totals.slice(0,this.max_legend_points)}},{key:"makeArcPath",value:function(t,e){var i=this.centerX,a=this.centerY,n=this.radius,r=this.clockWise;return"M"+i+" "+a+" L"+(i+t.x)+" "+(a+t.y)+" A "+n+" "+n+" 0 0 "+(r?1:0)+" "+(i+e.x)+" "+(a+e.y)+" z"}},{key:"make_graph_components",value:function(e){var a=this,n=this.radius,r=this.clockWise;this.grand_total=this.slice_totals.reduce(function(t,e){return t+e},0);var s=this.slicesProperties||[];this.slices=[],this.elements_to_animate=[],this.slicesProperties=[];var o=180-this.startAngle;this.slice_totals.map(function(l,c){var h=o,u=l/a.grand_total*360,_=r?-u:u,p=o+=_,d=i.getPositionByAngle(h,n),f=i.getPositionByAngle(p,n),v=e&&s[c],g=void 0,m=void 0;e?(g=v?v.startPosition:d,m=v?v.endPosition:d):(g=d,m=f);var y=a.makeArcPath(g,m),b=t.createSVG("path",{inside:a.draw_area,className:"pie-path",style:"transition:transform .3s;",d:y,fill:a.colors[c]});a.slices.push(b),a.slicesProperties.push({startPosition:d,endPosition:f,value:l,total:a.grand_total,startAngle:h,endAngle:p,angle:_}),e&&a.elements_to_animate.push([{unit:b,array:a.slices,index:a.slices.length-1},{d:a.makeArcPath(d,f)},650,"easein",null,{d:y}])}),e&&this.run_animation()}},{key:"run_animation",value:function(){var t=this;if(this.elements_to_animate&&0!==this.elements_to_animate.length){var e=r(this.svg,this.elements_to_animate);this.svg.parentNode==this.chart_wrapper&&(this.chart_wrapper.removeChild(this.svg),this.chart_wrapper.appendChild(e)),setTimeout(function(){e.parentNode==t.chart_wrapper&&(t.chart_wrapper.removeChild(e),t.chart_wrapper.appendChild(t.svg))},650)}}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,a=this.hoverRadio,n=i.getPositionByAngle(t.startAngle+t.angle/2,e);return"translate3d("+n.x*a+"px,"+n.y*a+"px,0)"}},{key:"hoverSlice",value:function(e,i,a,r){if(e)if(a){n(e,this.calTranslateByAngle(this.slicesProperties[i])),e.setAttribute("fill",d(this.colors[i],50));var s=t.offset(this.svg),o=r.pageX-s.left+10,l=r.pageY-s.top-10,c=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.labels[i])+": ",h=(100*this.slice_totals[i]/this.grand_total).toFixed(1);this.tip.set_values(o,l,c,h+"%"),this.tip.show_tip()}else n(e,"translate3d(0,0,0)"),this.tip.hide_tip(),e.setAttribute("fill",this.colors[i])}},{key:"mouseMove",value:function(t){for(var e=t.target,i=this.curActiveSliceIndex,a=this.curActiveSlice,n=0;n0?this.formatted_labels:this.labels;this.legend_totals.map(function(a,n){a&&(t.create("div",{className:"stats",inside:e.stats_wrapper}).innerHTML='\n\t\t\t\t\t\n\t\t\t\t\t'+i[n]+":\n\t\t\t\t\t"+a+"\n\t\t\t\t")})}}],[{key:"getPositionByAngle",value:function(t,e){return{x:Math.sin(t*D)*e,y:Math.cos(t*D)*e}}}]),i}(),H=function(e){function i(t){var e=t.start,a=void 0===e?"":e,n=t.domain,r=void 0===n?"":n,s=t.subdomain,o=void 0===s?"":s,l=t.data,c=void 0===l?{}:l,h=t.discrete_domains,u=void 0===h?0:h,_=t.count_label,p=void 0===_?"":_;k(this,i);var d=A(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,arguments[0]));d.type="heatmap",d.domain=r,d.subdomain=o,d.data=c,d.discrete_domains=u,d.count_label=p;var f=new Date;return d.start=a||y(f,365),d.legend_colors=["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],d.translate_x=0,d.setup(),d}return N(i,L),w(i,[{key:"setup_base_values",value:function(){this.today=new Date,this.start||(this.start=new Date,this.start.setFullYear(this.start.getFullYear()-1)),this.first_week_start=new Date(this.start.toDateString()),this.last_week_start=new Date(this.today.toDateString()),7!==this.first_week_start.getDay()&&y(this.first_week_start,-1*this.first_week_start.getDay()),7!==this.last_week_start.getDay()&&y(this.last_week_start,-1*this.last_week_start.getDay()),this.no_of_cols=g(this.first_week_start+"",this.last_week_start+"")+1}},{key:"set_width",value:function(){this.base_width=12*(this.no_of_cols+3),this.discrete_domains&&(this.base_width+=144)}},{key:"setup_components",value:function(){this.domain_label_group=t.createSVG("g",{className:"domain-label-group chart-label",inside:this.draw_area}),this.data_groups=t.createSVG("g",{className:"data-groups",inside:this.draw_area,transform:"translate(0, 20)"})}},{key:"setup_values",value:function(){this.domain_label_group.textContent="",this.data_groups.textContent="",this.distribution=this.get_distribution(this.data,this.legend_colors),this.month_names=["January","February","March","April","May","June","July","August","September","October","November","December"],this.render_all_weeks_and_store_x_values(this.no_of_cols)}},{key:"render_all_weeks_and_store_x_values",value:function(t){var e=new Date(this.first_week_start);this.week_col=0,this.current_month=e.getMonth(),this.months=[this.current_month+""],this.month_weeks={},this.month_start_points=[],this.month_weeks[this.current_month]=0,this.month_start_points.push(13);for(var i=0;ia)break;d.getMonth()-e.getMonth()&&(n=1,this.discrete_domains&&(r=1),this.month_start_points.push(13+12*(i+r))),e=d}return[s,n]}},{key:"render_month_labels",value:function(){var e=this;this.months.shift(),this.month_start_points.shift(),this.months.pop(),this.month_start_points.pop(),this.month_start_points.map(function(i,a){var n=e.month_names[e.months[a]].substring(0,3);t.createSVG("text",{className:"y-value-text",inside:e.domain_label_group,x:i+12,y:10,dy:".32em",innerHTML:n})})}},{key:"make_graph_components",value:function(){Array.prototype.slice.call(this.container.querySelectorAll(".graph-stats-container, .sub-title, .title")).map(function(t){t.style.display="None"}),this.chart_wrapper.style.marginTop="0px",this.chart_wrapper.style.paddingTop="0px"}},{key:"bind_tooltip",value:function(){var t=this;Array.prototype.slice.call(document.querySelectorAll(".data-group .day")).map(function(e){e.addEventListener("mouseenter",function(e){var i=e.target.getAttribute("data-value"),a=e.target.getAttribute("data-date").split("-"),n=t.month_names[parseInt(a[1])-1].substring(0,3),r=t.chart_wrapper.getBoundingClientRect(),s=e.target.getBoundingClientRect(),o=parseInt(e.target.getAttribute("width")),l=s.left-r.left+(o+2)/2,c=s.top-r.top-(o+2)/2,h=i+" "+t.count_label,u=" on "+n+" "+a[0]+", "+a[2];t.tip.set_values(l,c,u,h,[],1),t.tip.show_tip()})})}},{key:"update",value:function(t){this.data=t,this.setup_values(),this.bind_tooltip()}},{key:"get_distribution",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments[1],i=Object.keys(t).map(function(e){return t[e]}),a=Math.max.apply(Math,M(i)),n=1/(e.length-1),r=[];return e.map(function(t,e){var i=a*(n*e);r.push(i)}),r}},{key:"get_max_checkpoint",value:function(t,e){return e.filter(function(i,a){return 1===a?e[0] {
- let space_taken = this.get_strwidth(point) + 2;
+ let space_taken = get_string_width(point, char_width) + 2;
if(space_taken > allowed_space) {
if(this.is_series) {
// Skip some axis lines if X axis is a series
@@ -153,7 +156,7 @@ export default class AxisChart extends BaseChart {
}
}
this.x_axis_group.appendChild(
- this.make_x_line(
+ make_x_line(
height,
text_start_at,
point,
@@ -178,7 +181,7 @@ export default class AxisChart extends BaseChart {
this.y_axis_group.textContent = '';
this.y_axis_values.map((value, i) => {
this.y_axis_group.appendChild(
- this.make_y_line(
+ make_y_line(
start_at,
width,
text_end_at,
@@ -277,8 +280,10 @@ export default class AxisChart extends BaseChart {
units_group.textContent = '';
units_array.length = 0;
+ let unit_renderer = new UnitRenderer(this.height, this.zero_line, this.avg_unit_width);
+
y_values.map((y, i) => {
- let data_unit = this.draw[unit.type](
+ let data_unit = unit_renderer['draw_' + unit.type](
x_values[i],
y,
unit.args,
@@ -300,7 +305,7 @@ export default class AxisChart extends BaseChart {
this.specific_y_group.textContent = '';
this.specific_values.map(d => {
this.specific_y_group.appendChild(
- this.make_y_line(
+ make_y_line(
0,
this.width,
this.width + 5,
@@ -504,7 +509,7 @@ export default class AxisChart extends BaseChart {
}
run_animation() {
- let anim_svg = $.runSVGAnimation(this.svg, this.elements_to_animate);
+ let anim_svg = runSVGAnimation(this.svg, this.elements_to_animate);
if(this.svg.parentNode == this.chart_wrapper) {
this.chart_wrapper.removeChild(this.svg);
@@ -567,14 +572,16 @@ export default class AxisChart extends BaseChart {
animate_units(d, index, old_x, old_y, new_x, new_y) {
let type = this.unit_args.type;
+ let unit_renderer = new UnitRenderer(this.height, this.zero_line, this.avg_unit_width);
d.svg_units.map((unit, i) => {
if(new_x[i] === undefined || new_y[i] === undefined) return;
- this.elements_to_animate.push(this.animate[type](
+ this.elements_to_animate.push(unit_renderer['animate_' + type](
{unit:unit, array:d.svg_units, index: i}, // unit, with info to replace where it came from in the data
new_x[i],
new_y[i],
- index
+ index,
+ this.y.length
));
});
}
@@ -633,7 +640,7 @@ export default class AxisChart extends BaseChart {
if(typeof new_pos === 'string') {
new_pos = parseInt(new_pos.substring(0, new_pos.length-1));
}
- const x_line = this.make_x_line(
+ const x_line = make_x_line(
height,
text_start_at,
value, // new value
@@ -742,66 +749,6 @@ export default class AxisChart extends BaseChart {
}
}
- make_x_line(height, text_start_at, point, label_class, axis_line_class, x_pos) {
- let line = $.createSVG('line', {
- x1: 0,
- x2: 0,
- y1: 0,
- y2: height
- });
-
- let text = $.createSVG('text', {
- className: label_class,
- x: 0,
- y: text_start_at,
- dy: '.71em',
- innerHTML: point
- });
-
- let x_level = $.createSVG('g', {
- className: `tick ${axis_line_class}`,
- transform: `translate(${ x_pos }, 0)`
- });
-
- x_level.appendChild(line);
- x_level.appendChild(text);
-
- return x_level;
- }
-
- make_y_line(start_at, width, text_end_at, point, label_class, axis_line_class, y_pos, darker=false, line_type="") {
- let line = $.createSVG('line', {
- className: line_type === "dashed" ? "dashed": "",
- x1: start_at,
- x2: width,
- y1: 0,
- y2: 0
- });
-
- let text = $.createSVG('text', {
- className: label_class,
- x: text_end_at,
- y: 0,
- dy: '.32em',
- innerHTML: point+""
- });
-
- let y_level = $.createSVG('g', {
- className: `tick ${axis_line_class}`,
- transform: `translate(0, ${y_pos})`,
- 'stroke-opacity': 1
- });
-
- if(darker) {
- line.style.stroke = "rgba(27, 31, 35, 0.6)";
- }
-
- y_level.appendChild(line);
- y_level.appendChild(text);
-
- return y_level;
- }
-
add_and_animate_y_line(value, old_pos, new_pos, i, group, type, specific=false) {
let filler = false;
if(typeof new_pos === 'string') {
@@ -819,7 +766,7 @@ export default class AxisChart extends BaseChart {
let [width, text_end_at, axis_line_class, start_at] = this.get_y_axis_line_props(specific);
let axis_label_class = !specific ? 'y-value-text' : 'specific-value';
value = !specific ? value : (value+"").toUpperCase();
- const y_line = this.make_y_line(
+ const y_line = make_y_line(
start_at,
width,
text_end_at,
@@ -843,117 +790,6 @@ export default class AxisChart extends BaseChart {
]);
}
- get_y_axis_points(array) {
- //*** Where the magic happens ***
-
- // Calculates best-fit y intervals from given values
- // and returns the interval array
-
- // TODO: Fractions
-
- let max_bound, min_bound, pos_no_of_parts, neg_no_of_parts, part_size; // eslint-disable-line no-unused-vars
-
- // Critical values
- let max_val = parseInt(Math.max(...array));
- let min_val = parseInt(Math.min(...array));
- if(min_val >= 0) {
- min_val = 0;
- }
-
- let get_params = (value1, value2) => {
- let bound1, bound2, no_of_parts_1, no_of_parts_2, interval_size;
- if((value1+"").length <= 1) {
- [bound1, no_of_parts_1] = [10, 5];
- } else {
- [bound1, no_of_parts_1] = this.calc_upper_bound_and_no_of_parts(value1);
- }
-
- interval_size = bound1 / no_of_parts_1;
- no_of_parts_2 = this.calc_no_of_parts(value2, interval_size);
- bound2 = no_of_parts_2 * interval_size;
-
- return [bound1, bound2, no_of_parts_1, no_of_parts_2, interval_size];
- };
-
- const abs_min_val = min_val * -1;
- if(abs_min_val <= max_val) {
- // Get the positive region intervals
- // then calc negative ones accordingly
- [max_bound, min_bound, pos_no_of_parts, neg_no_of_parts, part_size]
- = get_params(max_val, abs_min_val);
- if(abs_min_val === 0) {
- min_bound = 0; neg_no_of_parts = 0;
- }
- } else {
- // Get the negative region here first
- [min_bound, max_bound, neg_no_of_parts, pos_no_of_parts, part_size]
- = get_params(abs_min_val, max_val);
- }
-
- // Make both region parts even
- if(pos_no_of_parts % 2 !== 0 && neg_no_of_parts > 0) pos_no_of_parts++;
- if(neg_no_of_parts % 2 !== 0) {
- // every increase in no_of_parts entails an increase in corresponding bound
- // except here, it happens implicitly after every calc_no_of_parts() call
- neg_no_of_parts++;
- min_bound += part_size;
- }
-
- let no_of_parts = pos_no_of_parts + neg_no_of_parts;
- if(no_of_parts > 5) {
- no_of_parts /= 2;
- part_size *= 2;
-
- pos_no_of_parts /=2;
- }
-
- if (max_val < (pos_no_of_parts - 1) * part_size) {
- no_of_parts--;
- }
-
- return this.get_intervals(
- (-1) * min_bound,
- part_size,
- no_of_parts
- );
- }
-
- get_intervals(start, interval_size, count) {
- let intervals = [];
- for(var i = 0; i <= count; i++){
- intervals.push(start);
- start += interval_size;
- }
- return intervals;
- }
-
- calc_upper_bound_and_no_of_parts(max_val) {
- // Given a positive value, calculates a nice-number upper bound
- // and a consequent optimal number of parts
-
- const part_size = Math.pow(10, ((max_val+"").length - 1));
- const no_of_parts = this.calc_no_of_parts(max_val, part_size);
-
- // Use it to get a nice even upper bound
- const upper_bound = part_size * no_of_parts;
-
- return [upper_bound, no_of_parts];
- }
-
- calc_no_of_parts(value, divisor) {
- // value should be a positive number, divisor should be greater than 0
- // returns an even no of parts
- let no_of_parts = Math.ceil(value / divisor);
- if(no_of_parts % 2 !== 0) no_of_parts++; // Make it an even number
-
- return no_of_parts;
- }
-
- get_optimal_no_of_parts(no_of_parts) {
- // aka Divide by 2 if too large
- return (no_of_parts < 5) ? no_of_parts : no_of_parts / 2;
- }
-
set_avg_unit_width_and_x_offset() {
// Set the ... you get it
this.avg_unit_width = this.width/(this.x.length - 1);
@@ -985,78 +821,4 @@ export default class AxisChart extends BaseChart {
// this.chart_wrapper.removeChild(this.tip.container);
// this.make_tooltip();
}
-
- get_bar_height_and_y_attr(y_top) {
- let height, y;
- if (y_top <= this.zero_line) {
- height = this.zero_line - y_top;
- y = y_top;
-
- // In case of invisible bars
- if(height === 0) {
- height = this.height * 0.01;
- y -= height;
- }
- } else {
- height = y_top - this.zero_line;
- y = this.zero_line;
-
- // In case of invisible bars
- if(height === 0) {
- height = this.height * 0.01;
- }
- }
-
- return [height, y];
- }
-
- setup_utils() {
- this.draw = {
- 'bar': (x, y_top, args, color, index, dataset_index, no_of_datasets) => {
- let total_width = this.avg_unit_width - args.space_width;
- let start_x = x - total_width/2;
-
- let width = total_width / no_of_datasets;
- let current_x = start_x + width * dataset_index;
-
- let [height, y] = this.get_bar_height_and_y_attr(y_top);
-
- return $.createSVG('rect', {
- className: `bar mini fill ${color}`,
- 'data-point-index': index,
- x: current_x,
- y: y,
- width: width,
- height: height
- });
-
- },
- 'dot': (x, y, args, color, index) => {
- return $.createSVG('circle', {
- className: `fill ${color}`,
- 'data-point-index': index,
- cx: x,
- cy: y,
- r: args.radius
- });
- }
- };
-
- this.animate = {
- 'bar': (bar_obj, x, y_top, index) => {
- let start = x - this.avg_unit_width/4;
- let width = (this.avg_unit_width/2)/this.y.length;
- let [height, y] = this.get_bar_height_and_y_attr(y_top);
-
- x = start + (width * index);
-
- return [bar_obj, {width: width, height: height, x: x, y: y}, 350, "easein"];
- // bar.animate({height: args.new_height, y: y_top}, 350, mina.easein);
- },
- 'dot': (dot_obj, x, y_top) => {
- return [dot_obj, {cx: x, cy: y_top}, 350, "easein"];
- // dot.animate({cy: y_top}, 350, mina.easein);
- }
- };
- }
}
diff --git a/src/scripts/charts/BaseChart.js b/src/scripts/charts/BaseChart.js
index 77c2535..76f0486 100644
--- a/src/scripts/charts/BaseChart.js
+++ b/src/scripts/charts/BaseChart.js
@@ -1,15 +1,16 @@
import SvgTip from '../objects/SvgTip';
-import $ from '../helpers/dom';
+import $ from '../utils/dom';
+import { get_string_width } from '../utils/helpers';
import Chart from '../charts';
export default class BaseChart {
constructor({
height = 240,
- title = '', subtitle = '',
-
+ title = '',
+ subtitle = '',
+ colors = [],
format_lambdas = {},
-
summary = [],
is_navigable = 0,
@@ -38,6 +39,12 @@ export default class BaseChart {
}
this.has_legend = has_legend;
+ this.colors = colors;
+ if(!this.colors || (this.data.labels && this.colors.length < this.data.labels.length)) {
+ this.colors = ['light-blue', 'blue', 'violet', 'red', 'orange',
+ 'yellow', 'green', 'light-green', 'purple', 'magenta'];
+ }
+
this.chart_types = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];
this.set_margins(height);
@@ -122,9 +129,11 @@ export default class BaseChart {
set_width() {
let special_values_width = 0;
+ let char_width = 8;
this.specific_values.map(val => {
- if(this.get_strwidth(val.title) > special_values_width) {
- special_values_width = this.get_strwidth(val.title) - 40;
+ let str_width = get_string_width((val.title + ""), char_width);
+ if(str_width > special_values_width) {
+ special_values_width = str_width - 40;
}
});
this.base_width = this.parent.offsetWidth - special_values_width;
@@ -256,11 +265,6 @@ export default class BaseChart {
$.fire(this.parent, "data-select", this.get_data_point());
}
- // Helpers
- get_strwidth(string) {
- return (string+"").length * 8;
- }
-
// Objects
setup_utils() { }
}
diff --git a/src/scripts/charts/Heatmap.js b/src/scripts/charts/Heatmap.js
index 85d741f..6e05efc 100644
--- a/src/scripts/charts/Heatmap.js
+++ b/src/scripts/charts/Heatmap.js
@@ -1,5 +1,6 @@
import BaseChart from './BaseChart';
-import $ from '../helpers/dom';
+import $ from '../utils/dom';
+import { add_days, get_dd_mm_yyyy, get_weeks_between } from '../utils/date-utils';
export default class Heatmap extends BaseChart {
constructor({
@@ -21,7 +22,7 @@ export default class Heatmap extends BaseChart {
this.count_label = count_label;
let today = new Date();
- this.start = start || this.add_days(today, 365);
+ this.start = start || add_days(today, 365);
this.legend_colors = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];
@@ -39,12 +40,12 @@ export default class Heatmap extends BaseChart {
this.first_week_start = new Date(this.start.toDateString());
this.last_week_start = new Date(this.today.toDateString());
if(this.first_week_start.getDay() !== 7) {
- this.add_days(this.first_week_start, (-1) * this.first_week_start.getDay());
+ add_days(this.first_week_start, (-1) * this.first_week_start.getDay());
}
if(this.last_week_start.getDay() !== 7) {
- this.add_days(this.last_week_start, (-1) * this.last_week_start.getDay());
+ add_days(this.last_week_start, (-1) * this.last_week_start.getDay());
}
- this.no_of_cols = this.get_weeks_between(this.first_week_start + '', this.last_week_start + '') + 1;
+ this.no_of_cols = get_weeks_between(this.first_week_start + '', this.last_week_start + '') + 1;
}
set_width() {
@@ -101,7 +102,7 @@ export default class Heatmap extends BaseChart {
this.months.push(this.current_month + '');
this.month_weeks[this.current_month] = 1;
}
- this.add_days(current_week_sunday, 7);
+ add_days(current_week_sunday, 7);
}
this.render_month_labels();
}
@@ -148,13 +149,13 @@ export default class Heatmap extends BaseChart {
width: square_side,
height: square_side,
fill: this.legend_colors[color_index],
- 'data-date': this.get_dd_mm_yyyy(current_date),
+ 'data-date': get_dd_mm_yyyy(current_date),
'data-value': data_value,
'data-day': current_date.getDay()
});
let next_date = new Date(current_date);
- this.add_days(next_date, 1);
+ add_days(next_date, 1);
if(next_date.getTime() > today_time) break;
@@ -270,39 +271,4 @@ export default class Heatmap extends BaseChart {
return d <= value;
}).length - 1;
}
-
- // TODO: date utils, move these out
-
- // https://stackoverflow.com/a/11252167/6495043
- treat_as_utc(date_str) {
- let result = new Date(date_str);
- result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
- return result;
- }
-
- get_dd_mm_yyyy(date) {
- let dd = date.getDate();
- let mm = date.getMonth() + 1; // getMonth() is zero-based
- return [
- (dd>9 ? '' : '0') + dd,
- (mm>9 ? '' : '0') + mm,
- date.getFullYear()
- ].join('-');
- }
-
- get_weeks_between(start_date_str, end_date_str) {
- return Math.ceil(this.get_days_between(start_date_str, end_date_str) / 7);
- }
-
- get_days_between(start_date_str, end_date_str) {
- let milliseconds_per_day = 24 * 60 * 60 * 1000;
- return (this.treat_as_utc(end_date_str) - this.treat_as_utc(start_date_str)) / milliseconds_per_day;
- }
-
- // mutates
- add_days(date, number_of_days) {
- date.setDate(date.getDate() + number_of_days);
- }
-
- get_month_name() {}
}
diff --git a/src/scripts/charts/LineChart.js b/src/scripts/charts/LineChart.js
index 9b5ed43..b584e98 100644
--- a/src/scripts/charts/LineChart.js
+++ b/src/scripts/charts/LineChart.js
@@ -1,5 +1,5 @@
import AxisChart from './AxisChart';
-import $ from '../helpers/dom';
+import $ from '../utils/dom';
export default class LineChart extends AxisChart {
constructor(args) {
diff --git a/src/scripts/charts/PercentageChart.js b/src/scripts/charts/PercentageChart.js
index 9d34366..e3d9198 100644
--- a/src/scripts/charts/PercentageChart.js
+++ b/src/scripts/charts/PercentageChart.js
@@ -1,5 +1,5 @@
import BaseChart from './BaseChart';
-import $ from '../helpers/dom';
+import $ from '../utils/dom';
export default class PercentageChart extends BaseChart {
constructor(args) {
@@ -13,13 +13,6 @@ export default class PercentageChart extends BaseChart {
this.max_slices = 10;
this.max_legend_points = 6;
- this.colors = args.colors;
-
- if(!this.colors || this.colors.length < this.data.labels.length) {
- this.colors = ['light-blue', 'blue', 'violet', 'red', 'orange',
- 'yellow', 'green', 'light-green', 'purple', 'magenta'];
- }
-
this.setup();
}
@@ -86,8 +79,6 @@ export default class PercentageChart extends BaseChart {
this.legend_totals = this.slice_totals.slice(0, this.max_legend_points);
}
- setup_utils() { }
-
make_graph_components() {
this.grand_total = this.slice_totals.reduce((a, b) => a + b, 0);
this.slices = [];
diff --git a/src/scripts/charts/PieChart.js b/src/scripts/charts/PieChart.js
index 9c6d9f2..0ad2bb3 100644
--- a/src/scripts/charts/PieChart.js
+++ b/src/scripts/charts/PieChart.js
@@ -1,6 +1,7 @@
import BaseChart from './BaseChart';
-import $ from '../helpers/dom';
-import { lightenDarkenColor } from '../helpers/utils';
+import $ from '../utils/dom';
+import { lighten_darken_color } from '../utils/colors';
+import { runSVGAnimation, transform } from '../utils/animate';
const ANGLE_RATIO = Math.PI / 180;
const FULL_ANGLE = 360;
@@ -65,7 +66,6 @@ export default class PieChart extends BaseChart {
this.legend_totals = this.slice_totals.slice(0, this.max_legend_points);
}
- setup_utils() { }
static getPositionByAngle(angle,radius){
return {
x:Math.sin(angle * ANGLE_RATIO) * radius,
@@ -135,7 +135,7 @@ export default class PieChart extends BaseChart {
// if(this.isAnimate) return ;
// this.isAnimate = true;
if(!this.elements_to_animate || this.elements_to_animate.length === 0) return;
- let anim_svg = $.runSVGAnimation(this.svg, this.elements_to_animate);
+ let anim_svg = runSVGAnimation(this.svg, this.elements_to_animate);
if(this.svg.parentNode == this.chart_wrapper) {
this.chart_wrapper.removeChild(this.svg);
@@ -161,8 +161,8 @@ export default class PieChart extends BaseChart {
hoverSlice(path,i,flag,e){
if(!path) return;
if(flag){
- $.transform(path,this.calTranslateByAngle(this.slicesProperties[i]));
- path.setAttribute('fill',lightenDarkenColor(this.colors[i],50));
+ transform(path,this.calTranslateByAngle(this.slicesProperties[i]));
+ path.setAttribute('fill',lighten_darken_color(this.colors[i],50));
let g_off = $.offset(this.svg);
let x = e.pageX - g_off.left + 10;
let y = e.pageY - g_off.top - 10;
@@ -172,7 +172,7 @@ export default class PieChart extends BaseChart {
this.tip.set_values(x, y, title, percent + "%");
this.tip.show_tip();
}else{
- $.transform(path,'translate3d(0,0,0)');
+ transform(path,'translate3d(0,0,0)');
this.tip.hide_tip();
path.setAttribute('fill',this.colors[i]);
}
diff --git a/src/scripts/objects/SvgTip.js b/src/scripts/objects/SvgTip.js
index bd37556..0942768 100644
--- a/src/scripts/objects/SvgTip.js
+++ b/src/scripts/objects/SvgTip.js
@@ -1,4 +1,4 @@
-import $ from '../helpers/dom';
+import $ from '../utils/dom';
export default class SvgTip {
constructor({
diff --git a/src/scripts/utils/animate.js b/src/scripts/utils/animate.js
new file mode 100644
index 0000000..dffaf70
--- /dev/null
+++ b/src/scripts/utils/animate.js
@@ -0,0 +1,101 @@
+// Leveraging SMIL Animations
+
+const EASING = {
+ ease: "0.25 0.1 0.25 1",
+ linear: "0 0 1 1",
+ // easein: "0.42 0 1 1",
+ easein: "0.1 0.8 0.2 1",
+ easeout: "0 0 0.58 1",
+ easeinout: "0.42 0 0.58 1"
+};
+
+function animateSVG(element, props, dur, easing_type="linear", type=undefined, old_values={}) {
+
+ let anim_element = element.cloneNode(true);
+ let new_element = element.cloneNode(true);
+
+ for(var attributeName in props) {
+ let animate_element;
+ if(attributeName === 'transform') {
+ animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform");
+ } else {
+ animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animate");
+ }
+ let current_value = old_values[attributeName] || element.getAttribute(attributeName);
+ let value = props[attributeName];
+
+ let anim_attr = {
+ attributeName: attributeName,
+ from: current_value,
+ to: value,
+ begin: "0s",
+ dur: dur/1000 + "s",
+ values: current_value + ";" + value,
+ keySplines: EASING[easing_type],
+ keyTimes: "0;1",
+ calcMode: "spline",
+ fill: 'freeze'
+ };
+
+ if(type) {
+ anim_attr["type"] = type;
+ }
+
+ for (var i in anim_attr) {
+ animate_element.setAttribute(i, anim_attr[i]);
+ }
+
+ anim_element.appendChild(animate_element);
+
+ if(type) {
+ new_element.setAttribute(attributeName, `translate(${value})`);
+ } else {
+ new_element.setAttribute(attributeName, value);
+ }
+ }
+
+ return [anim_element, new_element];
+}
+
+export function transform(element, style) { // eslint-disable-line no-unused-vars
+ element.style.transform = style;
+ element.style.webkitTransform = style;
+ element.style.msTransform = style;
+ element.style.mozTransform = style;
+ element.style.oTransform = style;
+}
+
+export function runSVGAnimation(svg_container, elements) {
+ let new_elements = [];
+ let anim_elements = [];
+
+ elements.map(element => {
+ let obj = element[0];
+ let parent = obj.unit.parentNode;
+
+ let anim_element, new_element;
+
+ element[0] = obj.unit;
+ [anim_element, new_element] = animateSVG(...element);
+
+ new_elements.push(new_element);
+ anim_elements.push([anim_element, parent]);
+
+ parent.replaceChild(anim_element, obj.unit);
+
+ if(obj.array) {
+ obj.array[obj.index] = new_element;
+ } else {
+ obj.object[obj.key] = new_element;
+ }
+ });
+
+ let anim_svg = svg_container.cloneNode(true);
+
+ anim_elements.map((anim_element, i) => {
+ anim_element[1].replaceChild(new_elements[i], anim_element[0]);
+ elements[i][0] = new_elements[i];
+ });
+
+ return anim_svg;
+}
diff --git a/src/scripts/utils/colors.js b/src/scripts/utils/colors.js
new file mode 100644
index 0000000..fc4ae36
--- /dev/null
+++ b/src/scripts/utils/colors.js
@@ -0,0 +1,18 @@
+function limit_color(r){
+ if (r > 255) return 255;
+ else if (r < 0) return 0;
+ return r;
+}
+
+export function lighten_darken_color(col, amt) {
+ let usePound = false;
+ if (col[0] == "#") {
+ col = col.slice(1);
+ usePound = true;
+ }
+ let num = parseInt(col,16);
+ let r = limit_color((num >> 16) + amt);
+ let b = limit_color(((num >> 8) & 0x00FF) + amt);
+ let g = limit_color((num & 0x0000FF) + amt);
+ return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);
+}
\ No newline at end of file
diff --git a/src/scripts/utils/date-utils.js b/src/scripts/utils/date-utils.js
new file mode 100644
index 0000000..208c548
--- /dev/null
+++ b/src/scripts/utils/date-utils.js
@@ -0,0 +1,34 @@
+// Playing around with dates
+
+// https://stackoverflow.com/a/11252167/6495043
+function treat_as_utc(date_str) {
+ let result = new Date(date_str);
+ result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
+ return result;
+}
+
+export function get_dd_mm_yyyy(date) {
+ let dd = date.getDate();
+ let mm = date.getMonth() + 1; // getMonth() is zero-based
+ return [
+ (dd>9 ? '' : '0') + dd,
+ (mm>9 ? '' : '0') + mm,
+ date.getFullYear()
+ ].join('-');
+}
+
+export function get_weeks_between(start_date_str, end_date_str) {
+ return Math.ceil(get_days_between(start_date_str, end_date_str) / 7);
+}
+
+export function get_days_between(start_date_str, end_date_str) {
+ let milliseconds_per_day = 24 * 60 * 60 * 1000;
+ return (treat_as_utc(end_date_str) - treat_as_utc(start_date_str)) / milliseconds_per_day;
+}
+
+// mutates
+export function add_days(date, number_of_days) {
+ date.setDate(date.getDate() + number_of_days);
+}
+
+// export function get_month_name() {}
diff --git a/src/scripts/helpers/dom.js b/src/scripts/utils/dom.js
similarity index 53%
rename from src/scripts/helpers/dom.js
rename to src/scripts/utils/dom.js
index 2d66435..8479b80 100644
--- a/src/scripts/helpers/dom.js
+++ b/src/scripts/utils/dom.js
@@ -2,16 +2,6 @@ export default function $(expr, con) {
return typeof expr === "string"? (con || document).querySelector(expr) : expr || null;
}
-const EASING = {
- ease: "0.25 0.1 0.25 1",
- linear: "0 0 1 1",
- // easein: "0.42 0 1 1",
- easein: "0.1 0.8 0.2 1",
- easeout: "0 0 0.58 1",
- easeinout: "0.42 0 0.58 1"
-};
-
-
$.findNodeIndex = (node) =>
{
var i = 0;
@@ -79,100 +69,6 @@ $.createSVG = (tag, o) => {
return element;
};
-$.runSVGAnimation = (svg_container, elements) => {
- // let parent = elements[0][0]['unit'].parentNode;
-
- let new_elements = [];
- let anim_elements = [];
-
- elements.map(element => {
- let obj = element[0];
- let parent = obj.unit.parentNode;
- // let index = let findNodeIndex(obj.unit);
-
- let anim_element, new_element;
-
- element[0] = obj.unit;
- [anim_element, new_element] = $.animateSVG(...element);
-
- new_elements.push(new_element);
- anim_elements.push([anim_element, parent]);
-
- parent.replaceChild(anim_element, obj.unit);
-
- if(obj.array) {
- obj.array[obj.index] = new_element;
- } else {
- obj.object[obj.key] = new_element;
- }
- });
-
- let anim_svg = svg_container.cloneNode(true);
-
- anim_elements.map((anim_element, i) => {
- anim_element[1].replaceChild(new_elements[i], anim_element[0]);
- elements[i][0] = new_elements[i];
- });
-
- return anim_svg;
-};
-
-$.transform = (element, style)=>{
- element.style.transform = style;
- element.style.webkitTransform = style;
- element.style.msTransform = style;
- element.style.mozTransform = style;
- element.style.oTransform = style;
-};
-
-$.animateSVG = (element, props, dur, easing_type="linear", type=undefined, old_values={}) => {
-
- let anim_element = element.cloneNode(true);
- let new_element = element.cloneNode(true);
-
- for(var attributeName in props) {
- let animate_element;
- if(attributeName === 'transform') {
- animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform");
- } else {
- animate_element = document.createElementNS("http://www.w3.org/2000/svg", "animate");
- }
- let current_value = old_values[attributeName] || element.getAttribute(attributeName);
- let value = props[attributeName];
-
- let anim_attr = {
- attributeName: attributeName,
- from: current_value,
- to: value,
- begin: "0s",
- dur: dur/1000 + "s",
- values: current_value + ";" + value,
- keySplines: EASING[easing_type],
- keyTimes: "0;1",
- calcMode: "spline",
- fill: 'freeze'
- };
-
- if(type) {
- anim_attr["type"] = type;
- }
-
- for (var i in anim_attr) {
- animate_element.setAttribute(i, anim_attr[i]);
- }
-
- anim_element.appendChild(animate_element);
-
- if(type) {
- new_element.setAttribute(attributeName, `translate(${value})`);
- } else {
- new_element.setAttribute(attributeName, value);
- }
- }
-
- return [anim_element, new_element];
-};
-
$.offset = (element) => {
let rect = element.getBoundingClientRect();
return {
diff --git a/src/scripts/utils/draw.js b/src/scripts/utils/draw.js
new file mode 100644
index 0000000..992d8f0
--- /dev/null
+++ b/src/scripts/utils/draw.js
@@ -0,0 +1,148 @@
+import $ from './dom';
+
+export var UnitRenderer = (function() {
+ var UnitRenderer = function(total_height, zero_line, avg_unit_width) {
+ this.total_height = total_height;
+ this.zero_line = zero_line;
+ this.avg_unit_width = avg_unit_width;
+ };
+
+ function get_bar_height_and_y_attr(y_top, zero_line, total_height) {
+ let height, y;
+ if (y_top <= zero_line) {
+ height = zero_line - y_top;
+ y = y_top;
+
+ // In case of invisible bars
+ if(height === 0) {
+ height = total_height * 0.01;
+ y -= height;
+ }
+ } else {
+ height = y_top - zero_line;
+ y = zero_line;
+
+ // In case of invisible bars
+ if(height === 0) {
+ height = total_height * 0.01;
+ }
+ }
+
+ return [height, y];
+ }
+
+ UnitRenderer.prototype = {
+ draw_bar: function (x, y_top, args, color, index, dataset_index, no_of_datasets) {
+ let total_width = this.avg_unit_width - args.space_width;
+ let start_x = x - total_width/2;
+
+ let width = total_width / no_of_datasets;
+ let current_x = start_x + width * dataset_index;
+
+ let [height, y] = get_bar_height_and_y_attr(y_top, this.zero_line, this.total_height);
+
+ return $.createSVG('rect', {
+ className: `bar mini fill ${color}`,
+ 'data-point-index': index,
+ x: current_x,
+ y: y,
+ width: width,
+ height: height
+ });
+ },
+
+ draw_dot: function(x, y, args, color, index) {
+ return $.createSVG('circle', {
+ className: `fill ${color}`,
+ 'data-point-index': index,
+ cx: x,
+ cy: y,
+ r: args.radius
+ });
+ },
+
+ animate_bar: function(bar_obj, x, y_top, index, no_of_datasets) {
+ let start = x - this.avg_unit_width/4;
+ let width = (this.avg_unit_width/2)/no_of_datasets;
+ let [height, y] = get_bar_height_and_y_attr(y_top, this.zero_line, this.total_height);
+
+ x = start + (width * index);
+
+ return [bar_obj, {width: width, height: height, x: x, y: y}, 350, "easein"];
+ // bar.animate({height: args.new_height, y: y_top}, 350, mina.easein);
+ },
+
+ animate_dot: function(dot_obj, x, y_top) {
+ return [dot_obj, {cx: x, cy: y_top}, 350, "easein"];
+ // dot.animate({cy: y_top}, 350, mina.easein);
+ }
+ };
+
+ return UnitRenderer;
+})();
+
+
+export function make_x_line(height, text_start_at, point, label_class, axis_line_class, x_pos) {
+ let line = $.createSVG('line', {
+ x1: 0,
+ x2: 0,
+ y1: 0,
+ y2: height
+ });
+
+ let text = $.createSVG('text', {
+ className: label_class,
+ x: 0,
+ y: text_start_at,
+ dy: '.71em',
+ innerHTML: point
+ });
+
+ let x_line = $.createSVG('g', {
+ className: `tick ${axis_line_class}`,
+ transform: `translate(${ x_pos }, 0)`
+ });
+
+ x_line.appendChild(line);
+ x_line.appendChild(text);
+
+ return x_line;
+}
+
+export function make_y_line(start_at, width, text_end_at, point, label_class, axis_line_class, y_pos, darker=false, line_type="") {
+ let line = $.createSVG('line', {
+ className: line_type === "dashed" ? "dashed": "",
+ x1: start_at,
+ x2: width,
+ y1: 0,
+ y2: 0
+ });
+
+ let text = $.createSVG('text', {
+ className: label_class,
+ x: text_end_at,
+ y: 0,
+ dy: '.32em',
+ innerHTML: point+""
+ });
+
+ let y_line = $.createSVG('g', {
+ className: `tick ${axis_line_class}`,
+ transform: `translate(0, ${y_pos})`,
+ 'stroke-opacity': 1
+ });
+
+ if(darker) {
+ line.style.stroke = "rgba(27, 31, 35, 0.6)";
+ }
+
+ y_line.appendChild(line);
+ y_line.appendChild(text);
+
+ return y_line;
+}
+
+export function get_anim_x_line() {}
+
+export function get_anim_y_line() {}
+
diff --git a/src/scripts/helpers/utils.js b/src/scripts/utils/helpers.js
similarity index 56%
rename from src/scripts/helpers/utils.js
rename to src/scripts/utils/helpers.js
index d9064a6..38ce0d2 100644
--- a/src/scripts/helpers/utils.js
+++ b/src/scripts/utils/helpers.js
@@ -1,7 +1,16 @@
+/**
+ * Returns the value of a number upto 2 decimal places.
+ * @param {Number} d Any number
+ */
export function float_2(d) {
return parseFloat(d.toFixed(2));
}
+/**
+ * Returns whether or not two given arrays are equal.
+ * @param {Array} arr1 First array
+ * @param {Array} arr2 Second array
+ */
export function arrays_equal(arr1, arr2) {
if(arr1.length !== arr2.length) return false;
let are_equal = true;
@@ -11,28 +20,9 @@ export function arrays_equal(arr1, arr2) {
return are_equal;
}
-function limitColor(r){
- if (r > 255) return 255;
- else if (r < 0) return 0;
- return r;
-}
-
-export function lightenDarkenColor(col,amt) {
- let usePound = false;
- if (col[0] == "#") {
- col = col.slice(1);
- usePound = true;
- }
- let num = parseInt(col,16);
- let r = limitColor((num >> 16) + amt);
- let b = limitColor(((num >> 8) & 0x00FF) + amt);
- let g = limitColor((num & 0x0000FF) + amt);
- return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);
-}
-
/**
* Shuffles array in place. ES6 version
- * @param {Array} a items An array containing the items.
+ * @param {Array} array An array containing the items.
*/
export function shuffle(array) {
// Awesomeness: https://bost.ocks.org/mike/shuffle/
@@ -43,4 +33,15 @@ export function shuffle(array) {
let j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
-}
\ No newline at end of file
+
+ return array;
+}
+
+/**
+ * Returns pixel width of string.
+ * @param {String} string
+ * @param {Number} char_width Width of single char in pixels
+ */
+export function get_string_width(string, char_width) {
+ return (string+"").length * char_width;
+}
diff --git a/src/scripts/utils/intervals.js b/src/scripts/utils/intervals.js
new file mode 100644
index 0000000..b493b40
--- /dev/null
+++ b/src/scripts/utils/intervals.js
@@ -0,0 +1,144 @@
+export function divide_if_more_than_five(number) {
+ return (number < 5) ? number : number / 2;
+}
+
+export function calc_whole_parts(value, divisor) {
+ return Math.ceil(value / divisor);
+}
+
+export function make_even(number) {
+ return (number % 2 !== 0) ? ++number : number;
+}
+
+export function calc_part_size(value) {
+ // take care of fractions
+ return Math.pow(10, ((value+"").length - 1));
+}
+
+export function calc_upper_bound(value) {
+ //
+}
+
+export function clump_intervals(start, interval_size, count) {
+ let intervals = [];
+ for(var i = 0; i <= count; i++){
+ intervals.push(start);
+ start += interval_size;
+ }
+ return intervals;
+}
+
+// export function calc_intervals() {
+// //
+// }
+
+export function calc_y_intervals(array) {
+ //*** Where the magic happens ***
+
+ // Calculates best-fit y intervals from given values
+ // and returns the interval array
+
+ // TODO: Fractions
+
+ let max_bound, min_bound, pos_no_of_parts, neg_no_of_parts, part_size; // eslint-disable-line no-unused-vars
+
+ // Critical values
+ let max_val = parseInt(Math.max(...array));
+ let min_val = parseInt(Math.min(...array));
+ if(min_val >= 0) {
+ min_val = 0;
+ }
+
+ let get_params = (value1, value2) => {
+ let bound1, bound2, no_of_parts_1, no_of_parts_2, interval_size;
+ if((value1+"").length <= 1) {
+ [bound1, no_of_parts_1] = [10, 5];
+ } else {
+ [bound1, no_of_parts_1] = calc_upper_bound_and_no_of_parts(value1);
+ }
+
+ interval_size = bound1 / no_of_parts_1;
+ no_of_parts_2 = calc_no_of_parts(value2, interval_size);
+ bound2 = no_of_parts_2 * interval_size;
+
+ return [bound1, bound2, no_of_parts_1, no_of_parts_2, interval_size];
+ };
+
+ const abs_min_val = min_val * -1;
+ if(abs_min_val <= max_val) {
+ // Get the positive region intervals
+ // then calc negative ones accordingly
+ [max_bound, min_bound, pos_no_of_parts, neg_no_of_parts, part_size]
+ = get_params(max_val, abs_min_val);
+ if(abs_min_val === 0) {
+ min_bound = 0; neg_no_of_parts = 0;
+ }
+ } else {
+ // Get the negative region here first
+ [min_bound, max_bound, neg_no_of_parts, pos_no_of_parts, part_size]
+ = get_params(abs_min_val, max_val);
+ }
+
+ // Make both region parts even
+ if(pos_no_of_parts % 2 !== 0 && neg_no_of_parts > 0) pos_no_of_parts++;
+ if(neg_no_of_parts % 2 !== 0) {
+ // every increase in no_of_parts entails an increase in corresponding bound
+ // except here, it happens implicitly after every calc_no_of_parts() call
+ neg_no_of_parts++;
+ min_bound += part_size;
+ }
+
+ let no_of_parts = pos_no_of_parts + neg_no_of_parts;
+ if(no_of_parts > 5) {
+ no_of_parts /= 2;
+ part_size *= 2;
+
+ pos_no_of_parts /=2;
+ }
+
+ if (max_val < (pos_no_of_parts - 1) * part_size) {
+ no_of_parts--;
+ }
+
+ return get_intervals(
+ (-1) * min_bound,
+ part_size,
+ no_of_parts
+ );
+}
+
+function get_intervals(start, interval_size, count) {
+ let intervals = [];
+ for(var i = 0; i <= count; i++){
+ intervals.push(start);
+ start += interval_size;
+ }
+ return intervals;
+}
+
+function calc_upper_bound_and_no_of_parts(max_val) {
+ // Given a positive value, calculates a nice-number upper bound
+ // and a consequent optimal number of parts
+
+ const part_size = Math.pow(10, ((max_val+"").length - 1));
+ const no_of_parts = calc_no_of_parts(max_val, part_size);
+
+ // Use it to get a nice even upper bound
+ const upper_bound = part_size * no_of_parts;
+
+ return [upper_bound, no_of_parts];
+}
+
+function calc_no_of_parts(value, divisor) {
+ // value should be a positive number, divisor should be greater than 0
+ // returns an even no of parts
+ let no_of_parts = Math.ceil(value / divisor);
+ if(no_of_parts % 2 !== 0) no_of_parts++; // Make it an even number
+
+ return no_of_parts;
+}
+
+function get_optimal_no_of_parts(no_of_parts) {
+ // aka Divide by 2 if too large
+ return (no_of_parts < 5) ? no_of_parts : no_of_parts / 2;
+}