From ec86f7c39fdf5ddbe468d5f8fd97838a39517548 Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Mon, 15 Nov 2021 14:46:31 -0800 Subject: [PATCH] uglyfying --- docs/assets/js/frappe-charts.min.js | 5143 +---------------------- docs/assets/js/frappe-charts.min.js.map | 2 +- 2 files changed, 2 insertions(+), 5143 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index 4cc02f8..011925f 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -1,5143 +1,2 @@ -var frappe = (function () { -'use strict'; - -function styleInject(css, ref) { - if ( ref === void 0 ) ref = {}; - var insertAt = ref.insertAt; - - if (!css || typeof document === 'undefined') { return; } - - var head = document.head || document.getElementsByTagName('head')[0]; - var style = document.createElement('style'); - style.type = 'text/css'; - - if (insertAt === 'top') { - if (head.firstChild) { - head.insertBefore(style, head.firstChild); - } else { - head.appendChild(style); - } - } else { - head.appendChild(style); - } - - if (style.styleSheet) { - style.styleSheet.cssText = css; - } else { - style.appendChild(document.createTextNode(css)); - } -} - -var css = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:\" \";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}"; -styleInject(css); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - -var asyncGenerator = function () { - function AwaitValue(value) { - this.value = value; - } - - function AsyncGenerator(gen) { - var front, back; - - function send(key, arg) { - return new Promise(function (resolve, reject) { - var request = { - key: key, - arg: arg, - resolve: resolve, - reject: reject, - next: null - }; - - if (back) { - back = back.next = request; - } else { - front = back = request; - resume(key, arg); - } - }); - } - - function resume(key, arg) { - try { - var result = gen[key](arg); - var value = result.value; - - if (value instanceof AwaitValue) { - Promise.resolve(value.value).then(function (arg) { - resume("next", arg); - }, function (arg) { - resume("throw", arg); - }); - } else { - settle(result.done ? "return" : "normal", result.value); - } - } catch (err) { - settle("throw", err); - } - } - - function settle(type, value) { - switch (type) { - case "return": - front.resolve({ - value: value, - done: true - }); - break; - - case "throw": - front.reject(value); - break; - - default: - front.resolve({ - value: value, - done: false - }); - break; - } - - front = front.next; - - if (front) { - resume(front.key, front.arg); - } else { - back = null; - } - } - - this._invoke = send; - - if (typeof gen.return !== "function") { - this.return = undefined; - } - } - - if (typeof Symbol === "function" && Symbol.asyncIterator) { - AsyncGenerator.prototype[Symbol.asyncIterator] = function () { - return this; - }; - } - - AsyncGenerator.prototype.next = function (arg) { - return this._invoke("next", arg); - }; - - AsyncGenerator.prototype.throw = function (arg) { - return this._invoke("throw", arg); - }; - - AsyncGenerator.prototype.return = function (arg) { - return this._invoke("return", arg); - }; - - return { - wrap: function (fn) { - return function () { - return new AsyncGenerator(fn.apply(this, arguments)); - }; - }, - await: function (value) { - return new AwaitValue(value); - } - }; -}(); - - - - - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - -var get = function get(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } -}; - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - - - - - - - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - - - - - -var slicedToArray = function () { - function sliceIterator(arr, i) { - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if (Symbol.iterator in Object(arr)) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; -}(); - - - - - - - - - - - - - -var toConsumableArray = function (arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - - return arr2; - } else { - return Array.from(arr); - } -}; - -function $(expr, con) { - return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null; -} - - - -$.create = function (tag, o) { - var element = document.createElement(tag); - - for (var i in o) { - var val = o[i]; - - if (i === "inside") { - $(val).appendChild(element); - } else if (i === "around") { - var ref = $(val); - ref.parentNode.insertBefore(element, ref); - element.appendChild(ref); - } else if (i === "styles") { - if ((typeof val === "undefined" ? "undefined" : _typeof(val)) === "object") { - Object.keys(val).map(function (prop) { - element.style[prop] = val[prop]; - }); - } - } else if (i in element) { - element[i] = val; - } else { - element.setAttribute(i, val); - } - } - - return element; -}; - -function getOffset(element) { - var rect = element.getBoundingClientRect(); - return { - // https://stackoverflow.com/a/7436602/6495043 - // rect.top varies with scroll, so we add whatever has been - // scrolled to it to get absolute distance from actual page top - top: rect.top + (document.documentElement.scrollTop || document.body.scrollTop), - left: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft) - }; -} - -// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent -// an element's offsetParent property will return null whenever it, or any of its parents, -// is hidden via the display style property. -function isHidden(el) { - return el.offsetParent === null; -} - -function isElementInViewport(el) { - // Although straightforward: https://stackoverflow.com/a/7557433/6495043 - var rect = el.getBoundingClientRect(); - - return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ - rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ - ; -} - -function getElementContentWidth(element) { - var styles = window.getComputedStyle(element); - var padding = parseFloat(styles.paddingLeft) + parseFloat(styles.paddingRight); - - return element.clientWidth - padding; -} - - - - - -function fire(target, type, properties) { - var evt = document.createEvent("HTMLEvents"); - - evt.initEvent(type, true, true); - - for (var j in properties) { - evt[j] = properties[j]; - } - - return target.dispatchEvent(evt); -} - -// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/ - -var BASE_MEASURES = { - margins: { - top: 10, - bottom: 10, - left: 20, - right: 20 - }, - paddings: { - top: 20, - bottom: 40, - left: 30, - right: 10 - }, - - baseHeight: 240, - titleHeight: 20, - legendHeight: 30, - - titleFontSize: 12 -}; - -function getTopOffset(m) { - return m.titleHeight + m.margins.top + m.paddings.top; -} - -function getLeftOffset(m) { - return m.margins.left + m.paddings.left; -} - -function getExtraHeight(m) { - var totalExtraHeight = m.margins.top + m.margins.bottom + m.paddings.top + m.paddings.bottom + m.titleHeight + m.legendHeight; - return totalExtraHeight; -} - -function getExtraWidth(m) { - var totalExtraWidth = m.margins.left + m.margins.right + m.paddings.left + m.paddings.right; - - return totalExtraWidth; -} - -var INIT_CHART_UPDATE_TIMEOUT = 700; -var CHART_POST_ANIMATE_TIMEOUT = 400; - -var DEFAULT_AXIS_CHART_TYPE = 'line'; -var AXIS_DATASET_CHART_TYPES = ['line', 'bar']; - -var AXIS_LEGEND_BAR_SIZE = 100; - -var BAR_CHART_SPACE_RATIO = 0.5; -var MIN_BAR_PERCENT_HEIGHT = 0.00; - -var LINE_CHART_DOT_SIZE = 4; -var DOT_OVERLAY_SIZE_INCR = 4; - -var PERCENTAGE_BAR_DEFAULT_HEIGHT = 20; -var PERCENTAGE_BAR_DEFAULT_DEPTH = 2; - -// Fixed 5-color theme, -// More colors are difficult to parse visually -var HEATMAP_DISTRIBUTION_SIZE = 5; - -var HEATMAP_SQUARE_SIZE = 10; -var HEATMAP_GUTTER_SIZE = 2; - -var DEFAULT_CHAR_WIDTH = 7; - -var TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5; - -var DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange', 'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey']; -var HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127']; - - - -var DEFAULT_COLORS = { - bar: DEFAULT_CHART_COLORS, - line: DEFAULT_CHART_COLORS, - pie: DEFAULT_CHART_COLORS, - percentage: DEFAULT_CHART_COLORS, - heatmap: HEATMAP_COLORS_GREEN, - donut: DEFAULT_CHART_COLORS -}; - -// Universal constants -var ANGLE_RATIO = Math.PI / 180; -var FULL_ANGLE = 360; - -var SvgTip = function () { - function SvgTip(_ref) { - var _ref$parent = _ref.parent, - parent = _ref$parent === undefined ? null : _ref$parent, - _ref$colors = _ref.colors, - colors = _ref$colors === undefined ? [] : _ref$colors; - classCallCheck(this, SvgTip); - - this.parent = parent; - this.colors = colors; - this.titleName = ''; - this.titleValue = ''; - this.listValues = []; - this.titleValueFirst = 0; - - this.x = 0; - this.y = 0; - - this.top = 0; - this.left = 0; - - this.setup(); - } - - createClass(SvgTip, [{ - key: 'setup', - value: function setup() { - this.makeTooltip(); - } - }, { - key: 'refresh', - value: function refresh() { - this.fill(); - this.calcPosition(); - } - }, { - key: 'makeTooltip', - value: function makeTooltip() { - var _this = this; - - this.container = $.create('div', { - inside: this.parent, - className: 'graph-svg-tip comparison', - innerHTML: '\n\t\t\t\t\n\t\t\t\t
' - }); - this.hideTip(); - - this.title = this.container.querySelector('.title'); - this.dataPointList = this.container.querySelector('.data-point-list'); - - this.parent.addEventListener('mouseleave', function () { - _this.hideTip(); - }); - } - }, { - key: 'fill', - value: function fill() { - var _this2 = this; - - var title = void 0; - if (this.index) { - this.container.setAttribute('data-point-index', this.index); - } - if (this.titleValueFirst) { - title = '' + this.titleValue + '' + this.titleName; - } else { - title = this.titleName + '' + this.titleValue + ''; - } - this.title.innerHTML = title; - this.dataPointList.innerHTML = ''; - - this.listValues.map(function (set$$1, i) { - var color = _this2.colors[i] || 'black'; - var value = set$$1.formatted === 0 || set$$1.formatted ? set$$1.formatted : set$$1.value; - - var li = $.create('li', { - styles: { - 'border-top': '3px solid ' + color - }, - innerHTML: '' + (value === 0 || value ? value : '') + '\n\t\t\t\t\t' + (set$$1.title ? set$$1.title : '') - }); - - _this2.dataPointList.appendChild(li); - }); - } - }, { - key: 'calcPosition', - value: function calcPosition() { - var width = this.container.offsetWidth; - - this.top = this.y - this.container.offsetHeight - TOOLTIP_POINTER_TRIANGLE_HEIGHT; - this.left = this.x - width / 2; - var maxLeft = this.parent.offsetWidth - width; - - var pointer = this.container.querySelector('.svg-pointer'); - - if (this.left < 0) { - pointer.style.left = 'calc(50% - ' + -1 * this.left + 'px)'; - this.left = 0; - } else if (this.left > maxLeft) { - var delta = this.left - maxLeft; - var pointerOffset = 'calc(50% + ' + delta + 'px)'; - pointer.style.left = pointerOffset; - - this.left = maxLeft; - } else { - pointer.style.left = '50%'; - } - } - }, { - key: 'setValues', - value: function setValues(x, y) { - var title = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var listValues = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; - var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; - - this.titleName = title.name; - this.titleValue = title.value; - this.listValues = listValues; - this.x = x; - this.y = y; - this.titleValueFirst = title.valueFirst || 0; - this.index = index; - this.refresh(); - } - }, { - key: 'hideTip', - value: function hideTip() { - this.container.style.top = '0px'; - this.container.style.left = '0px'; - this.container.style.opacity = '0'; - } - }, { - key: 'showTip', - value: function showTip() { - this.container.style.top = this.top + 'px'; - this.container.style.left = this.left + 'px'; - this.container.style.opacity = '1'; - } - }]); - return SvgTip; -}(); - -function floatTwo(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 - */ - - -/** - * Shuffles array in place. ES6 version - * @param {Array} array An array containing the items. - */ - - -/** - * Fill an array with extra points - * @param {Array} array Array - * @param {Number} count number of filler elements - * @param {Object} element element to fill with - * @param {Boolean} start fill at start? - */ -function fillArray(array, count, element) { - var start = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - - if (!element) { - element = start ? array[0] : array[array.length - 1]; - } - var fillerArray = new Array(Math.abs(count)).fill(element); - array = start ? fillerArray.concat(array) : array.concat(fillerArray); - return array; -} - -/** - * Returns pixel width of string. - * @param {String} string - * @param {Number} charWidth Width of single char in pixels - */ -function getStringWidth(string, charWidth) { - return (string + "").length * charWidth; -} - - - -// https://stackoverflow.com/a/29325222 - - -function getPositionByAngle(angle, radius) { - return { - x: Math.sin(angle * ANGLE_RATIO) * radius, - y: Math.cos(angle * ANGLE_RATIO) * radius - }; -} - -/** - * Check if a number is valid for svg attributes - * @param {object} candidate Candidate to test - * @param {Boolean} nonNegative flag to treat negative number as invalid - */ -function isValidNumber(candidate) { - var nonNegative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (Number.isNaN(candidate)) return false;else if (candidate === undefined) return false;else if (!Number.isFinite(candidate)) return false;else if (nonNegative && candidate < 0) return false;else return true; -} - -/** - * Round a number to the closes precision, max max precision 4 - * @param {Number} d Any Number - */ -function round(d) { - // https://floating-point-gui.de/ - // https://www.jacklmoore.com/notes/rounding-in-javascript/ - return Number(Math.round(d + 'e4') + 'e-4'); -} - -/** - * Creates a deep clone of an object - * @param {Object} candidate Any Object - */ -function deepClone(candidate) { - var cloned = void 0, - value = void 0, - key = void 0; - - if (candidate instanceof Date) { - return new Date(candidate.getTime()); - } - - if ((typeof candidate === 'undefined' ? 'undefined' : _typeof(candidate)) !== "object" || candidate === null) { - return candidate; - } - - cloned = Array.isArray(candidate) ? [] : {}; - - for (key in candidate) { - value = candidate[key]; - - cloned[key] = deepClone(value); - } - - return cloned; -} - -function getBarHeightAndYAttr(yTop, zeroLine) { - var height = void 0, - y = void 0; - if (yTop <= zeroLine) { - height = zeroLine - yTop; - y = yTop; - } else { - height = yTop - zeroLine; - y = zeroLine; - } - - return [height, y]; -} - -function equilizeNoOfElements(array1, array2) { - var extraCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : array2.length - array1.length; - - - // Doesn't work if either has zero elements. - if (extraCount > 0) { - array1 = fillArray(array1, extraCount); - } else { - array2 = fillArray(array2, extraCount); - } - return [array1, array2]; -} - -function truncateString(txt, len) { - if (!txt) { - return; - } - if (txt.length > len) { - return txt.slice(0, len - 3) + '...'; - } else { - return txt; - } -} - -function shortenLargeNumber(label) { - var number = void 0; - if (typeof label === 'number') number = label;else if (typeof label === 'string') { - number = Number(label); - if (Number.isNaN(number)) return label; - } - - // Using absolute since log wont work for negative numbers - var p = Math.floor(Math.log10(Math.abs(number))); - if (p <= 2) return number; // Return as is for a 3 digit number of less - var l = Math.floor(p / 3); - var shortened = Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1); - - // Correct for floating point error upto 2 decimal places - return Math.round(shortened * 100) / 100 + ' ' + ['', 'K', 'M', 'B', 'T'][l]; -} - -// cubic bezier curve calculation (from example by François Romain) -function getSplineCurvePointsStr(xList, yList) { - - var points = []; - for (var i = 0; i < xList.length; i++) { - points.push([xList[i], yList[i]]); - } - - var smoothing = 0.2; - var line = function line(pointA, pointB) { - var lengthX = pointB[0] - pointA[0]; - var lengthY = pointB[1] - pointA[1]; - return { - length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)), - angle: Math.atan2(lengthY, lengthX) - }; - }; - - var controlPoint = function controlPoint(current, previous, next, reverse) { - var p = previous || current; - var n = next || current; - var o = line(p, n); - var angle = o.angle + (reverse ? Math.PI : 0); - var length = o.length * smoothing; - var x = current[0] + Math.cos(angle) * length; - var y = current[1] + Math.sin(angle) * length; - return [x, y]; - }; - - var bezierCommand = function bezierCommand(point, i, a) { - var cps = controlPoint(a[i - 1], a[i - 2], point); - var cpe = controlPoint(point, a[i - 1], a[i + 1], true); - return 'C ' + cps[0] + ',' + cps[1] + ' ' + cpe[0] + ',' + cpe[1] + ' ' + point[0] + ',' + point[1]; - }; - - var pointStr = function pointStr(points, command) { - return points.reduce(function (acc, point, i, a) { - return i === 0 ? point[0] + ',' + point[1] : acc + ' ' + command(point, i, a); - }, ''); - }; - - return pointStr(points, bezierCommand); -} - -var PRESET_COLOR_MAP = { - 'light-blue': '#7cd6fd', - 'blue': '#5e64ff', - 'violet': '#743ee2', - 'red': '#ff5858', - 'orange': '#ffa00a', - 'yellow': '#feef72', - 'green': '#28a745', - 'light-green': '#98d85b', - 'purple': '#b554ff', - 'magenta': '#ffa3ef', - 'black': '#36114C', - 'grey': '#bdd3e6', - 'light-grey': '#f0f4f7', - 'dark-grey': '#b8c2cc' -}; - -function limitColor(r) { - if (r > 255) return 255;else if (r < 0) return 0; - return r; -} - -function lightenDarkenColor(color, amt) { - var col = getColor(color); - 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); -} - -function isValidColor(string) { - // https://stackoverflow.com/a/32685393 - var HEX_RE = /(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i; - var RGB_RE = /(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i; - return HEX_RE.test(string) || RGB_RE.test(string); -} - -var getColor = function getColor(color) { - // When RGB color, convert to hexadecimal (alpha value is omitted) - if (/rgb[a]{0,1}\([\d, ]+\)/gim.test(color)) { - return (/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(color).map(function (x, i) { - return i !== 0 ? Number(x).toString(16) : '#'; - }).reduce(function (c, ch) { - return '' + c + ch; - }) - ); - } - return PRESET_COLOR_MAP[color] || color; -}; - -var AXIS_TICK_LENGTH = 6; -var LABEL_MARGIN = 4; -var LABEL_MAX_CHARS = 15; -var FONT_SIZE = 10; -var BASE_LINE_COLOR = '#dadada'; -var FONT_FILL = '#555b51'; - -function $$1(expr, con) { - return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null; -} - -function createSVG(tag, o) { - var element = document.createElementNS("http://www.w3.org/2000/svg", tag); - - for (var i in o) { - var val = o[i]; - - if (i === "inside") { - $$1(val).appendChild(element); - } else if (i === "around") { - var ref = $$1(val); - ref.parentNode.insertBefore(element, ref); - element.appendChild(ref); - } else if (i === "styles") { - if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === "object") { - Object.keys(val).map(function (prop) { - element.style[prop] = val[prop]; - }); - } - } else { - if (i === "className") { - i = "class"; - } - if (i === "innerHTML") { - element['textContent'] = val; - } else { - element.setAttribute(i, val); - } - } - } - - return element; -} - -function renderVerticalGradient(svgDefElem, gradientId) { - return createSVG('linearGradient', { - inside: svgDefElem, - id: gradientId, - x1: 0, - x2: 0, - y1: 0, - y2: 1 - }); -} - -function setGradientStop(gradElem, offset, color, opacity) { - return createSVG('stop', { - 'inside': gradElem, - 'style': 'stop-color: ' + color, - 'offset': offset, - 'stop-opacity': opacity - }); -} - -function makeSVGContainer(parent, className, width, height) { - return createSVG('svg', { - className: className, - inside: parent, - width: width, - height: height - }); -} - -function makeSVGDefs(svgContainer) { - return createSVG('defs', { - inside: svgContainer - }); -} - -function makeSVGGroup(className) { - var transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var parent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - - var args = { - className: className, - transform: transform - }; - if (parent) args.inside = parent; - return createSVG('g', args); -} - - - -function makePath(pathStr) { - var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var stroke = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'none'; - var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; - var strokeWidth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 2; - - return createSVG('path', { - className: className, - d: pathStr, - styles: { - stroke: stroke, - fill: fill, - 'stroke-width': strokeWidth - } - }); -} - -function makeArcPathStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - arcEndY = center.y + endPosition.y; - - return 'M' + center.x + ' ' + center.y + '\n\t\tL' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY + ' z'; -} - -function makeCircleStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - midArc = center.y * 2, - arcEndY = center.y + endPosition.y; - - return 'M' + center.x + ' ' + center.y + '\n\t\tL' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + midArc + ' z\n\t\tL' + arcStartX + ' ' + midArc + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY + ' z'; -} - -function makeArcStrokePathStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - arcEndY = center.y + endPosition.y; - - - return 'M' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY; -} - -function makeStrokeCircleStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - midArc = radius * 2 + arcStartY, - arcEndY = center.y + startPosition.y; - - - return 'M' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + midArc + '\n\t\tM' + arcStartX + ' ' + midArc + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY; -} - -function makeGradient(svgDefElem, color) { - var lighter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var gradientId = 'path-fill-gradient' + '-' + color + '-' + (lighter ? 'lighter' : 'default'); - var gradientDef = renderVerticalGradient(svgDefElem, gradientId); - var opacities = [1, 0.6, 0.2]; - if (lighter) { - opacities = [0.4, 0.2, 0]; - } - - setGradientStop(gradientDef, "0%", color, opacities[0]); - setGradientStop(gradientDef, "50%", color, opacities[1]); - setGradientStop(gradientDef, "100%", color, opacities[2]); - - return gradientId; -} - -function percentageBar(x, y, width, height) { - var depth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : PERCENTAGE_BAR_DEFAULT_DEPTH; - var fill = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'none'; - - - var args = { - className: 'percentage-bar', - x: x, - y: y, - width: width, - height: height, - fill: fill, - styles: { - 'stroke': lightenDarkenColor(fill, -25), - // Diabolically good: https://stackoverflow.com/a/9000859 - // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray - 'stroke-dasharray': '0, ' + (height + width) + ', ' + width + ', ' + height, - 'stroke-width': depth - } - }; - - return createSVG("rect", args); -} - -function heatSquare(className, x, y, size, radius) { - var fill = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'none'; - var data = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {}; - - var args = { - className: className, - x: x, - y: y, - width: size, - height: size, - rx: radius, - fill: fill - }; - - Object.keys(data).map(function (key) { - args[key] = data[key]; - }); - - return createSVG("rect", args); -} - -function legendBar(x, y, size) { - var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; - var label = arguments[4]; - var truncate = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; - - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - - var args = { - className: 'legend-bar', - x: 0, - y: 0, - width: size, - height: '2px', - fill: fill - }; - var text = createSVG('text', { - className: 'legend-dataset-text', - x: 0, - y: 0, - dy: FONT_SIZE * 2 + 'px', - 'font-size': FONT_SIZE * 1.2 + 'px', - 'text-anchor': 'start', - fill: FONT_FILL, - innerHTML: label - }); - - var group = createSVG('g', { - transform: 'translate(' + x + ', ' + y + ')' - }); - group.appendChild(createSVG("rect", args)); - group.appendChild(text); - - return group; -} - -function legendDot(x, y, size) { - var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; - var label = arguments[4]; - var truncate = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; - - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - - var args = { - className: 'legend-dot', - cx: 0, - cy: 0, - r: size, - fill: fill - }; - var text = createSVG('text', { - className: 'legend-dataset-text', - x: 0, - y: 0, - dx: FONT_SIZE + 'px', - dy: FONT_SIZE / 3 + 'px', - 'font-size': FONT_SIZE * 1.2 + 'px', - 'text-anchor': 'start', - fill: FONT_FILL, - innerHTML: label - }); - - var group = createSVG('g', { - transform: 'translate(' + x + ', ' + y + ')' - }); - group.appendChild(createSVG("circle", args)); - group.appendChild(text); - - return group; -} - -function makeText(className, x, y, content) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - var fontSize = options.fontSize || FONT_SIZE; - var dy = options.dy !== undefined ? options.dy : fontSize / 2; - var fill = options.fill || FONT_FILL; - var textAnchor = options.textAnchor || 'start'; - return createSVG('text', { - className: className, - x: x, - y: y, - dy: dy + 'px', - 'font-size': fontSize + 'px', - fill: fill, - 'text-anchor': textAnchor, - innerHTML: content - }); -} - -function makeVertLine(x, label, y1, y2) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - var l = createSVG('line', { - className: 'line-vertical ' + options.className, - x1: 0, - x2: 0, - y1: y1, - y2: y2, - styles: { - stroke: options.stroke - } - }); - - var text = createSVG('text', { - x: 0, - y: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE, - dy: FONT_SIZE + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'middle', - innerHTML: label + "" - }); - - var line = createSVG('g', { - transform: 'translate(' + x + ', 0)' - }); - - line.appendChild(l); - line.appendChild(text); - - return line; -} - -function makeHoriLine(y, label, x1, x2) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.lineType) options.lineType = ''; - if (!options.alignment) options.alignment = 'left'; - if (options.shortenNumbers) label = shortenLargeNumber(label); - - var className = 'line-horizontal ' + options.className + (options.lineType === 'dashed' ? 'dashed' : ''); - - var l = createSVG('line', { - className: className, - x1: x1, - x2: x2, - y1: 0, - y2: 0, - styles: { - stroke: options.stroke - } - }); - - var text = createSVG('text', { - x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4, - y: 0, - dy: FONT_SIZE / 2 - 2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': x1 < x2 ? 'end' : 'start', - innerHTML: label + '' - }); - - var line = createSVG('g', { - transform: 'translate(0, ' + y + ')', - 'stroke-opacity': 1 - }); - - if (text === 0 || text === '0') { - line.style.stroke = 'rgba(27, 31, 35, 0.6)'; - } - - line.appendChild(l); - line.appendChild(text); - - return line; -} - -function generateAxisLabel(options) { - if (!options.title) return; - - var x = options.position === 'left' ? LABEL_MARGIN : options.width; - // - getStringWidth(options.title, 5); - var rotation = options.position === 'right' ? 'rotate(90, ' + options.width + ', ' + options.height / 2 + ')' : 'rotate(270, 0, ' + options.height / 2 + ')'; - - var labelSvg = createSVG('text', { - className: 'chart-label', - x: x - getStringWidth(options.title, 5) / 2, - y: options.height / 2 - LABEL_MARGIN, - dy: FONT_SIZE / -2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'start', - transform: rotation, - innerHTML: options.title + '' - }); - - return labelSvg; -} - -function yLine(y, label, width) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - if (!isValidNumber(y)) y = 0; - - if (!options.pos) options.pos = 'left'; - if (!options.offset) options.offset = 0; - if (!options.mode) options.mode = 'span'; - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.className) options.className = ''; - - var x1 = -1 * AXIS_TICK_LENGTH; - var x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; - - if (options.mode === 'tick' && options.pos === 'right') { - x1 = width + AXIS_TICK_LENGTH; - x2 = width; - } - - var offset = options.pos === 'left' ? -1 * options.offset : options.offset; - - x1 += offset; - x2 += offset; - - return makeHoriLine(y, label, x1, x2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType, - alignment: options.pos, - shortenNumbers: options.shortenNumbers - }); -} - -function xLine(x, label, height) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - if (!isValidNumber(x)) x = 0; - - if (!options.pos) options.pos = 'bottom'; - if (!options.offset) options.offset = 0; - if (!options.mode) options.mode = 'span'; - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.className) options.className = ''; - - // Draw X axis line in span/tick mode with optional label - // y2(span) - // | - // | - // x line | - // | - // | - // ---------------------+-- y2(tick) - // | - // y1 - - var y1 = height + AXIS_TICK_LENGTH; - var y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height; - - if (options.mode === 'tick' && options.pos === 'top') { - // top axis ticks - y1 = -1 * AXIS_TICK_LENGTH; - y2 = 0; - } - - return makeVertLine(x, label, y1, y2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType - }); -} - -function yMarker(y, label, width) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - if (!options.labelPos) options.labelPos = 'right'; - var x = options.labelPos === 'left' ? LABEL_MARGIN : width - getStringWidth(label, 5) - LABEL_MARGIN; - - var labelSvg = createSVG('text', { - className: 'chart-label', - x: x, - y: 0, - dy: FONT_SIZE / -2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'start', - innerHTML: label + "" - }); - - var line = makeHoriLine(y, '', 0, width, { - stroke: options.stroke || BASE_LINE_COLOR, - className: options.className || '', - lineType: options.lineType - }); - - line.appendChild(labelSvg); - - return line; -} - -function yRegion(y1, y2, width, label) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - // return a group - var height = y1 - y2; - - var rect = createSVG('rect', { - className: 'bar mini', // remove class - styles: { - fill: 'rgba(228, 234, 239, 0.49)', - stroke: BASE_LINE_COLOR, - 'stroke-dasharray': width + ', ' + height - }, - // 'data-point-index': index, - x: 0, - y: 0, - width: width, - height: height - }); - - if (!options.labelPos) options.labelPos = 'right'; - var x = options.labelPos === 'left' ? LABEL_MARGIN : width - getStringWidth(label + "", 4.5) - LABEL_MARGIN; - - var labelSvg = createSVG('text', { - className: 'chart-label', - x: x, - y: 0, - dy: FONT_SIZE / -2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'start', - innerHTML: label + "" - }); - - var region = createSVG('g', { - transform: 'translate(0, ' + y2 + ')' - }); - - region.appendChild(rect); - region.appendChild(labelSvg); - - return region; -} - -function datasetBar(x, yTop, width, color) { - var label = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; - var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var offset = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0; - var meta = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : {}; - - var _getBarHeightAndYAttr = getBarHeightAndYAttr(yTop, meta.zeroLine), - _getBarHeightAndYAttr2 = slicedToArray(_getBarHeightAndYAttr, 2), - height = _getBarHeightAndYAttr2[0], - y = _getBarHeightAndYAttr2[1]; - - y -= offset; - - if (height === 0) { - height = meta.minHeight; - y -= meta.minHeight; - } - - // Preprocess numbers to avoid svg building errors - if (!isValidNumber(x)) x = 0; - if (!isValidNumber(y)) y = 0; - if (!isValidNumber(height, true)) height = 0; - if (!isValidNumber(width, true)) width = 0; - - var rect = createSVG('rect', { - className: 'bar mini', - style: 'fill: ' + color, - 'data-point-index': index, - x: x, - y: y, - width: width, - height: height - }); - - label += ""; - - if (!label && !label.length) { - return rect; - } else { - rect.setAttribute('y', 0); - rect.setAttribute('x', 0); - var text = createSVG('text', { - className: 'data-point-value', - x: width / 2, - y: 0, - dy: FONT_SIZE / 2 * -1 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'middle', - innerHTML: label - }); - - var group = createSVG('g', { - 'data-point-index': index, - transform: 'translate(' + x + ', ' + y + ')' - }); - group.appendChild(rect); - group.appendChild(text); - - return group; - } -} - -function datasetDot(x, y, radius, color) { - var label = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; - var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - - var dot = createSVG('circle', { - style: 'fill: ' + color, - 'data-point-index': index, - cx: x, - cy: y, - r: radius - }); - - label += ""; - - if (!label && !label.length) { - return dot; - } else { - dot.setAttribute('cy', 0); - dot.setAttribute('cx', 0); - - var text = createSVG('text', { - className: 'data-point-value', - x: 0, - y: 0, - dy: FONT_SIZE / 2 * -1 - radius + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'middle', - innerHTML: label - }); - - var group = createSVG('g', { - 'data-point-index': index, - transform: 'translate(' + x + ', ' + y + ')' - }); - group.appendChild(dot); - group.appendChild(text); - - return group; - } -} - -function getPaths(xList, yList, color) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - var meta = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - var pointsList = yList.map(function (y, i) { - return xList[i] + ',' + y; - }); - var pointsStr = pointsList.join("L"); - - // Spline - if (options.spline) pointsStr = getSplineCurvePointsStr(xList, yList); - - var path = makePath("M" + pointsStr, 'line-graph-path', color); - - // HeatLine - if (options.heatline) { - var gradient_id = makeGradient(meta.svgDefs, color); - path.style.stroke = 'url(#' + gradient_id + ')'; - } - - var paths = { - path: path - }; - - // Region - if (options.regionFill) { - var gradient_id_region = makeGradient(meta.svgDefs, color, true); - - var pathStr = "M" + (xList[0] + ',' + meta.zeroLine + 'L') + pointsStr + ('L' + xList.slice(-1)[0] + ',' + meta.zeroLine); - paths.region = makePath(pathStr, 'region-fill', 'none', 'url(#' + gradient_id_region + ')'); - } - - return paths; -} - -var makeOverlay = { - 'bar': function bar(unit) { - var transformValue = void 0; - if (unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var overlay = unit.cloneNode(); - overlay.style.fill = '#000000'; - overlay.style.opacity = '0.4'; - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - return overlay; - }, - - 'dot': function dot(unit) { - var transformValue = void 0; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var overlay = unit.cloneNode(); - var radius = unit.getAttribute('r'); - var fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - return overlay; - }, - - 'heat_square': function heat_square(unit) { - var transformValue = void 0; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var overlay = unit.cloneNode(); - var radius = unit.getAttribute('r'); - var fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - return overlay; - } -}; - -var updateOverlay = { - 'bar': function bar(unit, overlay) { - var transformValue = void 0; - if (unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var attributes = ['x', 'y', 'width', 'height']; - Object.values(unit.attributes).filter(function (attr) { - return attributes.includes(attr.name) && attr.specified; - }).map(function (attr) { - overlay.setAttribute(attr.name, attr.nodeValue); - }); - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, - - 'dot': function dot(unit, overlay) { - var transformValue = void 0; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var attributes = ['cx', 'cy']; - Object.values(unit.attributes).filter(function (attr) { - return attributes.includes(attr.name) && attr.specified; - }).map(function (attr) { - overlay.setAttribute(attr.name, attr.nodeValue); - }); - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, - - 'heat_square': function heat_square(unit, overlay) { - var transformValue = void 0; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var attributes = ['cx', 'cy']; - Object.values(unit.attributes).filter(function (attr) { - return attributes.includes(attr.name) && attr.specified; - }).map(function (attr) { - overlay.setAttribute(attr.name, attr.nodeValue); - }); - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - } -}; - -var UNIT_ANIM_DUR = 350; -var PATH_ANIM_DUR = 350; -var MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR; -var REPLACE_ALL_NEW_DUR = 250; - -var STD_EASING = 'easein'; - -function translate(unit, oldCoord, newCoord, duration) { - var old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', '); - return [unit, { transform: newCoord.join(', ') }, duration, STD_EASING, "translate", { transform: old }]; -} - -function translateVertLine(xLine, newX, oldX) { - return translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR); -} - -function translateHoriLine(yLine, newY, oldY) { - return translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR); -} - -function animateRegion(rectGroup, newY1, newY2, oldY2) { - var newHeight = newY1 - newY2; - var rect = rectGroup.childNodes[0]; - var width = rect.getAttribute("width"); - var rectAnim = [rect, { height: newHeight, 'stroke-dasharray': width + ', ' + newHeight }, MARKER_LINE_ANIM_DUR, STD_EASING]; - - var groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR); - return [rectAnim, groupAnim]; -} - -function animateBar(bar, x, yTop, width) { - var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; - var meta = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; - - var _getBarHeightAndYAttr = getBarHeightAndYAttr(yTop, meta.zeroLine), - _getBarHeightAndYAttr2 = slicedToArray(_getBarHeightAndYAttr, 2), - height = _getBarHeightAndYAttr2[0], - y = _getBarHeightAndYAttr2[1]; - - y -= offset; - if (bar.nodeName !== 'rect') { - var rect = bar.childNodes[0]; - var rectAnim = [rect, { width: width, height: height }, UNIT_ANIM_DUR, STD_EASING]; - - var oldCoordStr = bar.getAttribute("transform").split("(")[1].slice(0, -1); - var groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); - return [rectAnim, groupAnim]; - } else { - return [[bar, { width: width, height: height, x: x, y: y }, UNIT_ANIM_DUR, STD_EASING]]; - } - // bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein); -} - -function animateDot(dot, x, y) { - if (dot.nodeName !== 'circle') { - var oldCoordStr = dot.getAttribute("transform").split("(")[1].slice(0, -1); - var groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); - return [groupAnim]; - } else { - return [[dot, { cx: x, cy: y }, UNIT_ANIM_DUR, STD_EASING]]; - } - // dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein); -} - -function animatePath(paths, newXList, newYList, zeroLine, spline) { - var pathComponents = []; - var pointsStr = newYList.map(function (y, i) { - return newXList[i] + ',' + y; - }).join("L"); - - if (spline) pointsStr = getSplineCurvePointsStr(newXList, newYList); - - var animPath = [paths.path, { d: "M" + pointsStr }, PATH_ANIM_DUR, STD_EASING]; - pathComponents.push(animPath); - - if (paths.region) { - var regStartPt = newXList[0] + ',' + zeroLine + 'L'; - var regEndPt = 'L' + newXList.slice(-1)[0] + ', ' + zeroLine; - - var animRegion = [paths.region, { d: "M" + regStartPt + pointsStr + regEndPt }, PATH_ANIM_DUR, STD_EASING]; - pathComponents.push(animRegion); - } - - return pathComponents; -} - -function animatePathStr(oldPath, pathStr) { - return [oldPath, { d: pathStr }, UNIT_ANIM_DUR, STD_EASING]; -} - -// 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 animateSVGElement(element, props, dur) { - var easingType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "linear"; - var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; - var oldValues = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; - - - var animElement = element.cloneNode(true); - var newElement = element.cloneNode(true); - - for (var attributeName in props) { - var animateElement = void 0; - if (attributeName === 'transform') { - animateElement = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform"); - } else { - animateElement = document.createElementNS("http://www.w3.org/2000/svg", "animate"); - } - var currentValue = oldValues[attributeName] || element.getAttribute(attributeName); - var value = props[attributeName]; - - var animAttr = { - attributeName: attributeName, - from: currentValue, - to: value, - begin: "0s", - dur: dur / 1000 + "s", - values: currentValue + ";" + value, - keySplines: EASING[easingType], - keyTimes: "0;1", - calcMode: "spline", - fill: 'freeze' - }; - - if (type) { - animAttr["type"] = type; - } - - for (var i in animAttr) { - animateElement.setAttribute(i, animAttr[i]); - } - - animElement.appendChild(animateElement); - - if (type) { - newElement.setAttribute(attributeName, "translate(" + value + ")"); - } else { - newElement.setAttribute(attributeName, value); - } - } - - return [animElement, newElement]; -} - -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 animateSVG(svgContainer, elements) { - var newElements = []; - var animElements = []; - - elements.map(function (element) { - var unit = element[0]; - var parent = unit.parentNode; - - var animElement = void 0, - newElement = void 0; - - element[0] = unit; - - var _animateSVGElement = animateSVGElement.apply(undefined, toConsumableArray(element)); - - var _animateSVGElement2 = slicedToArray(_animateSVGElement, 2); - - animElement = _animateSVGElement2[0]; - newElement = _animateSVGElement2[1]; - - - newElements.push(newElement); - animElements.push([animElement, parent]); - - if (parent) { - parent.replaceChild(animElement, unit); - } - }); - - var animSvg = svgContainer.cloneNode(true); - - animElements.map(function (animElement, i) { - if (animElement[1]) { - animElement[1].replaceChild(newElements[i], animElement[0]); - elements[i][0] = newElements[i]; - } - }); - - return animSvg; -} - -function runSMILAnimation(parent, svgElement, elementsToAnimate) { - if (elementsToAnimate.length === 0) return; - - var animSvgElement = animateSVG(svgElement, elementsToAnimate); - if (svgElement.parentNode == parent) { - parent.removeChild(svgElement); - parent.appendChild(animSvgElement); - } - - // Replace the new svgElement (data has already been replaced) - setTimeout(function () { - if (animSvgElement.parentNode == parent) { - parent.removeChild(animSvgElement); - parent.appendChild(svgElement); - } - }, REPLACE_ALL_NEW_DUR); -} - -var CSSTEXT = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}"; - -function downloadFile(filename, data) { - var a = document.createElement('a'); - a.style = "display: none"; - var blob = new Blob(data, { type: "image/svg+xml; charset=utf-8" }); - var url = window.URL.createObjectURL(blob); - a.href = url; - a.download = filename; - document.body.appendChild(a); - a.click(); - setTimeout(function () { - document.body.removeChild(a); - window.URL.revokeObjectURL(url); - }, 300); -} - -function prepareForExport(svg) { - var clone = svg.cloneNode(true); - clone.classList.add('chart-container'); - clone.setAttribute('xmlns', "http://www.w3.org/2000/svg"); - clone.setAttribute('xmlns:xlink', "http://www.w3.org/1999/xlink"); - var styleEl = $.create('style', { - 'innerHTML': CSSTEXT - }); - clone.insertBefore(styleEl, clone.firstChild); - - var container = $.create('div'); - container.appendChild(clone); - - return container.innerHTML; -} - -var BaseChart = function () { - function BaseChart(parent, options) { - classCallCheck(this, BaseChart); - - // deepclone options to avoid making changes to orignal object - options = deepClone(options); - - this.parent = typeof parent === 'string' ? document.querySelector(parent) : parent; - - if (!(this.parent instanceof HTMLElement)) { - throw new Error('No `parent` element to render on was provided.'); - } - - this.rawChartArgs = options; - - this.title = options.title || ''; - this.type = options.type || ''; - - this.realData = this.prepareData(options.data); - this.data = this.prepareFirstData(this.realData); - - this.colors = this.validateColors(options.colors, this.type); - - this.config = { - showTooltip: 1, // calculate - showLegend: 1, // calculate - isNavigable: options.isNavigable || 0, - animate: typeof options.animate !== 'undefined' ? options.animate : 1, - truncateLegends: options.truncateLegends || 1 - }; - - this.measures = JSON.parse(JSON.stringify(BASE_MEASURES)); - var m = this.measures; - this.setMeasures(options); - if (!this.title.length) { - m.titleHeight = 0; - } - if (!this.config.showLegend) m.legendHeight = 0; - this.argHeight = options.height || m.baseHeight; - - this.state = {}; - this.options = {}; - - this.initTimeout = INIT_CHART_UPDATE_TIMEOUT; - - if (this.config.isNavigable) { - this.overlays = []; - } - - this.configure(options); - } - - createClass(BaseChart, [{ - key: 'prepareData', - value: function prepareData(data) { - return data; - } - }, { - key: 'prepareFirstData', - value: function prepareFirstData(data) { - return data; - } - }, { - key: 'validateColors', - value: function validateColors(colors, type) { - var validColors = []; - colors = (colors || []).concat(DEFAULT_COLORS[type]); - colors.forEach(function (string) { - var color = getColor(string); - if (!isValidColor(color)) { - console.warn('"' + string + '" is not a valid color.'); - } else { - validColors.push(color); - } - }); - return validColors; - } - }, { - key: 'setMeasures', - value: function setMeasures() { - // Override measures, including those for title and legend - // set config for legend and title - } - }, { - key: 'configure', - value: function configure() { - var _this = this; - - var height = this.argHeight; - this.baseHeight = height; - this.height = height - getExtraHeight(this.measures); - - // Bind window events - this.boundDrawFn = function () { - return _this.draw(true); - }; - if (ResizeObserver) { - this.resizeObserver = new ResizeObserver(this.boundDrawFn); - this.resizeObserver.observe(this.parent); - } - window.addEventListener('resize', this.boundDrawFn); - window.addEventListener('orientationchange', this.boundDrawFn); - } - }, { - key: 'destroy', - value: function destroy() { - if (this.resizeObserver) this.resizeObserver.disconnect(); - window.removeEventListener('resize', this.boundDrawFn); - window.removeEventListener('orientationchange', this.boundDrawFn); - } - - // Has to be called manually - - }, { - key: 'setup', - value: function setup() { - this.makeContainer(); - this.updateWidth(); - this.makeTooltip(); - - this.draw(false, true); - } - }, { - key: 'makeContainer', - value: function makeContainer() { - // Chart needs a dedicated parent element - this.parent.innerHTML = ''; - - var args = { - inside: this.parent, - className: 'chart-container' - }; - - if (this.independentWidth) { - args.styles = { width: this.independentWidth + 'px' }; - } - - this.container = $.create('div', args); - } - }, { - key: 'makeTooltip', - value: function makeTooltip() { - this.tip = new SvgTip({ - parent: this.container, - colors: this.colors - }); - this.bindTooltip(); - } - }, { - key: 'bindTooltip', - value: function bindTooltip() {} - }, { - key: 'draw', - value: function draw() { - var _this2 = this; - - var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (onlyWidthChange && isHidden(this.parent)) { - // Don't update anything if the chart is hidden - return; - } - this.updateWidth(); - - this.calc(onlyWidthChange); - this.makeChartArea(); - this.setupComponents(); - - this.components.forEach(function (c) { - return c.setup(_this2.drawArea); - }); - // this.components.forEach(c => c.make()); - this.render(this.components, false); - - if (init) { - this.data = this.realData; - setTimeout(function () { - _this2.update(_this2.data); - }, this.initTimeout); - } - - this.renderLegend(); - - this.setupNavigation(init); - } - }, { - key: 'calc', - value: function calc() {} // builds state - - }, { - key: 'updateWidth', - value: function updateWidth() { - this.baseWidth = getElementContentWidth(this.parent); - this.width = this.baseWidth - getExtraWidth(this.measures); - } - }, { - key: 'makeChartArea', - value: function makeChartArea() { - if (this.svg) { - this.container.removeChild(this.svg); - } - var m = this.measures; - - this.svg = makeSVGContainer(this.container, 'frappe-chart chart', this.baseWidth, this.baseHeight); - this.svgDefs = makeSVGDefs(this.svg); - - if (this.title.length) { - this.titleEL = makeText('title', m.margins.left, m.margins.top, this.title, { - fontSize: m.titleFontSize, - fill: '#666666', - dy: m.titleFontSize - }); - } - - var top = getTopOffset(m); - this.drawArea = makeSVGGroup(this.type + '-chart chart-draw-area', 'translate(' + getLeftOffset(m) + ', ' + top + ')'); - - if (this.config.showLegend) { - top += this.height + m.paddings.bottom; - this.legendArea = makeSVGGroup('chart-legend', 'translate(' + getLeftOffset(m) + ', ' + top + ')'); - } - - if (this.title.length) { - this.svg.appendChild(this.titleEL); - } - this.svg.appendChild(this.drawArea); - if (this.config.showLegend) { - this.svg.appendChild(this.legendArea); - } - - this.updateTipOffset(getLeftOffset(m), getTopOffset(m)); - } - }, { - key: 'updateTipOffset', - value: function updateTipOffset(x, y) { - this.tip.offset = { - x: x, - y: y - }; - } - }, { - key: 'setupComponents', - value: function setupComponents() { - this.components = new Map(); - } - }, { - key: 'update', - value: function update(data) { - if (!data) { - console.error('No data to update.'); - } - this.data = this.prepareData(data); - this.calc(); // builds state - this.render(this.components, this.config.animate); - this.renderLegend(); - } - }, { - key: 'render', - value: function render() { - var _this3 = this; - - var components = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.components; - var animate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - - if (this.config.isNavigable) { - // Remove all existing overlays - this.overlays.map(function (o) { - return o.parentNode.removeChild(o); - }); - // ref.parentNode.insertBefore(element, ref); - } - var elementsToAnimate = []; - // Can decouple to this.refreshComponents() first to save animation timeout - components.forEach(function (c) { - elementsToAnimate = elementsToAnimate.concat(c.update(animate)); - }); - if (elementsToAnimate.length > 0) { - runSMILAnimation(this.container, this.svg, elementsToAnimate); - setTimeout(function () { - components.forEach(function (c) { - return c.make(); - }); - _this3.updateNav(); - }, CHART_POST_ANIMATE_TIMEOUT); - } else { - components.forEach(function (c) { - return c.make(); - }); - this.updateNav(); - } - } - }, { - key: 'updateNav', - value: function updateNav() { - if (this.config.isNavigable) { - this.makeOverlay(); - this.bindUnits(); - } - } - }, { - key: 'renderLegend', - value: function renderLegend() {} - }, { - key: 'setupNavigation', - value: function setupNavigation() { - var _this4 = this; - - var init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - if (!this.config.isNavigable) return; - - if (init) { - this.bindOverlay(); - - this.keyActions = { - '13': this.onEnterKey.bind(this), - '37': this.onLeftArrow.bind(this), - '38': this.onUpArrow.bind(this), - '39': this.onRightArrow.bind(this), - '40': this.onDownArrow.bind(this) - }; - - document.addEventListener('keydown', function (e) { - if (isElementInViewport(_this4.container)) { - e = e || window.event; - if (_this4.keyActions[e.keyCode]) { - _this4.keyActions[e.keyCode](); - } - } - }); - } - } - }, { - key: 'makeOverlay', - value: function makeOverlay$$1() {} - }, { - key: 'updateOverlay', - value: function updateOverlay$$1() {} - }, { - key: 'bindOverlay', - value: function bindOverlay() {} - }, { - key: 'bindUnits', - value: function bindUnits() {} - }, { - key: 'onLeftArrow', - value: function onLeftArrow() {} - }, { - key: 'onRightArrow', - value: function onRightArrow() {} - }, { - key: 'onUpArrow', - value: function onUpArrow() {} - }, { - key: 'onDownArrow', - value: function onDownArrow() {} - }, { - key: 'onEnterKey', - value: function onEnterKey() {} - }, { - key: 'addDataPoint', - value: function addDataPoint() {} - }, { - key: 'removeDataPoint', - value: function removeDataPoint() {} - }, { - key: 'getDataPoint', - value: function getDataPoint() {} - }, { - key: 'setCurrentDataPoint', - value: function setCurrentDataPoint() {} - }, { - key: 'updateDataset', - value: function updateDataset() {} - }, { - key: 'export', - value: function _export() { - var chartSvg = prepareForExport(this.svg); - downloadFile(this.title || 'Chart', [chartSvg]); - } - }]); - return BaseChart; -}(); - -var AggregationChart = function (_BaseChart) { - inherits(AggregationChart, _BaseChart); - - function AggregationChart(parent, args) { - classCallCheck(this, AggregationChart); - return possibleConstructorReturn(this, (AggregationChart.__proto__ || Object.getPrototypeOf(AggregationChart)).call(this, parent, args)); - } - - createClass(AggregationChart, [{ - key: 'configure', - value: function configure(args) { - get(AggregationChart.prototype.__proto__ || Object.getPrototypeOf(AggregationChart.prototype), 'configure', this).call(this, args); - - this.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY; - this.config.maxSlices = args.maxSlices || 20; - this.config.maxLegendPoints = args.maxLegendPoints || 20; - } - }, { - key: 'calc', - value: function calc() { - var _this2 = this; - - var s = this.state; - var maxSlices = this.config.maxSlices; - s.sliceTotals = []; - - var allTotals = this.data.labels.map(function (label, i) { - var total = 0; - _this2.data.datasets.map(function (e) { - total += e.values[i]; - }); - return [total, label]; - }).filter(function (d) { - return d[0] >= 0; - }); // keep only positive results - - var totals = allTotals; - if (allTotals.length > maxSlices) { - // Prune and keep a grey area for rest as per maxSlices - allTotals.sort(function (a, b) { - return b[0] - a[0]; - }); - - totals = allTotals.slice(0, maxSlices - 1); - var remaining = allTotals.slice(maxSlices - 1); - - var sumOfRemaining = 0; - remaining.map(function (d) { - sumOfRemaining += d[0]; - }); - totals.push([sumOfRemaining, 'Rest']); - this.colors[maxSlices - 1] = 'grey'; - } - - s.labels = []; - totals.map(function (d) { - s.sliceTotals.push(round(d[0])); - s.labels.push(d[1]); - }); - - s.grandTotal = s.sliceTotals.reduce(function (a, b) { - return a + b; - }, 0); - - this.center = { - x: this.width / 2, - y: this.height / 2 - }; - } - }, { - key: 'renderLegend', - value: function renderLegend() { - var _this3 = this; - - var s = this.state; - this.legendArea.textContent = ''; - this.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints); - - var count = 0; - var y = 0; - this.legendTotals.map(function (d, i) { - var barWidth = 150; - var divisor = Math.floor((_this3.width - getExtraWidth(_this3.measures)) / barWidth); - if (_this3.legendTotals.length < divisor) { - barWidth = _this3.width / _this3.legendTotals.length; - } - if (count > divisor) { - count = 0; - y += 20; - } - var x = barWidth * count + 5; - var label = _this3.config.truncateLegends ? truncateString(s.labels[i], barWidth / 10) : s.labels[i]; - var formatted = _this3.config.formatTooltipY ? _this3.config.formatTooltipY(d) : d; - var dot = legendDot(x, y, 5, _this3.colors[i], label + ': ' + formatted, false); - _this3.legendArea.appendChild(dot); - count++; - }); - } - }]); - return AggregationChart; -}(BaseChart); - -// Playing around with dates - -var NO_OF_YEAR_MONTHS = 12; -var NO_OF_DAYS_IN_WEEK = 7; - -var NO_OF_MILLIS = 1000; -var SEC_IN_DAY = 86400; - -var MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; - - -var DAY_NAMES_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; - - -// https://stackoverflow.com/a/11252167/6495043 -function treatAsUtc(date) { - var result = new Date(date); - result.setMinutes(result.getMinutes() - result.getTimezoneOffset()); - return result; -} - -function getYyyyMmDd(date) { - var dd = date.getDate(); - var mm = date.getMonth() + 1; // getMonth() is zero-based - return [date.getFullYear(), (mm > 9 ? '' : '0') + mm, (dd > 9 ? '' : '0') + dd].join('-'); -} - -function clone(date) { - return new Date(date.getTime()); -} - - - - - -// export function getMonthsBetween(startDate, endDate) {} - -function getWeeksBetween(startDate, endDate) { - var weekStartDate = setDayToSunday(startDate); - return Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK); -} - -function getDaysBetween(startDate, endDate) { - var millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS; - return (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay; -} - -function areInSameMonth(startDate, endDate) { - return startDate.getMonth() === endDate.getMonth() && startDate.getFullYear() === endDate.getFullYear(); -} - -function getMonthName(i) { - var short = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - var monthName = MONTH_NAMES[i]; - return short ? monthName.slice(0, 3) : monthName; -} - -function getLastDateInMonth(month, year) { - return new Date(year, month + 1, 0); // 0: last day in previous month -} - -// mutates -function setDayToSunday(date) { - var newDate = clone(date); - var day = newDate.getDay(); - if (day !== 0) { - addDays(newDate, -1 * day); - } - return newDate; -} - -// mutates -function addDays(date, numberOfDays) { - date.setDate(date.getDate() + numberOfDays); -} - -var ChartComponent = function () { - function ChartComponent(_ref) { - var _ref$layerClass = _ref.layerClass, - layerClass = _ref$layerClass === undefined ? '' : _ref$layerClass, - _ref$layerTransform = _ref.layerTransform, - layerTransform = _ref$layerTransform === undefined ? '' : _ref$layerTransform, - constants = _ref.constants, - getData = _ref.getData, - makeElements = _ref.makeElements, - animateElements = _ref.animateElements; - classCallCheck(this, ChartComponent); - - this.layerTransform = layerTransform; - this.constants = constants; - - this.makeElements = makeElements; - this.getData = getData; - - this.animateElements = animateElements; - - this.store = []; - this.labels = []; - - this.layerClass = layerClass; - this.layerClass = typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass; - - this.refresh(); - } - - createClass(ChartComponent, [{ - key: 'refresh', - value: function refresh(data) { - this.data = data || this.getData(); - } - }, { - key: 'setup', - value: function setup(parent) { - this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent); - } - }, { - key: 'make', - value: function make() { - this.render(this.data); - this.oldData = this.data; - } - }, { - key: 'render', - value: function render(data) { - var _this = this; - - this.store = this.makeElements(data); - - this.layer.textContent = ''; - this.store.forEach(function (element) { - element.length ? element.forEach(function (el) { - _this.layer.appendChild(el); - }) : _this.layer.appendChild(element); - }); - this.labels.forEach(function (element) { - _this.layer.appendChild(element); - }); - } - }, { - key: 'update', - value: function update() { - var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - this.refresh(); - var animateElements = []; - if (animate) { - animateElements = this.animateElements(this.data) || []; - } - return animateElements; - } - }]); - return ChartComponent; -}(); - -var componentConfigs = { - donutSlices: { - layerClass: 'donut-slices', - makeElements: function makeElements(data) { - return data.sliceStrings.map(function (s, i) { - var slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth); - slice.style.transition = 'transform .3s;'; - return slice; - }); - }, - animateElements: function animateElements(newData) { - return this.store.map(function (slice, i) { - return animatePathStr(slice, newData.sliceStrings[i]); - }); - } - }, - pieSlices: { - layerClass: 'pie-slices', - makeElements: function makeElements(data) { - return data.sliceStrings.map(function (s, i) { - var slice = makePath(s, 'pie-path', 'none', data.colors[i]); - slice.style.transition = 'transform .3s;'; - return slice; - }); - }, - animateElements: function animateElements(newData) { - return this.store.map(function (slice, i) { - return animatePathStr(slice, newData.sliceStrings[i]); - }); - } - }, - percentageBars: { - layerClass: 'percentage-bars', - makeElements: function makeElements(data) { - var _this2 = this; - - return data.xPositions.map(function (x, i) { - var y = 0; - var bar = percentageBar(x, y, data.widths[i], _this2.constants.barHeight, _this2.constants.barDepth, data.colors[i]); - return bar; - }); - }, - animateElements: function animateElements(newData) { - if (newData) return []; - } - }, - yAxis: { - layerClass: 'y axis', - makeElements: function makeElements(data) { - var _this3 = this; - - var elements = []; - // will loop through each yaxis dataset if it exists - if (data.length) { - data.forEach(function (item, i) { - item.positions.map(function (position, i) { - elements.push(yLine(position, item.labels[i], _this3.constants.width, { - mode: _this3.constants.mode, - pos: item.pos || _this3.constants.pos, - shortenNumbers: _this3.constants.shortenNumbers - })); - }); - // we need to make yAxis titles if they are defined - if (item.title) { - elements.push(generateAxisLabel({ - title: item.title, - position: item.pos, - height: item.zeroLine, - width: _this3.constants.width - })); - } - }); - - return elements; - } - - data.positions.forEach(function (position, i) { - elements.push(yLine(position, data.labels[i], _this3.constants.width, { - mode: _this3.constants.mode, - pos: data.pos || _this3.constants.pos, - shortenNumbers: _this3.constants.shortenNumbers - })); - }); - - if (data.title) { - elements.push(generateAxisLabel({ - title: data.title, - position: data.pos, - height: data.zeroLine, - width: this.constants.width - })); - } - - return elements; - }, - animateElements: function animateElements(newData) { - var _this4 = this; - - var animateMultipleElements = function animateMultipleElements(oldData, newData) { - var newPos = newData.positions; - var newLabels = newData.labels; - var oldPos = oldData.positions; - var oldLabels = oldData.labels; - - var _equilizeNoOfElements = equilizeNoOfElements(oldPos, newPos); - - var _equilizeNoOfElements2 = slicedToArray(_equilizeNoOfElements, 2); - - oldPos = _equilizeNoOfElements2[0]; - newPos = _equilizeNoOfElements2[1]; - - var _equilizeNoOfElements3 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements4 = slicedToArray(_equilizeNoOfElements3, 2); - - oldLabels = _equilizeNoOfElements4[0]; - newLabels = _equilizeNoOfElements4[1]; - - - _this4.render({ - positions: oldPos, - labels: newLabels - }); - - return _this4.store.map(function (line, i) { - return translateHoriLine(line, newPos[i], oldPos[i]); - }); - }; - - // we will need to animate both axis if we have more than one. - // so check if the oldData is an array of values. - if (this.oldData instanceof Array) { - return this.oldData.forEach(function (old, i) { - animateMultipleElements(old, newData[i]); - }); - } - - var newPos = newData.positions; - var newLabels = newData.labels; - var oldPos = this.oldData.positions; - var oldLabels = this.oldData.labels; - - var _equilizeNoOfElements5 = equilizeNoOfElements(oldPos, newPos); - - var _equilizeNoOfElements6 = slicedToArray(_equilizeNoOfElements5, 2); - - oldPos = _equilizeNoOfElements6[0]; - newPos = _equilizeNoOfElements6[1]; - - var _equilizeNoOfElements7 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements8 = slicedToArray(_equilizeNoOfElements7, 2); - - oldLabels = _equilizeNoOfElements8[0]; - newLabels = _equilizeNoOfElements8[1]; - - - this.render({ - positions: oldPos, - labels: newLabels - }); - - return this.store.map(function (line, i) { - return translateHoriLine(line, newPos[i], oldPos[i]); - }); - } - }, - - xAxis: { - layerClass: 'x axis', - makeElements: function makeElements(data) { - var _this5 = this; - - return data.positions.map(function (position, i) { - return xLine(position, data.calcLabels[i], _this5.constants.height, { mode: _this5.constants.mode, pos: _this5.constants.pos }); - }); - }, - animateElements: function animateElements(newData) { - var newPos = newData.positions; - var newLabels = newData.calcLabels; - var oldPos = this.oldData.positions; - var oldLabels = this.oldData.calcLabels; - - var _equilizeNoOfElements9 = equilizeNoOfElements(oldPos, newPos); - - var _equilizeNoOfElements10 = slicedToArray(_equilizeNoOfElements9, 2); - - oldPos = _equilizeNoOfElements10[0]; - newPos = _equilizeNoOfElements10[1]; - - var _equilizeNoOfElements11 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements12 = slicedToArray(_equilizeNoOfElements11, 2); - - oldLabels = _equilizeNoOfElements12[0]; - newLabels = _equilizeNoOfElements12[1]; - - - this.render({ - positions: oldPos, - calcLabels: newLabels - }); - - return this.store.map(function (line, i) { - return translateVertLine(line, newPos[i], oldPos[i]); - }); - } - }, - - yMarkers: { - layerClass: 'y-markers', - makeElements: function makeElements(data) { - var _this6 = this; - - return data.map(function (m) { - return yMarker(m.position, m.label, _this6.constants.width, { - labelPos: m.options.labelPos, - mode: 'span', - lineType: 'dashed' - }); - }); - }, - animateElements: function animateElements(newData) { - var _equilizeNoOfElements13 = equilizeNoOfElements(this.oldData, newData); - - var _equilizeNoOfElements14 = slicedToArray(_equilizeNoOfElements13, 2); - - this.oldData = _equilizeNoOfElements14[0]; - newData = _equilizeNoOfElements14[1]; - - - var newPos = newData.map(function (d) { - return d.position; - }); - var newLabels = newData.map(function (d) { - return d.label; - }); - var newOptions = newData.map(function (d) { - return d.options; - }); - - var oldPos = this.oldData.map(function (d) { - return d.position; - }); - - this.render(oldPos.map(function (pos, i) { - return { - position: oldPos[i], - label: newLabels[i], - options: newOptions[i] - }; - })); - - return this.store.map(function (line, i) { - return translateHoriLine(line, newPos[i], oldPos[i]); - }); - } - }, - - yRegions: { - layerClass: 'y-regions', - makeElements: function makeElements(data) { - var _this7 = this; - - return data.map(function (r) { - return yRegion(r.startPos, r.endPos, _this7.constants.width, r.label, { labelPos: r.options.labelPos }); - }); - }, - animateElements: function animateElements(newData) { - var _equilizeNoOfElements15 = equilizeNoOfElements(this.oldData, newData); - - var _equilizeNoOfElements16 = slicedToArray(_equilizeNoOfElements15, 2); - - this.oldData = _equilizeNoOfElements16[0]; - newData = _equilizeNoOfElements16[1]; - - - var newPos = newData.map(function (d) { - return d.endPos; - }); - var newLabels = newData.map(function (d) { - return d.label; - }); - var newStarts = newData.map(function (d) { - return d.startPos; - }); - var newOptions = newData.map(function (d) { - return d.options; - }); - - var oldPos = this.oldData.map(function (d) { - return d.endPos; - }); - var oldStarts = this.oldData.map(function (d) { - return d.startPos; - }); - - this.render(oldPos.map(function (pos, i) { - return { - startPos: oldStarts[i], - endPos: oldPos[i], - label: newLabels[i], - options: newOptions[i] - }; - })); - - var animateElements = []; - - this.store.map(function (rectGroup, i) { - animateElements = animateElements.concat(animateRegion(rectGroup, newStarts[i], newPos[i], oldPos[i])); - }); - - return animateElements; - } - }, - - heatDomain: { - layerClass: function layerClass() { - return 'heat-domain domain-' + this.constants.index; - }, - makeElements: function makeElements(data) { - var _this8 = this; - - var _constants = this.constants, - index = _constants.index, - colWidth = _constants.colWidth, - rowHeight = _constants.rowHeight, - squareSize = _constants.squareSize, - radius = _constants.radius, - xTranslate = _constants.xTranslate; - - var monthNameHeight = -12; - var x = xTranslate, - y = 0; - - this.serializedSubDomains = []; - - data.cols.map(function (week, weekNo) { - if (weekNo === 1) { - _this8.labels.push(makeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(), { - fontSize: 9 - })); - } - week.map(function (day, i) { - if (day.fill) { - var _data = { - 'data-date': day.yyyyMmDd, - 'data-value': day.dataValue, - 'data-day': i - }; - var square = heatSquare('day', x, y, squareSize, radius, day.fill, _data); - _this8.serializedSubDomains.push(square); - } - y += rowHeight; - }); - y = 0; - x += colWidth; - }); - - return this.serializedSubDomains; - }, - animateElements: function animateElements(newData) { - if (newData) return []; - } - }, - - barGraph: { - layerClass: function layerClass() { - return 'dataset-units dataset-bars dataset-' + this.constants.index; - }, - makeElements: function makeElements(data) { - var c = this.constants; - this.unitType = 'bar'; - this.units = data.yPositions.map(function (y, j) { - return datasetBar(data.xPositions[j], y, data.barWidth, c.color, data.labels[j], j, data.offsets[j], { - zeroLine: data.zeroLine, - barsWidth: data.barsWidth, - minHeight: c.minHeight - }); - }); - return this.units; - }, - animateElements: function animateElements(newData) { - var newXPos = newData.xPositions; - var newYPos = newData.yPositions; - var newOffsets = newData.offsets; - var newLabels = newData.labels; - - var oldXPos = this.oldData.xPositions; - var oldYPos = this.oldData.yPositions; - var oldOffsets = this.oldData.offsets; - var oldLabels = this.oldData.labels; - - var _equilizeNoOfElements17 = equilizeNoOfElements(oldXPos, newXPos); - - var _equilizeNoOfElements18 = slicedToArray(_equilizeNoOfElements17, 2); - - oldXPos = _equilizeNoOfElements18[0]; - newXPos = _equilizeNoOfElements18[1]; - - var _equilizeNoOfElements19 = equilizeNoOfElements(oldYPos, newYPos); - - var _equilizeNoOfElements20 = slicedToArray(_equilizeNoOfElements19, 2); - - oldYPos = _equilizeNoOfElements20[0]; - newYPos = _equilizeNoOfElements20[1]; - - var _equilizeNoOfElements21 = equilizeNoOfElements(oldOffsets, newOffsets); - - var _equilizeNoOfElements22 = slicedToArray(_equilizeNoOfElements21, 2); - - oldOffsets = _equilizeNoOfElements22[0]; - newOffsets = _equilizeNoOfElements22[1]; - - var _equilizeNoOfElements23 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements24 = slicedToArray(_equilizeNoOfElements23, 2); - - oldLabels = _equilizeNoOfElements24[0]; - newLabels = _equilizeNoOfElements24[1]; - - - this.render({ - xPositions: oldXPos, - yPositions: oldYPos, - offsets: oldOffsets, - labels: newLabels, - - zeroLine: this.oldData.zeroLine, - barsWidth: this.oldData.barsWidth, - barWidth: this.oldData.barWidth - }); - - var animateElements = []; - - this.store.map(function (bar, i) { - animateElements = animateElements.concat(animateBar(bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], { zeroLine: newData.zeroLine })); - }); - - return animateElements; - } - }, - - lineGraph: { - layerClass: function layerClass() { - return 'dataset-units dataset-line dataset-' + this.constants.index; - }, - makeElements: function makeElements(data) { - var c = this.constants; - this.unitType = 'dot'; - this.paths = {}; - if (!c.hideLine) { - this.paths = getPaths(data.xPositions, data.yPositions, c.color, { - heatline: c.heatline, - regionFill: c.regionFill, - spline: c.spline - }, { - svgDefs: c.svgDefs, - zeroLine: data.zeroLine - }); - } - - this.units = []; - - if (!c.hideDots) { - this.units = data.yPositions.map(function (y, j) { - return datasetDot(data.xPositions[j], y, data.radius, c.color, c.valuesOverPoints ? data.values[j] : '', j); - }); - } - - return Object.values(this.paths).concat(this.units); - }, - animateElements: function animateElements(newData) { - var newXPos = newData.xPositions; - var newYPos = newData.yPositions; - var newValues = newData.values; - - var oldXPos = this.oldData.xPositions; - var oldYPos = this.oldData.yPositions; - var oldValues = this.oldData.values; - - var _equilizeNoOfElements25 = equilizeNoOfElements(oldXPos, newXPos); - - var _equilizeNoOfElements26 = slicedToArray(_equilizeNoOfElements25, 2); - - oldXPos = _equilizeNoOfElements26[0]; - newXPos = _equilizeNoOfElements26[1]; - - var _equilizeNoOfElements27 = equilizeNoOfElements(oldYPos, newYPos); - - var _equilizeNoOfElements28 = slicedToArray(_equilizeNoOfElements27, 2); - - oldYPos = _equilizeNoOfElements28[0]; - newYPos = _equilizeNoOfElements28[1]; - - var _equilizeNoOfElements29 = equilizeNoOfElements(oldValues, newValues); - - var _equilizeNoOfElements30 = slicedToArray(_equilizeNoOfElements29, 2); - - oldValues = _equilizeNoOfElements30[0]; - newValues = _equilizeNoOfElements30[1]; - - - this.render({ - xPositions: oldXPos, - yPositions: oldYPos, - values: newValues, - - zeroLine: this.oldData.zeroLine, - radius: this.oldData.radius - }); - - var animateElements = []; - - if (Object.keys(this.paths).length) { - animateElements = animateElements.concat(animatePath(this.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline)); - } - - if (this.units.length) { - this.units.map(function (dot, i) { - animateElements = animateElements.concat(animateDot(dot, newXPos[i], newYPos[i])); - }); - } - - return animateElements; - } - } -}; - -function getComponent(name, constants, getData) { - var keys = Object.keys(componentConfigs).filter(function (k) { - return name.includes(k); - }); - var config = componentConfigs[keys[0]]; - Object.assign(config, { - constants: constants, - getData: getData - }); - return new ChartComponent(config); -} - -var PercentageChart = function (_AggregationChart) { - inherits(PercentageChart, _AggregationChart); - - function PercentageChart(parent, args) { - classCallCheck(this, PercentageChart); - - var _this = possibleConstructorReturn(this, (PercentageChart.__proto__ || Object.getPrototypeOf(PercentageChart)).call(this, parent, args)); - - _this.type = 'percentage'; - _this.setup(); - return _this; - } - - createClass(PercentageChart, [{ - key: 'setMeasures', - value: function setMeasures(options) { - var m = this.measures; - this.barOptions = options.barOptions || {}; - - var b = this.barOptions; - b.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT; - b.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH; - - m.paddings.right = 30; - m.legendHeight = 60; - m.baseHeight = (b.height + b.depth * 0.5) * 8; - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var s = this.state; - - var componentConfigs = [['percentageBars', { - barHeight: this.barOptions.height, - barDepth: this.barOptions.depth - }, function () { - return { - xPositions: s.xPositions, - widths: s.widths, - colors: this.colors - }; - }.bind(this)]]; - - this.components = new Map(componentConfigs.map(function (args) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: 'calc', - value: function calc() { - var _this2 = this; - - get(PercentageChart.prototype.__proto__ || Object.getPrototypeOf(PercentageChart.prototype), 'calc', this).call(this); - var s = this.state; - - s.xPositions = []; - s.widths = []; - - var xPos = 0; - s.sliceTotals.map(function (value) { - var width = _this2.width * value / s.grandTotal; - s.widths.push(width); - s.xPositions.push(xPos); - xPos += width; - }); - } - }, { - key: 'makeDataByIndex', - value: function makeDataByIndex() {} - }, { - key: 'bindTooltip', - value: function bindTooltip() { - var _this3 = this; - - var s = this.state; - this.container.addEventListener('mousemove', function (e) { - var bars = _this3.components.get('percentageBars').store; - var bar = e.target; - if (bars.includes(bar)) { - - var i = bars.indexOf(bar); - var gOff = getOffset(_this3.container), - pOff = getOffset(bar); - - var x = pOff.left - gOff.left + parseInt(bar.getAttribute('width')) / 2; - var y = pOff.top - gOff.top; - var title = (_this3.formattedLabels && _this3.formattedLabels.length > 0 ? _this3.formattedLabels[i] : _this3.state.labels[i]) + ': '; - var fraction = s.sliceTotals[i] / s.grandTotal; - - _this3.tip.setValues(x, y, { name: title, value: (fraction * 100).toFixed(1) + "%" }); - _this3.tip.showTip(); - } - }); - } - }]); - return PercentageChart; -}(AggregationChart); - -var PieChart = function (_AggregationChart) { - inherits(PieChart, _AggregationChart); - - function PieChart(parent, args) { - classCallCheck(this, PieChart); - - var _this = possibleConstructorReturn(this, (PieChart.__proto__ || Object.getPrototypeOf(PieChart)).call(this, parent, args)); - - _this.type = 'pie'; - _this.initTimeout = 0; - _this.init = 1; - - _this.setup(); - return _this; - } - - createClass(PieChart, [{ - key: 'configure', - value: function configure(args) { - get(PieChart.prototype.__proto__ || Object.getPrototypeOf(PieChart.prototype), 'configure', this).call(this, args); - this.mouseMove = this.mouseMove.bind(this); - this.mouseLeave = this.mouseLeave.bind(this); - - this.hoverRadio = args.hoverRadio || 0.1; - this.config.startAngle = args.startAngle || 0; - - this.clockWise = args.clockWise || false; - } - }, { - key: 'calc', - value: function calc() { - var _this2 = this; - - get(PieChart.prototype.__proto__ || Object.getPrototypeOf(PieChart.prototype), 'calc', this).call(this); - var s = this.state; - this.radius = this.height > this.width ? this.center.x : this.center.y; - - var radius = this.radius, - clockWise = this.clockWise; - - - var prevSlicesProperties = s.slicesProperties || []; - s.sliceStrings = []; - s.slicesProperties = []; - var curAngle = 180 - this.config.startAngle; - s.sliceTotals.map(function (total, i) { - var startAngle = curAngle; - var originDiffAngle = total / s.grandTotal * FULL_ANGLE; - var largeArc = originDiffAngle > 180 ? 1 : 0; - var diffAngle = clockWise ? -originDiffAngle : originDiffAngle; - var endAngle = curAngle = curAngle + diffAngle; - var startPosition = getPositionByAngle(startAngle, radius); - var endPosition = getPositionByAngle(endAngle, radius); - - var prevProperty = _this2.init && prevSlicesProperties[i]; - - var curStart = void 0, - curEnd = void 0; - if (_this2.init) { - curStart = prevProperty ? prevProperty.startPosition : startPosition; - curEnd = prevProperty ? prevProperty.endPosition : startPosition; - } else { - curStart = startPosition; - curEnd = endPosition; - } - var curPath = originDiffAngle === 360 ? makeCircleStr(curStart, curEnd, _this2.center, _this2.radius, clockWise, largeArc) : makeArcPathStr(curStart, curEnd, _this2.center, _this2.radius, clockWise, largeArc); - - s.sliceStrings.push(curPath); - s.slicesProperties.push({ - startPosition: startPosition, - endPosition: endPosition, - value: total, - total: s.grandTotal, - startAngle: startAngle, - endAngle: endAngle, - angle: diffAngle - }); - }); - this.init = 0; - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var s = this.state; - - var componentConfigs = [['pieSlices', {}, function () { - return { - sliceStrings: s.sliceStrings, - colors: this.colors - }; - }.bind(this)]]; - - this.components = new Map(componentConfigs.map(function (args) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: 'calTranslateByAngle', - value: function calTranslateByAngle(property) { - var radius = this.radius, - hoverRadio = this.hoverRadio; - - var position = getPositionByAngle(property.startAngle + property.angle / 2, radius); - return 'translate3d(' + position.x * hoverRadio + 'px,' + position.y * hoverRadio + 'px,0)'; - } - }, { - key: 'hoverSlice', - value: function hoverSlice(path, i, flag, e) { - if (!path) return; - var color = this.colors[i]; - if (flag) { - transform(path, this.calTranslateByAngle(this.state.slicesProperties[i])); - path.style.fill = lightenDarkenColor(color, 50); - var g_off = getOffset(this.svg); - var x = e.pageX - g_off.left + 10; - var y = e.pageY - g_off.top - 10; - var title = (this.formatted_labels && this.formatted_labels.length > 0 ? this.formatted_labels[i] : this.state.labels[i]) + ': '; - var percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1); - this.tip.setValues(x, y, { name: title, value: percent + "%" }); - this.tip.showTip(); - } else { - transform(path, 'translate3d(0,0,0)'); - this.tip.hideTip(); - path.style.fill = color; - } - } - }, { - key: 'bindTooltip', - value: function bindTooltip() { - this.container.addEventListener('mousemove', this.mouseMove); - this.container.addEventListener('mouseleave', this.mouseLeave); - } - }, { - key: 'mouseMove', - value: function mouseMove(e) { - var target = e.target; - var slices = this.components.get('pieSlices').store; - var prevIndex = this.curActiveSliceIndex; - var prevAcitve = this.curActiveSlice; - if (slices.includes(target)) { - var i = slices.indexOf(target); - this.hoverSlice(prevAcitve, prevIndex, false); - this.curActiveSlice = target; - this.curActiveSliceIndex = i; - this.hoverSlice(target, i, true, e); - } else { - this.mouseLeave(); - } - } - }, { - key: 'mouseLeave', - value: function mouseLeave() { - this.hoverSlice(this.curActiveSlice, this.curActiveSliceIndex, false); - } - }]); - return PieChart; -}(AggregationChart); - -function normalize(x) { - // Calculates mantissa and exponent of a number - // Returns normalized number and exponent - // https://stackoverflow.com/q/9383593/6495043 - - if (x === 0) { - return [0, 0]; - } - if (isNaN(x)) { - return { mantissa: -6755399441055744, exponent: 972 }; - } - var sig = x > 0 ? 1 : -1; - if (!isFinite(x)) { - return { mantissa: sig * 4503599627370496, exponent: 972 }; - } - - x = Math.abs(x); - var exp = Math.floor(Math.log10(x)); - var man = x / Math.pow(10, exp); - - return [sig * man, exp]; -} - -function getChartRangeIntervals(max) { - var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var upperBound = Math.ceil(max); - var lowerBound = Math.floor(min); - var range = upperBound - lowerBound; - - var noOfParts = range; - var partSize = 1; - - // To avoid too many partitions - if (range > 5) { - if (range % 2 !== 0) { - upperBound++; - // Recalc range - range = upperBound - lowerBound; - } - noOfParts = range / 2; - partSize = 2; - } - - // Special case: 1 and 2 - if (range <= 2) { - noOfParts = 4; - partSize = range / noOfParts; - } - - // Special case: 0 - if (range === 0) { - noOfParts = 5; - partSize = 1; - } - - var intervals = []; - for (var i = 0; i <= noOfParts; i++) { - intervals.push(lowerBound + partSize * i); - } - return intervals; -} - -function getChartIntervals(maxValue) { - var minValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var _normalize = normalize(maxValue), - _normalize2 = slicedToArray(_normalize, 2), - normalMaxValue = _normalize2[0], - exponent = _normalize2[1]; - - var normalMinValue = minValue ? minValue / Math.pow(10, exponent) : 0; - - // Allow only 7 significant digits - normalMaxValue = normalMaxValue.toFixed(6); - - var intervals = getChartRangeIntervals(normalMaxValue, normalMinValue); - intervals = intervals.map(function (value) { - // For negative exponents we want to divide by 10^-exponent to avoid - // floating point arithmetic bugs. For instance, in javascript - // 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6 - if (exponent < 0) { - return value / Math.pow(10, -exponent); - } - return value * Math.pow(10, exponent); - }); - return intervals; -} - -function calcChartIntervals(values) { - var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - //*** Where the magic happens *** - - // Calculates best-fit y intervals from given values - // and returns the interval array - - var maxValue = Math.max.apply(Math, toConsumableArray(values)); - var minValue = Math.min.apply(Math, toConsumableArray(values)); - - // Exponent to be used for pretty print - var exponent = 0, - intervals = []; // eslint-disable-line no-unused-vars - - function getPositiveFirstIntervals(maxValue, absMinValue) { - var intervals = getChartIntervals(maxValue); - - var intervalSize = intervals[1] - intervals[0]; - - // Then unshift the negative values - var value = 0; - for (var i = 1; value < absMinValue; i++) { - value += intervalSize; - intervals.unshift(-1 * value); - } - return intervals; - } - - // CASE I: Both non-negative - - if (maxValue >= 0 && minValue >= 0) { - exponent = normalize(maxValue)[1]; - if (!withMinimum) { - intervals = getChartIntervals(maxValue); - } else { - intervals = getChartIntervals(maxValue, minValue); - } - } - - // CASE II: Only minValue negative - - else if (maxValue > 0 && minValue < 0) { - // `withMinimum` irrelevant in this case, - // We'll be handling both sides of zero separately - // (both starting from zero) - // Because ceil() and floor() behave differently - // in those two regions - - var absMinValue = Math.abs(minValue); - - if (maxValue >= absMinValue) { - exponent = normalize(maxValue)[1]; - intervals = getPositiveFirstIntervals(maxValue, absMinValue); - } else { - // Mirror: maxValue => absMinValue, then change sign - exponent = normalize(absMinValue)[1]; - var posIntervals = getPositiveFirstIntervals(absMinValue, maxValue); - intervals = posIntervals.reverse().map(function (d) { - return d * -1; - }); - } - } - - // CASE III: Both non-positive - - else if (maxValue <= 0 && minValue <= 0) { - // Mirrored Case I: - // Work with positives, then reverse the sign and array - - var pseudoMaxValue = Math.abs(minValue); - var pseudoMinValue = Math.abs(maxValue); - - exponent = normalize(pseudoMaxValue)[1]; - if (!withMinimum) { - intervals = getChartIntervals(pseudoMaxValue); - } else { - intervals = getChartIntervals(pseudoMaxValue, pseudoMinValue); - } - - intervals = intervals.reverse().map(function (d) { - return d * -1; - }); - } - - return intervals; -} - -function getZeroIndex(yPts) { - var zeroIndex = void 0; - var interval = getIntervalSize(yPts); - if (yPts.indexOf(0) >= 0) { - // the range has a given zero - // zero-line on the chart - zeroIndex = yPts.indexOf(0); - } else if (yPts[0] > 0) { - // Minimum value is positive - // zero-line is off the chart: below - var min = yPts[0]; - zeroIndex = -1 * min / interval; - } else { - // Maximum value is negative - // zero-line is off the chart: above - var max = yPts[yPts.length - 1]; - zeroIndex = -1 * max / interval + (yPts.length - 1); - } - return zeroIndex; -} - - - -function getIntervalSize(orderedArray) { - return orderedArray[1] - orderedArray[0]; -} - -function getValueRange(orderedArray) { - return orderedArray[orderedArray.length - 1] - orderedArray[0]; -} - -function scale(val, yAxis) { - return floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier); -} - - - - - -function getClosestInArray(goal, arr) { - var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var closest = arr.reduce(function (prev, curr) { - return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev; - }, []); - - return index ? arr.indexOf(closest) : closest; -} - -function calcDistribution(values, distributionSize) { - // Assume non-negative values, - // implying distribution minimum at zero - - var dataMaxValue = Math.max.apply(Math, toConsumableArray(values)); - - var distributionStep = 1 / (distributionSize - 1); - var distribution = []; - - for (var i = 0; i < distributionSize; i++) { - var checkpoint = dataMaxValue * (distributionStep * i); - distribution.push(checkpoint); - } - - return distribution; -} - -function getMaxCheckpoint(value, distribution) { - return distribution.filter(function (d) { - return d < value; - }).length; -} - -var COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE; -var ROW_HEIGHT = COL_WIDTH; -// const DAY_INCR = 1; - -var Heatmap = function (_BaseChart) { - inherits(Heatmap, _BaseChart); - - function Heatmap(parent, options) { - classCallCheck(this, Heatmap); - - var _this = possibleConstructorReturn(this, (Heatmap.__proto__ || Object.getPrototypeOf(Heatmap)).call(this, parent, options)); - - _this.type = 'heatmap'; - - _this.countLabel = options.countLabel || ''; - - var validStarts = ['Sunday', 'Monday']; - var startSubDomain = validStarts.includes(options.startSubDomain) ? options.startSubDomain : 'Sunday'; - _this.startSubDomainIndex = validStarts.indexOf(startSubDomain); - - _this.setup(); - return _this; - } - - createClass(Heatmap, [{ - key: 'setMeasures', - value: function setMeasures(options) { - var m = this.measures; - this.discreteDomains = options.discreteDomains === 0 ? 0 : 1; - - m.paddings.top = ROW_HEIGHT * 3; - m.paddings.bottom = 0; - m.legendHeight = ROW_HEIGHT * 2; - m.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK + getExtraHeight(m); - - var d = this.data; - var spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0; - this.independentWidth = (getWeeksBetween(d.start, d.end) + spacing) * COL_WIDTH + getExtraWidth(m); - } - }, { - key: 'updateWidth', - value: function updateWidth() { - var spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0; - var noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52; - this.baseWidth = (noOfWeeks + spacing) * COL_WIDTH + getExtraWidth(this.measures); - } - }, { - key: 'prepareData', - value: function prepareData() { - var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; - - if (data.start && data.end && data.start > data.end) { - throw new Error('Start date cannot be greater than end date.'); - } - - if (!data.start) { - data.start = new Date(); - data.start.setFullYear(data.start.getFullYear() - 1); - } - if (!data.end) { - data.end = new Date(); - } - data.dataPoints = data.dataPoints || {}; - - if (parseInt(Object.keys(data.dataPoints)[0]) > 100000) { - var points = {}; - Object.keys(data.dataPoints).forEach(function (timestampSec$$1) { - var date = new Date(timestampSec$$1 * NO_OF_MILLIS); - points[getYyyyMmDd(date)] = data.dataPoints[timestampSec$$1]; - }); - data.dataPoints = points; - } - - return data; - } - }, { - key: 'calc', - value: function calc() { - var s = this.state; - - s.start = clone(this.data.start); - s.end = clone(this.data.end); - - s.firstWeekStart = clone(s.start); - s.noOfWeeks = getWeeksBetween(s.start, s.end); - s.distribution = calcDistribution(Object.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE); - - s.domainConfigs = this.getDomains(); - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var _this2 = this; - - var s = this.state; - var lessCol = this.discreteDomains ? 0 : 1; - - var componentConfigs = s.domainConfigs.map(function (config, i) { - return ['heatDomain', { - index: config.index, - colWidth: COL_WIDTH, - rowHeight: ROW_HEIGHT, - squareSize: HEATMAP_SQUARE_SIZE, - radius: _this2.rawChartArgs.radius || 0, - xTranslate: s.domainConfigs.filter(function (config, j) { - return j < i; - }).map(function (config) { - return config.cols.length - lessCol; - }).reduce(function (a, b) { - return a + b; - }, 0) * COL_WIDTH - }, function () { - return s.domainConfigs[i]; - }.bind(_this2)]; - }); - - this.components = new Map(componentConfigs.map(function (args, i) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - return [args[0] + '-' + i, component]; - })); - - var y = 0; - DAY_NAMES_SHORT.forEach(function (dayName, i) { - if ([1, 3, 5].includes(i)) { - var dayText = makeText('subdomain-name', -COL_WIDTH / 2, y, dayName, { - fontSize: HEATMAP_SQUARE_SIZE, - dy: 8, - textAnchor: 'end' - }); - _this2.drawArea.appendChild(dayText); - } - y += ROW_HEIGHT; - }); - } - }, { - key: 'update', - value: function update(data) { - if (!data) { - console.error('No data to update.'); - } - - this.data = this.prepareData(data); - this.draw(); - this.bindTooltip(); - } - }, { - key: 'bindTooltip', - value: function bindTooltip() { - var _this3 = this; - - this.container.addEventListener('mousemove', function (e) { - _this3.components.forEach(function (comp) { - var daySquares = comp.store; - var daySquare = e.target; - if (daySquares.includes(daySquare)) { - - var count = daySquare.getAttribute('data-value'); - var dateParts = daySquare.getAttribute('data-date').split('-'); - - var month = getMonthName(parseInt(dateParts[1]) - 1, true); - - var gOff = _this3.container.getBoundingClientRect(), - pOff = daySquare.getBoundingClientRect(); - - var width = parseInt(e.target.getAttribute('width')); - var x = pOff.left - gOff.left + width / 2; - var y = pOff.top - gOff.top; - var value = count + ' ' + _this3.countLabel; - var name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2]; - - _this3.tip.setValues(x, y, { name: name, value: value, valueFirst: 1 }, []); - _this3.tip.showTip(); - } - }); - }); - } - }, { - key: 'renderLegend', - value: function renderLegend() { - var _this4 = this; - - this.legendArea.textContent = ''; - var x = 0; - var y = ROW_HEIGHT; - var radius = this.rawChartArgs.radius || 0; - - var lessText = makeText('subdomain-name', x, y, 'Less', { - fontSize: HEATMAP_SQUARE_SIZE + 1, - dy: 9 - }); - x = COL_WIDTH * 2 + COL_WIDTH / 2; - this.legendArea.appendChild(lessText); - - this.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map(function (color, i) { - var square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i, y, HEATMAP_SQUARE_SIZE, radius, color); - _this4.legendArea.appendChild(square); - }); - - var moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH / 4; - var moreText = makeText('subdomain-name', moreTextX, y, 'More', { - fontSize: HEATMAP_SQUARE_SIZE + 1, - dy: 9 - }); - this.legendArea.appendChild(moreText); - } - }, { - key: 'getDomains', - value: function getDomains() { - var s = this.state; - var _ref = [s.start.getMonth(), s.start.getFullYear()], - startMonth = _ref[0], - startYear = _ref[1]; - var _ref2 = [s.end.getMonth(), s.end.getFullYear()], - endMonth = _ref2[0], - endYear = _ref2[1]; - - - var noOfMonths = endMonth - startMonth + 1 + (endYear - startYear) * 12; - - var domainConfigs = []; - - var startOfMonth = clone(s.start); - for (var i = 0; i < noOfMonths; i++) { - var endDate = s.end; - if (!areInSameMonth(startOfMonth, s.end)) { - var _ref3 = [startOfMonth.getMonth(), startOfMonth.getFullYear()], - month = _ref3[0], - year = _ref3[1]; - - endDate = getLastDateInMonth(month, year); - } - domainConfigs.push(this.getDomainConfig(startOfMonth, endDate)); - - addDays(endDate, 1); - startOfMonth = endDate; - } - - return domainConfigs; - } - }, { - key: 'getDomainConfig', - value: function getDomainConfig(startDate) { - var endDate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var _ref4 = [startDate.getMonth(), startDate.getFullYear()], - month = _ref4[0], - year = _ref4[1]; - - var startOfWeek = setDayToSunday(startDate); // TODO: Monday as well - endDate = clone(endDate) || getLastDateInMonth(month, year); - - var domainConfig = { - index: month, - cols: [] - }; - - addDays(endDate, 1); - var noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate); - - var cols = [], - col = void 0; - for (var i = 0; i < noOfMonthWeeks; i++) { - col = this.getCol(startOfWeek, month); - cols.push(col); - - startOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd); - addDays(startOfWeek, 1); - } - - if (col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) { - addDays(startOfWeek, 1); - cols.push(this.getCol(startOfWeek, month, true)); - } - - domainConfig.cols = cols; - - return domainConfig; - } - }, { - key: 'getCol', - value: function getCol(startDate, month) { - var empty = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var s = this.state; - - // startDate is the start of week - var currentDate = clone(startDate); - var col = []; - - for (var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) { - var config = {}; - - // Non-generic adjustment for entire heatmap, needs state - var currentDateWithinData = currentDate >= s.start && currentDate <= s.end; - - if (empty || currentDate.getMonth() !== month || !currentDateWithinData) { - config.yyyyMmDd = getYyyyMmDd(currentDate); - } else { - config = this.getSubDomainConfig(currentDate); - } - col.push(config); - } - - return col; - } - }, { - key: 'getSubDomainConfig', - value: function getSubDomainConfig(date) { - var yyyyMmDd = getYyyyMmDd(date); - var dataValue = this.data.dataPoints[yyyyMmDd]; - var config = { - yyyyMmDd: yyyyMmDd, - dataValue: dataValue || 0, - fill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)] - }; - return config; - } - }]); - return Heatmap; -}(BaseChart); - -function dataPrep(data, type) { - data.labels = data.labels || []; - - var datasetLength = data.labels.length; - - // Datasets - var datasets = data.datasets; - var zeroArray = new Array(datasetLength).fill(0); - if (!datasets) { - // default - datasets = [{ - values: zeroArray - }]; - } - - datasets.map(function (d) { - // Set values - if (!d.values) { - d.values = zeroArray; - } else { - // Check for non values - var vals = d.values; - vals = vals.map(function (val) { - return !isNaN(val) ? val : 0; - }); - - // Trim or extend - if (vals.length > datasetLength) { - vals = vals.slice(0, datasetLength); - } else { - vals = fillArray(vals, datasetLength - vals.length, 0); - } - d.values = vals; - } - - // Set type - if (!d.chartType) { - if (!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE; - d.chartType = type; - } - }); - - // Markers - - // Regions - // data.yRegions = data.yRegions || []; - if (data.yRegions) { - data.yRegions.map(function (d) { - if (d.end < d.start) { - var _ref = [d.end, d.start]; - d.start = _ref[0]; - d.end = _ref[1]; - } - }); - } - - return data; -} - -function zeroDataPrep(realData) { - var datasetLength = realData.labels.length; - var zeroArray = new Array(datasetLength).fill(0); - - var zeroData = { - labels: realData.labels.slice(0, -1), - datasets: realData.datasets.map(function (d) { - var axisID = d.axisID; - - return { - axisID: axisID, - name: '', - values: zeroArray.slice(0, -1), - chartType: d.chartType - }; - }) - }; - - if (realData.yMarkers) { - zeroData.yMarkers = [{ - value: 0, - label: '' - }]; - } - - if (realData.yRegions) { - zeroData.yRegions = [{ - start: 0, - end: 0, - label: '' - }]; - } - - return zeroData; -} - -function getShortenedLabels(chartWidth) { - var labels = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - var isSeries = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - - var allowedSpace = chartWidth / labels.length; - if (allowedSpace <= 0) allowedSpace = 1; - var allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH; - - var seriesMultiple = void 0; - if (isSeries) { - // Find the maximum label length for spacing calculations - var maxLabelLength = Math.max.apply(Math, toConsumableArray(labels.map(function (label) { - return label.length; - }))); - seriesMultiple = Math.ceil(maxLabelLength / allowedLetters); - } - - var calcLabels = labels.map(function (label, i) { - label += ""; - if (label.length > allowedLetters) { - - if (!isSeries) { - if (allowedLetters - 3 > 0) { - label = label.slice(0, allowedLetters - 3) + " ..."; - } else { - label = label.slice(0, allowedLetters) + '..'; - } - } else { - if (i % seriesMultiple !== 0) { - label = ""; - } - } - } - return label; - }); - - return calcLabels; -} - -var AxisChart = function (_BaseChart) { - inherits(AxisChart, _BaseChart); - - function AxisChart(parent, args) { - classCallCheck(this, AxisChart); - - var _this = possibleConstructorReturn(this, (AxisChart.__proto__ || Object.getPrototypeOf(AxisChart)).call(this, parent, args)); - - _this.barOptions = args.barOptions || {}; - _this.lineOptions = args.lineOptions || {}; - - _this.type = args.type || 'line'; - _this.init = 1; - - _this.setup(); - return _this; - } - - createClass(AxisChart, [{ - key: 'setMeasures', - value: function setMeasures() { - if (this.data.datasets.length <= 1) { - this.config.showLegend = 0; - this.measures.paddings.bottom = 30; - } - } - }, { - key: 'configure', - value: function configure(options) { - get(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'configure', this).call(this, options); - var _options$axisOptions = options.axisOptions, - axisOptions = _options$axisOptions === undefined ? {} : _options$axisOptions; - - var _ref = axisOptions || {}, - xAxis = _ref.xAxis, - yAxis = _ref.yAxis; - - options.tooltipOptions = options.tooltipOptions || {}; - - this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span'; - - // this will pass an array - // lets determine if we need two yAxis based on if there is length - // to the yAxis array - if (yAxis && yAxis.length) { - this.config.yAxisConfig = yAxis.map(function (item) { - return { - yAxisMode: item.yAxisMode, - id: item.id, - position: item.position, - title: item.title - }; - }); - } else { - this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span'; - - // if we have yAxis config settings lets populate a yAxis config array. - if (yAxis && yAxis.id && yAxis.position) { - this.config.yAxisConfig = [yAxis]; - } - } - - this.config.xIsSeries = axisOptions.xIsSeries || 0; - this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0; - - this.config.formatTooltipX = options.tooltipOptions.formatTooltipX; - this.config.formatTooltipY = options.tooltipOptions.formatTooltipY; - - this.config.valuesOverPoints = options.valuesOverPoints; - } - }, { - key: 'prepareData', - value: function prepareData() { - var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; - - return dataPrep(data, this.type); - } - }, { - key: 'prepareFirstData', - value: function prepareFirstData() { - var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; - - return zeroDataPrep(data); - } - }, { - key: 'calc', - value: function calc() { - var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - this.calcXPositions(); - if (!onlyWidthChange) { - this.calcYAxisParameters(this.getAllYValues(), this.type === 'line'); - } - this.makeDataByIndex(); - } - }, { - key: 'calcXPositions', - value: function calcXPositions() { - var s = this.state; - var labels = this.data.labels; - s.datasetLength = labels.length; - - s.unitWidth = this.width / s.datasetLength; - // Default, as per bar, and mixed. Only line will be a special case - s.xOffset = s.unitWidth / 2; - - // // For a pure Line Chart - // s.unitWidth = this.width/(s.datasetLength - 1); - // s.xOffset = 0; - - s.xAxis = { - labels: labels, - positions: labels.map(function (d, i) { - return floatTwo(s.xOffset + i * s.unitWidth); - }) - }; - } - }, { - key: 'calcYAxisParameters', - value: function calcYAxisParameters(dataValues) { - var _this2 = this; - - var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'false'; - - var yPts = void 0, - scaleMultiplier = void 0, - intervalHeight = void 0, - zeroLine = void 0, - positions = void 0, - yAxisConfigObject = void 0, - yAxisAlignment = void 0, - yKeys = void 0; - yKeys = []; - yAxisConfigObject = this.config.yAxisMode || {}; - yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; - - // if we have an object we have multiple yAxisParameters. - if (dataValues instanceof Array) { - yPts = calcChartIntervals(dataValues, withMinimum); - scaleMultiplier = this.height / getValueRange(yPts); - intervalHeight = getIntervalSize(yPts) * scaleMultiplier; - zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; - - this.state.yAxis = { - labels: yPts, - positions: yPts.map(function (d) { - return zeroLine - d * scaleMultiplier; - }), - title: yAxisConfigObject.title || null, - pos: yAxisAlignment, - scaleMultiplier: scaleMultiplier, - zeroLine: zeroLine - }; - } else { - this.state.yAxis = []; - - var _loop = function _loop(key) { - var dataValue = dataValues[key]; - yAxisConfigObject = _this2.config.yAxisConfig.find(function (item) { - return key === item.id; - }) || []; - yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; - yPts = calcChartIntervals(dataValue, withMinimum); - scaleMultiplier = _this2.height / getValueRange(yPts); - intervalHeight = getIntervalSize(yPts) * scaleMultiplier; - zeroLine = _this2.height - getZeroIndex(yPts) * intervalHeight; - positions = yPts.map(function (d) { - return zeroLine - d * scaleMultiplier; - }); - yKeys.push(key); - - if (_this2.state.yAxis.length > 1) { - var yPtsArray = []; - var firstArr = _this2.state.yAxis[0]; - - // we need to calculate the scaleMultiplier. - - // now that we have an accurate scaleMultiplier we can - // we need to loop through original positions. - scaleMultiplier = _this2.height / getValueRange(yPts); - firstArr.positions.forEach(function (pos) { - yPtsArray.push(Math.ceil(pos / scaleMultiplier)); - }); - yPts = yPtsArray.reverse(); - zeroLine = _this2.height - getZeroIndex(yPts) * intervalHeight; - positions = firstArr.positions; - } - - _this2.state.yAxis.push({ - axisID: key || 'left-axis', - labels: yPts, - title: yAxisConfigObject.title, - pos: yAxisAlignment, - scaleMultiplier: scaleMultiplier, - zeroLine: zeroLine, - positions: positions - }); - }; - - for (var key in dataValues) { - _loop(key); - } - - // the labels are not aligned in length between the two yAxis objects, - // we need to run some new calculations. - if (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) { - var newYptsArr = []; - // find the shorter array - var shortest = this.state.yAxis.reduce(function (p, c) { - return p.length > c.labels.length ? c : p; - }, { length: Infinity }); - // return the longest - var longest = this.state.yAxis.reduce(function (p, c) { - return p.length < c.labels.length ? p : c; - }, { length: Infinity }); - - // we now need to populate the shortest obj with the new scale multiplier - // with the positions of the longest obj. - longest.positions.forEach(function (pos) { - // calculate a new yPts - newYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier)); - }); - - shortest.labels = newYptsArr.reverse(); - shortest.positions = longest.positions; - } - } - - // Dependent if above changes - this.calcDatasetPoints(); - this.calcYExtremes(); - this.calcYRegions(); - } - }, { - key: 'calcDatasetPoints', - value: function calcDatasetPoints() { - var s = this.state; - var scaleAll = function scaleAll(values, id) { - return values.map(function (val) { - var yAxis = s.yAxis; - - - if (yAxis instanceof Array) { - yAxis = yAxis.length > 1 ? yAxis.find(function (axis) { - return id === axis.axisID; - }) : s.yAxis[0]; - } - - return scale(val, yAxis); - }); - }; - - s.barChartIndex = 1; - s.datasets = this.data.datasets.map(function (d, i) { - var values = d.values; - var cumulativeYs = d.cumulativeYs || []; - - return { - name: d.name && d.name.replace(/<|>|&/g, function (char) { - return char == '&' ? '&' : char == '<' ? '<' : '>'; - }), - index: i, - barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex, - chartType: d.chartType, - - values: values, - yPositions: scaleAll(values, d.axisID), - id: d.axisID, - - cumulativeYs: cumulativeYs, - cumulativeYPos: scaleAll(cumulativeYs, d.axisID) - }; - }); - } - }, { - key: 'calcYExtremes', - value: function calcYExtremes() { - var s = this.state; - if (this.barOptions.stacked) { - s.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos; - return; - } - s.yExtremes = new Array(s.datasetLength).fill(9999); - s.datasets.map(function (d) { - d.yPositions.map(function (pos, j) { - if (pos < s.yExtremes[j]) { - s.yExtremes[j] = pos; - } - }); - }); - } - }, { - key: 'calcYRegions', - value: function calcYRegions() { - var s = this.state; - if (this.data.yMarkers) { - this.state.yMarkers = this.data.yMarkers.map(function (d) { - d.position = scale(d.value, s.yAxis); - if (!d.options) d.options = {}; - // if(!d.label.includes(':')) { - // d.label += ': ' + d.value; - // } - return d; - }); - } - if (this.data.yRegions) { - this.state.yRegions = this.data.yRegions.map(function (d) { - d.startPos = scale(d.start, s.yAxis); - d.endPos = scale(d.end, s.yAxis); - if (!d.options) d.options = {}; - return d; - }); - } - } - }, { - key: 'getAllYValues', - value: function getAllYValues() { - var _this3 = this, - _ref2; - - var key = 'values'; - var multiAxis = this.config.yAxisConfig ? true : false; - var allValueLists = multiAxis ? {} : []; - - var groupBy = function groupBy(arr, property) { - return arr.reduce(function (acc, cur) { - acc[cur[property]] = [].concat(toConsumableArray(acc[cur[property]] || []), [cur]); - return acc; - }, {}); - }; - - var generateCumulative = function generateCumulative(arr) { - var cumulative = new Array(_this3.state.datasetLength).fill(0); - arr.forEach(function (d, i) { - var values = arr[i].values; - d[key] = cumulative = cumulative.map(function (c, i) { - return c + values[i]; - }); - }); - }; - - if (this.barOptions.stacked) { - key = 'cumulativeYs'; - // we need to filter out the different yAxis ID's here. - if (multiAxis) { - var groupedDataSets = groupBy(this.data.datasets, 'axisID'); - // const dataSetsByAxis = this.data.dd - for (var axisID in groupedDataSets) { - generateCumulative(groupedDataSets[axisID]); - } - } else { - generateCumulative(this.data.datasets); - } - } - - // this is the trouble maker, we don't want to merge all - // datasets since we are trying to run two yAxis. - if (multiAxis) { - this.data.datasets.forEach(function (d) { - var _allValueLists; - - // if the array exists already just push more data into it. - // otherwise create a new array into the object. - allValueLists[d.axisID || key] ? (_allValueLists = allValueLists[d.axisID || key]).push.apply(_allValueLists, toConsumableArray(d[key])) : allValueLists[d.axisID || key] = [].concat(toConsumableArray(d[key])); - }); - } else { - allValueLists = this.data.datasets.map(function (d) { - return d[key]; - }); - } - - if (this.data.yMarkers && !multiAxis) { - allValueLists.push(this.data.yMarkers.map(function (d) { - return d.value; - })); - } - - if (this.data.yRegions && !multiAxis) { - this.data.yRegions.map(function (d) { - allValueLists.push([d.end, d.start]); - }); - } - - return multiAxis ? allValueLists : (_ref2 = []).concat.apply(_ref2, toConsumableArray(allValueLists)); - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var _this4 = this; - - var componentConfigs = [['xAxis', { - mode: this.config.xAxisMode, - height: this.height - // pos: 'right' - }, function () { - var s = this.state; - s.xAxis.calcLabels = getShortenedLabels(this.width, s.xAxis.labels, this.config.xIsSeries); - - return s.xAxis; - }.bind(this)], ['yRegions', { - width: this.width, - pos: 'right' - }, function () { - return this.state.yRegions; - }.bind(this)]]; - - // if we have multiple yAxisConfigs we need to update the yAxisDefault - // components to multiple yAxis components. - if (this.config.yAxisConfig && this.config.yAxisConfig.length) { - this.config.yAxisConfig.forEach(function (yAxis) { - componentConfigs.push(['yAxis', { - mode: _this4.config.yAxisMode, - width: _this4.width, - shortenNumbers: _this4.config.shortenYAxisNumbers, - pos: yAxis.position || 'left' - }, function () { - return this.state.yAxis; - }.bind(_this4)]); - }); - } else { - componentConfigs.push(['yAxis', { - mode: this.config.yAxisMode, - width: this.width, - shortenNumbers: this.config.shortenYAxisNumbers - }, function () { - return this.state.yAxis; - }.bind(this)]); - } - - var barDatasets = this.state.datasets.filter(function (d) { - return d.chartType === 'bar'; - }); - var lineDatasets = this.state.datasets.filter(function (d) { - return d.chartType === 'line'; - }); - - var barsConfigs = barDatasets.map(function (d) { - var index = d.index; - var barIndex = d.barIndex || index; - return ['barGraph' + '-' + d.index, { - index: index, - color: _this4.colors[index], - stacked: _this4.barOptions.stacked, - - // same for all datasets - valuesOverPoints: _this4.config.valuesOverPoints, - minHeight: _this4.height * MIN_BAR_PERCENT_HEIGHT - }, function () { - var s = this.state; - var yAxis = s.yAxis; - - var d = s.datasets[index]; - var _d$id = d.id, - id = _d$id === undefined ? 'left-axis' : _d$id; - - var stacked = this.barOptions.stacked; - - var spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO; - var barsWidth = s.unitWidth * (1 - spaceRatio); - var barWidth = barsWidth / (stacked ? 1 : barDatasets.length); - - // if there are multiple yAxis we need to return the yAxis with the - // proper ID. - if (yAxis instanceof Array) { - // if the person only configured one yAxis in the array return the first. - yAxis = yAxis.length > 1 ? yAxis.find(function (axis) { - return id === axis.axisID; - }) : s.yAxis[0]; - } - - var xPositions = s.xAxis.positions.map(function (x) { - return x - barsWidth / 2; - }); - - if (!stacked) { - xPositions = xPositions.map(function (p) { - return p + barWidth * barIndex - barWidth; - }); - } - - var labels = new Array(s.datasetLength).fill(''); - if (this.config.valuesOverPoints) { - if (stacked && d.index === s.datasets.length - 1) { - labels = d.cumulativeYs; - } else { - labels = d.values; - } - } - var offsets = new Array(s.datasetLength).fill(0); - if (stacked) { - offsets = d.yPositions.map(function (y, j) { - return y - d.cumulativeYPos[j]; - }); - } - - return { - xPositions: xPositions, - yPositions: d.yPositions, - offsets: offsets, - // values: d.values, - labels: labels, - - zeroLine: yAxis.zeroLine, - barsWidth: barsWidth, - barWidth: barWidth - }; - }.bind(_this4)]; - }); - - var lineConfigs = lineDatasets.map(function (d) { - var index = d.index; - return ['lineGraph' + '-' + d.index, { - index: index, - color: _this4.colors[index], - svgDefs: _this4.svgDefs, - heatline: _this4.lineOptions.heatline, - regionFill: _this4.lineOptions.regionFill, - spline: _this4.lineOptions.spline, - hideDots: _this4.lineOptions.hideDots, - hideLine: _this4.lineOptions.hideLine, - - // same for all datasets - valuesOverPoints: _this4.config.valuesOverPoints - }, function () { - var s = this.state; - var d = s.datasets[index]; - - // if we have more than one yindex lets map the values - var yAxis = s.yAxis.length ? s.yAxis.find(function (axis) { - return d.id === axis.axisID; - }) || s.yAxis[0] : s.yAxis; - - var minLine = yAxis.positions[0] < yAxis.zeroLine ? yAxis.positions[0] : yAxis.zeroLine; - - return { - xPositions: s.xAxis.positions, - yPositions: d.yPositions, - - values: d.values, - - zeroLine: minLine, - radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE - }; - }.bind(_this4)]; - }); - - var markerConfigs = [['yMarkers', { - width: this.width, - pos: 'right' - }, function () { - return this.state.yMarkers; - }.bind(this)]]; - - componentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs); - - var optionals = ['yMarkers', 'yRegions']; - this.dataUnitComponents = []; - - this.components = new Map(componentConfigs.filter(function (args) { - return !optionals.includes(args[0]) || _this4.state[args[0]]; - }).map(function (args) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - if (args[0].includes('lineGraph') || args[0].includes('barGraph')) { - _this4.dataUnitComponents.push(component); - } - return [args[0], component]; - })); - } - }, { - key: 'makeDataByIndex', - value: function makeDataByIndex() { - var _this5 = this; - - this.dataByIndex = {}; - - var s = this.state; - var formatX = this.config.formatTooltipX; - var formatY = this.config.formatTooltipY; - var titles = s.xAxis.labels; - - titles.map(function (label, index) { - var values = _this5.state.datasets.map(function (set$$1, i) { - var value = set$$1.values[index]; - return { - title: set$$1.name, - value: value, - yPos: set$$1.yPositions[index], - color: _this5.colors[i], - formatted: formatY ? formatY(value) : value - }; - }); - - _this5.dataByIndex[index] = { - label: label, - formattedLabel: formatX ? formatX(label) : label, - xPos: s.xAxis.positions[index], - values: values, - yExtreme: s.yExtremes[index] - }; - }); - } - }, { - key: 'bindTooltip', - value: function bindTooltip() { - var _this6 = this; - - // NOTE: could be in tooltip itself, as it is a given functionality for its parent - this.container.addEventListener('mousemove', function (e) { - var m = _this6.measures; - var o = getOffset(_this6.container); - var relX = e.pageX - o.left - getLeftOffset(m); - var relY = e.pageY - o.top; - - if (relY < _this6.height + getTopOffset(m) && relY > getTopOffset(m)) { - _this6.mapTooltipXPosition(relX); - } else { - _this6.tip.hideTip(); - } - }); - } - }, { - key: 'mapTooltipXPosition', - value: function mapTooltipXPosition(relX) { - var s = this.state; - if (!s.yExtremes) return; - - var index = getClosestInArray(relX, s.xAxis.positions, true); - if (index >= 0) { - var dbi = this.dataByIndex[index]; - - this.tip.setValues(dbi.xPos + this.tip.offset.x, dbi.yExtreme + this.tip.offset.y, { name: dbi.formattedLabel, value: '' }, dbi.values, index); - - this.tip.showTip(); - } - } - }, { - key: 'renderLegend', - value: function renderLegend() { - var _this7 = this; - - var s = this.data; - if (s.datasets.length > 1) { - this.legendArea.textContent = ''; - s.datasets.map(function (d, i) { - var barWidth = AXIS_LEGEND_BAR_SIZE; - // let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right; - // let multiplier = s.datasets.length - i; - var rect = legendBar( - // rightEndPoint - multiplier * barWidth, // To right align - barWidth * i, '0', barWidth, _this7.colors[i], d.name, _this7.config.truncateLegends); - _this7.legendArea.appendChild(rect); - }); - } - } - - // Overlay - - }, { - key: 'makeOverlay', - value: function makeOverlay$$1() { - var _this8 = this; - - if (this.init) { - this.init = 0; - return; - } - if (this.overlayGuides) { - this.overlayGuides.forEach(function (g) { - var o = g.overlay; - o.parentNode.removeChild(o); - }); - } - - this.overlayGuides = this.dataUnitComponents.map(function (c) { - return { - type: c.unitType, - overlay: undefined, - units: c.units - }; - }); - - if (this.state.currentIndex === undefined) { - this.state.currentIndex = this.state.datasetLength - 1; - } - - // Render overlays - this.overlayGuides.map(function (d) { - var currentUnit = d.units[_this8.state.currentIndex]; - - d.overlay = makeOverlay[d.type](currentUnit); - _this8.drawArea.appendChild(d.overlay); - }); - } - }, { - key: 'updateOverlayGuides', - value: function updateOverlayGuides() { - if (this.overlayGuides) { - this.overlayGuides.forEach(function (g) { - var o = g.overlay; - o.parentNode.removeChild(o); - }); - } - } - }, { - key: 'bindOverlay', - value: function bindOverlay() { - var _this9 = this; - - this.parent.addEventListener('data-select', function () { - _this9.updateOverlay(); - }); - } - }, { - key: 'bindUnits', - value: function bindUnits() { - var _this10 = this; - - this.dataUnitComponents.map(function (c) { - c.units.map(function (unit) { - unit.addEventListener('click', function () { - var index = unit.getAttribute('data-point-index'); - _this10.setCurrentDataPoint(index); - }); - }); - }); - - // Note: Doesn't work as tooltip is absolutely positioned - this.tip.container.addEventListener('click', function () { - var index = _this10.tip.container.getAttribute('data-point-index'); - _this10.setCurrentDataPoint(index); - }); - } - }, { - key: 'updateOverlay', - value: function updateOverlay$$1() { - var _this11 = this; - - this.overlayGuides.map(function (d) { - var currentUnit = d.units[_this11.state.currentIndex]; - updateOverlay[d.type](currentUnit, d.overlay); - }); - } - }, { - key: 'onLeftArrow', - value: function onLeftArrow() { - this.setCurrentDataPoint(this.state.currentIndex - 1); - } - }, { - key: 'onRightArrow', - value: function onRightArrow() { - this.setCurrentDataPoint(this.state.currentIndex + 1); - } - }, { - key: 'getDataPoint', - value: function getDataPoint() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentIndex; - - var s = this.state; - var data_point = { - index: index, - label: s.xAxis.labels[index], - values: s.datasets.map(function (d) { - return d.values[index]; - }) - }; - return data_point; - } - }, { - key: 'setCurrentDataPoint', - value: function setCurrentDataPoint(index) { - var s = this.state; - index = parseInt(index); - if (index < 0) index = 0; - if (index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1; - if (index === s.currentIndex) return; - s.currentIndex = index; - fire(this.parent, "data-select", this.getDataPoint()); - } - - // API - - }, { - key: 'addDataPoint', - value: function addDataPoint(label, datasetValues) { - var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.state.datasetLength; - - get(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'addDataPoint', this).call(this, label, datasetValues, index); - this.data.labels.splice(index, 0, label); - this.data.datasets.map(function (d, i) { - d.values.splice(index, 0, datasetValues[i]); - }); - this.update(this.data); - } - }, { - key: 'removeDataPoint', - value: function removeDataPoint() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.datasetLength - 1; - - if (this.data.labels.length <= 1) { - return; - } - get(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'removeDataPoint', this).call(this, index); - this.data.labels.splice(index, 1); - this.data.datasets.map(function (d) { - d.values.splice(index, 1); - }); - this.update(this.data); - } - }, { - key: 'updateDataset', - value: function updateDataset(datasetValues) { - var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - this.data.datasets[index].values = datasetValues; - this.update(this.data); - } - // addDataset(dataset, index) {} - // removeDataset(index = 0) {} - - }, { - key: 'updateDatasets', - value: function updateDatasets(datasets) { - this.data.datasets.map(function (d, i) { - if (datasets[i]) { - d.values = datasets[i]; - } - }); - this.update(this.data); - } - - // updateDataPoint(dataPoint, index = 0) {} - // addDataPoint(dataPoint, index = 0) {} - // removeDataPoint(index = 0) {} - - }]); - return AxisChart; -}(BaseChart); - -var DonutChart = function (_AggregationChart) { - inherits(DonutChart, _AggregationChart); - - function DonutChart(parent, args) { - classCallCheck(this, DonutChart); - - var _this = possibleConstructorReturn(this, (DonutChart.__proto__ || Object.getPrototypeOf(DonutChart)).call(this, parent, args)); - - _this.type = 'donut'; - _this.initTimeout = 0; - _this.init = 1; - - _this.setup(); - return _this; - } - - createClass(DonutChart, [{ - key: 'configure', - value: function configure(args) { - get(DonutChart.prototype.__proto__ || Object.getPrototypeOf(DonutChart.prototype), 'configure', this).call(this, args); - this.mouseMove = this.mouseMove.bind(this); - this.mouseLeave = this.mouseLeave.bind(this); - - this.hoverRadio = args.hoverRadio || 0.1; - this.config.startAngle = args.startAngle || 0; - - this.clockWise = args.clockWise || false; - this.strokeWidth = args.strokeWidth || 30; - } - }, { - key: 'calc', - value: function calc() { - var _this2 = this; - - get(DonutChart.prototype.__proto__ || Object.getPrototypeOf(DonutChart.prototype), 'calc', this).call(this); - var s = this.state; - this.radius = this.height > this.width ? this.center.x - this.strokeWidth / 2 : this.center.y - this.strokeWidth / 2; - - var radius = this.radius, - clockWise = this.clockWise; - - - var prevSlicesProperties = s.slicesProperties || []; - s.sliceStrings = []; - s.slicesProperties = []; - var curAngle = 180 - this.config.startAngle; - - s.sliceTotals.map(function (total, i) { - var startAngle = curAngle; - var originDiffAngle = total / s.grandTotal * FULL_ANGLE; - var largeArc = originDiffAngle > 180 ? 1 : 0; - var diffAngle = clockWise ? -originDiffAngle : originDiffAngle; - var endAngle = curAngle = curAngle + diffAngle; - var startPosition = getPositionByAngle(startAngle, radius); - var endPosition = getPositionByAngle(endAngle, radius); - - var prevProperty = _this2.init && prevSlicesProperties[i]; - - var curStart = void 0, - curEnd = void 0; - if (_this2.init) { - curStart = prevProperty ? prevProperty.startPosition : startPosition; - curEnd = prevProperty ? prevProperty.endPosition : startPosition; - } else { - curStart = startPosition; - curEnd = endPosition; - } - var curPath = originDiffAngle === 360 ? makeStrokeCircleStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise, largeArc) : makeArcStrokePathStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise, largeArc); - - s.sliceStrings.push(curPath); - s.slicesProperties.push({ - startPosition: startPosition, - endPosition: endPosition, - value: total, - total: s.grandTotal, - startAngle: startAngle, - endAngle: endAngle, - angle: diffAngle - }); - }); - this.init = 0; - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var s = this.state; - - var componentConfigs = [['donutSlices', {}, function () { - return { - sliceStrings: s.sliceStrings, - colors: this.colors, - strokeWidth: this.strokeWidth - }; - }.bind(this)]]; - - this.components = new Map(componentConfigs.map(function (args) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: 'calTranslateByAngle', - value: function calTranslateByAngle(property) { - var radius = this.radius, - hoverRadio = this.hoverRadio; - - var position = getPositionByAngle(property.startAngle + property.angle / 2, radius); - return 'translate3d(' + position.x * hoverRadio + 'px,' + position.y * hoverRadio + 'px,0)'; - } - }, { - key: 'hoverSlice', - value: function hoverSlice(path, i, flag, e) { - if (!path) return; - var color = this.colors[i]; - if (flag) { - transform(path, this.calTranslateByAngle(this.state.slicesProperties[i])); - path.style.stroke = lightenDarkenColor(color, 50); - var g_off = getOffset(this.svg); - var x = e.pageX - g_off.left + 10; - var y = e.pageY - g_off.top - 10; - var title = (this.formatted_labels && this.formatted_labels.length > 0 ? this.formatted_labels[i] : this.state.labels[i]) + ': '; - var percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1); - this.tip.setValues(x, y, { name: title, value: percent + "%" }); - this.tip.showTip(); - } else { - transform(path, 'translate3d(0,0,0)'); - this.tip.hideTip(); - path.style.stroke = color; - } - } - }, { - key: 'bindTooltip', - value: function bindTooltip() { - this.container.addEventListener('mousemove', this.mouseMove); - this.container.addEventListener('mouseleave', this.mouseLeave); - } - }, { - key: 'mouseMove', - value: function mouseMove(e) { - var target = e.target; - var slices = this.components.get('donutSlices').store; - var prevIndex = this.curActiveSliceIndex; - var prevAcitve = this.curActiveSlice; - if (slices.includes(target)) { - var i = slices.indexOf(target); - this.hoverSlice(prevAcitve, prevIndex, false); - this.curActiveSlice = target; - this.curActiveSliceIndex = i; - this.hoverSlice(target, i, true, e); - } else { - this.mouseLeave(); - } - } - }, { - key: 'mouseLeave', - value: function mouseLeave() { - this.hoverSlice(this.curActiveSlice, this.curActiveSliceIndex, false); - } - }]); - return DonutChart; -}(AggregationChart); - -var chartTypes = { - bar: AxisChart, - line: AxisChart, - // multiaxis: MultiAxisChart, - percentage: PercentageChart, - heatmap: Heatmap, - pie: PieChart, - donut: DonutChart -}; - -function getChartByType() { - var chartType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'line'; - var parent = arguments[1]; - var options = arguments[2]; - - if (chartType === 'axis-mixed') { - options.type = 'line'; - return new AxisChart(parent, options); - } - - if (!chartTypes[chartType]) { - console.error("Undefined chart type: " + chartType); - return; - } - - return new chartTypes[chartType](parent, options); -} - -var Chart = function Chart(parent, options) { - classCallCheck(this, Chart); - - return getChartByType(options.type, parent, options); -}; - - - -var Charts = Object.freeze({ - Chart: Chart, - PercentageChart: PercentageChart, - PieChart: PieChart, - Heatmap: Heatmap, - AxisChart: AxisChart -}); - -var frappe = {}; - -frappe.NAME = 'Frappe Charts'; -frappe.VERSION = '1.6.2'; - -frappe = Object.assign({}, frappe, Charts); - -var frappe$1 = frappe; - -return frappe$1; - -}()); +var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(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)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function h(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function u(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function M(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function D(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)M(a).appendChild(i);else if("around"===n){var s=M(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function T(t,e){return D("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function C(t,e,i,n){return D("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return D("svg",{className:e,inside:t,width:i,height:n})}function O(t){return D("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),D("g",n)}function S(t){return D("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*i.y,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z\n\t\tL"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*n+o,u=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+"\n\t\tM"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=T(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),C(a,"0%",e,s[0]),C(a,"50%",e,s[1]),C(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return D("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),D("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=D("text",{className:"legend-dataset-text",x:0,y:0,dy:2*oe+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:he,innerHTML:a}),o=D("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(D("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=D("text",{className:"legend-dataset-text",x:0,y:0,dx:oe+"px",dy:oe/3+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:he,innerHTML:a}),o=D("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(D("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||oe;return D("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||he,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le);var s=D("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=D("text",{x:0,y:i>n?i+se:i-se-oe,dy:oe+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:e+""}),o=D("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=D("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=D("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:oe/2-2+"px","font-size":oe+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=D("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||le,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=D("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:le,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=D("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:n+""}),l=D("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),h=Ut(l,2),u=h[0],c=h[1];c-=r,0===u&&(u=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(u,!0)||(u=0),f(i,!0)||(i=0);var d=D("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:u});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=D("text",{className:"data-point-value",x:i/2,y:0,dy:oe/2*-1+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),v=D("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=D("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=D("text",{className:"data-point-value",x:0,y:0,dy:oe/2*-1-i+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),l=D("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var h=H(a.svgDefs,i,!0),u="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(u,"region-fill","none","url(#"+h+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ge,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],fe)}function et(t,e,i){return Z(t,[0,i],[0,e],fe)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},fe,ge],Z(t,[0,n],[0,i],fe)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},de,ge],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],fe)]:[[t,{width:n,height:o,x:e,y:l},de,ge]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],fe)]:[[t,{cx:e,cy:i},de,ge]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},pe,ge];if(s.push(o),t.region){var l=e[0]+","+n+"L",h="L"+e.slice(-1)[0]+", "+n,u=[t.region,{d:"M"+l+r+h},pe,ge];s.push(u)}return s}function rt(t,e){return[t,{d:e},de,ge]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var h=void 0;h="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:u,to:c,begin:"0s",dur:i/1e3+"s",values:u+";"+c,keySplines:ye[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)h.setAttribute(p,d[p]);r.appendChild(h),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ht(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ut(t,e,i){if(0!==i.length){var n=ht(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ve)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/ke)}function yt(t,e){var i=Ae*we;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Pe[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new De(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Mt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Tt(t){function e(t,e){for(var i=Dt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Dt(n,a):Dt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Dt(o,l):Dt(o)).reverse().map(function(t){return-1*t})}return s}function Ct(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return u(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ne(e,i)):Ee[t]?new Ee[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="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},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"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")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
    \n\t\t\t\t
    '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,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 n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=10,le="#dadada",he="#555b51",ue={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},ce={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},de=350,pe=350,fe=de,ve=250,ge="easein",ye={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"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",be=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-h(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ut(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),xe=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-h(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,u=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],u+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(be),ke=7,we=1e3,Ae=86400,Pe=["January","February","March","April","May","June","July","August","September","October","November","December"],Me=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],De=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,h=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=h,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(t,n){t.positions.map(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:e.constants.width}))}),i):(t.positions.forEach(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:this.constants.width})),i)},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var h=[];return this.store.map(function(t,e){h=h.concat(it(t,s[e],n[e],o[e]))}),h}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,h=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,h,r,o,t.fill,n);e.serializedSubDomains.push(a)}h+=s}),h=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,h=m(s,e),u=Ut(h,2);s=u[0],e=u[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var h=m(s,i),u=Ut(h,2);s=u[0],i=u[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Ce=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),h=l.left-o.left+parseInt(s.getAttribute("width"))/2,u=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(h,u,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(xe),Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?_(y,m,t.center,t.radius,a,u):E(y,m,t.center,t.radius,a,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Oe=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*ke+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+h(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+h(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*we);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],h=void 0,u=0;u2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(be),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):(this.config.yAxisMode=r?r.yAxisMode:n.yAxisMode||"span",r&&r.id&&r.position&&(this.config.yAxisConfig=[r])),this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return u(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0,l=void 0,h=void 0,u=void 0;if(u=[],l=this.config.yAxisMode||{},h=l.position?l.position:"left",t instanceof Array)n=Tt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Ct(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),title:l.title||null,pos:h,scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var c in t)!function(c){var d=t[c];if(l=e.config.yAxisConfig.find(function(t){return c===t.id})||[],h=l.position?l.position:"left",n=Tt(d,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Ct(n)*s,o=n.map(function(t){return r-t*a}),u.push(c),e.state.yAxis.length>1){var p=[],f=e.state.yAxis[0];a=e.height/Ot(n),f.positions.forEach(function(t){p.push(Math.ceil(t/a))}),n=p.reverse(),r=e.height-Ct(n)*s,o=f.positions}e.state.yAxis.push({axisID:c||"left-axis",labels:n,title:l.title,pos:h,scaleMultiplier:a,zeroLine:r,positions:o})}(c);if(this.state.yAxis[1]&&this.state.yAxis[0].labels.length!==this.state.yAxis[1].labels.length){var d=[],p=this.state.yAxis.reduce(function(t,e){return t.length>e.labels.length?e:t},{length:1/0}),f=this.state.yAxis.reduce(function(t,e){return t.length1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-u/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:u,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=ue[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];ce[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(be),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?I(y,m,t.center,t.radius,t.clockWise,u):z(y,m,t.center,t.radius,t.clockWise,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Ee={bar:Ne,line:Ne,percentage:Ce,heatmap:Oe,pie:Le,donut:Se},_e=function t(e,i){return jt(this,t),Wt(i.type,e,i)},ze=Object.freeze({Chart:_e,PercentageChart:Ce,PieChart:Le,Heatmap:Oe,AxisChart:Ne}),Ie={};return Ie.NAME="Frappe Charts",Ie.VERSION="1.6.2",Ie=Object.assign({},Ie,ze)}(); //# sourceMappingURL=frappe-charts.min.js.map diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index c2b2051..be935e5 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/objects/SvgTip.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/css/chartsCss.js","../../../src/js/utils/export.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/utils/intervals.js","../../../src/js/charts/Heatmap.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/chart.js","../../../src/js/index.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
      \n\t\t\t\t
      `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["$","expr","con","document","querySelector","create","tag","o","element","createElement","i","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","getOffset","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","BASE_MEASURES","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","totalExtraHeight","legendHeight","getExtraWidth","totalExtraWidth","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","DEFAULT_AXIS_CHART_TYPE","AXIS_DATASET_CHART_TYPES","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","DOT_OVERLAY_SIZE_INCR","PERCENTAGE_BAR_DEFAULT_HEIGHT","PERCENTAGE_BAR_DEFAULT_DEPTH","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","HEATMAP_GUTTER_SIZE","DEFAULT_CHAR_WIDTH","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","HEATMAP_COLORS_GREEN","DEFAULT_COLORS","ANGLE_RATIO","Math","PI","FULL_ANGLE","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","hideTip","title","dataPointList","addEventListener","index","innerHTML","set","color","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","push","smoothing","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","n","bezierCommand","point","a","cps","cpe","pointStr","command","reduce","acc","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","HEX_RE","RGB_RE","test","exec","c","ch","AXIS_TICK_LENGTH","LABEL_MARGIN","LABEL_MAX_CHARS","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","makeSVGContainer","className","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","stroke","strokeWidth","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","heatSquare","size","data","legendBar","truncate","text","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","position","rotation","labelSvg","yLine","pos","mode","xLine","yMarker","labelPos","yRegion","region","datasetBar","meta","minHeight","datasetDot","dot","getPaths","pointsList","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","updateOverlay","attributes","values","filter","includes","attr","specified","nodeValue","UNIT_ANIM_DUR","PATH_ANIM_DUR","MARKER_LINE_ANIM_DUR","REPLACE_ALL_NEW_DUR","STD_EASING","translate","oldCoord","newCoord","duration","old","translateVertLine","newX","oldX","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","rectAnim","groupAnim","animateBar","bar","oldCoordStr","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","EASING","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","CSSTEXT","downloadFile","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","firstChild","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","error","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","millisecondsPerDay","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","sliceStrings","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","newOptions","startPos","endPos","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","monthNameHeight","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","Object","newValues","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","man","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","COL_WIDTH","ROW_HEIGHT","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","moreTextX","moreText","startMonth","startYear","endMonth","endYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","yRegions","zeroDataPrep","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","seriesMultiple","maxLabelLength","AxisChart","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","groupBy","cur","generateCumulative","cumulative","groupedDataSets","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","titles","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","setCurrentDataPoint","data_point","getDataPoint","datasetValues","splice","DonutChart","chartTypes","getChartByType","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
        \n\t\t\t\t
        `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","rotation","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file