diff --git a/dist/frappe-charts.cjs.js b/dist/frappe-charts.cjs.js index dff1d2a..295bd17 100644 --- a/dist/frappe-charts.cjs.js +++ b/dist/frappe-charts.cjs.js @@ -1,4459 +1,2 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a 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); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; -} - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) _setPrototypeOf(subClass, superClass); -} - -function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); -} - -function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); -} - -function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { - return false; - } -} - -function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; -} - -function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - - return _assertThisInitialized(self); -} - -function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } - - return _possibleConstructorReturn(this, result); - }; -} - -function _superPropBase(object, property) { - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = _getPrototypeOf(object); - if (object === null) break; - } - - return object; -} - -function _get(target, property, receiver) { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; - } else { - _get = function _get(target, property, receiver) { - var base = _superPropBase(target, property); - - if (!base) return; - var desc = Object.getOwnPropertyDescriptor(base, property); - - if (desc.get) { - return desc.get.call(receiver); - } - - return desc.value; - }; - } - - return _get(target, property, receiver || target); -} - -function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); -} - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; -} - -function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); -} - -function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - 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"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -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_248z = ".chart-container {\n position: relative;\n /* for absolutely positioned tooltip */\n /* https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/ */\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; }\n .chart-container .axis, .chart-container .chart-label {\n fill: #313B44; }\n .chart-container .axis line, .chart-container .chart-label line {\n stroke: #E2E6E9; }\n .chart-container .dataset-units circle {\n stroke: #fff;\n stroke-width: 2; }\n .chart-container .dataset-units path {\n fill: none;\n stroke-opacity: 1;\n stroke-width: 2px; }\n .chart-container .dataset-path {\n stroke-width: 2px; }\n .chart-container .path-group path {\n fill: none;\n stroke-opacity: 1;\n stroke-width: 2px; }\n .chart-container line.dashed {\n stroke-dasharray: 5, 3; }\n .chart-container .axis-line .specific-value {\n text-anchor: start; }\n .chart-container .axis-line .y-line {\n text-anchor: end; }\n .chart-container .axis-line .x-line {\n text-anchor: middle; }\n .chart-container .legend-dataset-text {\n fill: #6c7680;\n font-weight: 600; }\n\n.graph-svg-tip {\n position: absolute;\n z-index: 99999;\n padding: 10px;\n font-size: 12px;\n text-align: center;\n background: #FFFFFF;\n box-shadow: 0px 1px 4px rgba(17, 43, 66, 0.1), 0px 2px 6px rgba(17, 43, 66, 0.08), 0px 40px 30px -30px rgba(17, 43, 66, 0.1);\n border-radius: 6px; }\n .graph-svg-tip ul {\n padding-left: 0;\n display: flex; }\n .graph-svg-tip ol {\n padding-left: 0;\n display: flex; }\n .graph-svg-tip ul.data-point-list li {\n min-width: 90px;\n font-weight: 600; }\n .graph-svg-tip .svg-pointer {\n position: absolute;\n height: 12px;\n width: 12px;\n border-radius: 2px;\n background: white;\n transform: rotate(45deg);\n margin-top: -7px;\n margin-left: -6px; }\n .graph-svg-tip.comparison {\n text-align: left;\n padding: 0px;\n pointer-events: none; }\n .graph-svg-tip.comparison .title {\n display: block;\n padding: 16px;\n margin: 0;\n color: #313B44;\n font-weight: 600;\n line-height: 1;\n pointer-events: none;\n text-transform: uppercase; }\n .graph-svg-tip.comparison ul {\n margin: 0;\n white-space: nowrap;\n list-style: none; }\n .graph-svg-tip.comparison ul.tooltip-grid {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 5px; }\n .graph-svg-tip.comparison li {\n display: inline-block;\n display: flex;\n flex-direction: row;\n font-weight: 600;\n line-height: 1;\n padding: 5px 15px 15px 15px; }\n .graph-svg-tip.comparison li .tooltip-legend {\n height: 12px;\n width: 12px;\n margin-right: 8px;\n border-radius: 2px; }\n .graph-svg-tip.comparison li .tooltip-label {\n margin-top: 4px;\n font-size: 11px;\n max-width: 100px;\n color: #313B44;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .graph-svg-tip.comparison li .tooltip-value {\n color: #192734; }\n"; -styleInject(css_248z); - -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) === "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 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 = 7.48; -var DEFAULT_CHART_COLORS = ['pink', 'blue', 'green', 'grey', 'red', 'yellow', 'purple', 'teal', 'cyan', 'orange']; -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 = /*#__PURE__*/function () { - function SvgTip(_ref) { - var _ref$parent = _ref.parent, - parent = _ref$parent === void 0 ? null : _ref$parent, - _ref$colors = _ref.colors, - colors = _ref$colors === void 0 ? [] : _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.list = this.container.querySelector('.data-point-list'); - 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; - - if (this.index) { - this.container.setAttribute('data-point-index', this.index); - } - - if (this.titleValueFirst) { - title = "".concat(this.titleValue, "").concat(this.titleName); - } else { - title = "".concat(this.titleName, "").concat(this.titleValue, ""); - } - - if (this.listValues.length > 4) { - this.list.classList.add('tooltip-grid'); - } else { - this.list.classList.remove('tooltip-grid'); - } - - this.title.innerHTML = title; - this.dataPointList.innerHTML = ''; - this.listValues.map(function (set, i) { - var color = _this2.colors[i] || 'black'; - var value = set.formatted === 0 || set.formatted ? set.formatted : set.value; - var li = $.create('li', { - innerHTML: "
\n\t\t\t\t\t
\n\t\t\t\t\t\t
").concat(value === 0 || value ? value : '', "
\n\t\t\t\t\t\t
").concat(set.title ? set.title : '', "
\n\t\t\t\t\t
") - }); - - _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% - ".concat(-1 * this.left, "px)"); - this.left = 0; - } else if (this.left > maxLeft) { - var delta = this.left - maxLeft; - var pointerOffset = "calc(50% + ".concat(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; -}(); - -/** - * Returns the value of a number upto 2 decimal places. - * @param {Number} d Any number - */ - -function floatTwo(d) { - return parseFloat(d.toFixed(2)); -} -/** - * 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; -} -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; -} - -function getBarHeightAndYAttr(yTop, zeroLine) { - var height, y; - - 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; - 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 ".concat(cps[0], ",").concat(cps[1], " ").concat(cpe[0], ",").concat(cpe[1], " ").concat(point[0], ",").concat(point[1]); - }; - - var pointStr = function pointStr(points, command) { - return points.reduce(function (acc, point, i, a) { - return i === 0 ? "".concat(point[0], ",").concat(point[1]) : "".concat(acc, " ").concat(command(point, i, a)); - }, ''); - }; - - return pointStr(points, bezierCommand); -} - -var PRESET_COLOR_MAP = { - 'pink': '#F683AE', - 'blue': '#318AD8', - 'green': '#48BB74', - 'grey': '#A6B1B9', - 'red': '#F56B6B', - 'yellow': '#FACF7A', - 'purple': '#44427B', - 'teal': '#5FD8C4', - 'cyan': '#15CCEF', - 'orange': '#F8814F', - 'light-pink': '#FED7E5', - 'light-blue': '#BFDDF7', - 'light-green': '#48BB74', - 'light-grey': '#F4F5F6', - 'light-red': '#F6DFDF', - 'light-yellow': '#FEE9BF', - 'light-purple': '#E8E8F7', - 'light-teal': '#D3FDF6', - 'light-cyan': '#DDF8FD', - 'light-orange': '#FECDB8' -}; - -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) { - 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 = '#E2E6E9'; -var FONT_FILL = '#313B44'; - -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) === "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: ".concat(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".concat(center.x, " ").concat(center.y, "\n\t\tL").concat(arcStartX, " ").concat(arcStartY, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(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".concat(center.x, " ").concat(center.y, "\n\t\tL").concat(arcStartX, " ").concat(arcStartY, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(midArc, " z\n\t\tL").concat(arcStartX, " ").concat(midArc, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(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".concat(arcStartX, " ").concat(arcStartY, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(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".concat(arcStartX, " ").concat(arcStartY, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(midArc, "\n\t\tM").concat(arcStartX, " ").concat(midArc, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(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, ".concat(height + width, ", ").concat(width, ", ").concat(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.length > 4 ? arguments[4] : undefined; - 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(".concat(x, ", ").concat(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.length > 4 ? arguments[4] : undefined; - 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(".concat(x, ", ").concat(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(".concat(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.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: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN, - 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, ".concat(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 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; - } // let offset = options.pos === 'left' ? -1 * options.offset : options.offset; - - - x1 += options.offset; - x2 += options.offset; - return makeHoriLine(y, label, x1, x2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType, - 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': "".concat(width, ", ").concat(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, ".concat(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: ".concat(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(".concat(x, ", ").concat(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: ".concat(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(".concat(x, ", ").concat(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(#".concat(gradient_id, ")"); - } - - var paths = { - path: path - }; // Region - - if (options.regionFill) { - var gradient_id_region = makeGradient(meta.svgDefs, color, true); - var pathStr = "M" + "".concat(xList[0], ",").concat(meta.zeroLine, "L") + pointsStr + "L".concat(xList.slice(-1)[0], ",").concat(meta.zeroLine); - paths.region = makePath(pathStr, "region-fill", 'none', "url(#".concat(gradient_id_region, ")")); - } - - return paths; -} -var makeOverlay = { - 'bar': function bar(unit) { - var transformValue; - - 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; - - 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; - - 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; - - 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; - - 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; - - 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': "".concat(width, ", ").concat(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 = "".concat(newXList[0], ",").concat(zeroLine, "L"); - var regEndPt = "L".concat(newXList.slice(-1)[0], ", ").concat(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]; -} - -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(".concat(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, newElement; - element[0] = unit; - - var _animateSVGElement = animateSVGElement.apply(void 0, _toConsumableArray(element)); - - var _animateSVGElement2 = _slicedToArray(_animateSVGElement, 2); - - animElement = _animateSVGElement2[0]; - newElement = _animateSVGElement2[1]; - newElements.push(newElement); - animElements.push([animElement, parent]); - parent.replaceChild(animElement, unit); - }); - var animSvg = svgContainer.cloneNode(true); - animElements.map(function (animElement, i) { - 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;}.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 = /*#__PURE__*/function () { - function BaseChart(parent, options) { - _classCallCheck(this, BaseChart); - - 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); - }; - - window.addEventListener('resize', this.boundDrawFn); - window.addEventListener('orientationchange', this.boundDrawFn); - } - }, { - key: "destroy", - value: function destroy() { - 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(".concat(getLeftOffset(m), ", ").concat(top, ")")); - - if (this.config.showLegend) { - top += this.height + m.paddings.bottom; - this.legendArea = makeSVGGroup('chart-legend', "translate(".concat(getLeftOffset(m), ", ").concat(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); - } - }, { - 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() {} - }, { - key: "updateOverlay", - value: function updateOverlay() {} - }, { - 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 = /*#__PURE__*/function (_BaseChart) { - _inherits(AggregationChart, _BaseChart); - - var _super = _createSuper(AggregationChart); - - function AggregationChart(parent, args) { - _classCallCheck(this, AggregationChart); - - return _super.call(this, parent, args); - } - - _createClass(AggregationChart, [{ - key: "configure", - value: function configure(args) { - _get(_getPrototypeOf(AggregationChart.prototype), "configure", this).call(this, args); - - this.config.maxSlices = args.maxSlices || 20; - this.config.maxLegendPoints = args.maxLegendPoints || 20; - } - }, { - key: "calc", - value: function calc() { - var _this = this; - - var s = this.state; - var maxSlices = this.config.maxSlices; - s.sliceTotals = []; - var allTotals = this.data.labels.map(function (label, i) { - var total = 0; - - _this.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(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 _this2 = 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((_this2.width - getExtraWidth(_this2.measures)) / barWidth); - - if (_this2.legendTotals.length < divisor) { - barWidth = _this2.width / _this2.legendTotals.length; - } - - if (count > divisor) { - count = 0; - y += 20; - } - - var x = barWidth * count + 5; - var label = _this2.config.truncateLegends ? truncateString(s.labels[i], barWidth / 10) : s.labels[i]; - var dot = legendDot(x, y, 5, _this2.colors[i], "".concat(label, ": ").concat(d), false); - - _this2.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"]; - -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()); -} - -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 = /*#__PURE__*/function () { - function ChartComponent(_ref) { - var _ref$layerClass = _ref.layerClass, - layerClass = _ref$layerClass === void 0 ? '' : _ref$layerClass, - _ref$layerTransform = _ref.layerTransform, - layerTransform = _ref$layerTransform === void 0 ? '' : _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) { - _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; - - return data.positions.map(function (position, i) { - return yLine(position, data.labels[i], _this3.constants.width, { - mode: _this3.constants.mode, - pos: _this3.constants.pos, - shortenNumbers: _this3.constants.shortenNumbers - }); - }); - }, - animateElements: function animateElements(newData) { - var newPos = newData.positions; - var newLabels = newData.labels; - var oldPos = this.oldData.positions; - var oldLabels = this.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]; - 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 _this4 = this; - - return data.positions.map(function (position, i) { - return xLine(position, data.calcLabels[i], _this4.constants.height, { - mode: _this4.constants.mode, - pos: _this4.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 _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, - 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 _this5 = this; - - return data.map(function (m) { - return yMarker(m.position, m.label, _this5.constants.width, { - labelPos: m.options.labelPos, - mode: 'span', - lineType: 'dashed' - }); - }); - }, - animateElements: function animateElements(newData) { - var _equilizeNoOfElements9 = equilizeNoOfElements(this.oldData, newData); - - var _equilizeNoOfElements10 = _slicedToArray(_equilizeNoOfElements9, 2); - - this.oldData = _equilizeNoOfElements10[0]; - newData = _equilizeNoOfElements10[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 _this6 = this; - - return data.map(function (r) { - return yRegion(r.startPos, r.endPos, _this6.constants.width, r.label, { - labelPos: r.options.labelPos - }); - }); - }, - animateElements: function animateElements(newData) { - var _equilizeNoOfElements11 = equilizeNoOfElements(this.oldData, newData); - - var _equilizeNoOfElements12 = _slicedToArray(_equilizeNoOfElements11, 2); - - this.oldData = _equilizeNoOfElements12[0]; - newData = _equilizeNoOfElements12[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 _this7 = this; - - var _this$constants = this.constants, - index = _this$constants.index, - colWidth = _this$constants.colWidth, - rowHeight = _this$constants.rowHeight, - squareSize = _this$constants.squareSize, - radius = _this$constants.radius, - xTranslate = _this$constants.xTranslate; - var monthNameHeight = -12; - var x = xTranslate, - y = 0; - this.serializedSubDomains = []; - data.cols.map(function (week, weekNo) { - if (weekNo === 1) { - _this7.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); - - _this7.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 _equilizeNoOfElements13 = equilizeNoOfElements(oldXPos, newXPos); - - var _equilizeNoOfElements14 = _slicedToArray(_equilizeNoOfElements13, 2); - - oldXPos = _equilizeNoOfElements14[0]; - newXPos = _equilizeNoOfElements14[1]; - - var _equilizeNoOfElements15 = equilizeNoOfElements(oldYPos, newYPos); - - var _equilizeNoOfElements16 = _slicedToArray(_equilizeNoOfElements15, 2); - - oldYPos = _equilizeNoOfElements16[0]; - newYPos = _equilizeNoOfElements16[1]; - - var _equilizeNoOfElements17 = equilizeNoOfElements(oldOffsets, newOffsets); - - var _equilizeNoOfElements18 = _slicedToArray(_equilizeNoOfElements17, 2); - - oldOffsets = _equilizeNoOfElements18[0]; - newOffsets = _equilizeNoOfElements18[1]; - - var _equilizeNoOfElements19 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements20 = _slicedToArray(_equilizeNoOfElements19, 2); - - oldLabels = _equilizeNoOfElements20[0]; - newLabels = _equilizeNoOfElements20[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 _equilizeNoOfElements21 = equilizeNoOfElements(oldXPos, newXPos); - - var _equilizeNoOfElements22 = _slicedToArray(_equilizeNoOfElements21, 2); - - oldXPos = _equilizeNoOfElements22[0]; - newXPos = _equilizeNoOfElements22[1]; - - var _equilizeNoOfElements23 = equilizeNoOfElements(oldYPos, newYPos); - - var _equilizeNoOfElements24 = _slicedToArray(_equilizeNoOfElements23, 2); - - oldYPos = _equilizeNoOfElements24[0]; - newYPos = _equilizeNoOfElements24[1]; - - var _equilizeNoOfElements25 = equilizeNoOfElements(oldValues, newValues); - - var _equilizeNoOfElements26 = _slicedToArray(_equilizeNoOfElements25, 2); - - oldValues = _equilizeNoOfElements26[0]; - newValues = _equilizeNoOfElements26[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 = /*#__PURE__*/function (_AggregationChart) { - _inherits(PercentageChart, _AggregationChart); - - var _super = _createSuper(PercentageChart); - - function PercentageChart(parent, args) { - var _this; - - _classCallCheck(this, PercentageChart); - - _this = _super.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(void 0, _toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: "calc", - value: function calc() { - var _this2 = this; - - _get(_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 = /*#__PURE__*/function (_AggregationChart) { - _inherits(PieChart, _AggregationChart); - - var _super = _createSuper(PieChart); - - function PieChart(parent, args) { - var _this; - - _classCallCheck(this, PieChart); - - _this = _super.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(_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(_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, curEnd; - - 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(void 0, _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(".concat(position.x * hoverRadio, "px,").concat(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) { - 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.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; - 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 = /*#__PURE__*/function (_BaseChart) { - _inherits(Heatmap, _BaseChart); - - var _super = _createSuper(Heatmap); - - function Heatmap(parent, options) { - var _this; - - _classCallCheck(this, Heatmap); - - _this = _super.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) { - var date = new Date(timestampSec * NO_OF_MILLIS); - points[getYyyyMmDd(date)] = data.dataPoints[timestampSec]; - }); - 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(void 0, _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; - - 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); - } - } // Set labels - // - // Set type - - - if (!d.chartType) { - 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) { - return { - 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; - - 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 = /*#__PURE__*/function (_BaseChart) { - _inherits(AxisChart, _BaseChart); - - var _super = _createSuper(AxisChart); - - function AxisChart(parent, args) { - var _this; - - _classCallCheck(this, AxisChart); - - _this = _super.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(_getPrototypeOf(AxisChart.prototype), "configure", this).call(this, options); - - options.axisOptions = options.axisOptions || {}; - options.tooltipOptions = options.tooltipOptions || {}; - this.config.xAxisMode = options.axisOptions.xAxisMode || 'span'; - this.config.yAxisMode = options.axisOptions.yAxisMode || 'span'; - this.config.xIsSeries = options.axisOptions.xIsSeries || 0; - this.config.shortenYAxisNumbers = options.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 withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'false'; - var yPts = calcChartIntervals(dataValues, withMinimum); - var scaleMultiplier = this.height / getValueRange(yPts); - var intervalHeight = getIntervalSize(yPts) * scaleMultiplier; - var zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; - this.state.yAxis = { - labels: yPts, - positions: yPts.map(function (d) { - return zeroLine - d * scaleMultiplier; - }), - scaleMultiplier: scaleMultiplier, - zeroLine: zeroLine - }; // Dependent if above changes - - this.calcDatasetPoints(); - this.calcYExtremes(); - this.calcYRegions(); - } - }, { - key: "calcDatasetPoints", - value: function calcDatasetPoints() { - var s = this.state; - - var scaleAll = function scaleAll(values) { - return values.map(function (val) { - return scale(val, s.yAxis); - }); - }; - - s.datasets = this.data.datasets.map(function (d, i) { - var values = d.values; - var cumulativeYs = d.cumulativeYs || []; - return { - name: d.name, - index: i, - chartType: d.chartType, - values: values, - yPositions: scaleAll(values), - cumulativeYs: cumulativeYs, - cumulativeYPos: scaleAll(cumulativeYs) - }; - }); - } - }, { - 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 _this2 = this, - _ref; - - var key = 'values'; - - if (this.barOptions.stacked) { - key = 'cumulativeYs'; - var cumulative = new Array(this.state.datasetLength).fill(0); - this.data.datasets.map(function (d, i) { - var values = _this2.data.datasets[i].values; - d[key] = cumulative = cumulative.map(function (c, i) { - return c + values[i]; - }); - }); - } - - var allValueLists = this.data.datasets.map(function (d) { - return d[key]; - }); - - if (this.data.yMarkers) { - allValueLists.push(this.data.yMarkers.map(function (d) { - return d.value; - })); - } - - if (this.data.yRegions) { - this.data.yRegions.map(function (d) { - allValueLists.push([d.end, d.start]); - }); - } - - return (_ref = []).concat.apply(_ref, _toConsumableArray(allValueLists)); - } - }, { - key: "setupComponents", - value: function setupComponents() { - var _this3 = this; - - var componentConfigs = [['yAxis', { - mode: this.config.yAxisMode, - width: this.width, - shortenNumbers: this.config.shortenYAxisNumbers // pos: 'right' - - }, function () { - return this.state.yAxis; - }.bind(this)], ['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)]]; - 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; - return ['barGraph' + '-' + d.index, { - index: index, - color: _this3.colors[index], - stacked: _this3.barOptions.stacked, - // same for all datasets - valuesOverPoints: _this3.config.valuesOverPoints, - minHeight: _this3.height * MIN_BAR_PERCENT_HEIGHT - }, function () { - var s = this.state; - var d = s.datasets[index]; - 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); - var xPositions = s.xAxis.positions.map(function (x) { - return x - barsWidth / 2; - }); - - if (!stacked) { - xPositions = xPositions.map(function (p) { - return p + barWidth * index; - }); - } - - 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: s.yAxis.zeroLine, - barsWidth: barsWidth, - barWidth: barWidth - }; - }.bind(_this3)]; - }); - var lineConfigs = lineDatasets.map(function (d) { - var index = d.index; - return ['lineGraph' + '-' + d.index, { - index: index, - color: _this3.colors[index], - svgDefs: _this3.svgDefs, - heatline: _this3.lineOptions.heatline, - regionFill: _this3.lineOptions.regionFill, - spline: _this3.lineOptions.spline, - hideDots: _this3.lineOptions.hideDots, - hideLine: _this3.lineOptions.hideLine, - // same for all datasets - valuesOverPoints: _this3.config.valuesOverPoints - }, function () { - var s = this.state; - var d = s.datasets[index]; - var minLine = s.yAxis.positions[0] < s.yAxis.zeroLine ? s.yAxis.positions[0] : s.yAxis.zeroLine; - return { - xPositions: s.xAxis.positions, - yPositions: d.yPositions, - values: d.values, - zeroLine: minLine, - radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE - }; - }.bind(_this3)]; - }); - 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]) || _this3.state[args[0]]; - }).map(function (args) { - var component = getComponent.apply(void 0, _toConsumableArray(args)); - - if (args[0].includes('lineGraph') || args[0].includes('barGraph')) { - _this3.dataUnitComponents.push(component); - } - - return [args[0], component]; - })); - } - }, { - key: "makeDataByIndex", - value: function makeDataByIndex() { - var _this4 = 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 = _this4.state.datasets.map(function (set, i) { - var value = set.values[index]; - return { - title: set.name, - value: value, - yPos: set.yPositions[index], - color: _this4.colors[i], - formatted: formatY ? formatY(value) : value - }; - }); - - _this4.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 _this5 = this; - - // NOTE: could be in tooltip itself, as it is a given functionality for its parent - this.container.addEventListener('mousemove', function (e) { - var m = _this5.measures; - var o = getOffset(_this5.container); - var relX = e.pageX - o.left - getLeftOffset(m); - var relY = e.pageY - o.top; - - if (relY < _this5.height + getTopOffset(m) && relY > getTopOffset(m)) { - _this5.mapTooltipXPosition(relX); - } else { - _this5.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 _this6 = 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, _this6.colors[i], d.name, _this6.config.truncateLegends); - - _this6.legendArea.appendChild(rect); - }); - } - } // Overlay - - }, { - key: "makeOverlay", - value: function makeOverlay$1() { - var _this7 = 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[_this7.state.currentIndex]; - d.overlay = makeOverlay[d.type](currentUnit); - - _this7.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 _this8 = this; - - this.parent.addEventListener('data-select', function () { - _this8.updateOverlay(); - }); - } - }, { - key: "bindUnits", - value: function bindUnits() { - var _this9 = this; - - this.dataUnitComponents.map(function (c) { - c.units.map(function (unit) { - unit.addEventListener('click', function () { - var index = unit.getAttribute('data-point-index'); - - _this9.setCurrentDataPoint(index); - }); - }); - }); // Note: Doesn't work as tooltip is absolutely positioned - - this.tip.container.addEventListener('click', function () { - var index = _this9.tip.container.getAttribute('data-point-index'); - - _this9.setCurrentDataPoint(index); - }); - } - }, { - key: "updateOverlay", - value: function updateOverlay$1() { - var _this10 = this; - - this.overlayGuides.map(function (d) { - var currentUnit = d.units[_this10.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(_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(_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 = /*#__PURE__*/function (_AggregationChart) { - _inherits(DonutChart, _AggregationChart); - - var _super = _createSuper(DonutChart); - - function DonutChart(parent, args) { - var _this; - - _classCallCheck(this, DonutChart); - - _this = _super.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(_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(_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, curEnd; - - 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(void 0, _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(".concat(position.x * hoverRadio, "px,").concat(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.length > 1 ? arguments[1] : undefined; - var options = arguments.length > 2 ? arguments[2] : undefined; - - 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); -}; - -exports.AxisChart = AxisChart; -exports.Chart = Chart; -exports.Heatmap = Heatmap; -exports.PercentageChart = PercentageChart; -exports.PieChart = PieChart; +"use strict";function t(e){return(t="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})(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,i=new Array(e);n=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}!function(t,e){void 0===e&&(e={});var n=e.insertAt;if(t&&"undefined"!=typeof document){var i=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===n&&i.firstChild?i.insertBefore(a,i.firstChild):i.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}(":root {\n --fr-label-color: #313b44;\n --fr-axis-line-color: #E2E6E9;\n --fr-stroke-width: 2px;\n --fr-dataset-circle-stroke: #FFFFFF;\n --fr-dataset-circle-stroke-width: var(--fr-stroke-width);\n --fr-tooltip-title: var(--fr-label-color);\n --fr-tooltip-label: var(--fr-label-color);\n --fr-tooltip-value: #192734;\n --fr-tooltip-bg: #FFFFFF; }\n\n.chart-container {\n position: relative;\n /* for absolutely positioned tooltip */\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; }\n .chart-container .axis, .chart-container .chart-label {\n fill: var(--fr-label-color); }\n .chart-container .axis line, .chart-container .chart-label line {\n stroke: var(--fr-axis-line-color); }\n .chart-container .dataset-units circle {\n stroke: var(--fr-dataset-circle-stroke);\n stroke-width: var(--fr-dataset-circle-stroke-width); }\n .chart-container .dataset-units path {\n fill: none;\n stroke-opacity: 1;\n stroke-width: var(--fr-stroke-width); }\n .chart-container .dataset-path {\n stroke-width: var(--fr-stroke-width); }\n .chart-container .path-group path {\n fill: none;\n stroke-opacity: 1;\n stroke-width: var(--fr-stroke-width); }\n .chart-container line.dashed {\n stroke-dasharray: 5, 3; }\n .chart-container .axis-line .specific-value {\n text-anchor: start; }\n .chart-container .axis-line .y-line {\n text-anchor: end; }\n .chart-container .axis-line .x-line {\n text-anchor: middle; }\n .chart-container .legend-dataset-label {\n fill: var(--fr-tooltip-label);\n font-weight: 600; }\n .chart-container .legend-dataset-value {\n fill: var(--fr-tooltip-value); }\n\n.graph-svg-tip {\n position: absolute;\n z-index: 99999;\n padding: 10px;\n font-size: 12px;\n text-align: center;\n background: var(--fr-tooltip-bg);\n box-shadow: 0px 1px 4px rgba(17, 43, 66, 0.1), 0px 2px 6px rgba(17, 43, 66, 0.08), 0px 40px 30px -30px rgba(17, 43, 66, 0.1);\n border-radius: 6px; }\n .graph-svg-tip ul {\n padding-left: 0;\n display: flex; }\n .graph-svg-tip ol {\n padding-left: 0;\n display: flex; }\n .graph-svg-tip ul.data-point-list li {\n min-width: 90px;\n font-weight: 600; }\n .graph-svg-tip .svg-pointer {\n position: absolute;\n height: 12px;\n width: 12px;\n border-radius: 2px;\n background: var(--fr-tooltip-bg);\n transform: rotate(45deg);\n margin-top: -7px;\n margin-left: -6px; }\n .graph-svg-tip.comparison {\n text-align: left;\n padding: 0px;\n pointer-events: none; }\n .graph-svg-tip.comparison .title {\n display: block;\n padding: 16px;\n margin: 0;\n color: var(--fr-tooltip-title);\n font-weight: 600;\n line-height: 1;\n pointer-events: none;\n text-transform: uppercase; }\n .graph-svg-tip.comparison ul {\n margin: 0;\n white-space: nowrap;\n list-style: none; }\n .graph-svg-tip.comparison ul.tooltip-grid {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 5px; }\n .graph-svg-tip.comparison li {\n display: inline-block;\n display: flex;\n flex-direction: row;\n font-weight: 600;\n line-height: 1;\n padding: 5px 15px 15px 15px; }\n .graph-svg-tip.comparison li .tooltip-legend {\n height: 12px;\n width: 12px;\n margin-right: 8px;\n border-radius: 2px; }\n .graph-svg-tip.comparison li .tooltip-label {\n margin-top: 4px;\n font-size: 11px;\n max-width: 100px;\n color: var(--fr-tooltip-label);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .graph-svg-tip.comparison li .tooltip-value {\n color: var(--fr-tooltip-value); }\n"),f.create=function(e,n){var i=document.createElement(e);for(var a in n){var s=n[a];if("inside"===a)f(s).appendChild(i);else if("around"===a){var r=f(s);r.parentNode.insertBefore(i,r),i.appendChild(r)}else"styles"===a?"object"===t(s)&&Object.keys(s).map((function(t){i.style[t]=s[t]})):a in i?i[a]=s:i.setAttribute(a,s)}return i};var y={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 x(t){return t.titleHeight+t.margins.top+t.paddings.top}function b(t){return t.margins.left+t.paddings.left}function k(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function w(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}var A=["pink","blue","green","grey","red","yellow","purple","teal","cyan","orange"],L={bar:A,line:A,pie:A,percentage:A,heatmap:["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],donut:A},P=Math.PI/180,M=function(){function t(n){var i=n.parent,a=void 0===i?null:i,s=n.colors,r=void 0===s?[]:s;e(this,t),this.parent=a,this.colors=r,this.titleName="",this.titleValue="",this.listValues=[],this.titleValueFirst=0,this.x=0,this.y=0,this.top=0,this.left=0,this.setup()}return i(t,[{key:"setup",value:function(){this.makeTooltip()}},{key:"refresh",value:function(){this.fill(),this.calcPosition()}},{key:"makeTooltip",value:function(){var t=this;this.container=f.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.list=this.container.querySelector(".data-point-list"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",(function(){t.hideTip()}))}},{key:"fill",value:function(){var t,e=this;this.index&&this.container.setAttribute("data-point-index",this.index),t=this.titleValueFirst?"".concat(this.titleValue,"").concat(this.titleName):"".concat(this.titleName,"").concat(this.titleValue,""),this.listValues.length>4?this.list.classList.add("tooltip-grid"):this.list.classList.remove("tooltip-grid"),this.title.innerHTML=t,this.dataPointList.innerHTML="",this.listValues.map((function(t,n){var i=e.colors[n]||"black",a=0===t.formatted||t.formatted?t.formatted:t.value,s=f.create("li",{innerHTML:'
\n\t\t\t\t\t
\n\t\t\t\t\t\t
').concat(0===a||a?a:"",'
\n\t\t\t\t\t\t
').concat(t.title?t.title:"","
\n\t\t\t\t\t
")});e.dataPointList.appendChild(s)}))}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-7.48,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,n=this.container.querySelector(".svg-pointer");if(this.left<0)n.style.left="calc(50% - ".concat(-1*this.left,"px)"),this.left=0;else if(this.left>e){var i=this.left-e,a="calc(50% + ".concat(i,"px)");n.style.left=a,this.left=e}else n.style.left="50%"}},{key:"setValues",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=n.name,this.titleValue=n.value,this.listValues=i,this.x=t,this.y=e,this.titleValueFirst=n.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"}}]),t}();function T(t){return parseFloat(t.toFixed(2))}function C(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n||(n=i?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(n);return t=i?a.concat(t):t.concat(a)}function D(t,e){return(t+"").length*e}function E(t,e){return{x:Math.sin(t*P)*e,y:Math.cos(t*P)*e}}function N(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 S(t,e){var n,i;return t<=e?(n=e-t,i=t):(n=t-e,i=e),[n,i]}function O(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return n>0?t=C(t,n):e=C(e,n),[t,e]}function F(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function z(t){var e;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var n=Math.floor(Math.log10(Math.abs(e)));if(n<=2)return e;var i=Math.floor(n/3),a=Math.pow(10,n-3*i)*+(e/Math.pow(10,n)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][i]}function H(t,e){for(var n=[],i=0;i1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,i={className:t,transform:e};return n&&(i.inside=n),R("g",i)}function Y(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:2;return R("path",{className:e,d:t,styles:{stroke:n,fill:i,"stroke-width":a}})}function V(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="path-fill-gradient-"+e+"-"+(n?"lighter":"default"),a=B(t,i),s=[1,.6,.2];return n&&(s=[.4,.2,0]),I(a,"0%",e,s[0]),I(a,"50%",e,s[1]),I(a,"100%",e,s[2]),i}function U(t,e,n){var i=n/2;return"M".concat(t,",0\n\t\t\th").concat(e-i,"\n\t\t\tq").concat(i,",0 ").concat(i,",").concat(i,"\n\t\t\tq0,").concat(i," -").concat(i,",").concat(i,"\n\t\t\th-").concat(e-i,"\n\t\t\tv").concat(n,"z")}function _(t,e,n){var i=n/2;return"M".concat(t+i,",0\n\t\t\th").concat(e-i,"\n\t\t\tv").concat(n,"\n\t\t\th-").concat(e-i,"\n\t\t\tq-").concat(i,", 0 -").concat(i,",-").concat(i,"\n\t\t\tq0,-").concat(i," ").concat(i,",-").concat(i,"z")}function q(t,e,n,i,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:n,width:i,height:i,rx:a,fill:s};return Object.keys(r).map((function(t){o[t]=r[t]})),R("rect",o)}function G(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||10,r=void 0!==a.dy?a.dy:s/2,o=a.fill||"#313B44",l=a.textAnchor||"start";return R("text",{className:t,x:e,y:n,dy:r+"px","font-size":s+"px",fill:o,"text-anchor":l,innerHTML:i})}function X(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke="#E2E6E9");var s=R("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:n,y2:i,styles:{stroke:a.stroke}}),r=R("text",{x:0,y:n>i?n+4:n-4-10,dy:"10px","font-size":"10px","text-anchor":"middle",innerHTML:e+""}),o=R("g",{transform:"translate(".concat(t,", 0)")});return o.appendChild(s),o.appendChild(r),o}function J(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke="#E2E6E9"),a.lineType||(a.lineType=""),a.shortenNumbers&&(e=z(e));var s="line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),r=R("line",{className:s,x1:n,x2:i,y1:0,y2:0,styles:{stroke:a.stroke}}),o=R("text",{x:n255?255:t<0?0:t}function tt(t,e){var n=et(t),i=!1;"#"==n[0]&&(n=n.slice(1),i=!0);var a=parseInt(n,16),s=Z((a>>16)+e),r=Z((a>>8&255)+e);return(i?"#":"")+(Z((255&a)+e)|r<<8|s<<16).toString(16)}var et=function(t){return Q[t]||t};function nt(t,e,n,i){var a="string"==typeof e?e:e.join(", ");return[t,{transform:n.join(", ")},i,"easein","translate",{transform:a}]}function it(t,e,n){return nt(t,[0,n],[0,e],350)}function at(t,e){return[t,{d:e},350,"easein"]}var st={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"};function rt(t,e,n){var i=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 c=void 0;c="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),h=e[l],d={attributeName:l,from:u,to:h,begin:"0s",dur:n/1e3+"s",values:u+";"+h,keySplines:st[i],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};for(var p in a&&(d.type=a),d)c.setAttribute(p,d[p]);r.appendChild(c),a?o.setAttribute(l,"translate(".concat(h,")")):o.setAttribute(l,h)}return[r,o]}function ot(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function lt(t,e){var n=[],i=[];e.map((function(t){var e,a,s=t[0],r=s.parentNode;t[0]=s;var o=u(rt.apply(void 0,h(t)),2);e=o[0],a=o[1],n.push(a),i.push([e,r]),r.replaceChild(e,s)}));var a=t.cloneNode(!0);return i.map((function(t,i){t[1].replaceChild(n[i],t[0]),e[i][0]=n[i]})),a}function ct(t,e,n){if(0!==n.length){var i=lt(e,n);e.parentNode==t&&(t.removeChild(e),t.appendChild(i)),setTimeout((function(){i.parentNode==t&&(t.removeChild(i),t.appendChild(e))}),250)}}var ut=function(){function t(n,i){if(e(this,t),this.parent="string"==typeof n?document.querySelector(n):n,!(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(y));var a=this.measures;this.setMeasures(i),this.title.length||(a.titleHeight=0),this.config.showLegend||(a.legendHeight=0),this.argHeight=i.height||a.baseHeight,this.state={},this.options={},this.initTimeout=700,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return i(t,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var n=[];return(t=(t||[]).concat(L[e])).forEach((function(t){var e=et(t);!function(t){return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i.test(t)}(e)?console.warn('"'+t+'" is not a valid color.'):n.push(e)})),n}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-k(this.measures),this.boundDrawFn=function(){return t.draw(!0)},window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){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 t={inside:this.parent,className:"chart-container"};this.independentWidth&&(t.styles={width:this.independentWidth+"px"}),this.container=f.create("div",t)}},{key:"makeTooltip",value:function(){this.tip=new M({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&&g(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(){var t,e,n;this.baseWidth=(t=this.parent,e=window.getComputedStyle(t),n=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight),t.clientWidth-n),this.width=this.baseWidth-w(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t,e,n,i,a=this.measures;this.svg=(t=this.container,e="frappe-chart chart",n=this.baseWidth,i=this.baseHeight,R("svg",{className:e,inside:t,width:n,height:i})),this.svgDefs=R("defs",{inside:this.svg}),this.title.length&&(this.titleEL=G("title",a.margins.left,a.margins.top,this.title,{fontSize:a.titleFontSize,fill:"#666666",dy:a.titleFontSize}));var s=x(a);this.drawArea=j(this.type+"-chart chart-draw-area","translate(".concat(b(a),", ").concat(s,")")),this.config.showLegend&&(s+=this.height+a.paddings.bottom,this.legendArea=j("chart-legend","translate(".concat(b(a),", ").concat(s,")"))),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(b(a),x(a))}},{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)}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map((function(t){return t.parentNode.removeChild(t)}));var i=[];e.forEach((function(t){i=i.concat(t.update(n))})),i.length>0?(ct(this.container,this.svg,i),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){m(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=function(t){var e=t.cloneNode(!0);e.classList.add("chart-container"),e.setAttribute("xmlns","http://www.w3.org/2000/svg"),e.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=f.create("style",{innerHTML:".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;}.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}"});e.insertBefore(n,e.firstChild);var i=f.create("div");return i.appendChild(e),i.innerHTML}(this.svg);!function(t,e){var n=document.createElement("a");n.style="display: none";var i=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(i);n.href=a,n.download=t,document.body.appendChild(n),n.click(),setTimeout((function(){document.body.removeChild(n),window.URL.revokeObjectURL(a)}),300)}(this.title||"Chart",[t])}}]),t}(),ht=function(t){a(r,ut);var n=l(r);function r(t,i){return e(this,r),n.call(this,t,i)}return i(r,[{key:"configure",value:function(t){c(s(r.prototype),"configure",this).call(this,t),this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,n=this.config.maxSlices;e.sliceTotals=[];var i=this.data.labels.map((function(e,n){var i=0;return t.data.datasets.map((function(t){i+=t.values[n]})),[i,e]})).filter((function(t){return t[0]>=0})),a=i;if(i.length>n){i.sort((function(t,e){return e[0]-t[0]})),a=i.slice(0,n-1);var s=i.slice(n-1),r=0;s.map((function(t){r+=t[0]})),a.push([r,"Rest"]),this.colors[n-1]="grey"}e.labels=[],a.map((function(t){e.sliceTotals.push(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 n=0,i=0;this.legendTotals.map((function(a,s){var r=150,o=Math.floor((t.width-w(t.measures))/r);t.legendTotals.lengtho&&(n=0,i+=60);var l=r*n+5,c=t.config.truncateLegends?F(e.labels[s],r/10):e.labels[s],u=function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"none",s=arguments.length>5?arguments[5]:void 0,r=arguments.length>6?arguments[6]:void 0,o=arguments.length>7&&void 0!==arguments[7]&&arguments[7],l={className:"legend-dot",x:0,y:4-n,height:n,width:n,rx:i,fill:a},c=R("text",{className:"legend-dataset-label",x:n,y:0,dx:"10px",dy:10/3+"px","font-size":"16px","text-anchor":"start",fill:"#313B44",innerHTML:s=o?F(s,15):s}),u=R("text",{className:"legend-dataset-value",x:n,y:20,dx:"10px",dy:10/3+"px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:r}),h=R("g",{transform:"translate(".concat(t,", ").concat(e,")")});return h.appendChild(R("rect",l)),h.appendChild(c),h.appendChild(u),h}(l,i,12,3,t.colors[s],c,a,!1);t.legendArea.appendChild(u),n++}))}}]),r}(),dt=["January","February","March","April","May","June","July","August","September","October","November","December"],pt=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];function ft(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function vt(t){var e=t.getDate(),n=t.getMonth()+1;return[t.getFullYear(),(n>9?"":"0")+n,(e>9?"":"0")+e].join("-")}function gt(t){return new Date(t.getTime())}function mt(t,e){var n=kt(t);return Math.ceil(function(t,e){return(ft(e)-ft(t))/864e5}(n,e)/7)}function yt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function xt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=dt[t];return e?n.slice(0,3):n}function bt(t,e){return new Date(e,t+1,0)}function kt(t){var e=gt(t),n=e.getDay();return 0!==n&&wt(e,-1*n),e}function wt(t,e){t.setDate(t.getDate()+e)}var At=function(){function t(n){var i=n.layerClass,a=void 0===i?"":i,s=n.layerTransform,r=void 0===s?"":s,o=n.constants,l=n.getData,c=n.makeElements,u=n.animateElements;e(this,t),this.layerTransform=r,this.constants=o,this.makeElements=c,this.getData=l,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=a,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return i(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=j(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){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}(),Lt={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=Y(e,"donut-path",t.colors[n],"none",t.strokeWidth);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return at(e,t.sliceStrings[n])}))}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=Y(e,"pie-path","none",t.colors[n]);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return at(e,t.sliceStrings[n])}))}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this,n=t.xPositions.length;return t.xPositions.map((function(i,a){var s=a==n-1,r=0==a;return function(t,e,n,i,a,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:"none";if(s){var o=U(t,n,i);return Y(o,"percentage-bar",null,r)}if(a){var l=_(t,n,i);return Y(l,"percentage-bar",null,r)}var c={className:"percentage-bar",x:t,y:e,width:n,height:i,fill:r};return R("rect",c)}(i,0,t.widths[a],e.constants.barHeight,r,s,t.colors[a])}))},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};N(t)||(t=0),i.pos||(i.pos="left"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke="#E2E6E9"),i.className||(i.className="");var a=-6,s="span"===i.mode?n+6:0;return"tick"===i.mode&&"right"===i.pos&&(a=n+6,s=n),J(t,e,a+=i.offset,s+=i.offset,{stroke:i.stroke,className:i.className,lineType:i.lineType,shortenNumbers:i.shortenNumbers})}(n,t.labels[i],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})}))},animateElements:function(t){var e=t.positions,n=t.labels,i=this.oldData.positions,a=this.oldData.labels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,labels:n}),this.store.map((function(t,n){return it(t,e[n],i[n])}))}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};N(t)||(t=0),i.pos||(i.pos="bottom"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke="#E2E6E9"),i.className||(i.className="");var a=n+6,s="span"===i.mode?-6:n;return"tick"===i.mode&&"top"===i.pos&&(a=-6,s=0),X(t,e,a,s,{stroke:i.stroke,className:i.className,lineType:i.lineType})}(n,t.calcLabels[i],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})}))},animateElements:function(t){var e=t.positions,n=t.calcLabels,i=this.oldData.positions,a=this.oldData.calcLabels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,calcLabels:n}),this.store.map((function(t,n){return function(t,e,n){return nt(t,[n,0],[e,0],350)}(t,e[n],i[n])}))}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};i.labelPos||(i.labelPos="right");var a="left"===i.labelPos?4:n-D(e,5)-4,s=R("text",{className:"chart-label",x:a,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:e+""}),r=J(t,"",0,n,{stroke:i.stroke||"#E2E6E9",className:i.className||"",lineType:i.lineType});return r.appendChild(s),r}(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.position})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.options})),s=this.oldData.map((function(t){return t.position}));return this.render(s.map((function(t,e){return{position:s[e],label:i[e],options:a[e]}}))),this.store.map((function(t,e){return it(t,n[e],s[e])}))}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=R("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:"#E2E6E9","stroke-dasharray":"".concat(n,", ").concat(s)},x:0,y:0,width:n,height:s});a.labelPos||(a.labelPos="right");var o="left"===a.labelPos?4:n-D(i+"",4.5)-4,l=R("text",{className:"chart-label",x:o,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:i+""}),c=R("g",{transform:"translate(0, ".concat(e,")")});return c.appendChild(r),c.appendChild(l),c}(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.endPos})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.startPos})),s=t.map((function(t){return t.options})),r=this.oldData.map((function(t){return t.endPos})),o=this.oldData.map((function(t){return t.startPos}));this.render(r.map((function(t,e){return{startPos:o[e],endPos:r[e],label:i[e],options:s[e]}})));var l=[];return this.store.map((function(t,e){l=l.concat(function(t,e,n,i){var a=e-n,s=t.childNodes[0],r=s.getAttribute("width");return[[s,{height:a,"stroke-dasharray":"".concat(r,", ").concat(a)},350,"easein"],nt(t,[0,i],[0,n],350)]}(t,a[e],n[e],r[e]))})),l}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,n=this.constants,i=n.index,a=n.colWidth,s=n.rowHeight,r=n.squareSize,o=n.radius,l=n.xTranslate,c=l,u=0;return this.serializedSubDomains=[],t.cols.map((function(t,n){1===n&&e.labels.push(G("domain-name",c,-12,xt(i,!0).toUpperCase(),{fontSize:9})),t.map((function(t,n){if(t.fill){var i={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":n},a=q("day",c,u,r,o,t.fill,i);e.serializedSubDomains.push(a)}u+=s})),u=0,c+=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(n,i){return function(t,e,n,i){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=S(e,o.zeroLine),c=u(l,2),h=c[0],d=c[1];d-=r,0===h&&(h=o.minHeight,d-=o.minHeight),N(t)||(t=0),N(d)||(d=0),N(h,!0)||(h=0),N(n,!0)||(n=0);var p=R("rect",{className:"bar mini",style:"fill: ".concat(i),"data-point-index":s,x:t,y:d,width:n,height:h});if((a+="")||a.length){p.setAttribute("y",0),p.setAttribute("x",0);var f=R("text",{className:"data-point-value",x:n/2,y:0,dy:"-5px","font-size":"10px","text-anchor":"middle",innerHTML:a}),v=R("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(d,")")});return v.appendChild(p),v.appendChild(f),v}return p}(t.xPositions[i],n,t.barWidth,e.color,t.labels[i],i,t.offsets[i],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})})),this.units},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,c=u(O(s,e),2);s=c[0],e=c[1];var h=u(O(r,n),2);r=h[0],n=h[1];var d=u(O(o,i),2);o=d[0],i=d[1];var p=u(O(l,a),2);l=p[0],a=p[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var f=[];return this.store.map((function(a,s){f=f.concat(function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=S(n,s.zeroLine),o=u(r,2),l=o[0],c=o[1];if(c-=a,"rect"!==t.nodeName){var h=t.childNodes[0],d=[h,{width:i,height:l},350,"easein"],p=t.getAttribute("transform").split("(")[1].slice(0,-1),f=nt(t,p,[e,c],350);return[d,f]}return[[t,{width:i,height:l,x:e,y:c},350,"easein"]]}(a,e[s],n[s],t.barWidth,i[s],{zeroLine:t.zeroLine}))})),f}},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=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map((function(e,n){return t[n]+","+e})),r=s.join("L");i.spline&&(r=H(t,e));var o=Y("M"+r,"line-graph-path",n);if(i.heatline){var l=V(a.svgDefs,n);o.style.stroke="url(#".concat(l,")")}var c={path:o};if(i.regionFill){var u=V(a.svgDefs,n,!0),h="M"+"".concat(t[0],",").concat(a.zeroLine,"L")+r+"L".concat(t.slice(-1)[0],",").concat(a.zeroLine);c.region=Y(h,"region-fill","none","url(#".concat(u,")"))}return c}(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(n,i){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=R("circle",{style:"fill: ".concat(i),"data-point-index":s,cx:t,cy:e,r:n});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=R("text",{className:"data-point-value",x:0,y:0,dy:-5-n+"px","font-size":"10px","text-anchor":"middle",innerHTML:a}),l=R("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(r),l.appendChild(o),l}return r}(t.xPositions[i],n,t.radius,e.color,e.valuesOverPoints?t.values[i]:"",i)}))),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=u(O(a,e),2);a=o[0],e=o[1];var l=u(O(s,n),2);s=l[0],n=l[1];var c=u(O(r,i),2);r=c[0],i=c[1],this.render({xPositions:a,yPositions:s,values:i,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var h=[];return Object.keys(this.paths).length&&(h=h.concat(function(t,e,n,i,a){var s=[],r=n.map((function(t,n){return e[n]+","+t})).join("L");a&&(r=H(e,n));var o=[t.path,{d:"M"+r},350,"easein"];if(s.push(o),t.region){var l="".concat(e[0],",").concat(i,"L"),c="L".concat(e.slice(-1)[0],", ").concat(i),u=[t.region,{d:"M"+l+r+c},350,"easein"];s.push(u)}return s}(this.paths,e,n,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map((function(t,i){h=h.concat(function(t,e,n){if("circle"!==t.nodeName){var i=t.getAttribute("transform").split("(")[1].slice(0,-1);return[nt(t,i,[e,n],350)]}return[[t,{cx:e,cy:n},350,"easein"]]}(t,e[i],n[i]))})),h}}};function Pt(t,e,n){var i=Object.keys(Lt).filter((function(e){return t.includes(e)})),a=Lt[i[0]];return Object.assign(a,{constants:e,getData:n}),new At(a)}var Mt=function(t){a(r,ht);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="percentage",a.setup(),a}return i(r,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var n=this.barOptions;n.height=n.height||16,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(n.height+.5*n.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map((function(t){var e=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calc",value:function(){var t=this;c(s(r.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,e=this.state;this.container.addEventListener("mousemove",(function(n){var i=t.components.get("percentageBars").store,a=n.target;if(i.includes(a)){var s=i.indexOf(a),r=v(t.container),o=v(a),l=o.left-r.left+parseInt(a.getAttribute("width"))/2,c=o.top-r.top,u=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[s]:t.state.labels[s])+": ",h=e.sliceTotals[s]/e.grandTotal;t.tip.setValues(l,c,{name:u,value:(100*h).toFixed(1)+"%"}),t.tip.showTip()}}))}}]),r}(),Tt=function(t){a(r,ht);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="pie",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.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;c(s(r.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,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,p=i?-h:h,f=o+=p,v=E(u,n),g=E(f,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*n.y,u=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z\n\t\tL").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u," z")}(l,c,t.center,t.radius,i,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z")}(l,c,t.center,t.radius,i,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:f,angle:p})})),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=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=E(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.fill=tt(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=a}}},{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,n=this.components.get("pieSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!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)}}]),r}();function Ct(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 n=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,n)),n]}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Math.ceil(t),i=Math.floor(e),a=n-i,s=a,r=1;a>5&&(a%2!=0&&(a=++n-i),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(i+r*l);return o}function Et(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Ct(t),i=u(n,2),a=i[0],s=i[1],r=e?e/Math.pow(10,s):0,o=Dt(a=a.toFixed(6),r);return o=o.map((function(t){return t*Math.pow(10,s)}))}function Nt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,h(t)),i=Math.min.apply(Math,h(t)),a=[];function s(t,e){for(var n=Et(t),i=n[1]-n[0],a=0,s=1;a=0&&i>=0)Ct(n)[1],a=e?Et(n,i):Et(n);else if(n>0&&i<0){var r=Math.abs(i);if(n>=r)Ct(n)[1],a=s(n,r);else{Ct(r)[1];var o=s(r,n);a=o.map((function(t){return-1*t}))}}else if(n<=0&&i<=0){var l=Math.abs(i),c=Math.abs(n);Ct(l)[1],a=(a=e?Et(l,c):Et(l)).reverse().map((function(t){return-1*t}))}return a}function St(t){var e,n=Ot(t);if(t.indexOf(0)>=0)e=t.indexOf(0);else if(t[0]>0){e=-1*t[0]/n}else{e=-1*t[t.length-1]/n+(t.length-1)}return e}function Ot(t){return t[1]-t[0]}function Ft(t){return t[t.length-1]-t[0]}function zt(t,e){return T(e.zeroLine-t*e.scaleMultiplier)}var Ht=function(t){a(s,ut);var n=l(s);function s(t,i){var a;e(this,s),(a=n.call(this,t,i)).type="heatmap",a.countLabel=i.countLabel||"";var r=["Sunday","Monday"],o=r.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return a.startSubDomainIndex=r.indexOf(o),a.setup(),a}return i(s,[{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=84+k(e);var n=this.data,i=this.discreteDomains?12:0;this.independentWidth=12*(mt(n.start,n.end)+i)+w(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+w(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(n){var i=new Date(1e3*n);e[vt(i)]=t.dataPoints[n]})),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=gt(this.data.start),t.end=gt(this.data.end),t.firstWeekStart=gt(t.start),t.noOfWeeks=mt(t.start,t.end),t.distribution=function(t,e){for(var n=Math.max.apply(Math,h(t)),i=1/(e-1),a=[],s=0;s1&&void 0!==arguments[1]?arguments[1]:"",n=[t.getMonth(),t.getFullYear()],i=n[0],a=n[1],s=kt(t),r={index:i,cols:[]};wt(e=gt(e)||bt(i,a),1);for(var o,l=mt(s,e),c=[],u=0;u2&&void 0!==arguments[2]&&arguments[2],i=this.state,a=gt(t),s=[],r=0;r<7;r++,wt(a,1)){var o={},l=a>=i.start&&a<=i.end;n||a.getMonth()!==e||!l?o.yyyyMmDd=vt(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e,n,i=vt(t),a=this.data.dataPoints[i];return{yyyyMmDd:i,dataValue:a||0,fill:this.colors[(e=a,n=this.state.distribution,n.filter((function(t){return tn?i.slice(0,n):C(i,n-i.length,0)}else t.values=a;t.chartType||(t.chartType=e)})),t.yRegions&&t.yRegions.map((function(t){if(t.end0&&void 0!==arguments[0]?arguments[0]:this.data;return Wt(t,this.type)}},{key:"prepareFirstData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;return Rt(t)}},{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,n){return T(t.xOffset+n*t.unitWidth)}))}}},{key:"calcYAxisParameters",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=Nt(t,e),i=this.height/Ft(n),a=Ot(n)*i,s=this.height-St(n)*a;this.state.yAxis={labels:n,positions:n.map((function(t){return s-t*i})),scaleMultiplier:i,zeroLine:s},this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e){return e.map((function(e){return zt(e,t.yAxis)}))};t.datasets=this.data.datasets.map((function(t,n){var i=t.values,a=t.cumulativeYs||[];return{name:t.name,index:n,chartType:t.chartType,values:i,yPositions:e(i),cumulativeYs:a,cumulativeYPos:e(a)}}))}},{key:"calcYExtremes",value:function(){var t=this.state;this.barOptions.stacked?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,n){e1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=t/e.length;i<=0&&(i=1);var a,s=i/7;if(n){var r=Math.max.apply(Math,h(e.map((function(t){return t.length}))));a=Math.ceil(r/s)}var o=e.map((function(t,e){return(t+="").length>s&&(n?e%a!=0&&(t=""):t=s-3>0?t.slice(0,s-3)+" ...":t.slice(0,s)+".."),t}));return o}(this.width,t.xAxis.labels,this.config.xIsSeries),t.xAxis}.bind(this)],["yRegions",{width:this.width,pos:"right"},function(){return this.state.yRegions}.bind(this)]],n=this.state.datasets.filter((function(t){return"bar"===t.chartType})),i=this.state.datasets.filter((function(t){return"line"===t.chartType})),a=n.map((function(e){var i=e.index;return["barGraph-"+e.index,{index:i,color:t.colors[i],stacked:t.barOptions.stacked,valuesOverPoints:t.config.valuesOverPoints,minHeight:0*t.height},function(){var t=this.state,e=t.datasets[i],a=this.barOptions.stacked,s=this.barOptions.spaceRatio||.8,r=t.unitWidth*(1-s),o=r/(a?1:n.length),l=t.xAxis.positions.map((function(t){return t-r/2}));a||(l=l.map((function(t){return t+o*i})));var c=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(c=a&&e.index===t.datasets.length-1?e.cumulativeYs:e.values);var u=new Array(t.datasetLength).fill(0);return a&&(u=e.yPositions.map((function(t,n){return t-e.cumulativeYPos[n]}))),{xPositions:l,yPositions:e.yPositions,offsets:u,labels:c,zeroLine:t.yAxis.zeroLine,barsWidth:r,barWidth:o}}.bind(t)]})),s=i.map((function(e){var n=e.index;return["lineGraph-"+e.index,{index:n,color:t.colors[n],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[n],i=t.yAxis.positions[0]x(n)?t.mapTooltipXPosition(a):t.tip.hideTip()}))}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var n=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=e.reduce((function(e,n){return Math.abs(n-t)=0){var i=this.dataByIndex[n];this.tip.setValues(i.xPos+this.tip.offset.x,i.yExtreme+this.tip.offset.y,{name:i.formattedLabel,value:""},i.values,n),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,n){var i=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]&&arguments[5],r={className:"legend-bar",x:0,y:0,width:n,height:"2px",fill:i},o=R("text",{className:"legend-dataset-text",x:0,y:0,dy:"20px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:a=s?F(a,15):a}),l=R("g",{transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(R("rect",r)),l.appendChild(o),l}(100*n,"0",100,t.colors[n],e.name,t.config.truncateLegends);t.legendArea.appendChild(i)})))}},{key:"makeOverlay",value:function(){var t=this;this.init?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 n=e.units[t.state.currentIndex];e.overlay=K[e.type](n),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 n=e.getAttribute("data-point-index");t.setCurrentDataPoint(n)}))}))})),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 n=e.units[t.state.currentIndex];$[e.type](n,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,n={index:t,label:e.xAxis.labels[t],values:e.datasets.map((function(e){return e.values[t]}))};return n}},{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,function(t,e,n){var i=document.createEvent("HTMLEvents");for(var a in i.initEvent(e,!0,!0),n)i[a]=n[a];t.dispatchEvent(i)}(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;c(s(r.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||(c(s(r.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,n){t[n]&&(e.values=t[n])})),this.update(this.data)}}]),r}(),It={bar:Bt,line:Bt,percentage:Mt,heatmap:Ht,pie:Tt,donut:function(t){a(r,ht);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="donut",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.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;c(s(r.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,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,p=i?-h:h,f=o+=p,v=E(u,n),g=E(f,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*i+o,u=n.y+t.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c,"\n\t\tM").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u)}(l,c,t.center,t.radius,t.clockWise,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c)}(l,c,t.center,t.radius,t.clockWise,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:f,angle:p})})),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=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=E(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.stroke=tt(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=a}}},{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,n=this.components.get("donutSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!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)}}]),r}()};exports.AxisChart=Bt,exports.Chart=function t(n,i){return e(this,t),function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0;return"axis-mixed"===t?(n.type="line",new Bt(e,n)):It[t]?new It[t](e,n):void console.error("Undefined chart type: "+t)}(i.type,n,i)},exports.Heatmap=Ht,exports.PercentageChart=Mt,exports.PieChart=Tt; +//# sourceMappingURL=frappe-charts.cjs.js.map diff --git a/dist/frappe-charts.cjs.js.map b/dist/frappe-charts.cjs.js.map new file mode 100644 index 0000000..ff9b69e --- /dev/null +++ b/dist/frappe-charts.cjs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"frappe-charts.cjs.js","sources":["../src/js/utils/dom.js","../node_modules/style-inject/dist/style-inject.es.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/draw.js","../src/js/utils/colors.js","../src/js/utils/animate.js","../src/js/utils/animation.js","../src/js/charts/BaseChart.js","../src/js/utils/export.js","../src/css/chartsCss.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/chart.js","../src/js/charts/DonutChart.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","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 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.8;\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 = 16;\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 = 7.48;\nconst DEFAULT_CHART_COLORS = ['pink', 'blue', 'green', 'grey', 'red', 'yellow', 'purple', 'teal', 'cyan', 'orange'];\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.list = this.container.querySelector('.data-point-list');\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\n\t\tif (this.listValues.length > 4) {\n\t\t\tthis.list.classList.add('tooltip-grid');\n\t\t} else {\n\t\t\tthis.list.classList.remove('tooltip-grid');\n\t\t}\n\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\t\t\tlet li = $.create('li', {\n\t\t\t\tinnerHTML: `
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    ${ value === 0 || value ? value : '' }
    \n\t\t\t\t\t\t
    ${set.title ? set.title : '' }
    \n\t\t\t\t\t
    `\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}","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","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR } from './constants';\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 = '#E2E6E9';\nconst FONT_FILL = '#313B44';\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 makeRoundedCornerBarPath(x, width, height) {\n\tlet radius = height/2;\n\n\treturn `M${x},0\n\t\t\th${width - radius}\n\t\t\tq${radius},0 ${radius},${radius}\n\t\t\tq0,${radius} -${radius},${radius}\n\t\t\th-${width - radius}\n\t\t\tv${height}z`;\n}\n\nexport function makeRoundedCornerBarPathLast(x, width, height) {\n\tlet radius = height/2;\n\n\treturn `M${x + radius},0\n\t\t\th${width - radius}\n\t\t\tv${height}\n\t\t\th-${width - radius}\n\t\t\tq-${radius}, 0 -${radius},-${radius}\n\t\t\tq0,-${radius} ${radius},-${radius}z`;\n}\n\n\nexport function percentageBar(x, y, width, height, isFirst, isLast, fill='none') {\n\t// https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90\n\t// \n\t// \n\n\tif (isLast) {\n\t\tlet pathStr = makeRoundedCornerBarPath(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\n\tif (isFirst) {\n\t\tlet pathStr = makeRoundedCornerBarPathLast(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\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};\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, radius, fill='none', label, value, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tx: 0,\n\t\ty: 4 - size,\n\t\theight: size,\n\t\twidth: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tlet textLabel = createSVG('text', {\n\t\tclassName: 'legend-dataset-label',\n\t\tx: size,\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.6) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet textValue = createSVG('text', {\n\t\tclassName: 'legend-dataset-value',\n\t\tx: size,\n\t\ty: FONT_SIZE + 10,\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: value\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(textLabel);\n\tgroup.appendChild(textValue);\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\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.lineType) options.lineType = '';\n\tif (options.shortenNumbers) label = shortenLargeNumber(label);\n\n\tlet className = 'line-horizontal ' + options.className +\n\t\t(options.lineType === \"dashed\" ? \"dashed\": \"\");\n\n\tlet l = createSVG('line', {\n\t\tclassName: className,\n\t\tx1: x1,\n\t\tx2: x2,\n\t\ty1: 0,\n\t\ty2: 0,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / 2 - 2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': x1 < x2 ? 'end' : 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(0, ${y})`,\n\t\t'stroke-opacity': 1\n\t});\n\n\tif(text === 0 || text === '0') {\n\t\tline.style.stroke = \"rgba(27, 31, 35, 0.6)\";\n\t}\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nexport function yLine(y, label, width, options={}) {\n\tif (!isValidNumber(y)) y = 0;\n\n\tif(!options.pos) options.pos = 'left';\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\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType,\n\t\tshortenNumbers: options.shortenNumbers\n\t});\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","const PRESET_COLOR_MAP = {\n\t'pink': '#F683AE',\n\t'blue': '#318AD8',\n\t'green': '#48BB74',\n\t'grey': '#A6B1B9',\n\t'red': '#F56B6B',\n\t'yellow': '#FACF7A',\n\t'purple': '#44427B',\n\t'teal': '#5FD8C4',\n\t'cyan': '#15CCEF',\n\t'orange': '#F8814F',\n\t'light-pink': '#FED7E5',\n\t'light-blue': '#BFDDF7',\n\t'light-green': '#48BB74',\n\t'light-grey': '#F4F5F6',\n\t'light-red': '#F6DFDF',\n\t'light-yellow': '#FEE9BF',\n\t'light-purple': '#E8E8F7',\n\t'light-teal': '#D3FDF6',\n\t'light-cyan': '#DDF8FD',\n\t'light-orange': '#FECDB8'\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\treturn PRESET_COLOR_MAP[color] || color;\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\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\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 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';\n\nexport default class BaseChart {\n\tconstructor(parent, 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\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\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}\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 { $ } 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","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;}.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 BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\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.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(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 += 60;\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 dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t12,\n\t\t\t\t3,\n\t\t\t\tthis.colors[i],\n\t\t\t\tlabel,\n\t\t\t\td,\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 { makeText, makePath, xLine, yLine, yMarker, yRegion, datasetBar, datasetDot, percentageBar, getPaths, heatSquare } from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport { translateHoriLine, translateVertLine, animateRegion, animateBar,\n\tanimateDot, animatePath, animatePathStr } from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n\tconstructor({\n\t\tlayerClass = '',\n\t\tlayerTransform = '',\n\t\tconstants,\n\n\t\tgetData,\n\t\tmakeElements,\n\t\tanimateElements\n\t}) {\n\t\tthis.layerTransform = layerTransform;\n\t\tthis.constants = constants;\n\n\t\tthis.makeElements = makeElements;\n\t\tthis.getData = getData;\n\n\t\tthis.animateElements = animateElements;\n\n\t\tthis.store = [];\n\t\tthis.labels = [];\n\n\t\tthis.layerClass = layerClass;\n\t\tthis.layerClass = typeof(this.layerClass) === 'function'\n\t\t\t? this.layerClass() : this.layerClass;\n\n\t\tthis.refresh();\n\t}\n\n\trefresh(data) {\n\t\tthis.data = data || this.getData();\n\t}\n\n\tsetup(parent) {\n\t\tthis.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n\t}\n\n\tmake() {\n\t\tthis.render(this.data);\n\t\tthis.oldData = this.data;\n\t}\n\n\trender(data) {\n\t\tthis.store = this.makeElements(data);\n\n\t\tthis.layer.textContent = '';\n\t\tthis.store.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t\tthis.labels.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t}\n\n\tupdate(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\tconst numberOfPoints = data.xPositions.length;\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\n\t\t\t\tlet isLast = i == numberOfPoints - 1;\n\t\t\t\tlet isFirst = i == 0;\n\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i], this.constants.barHeight, isFirst, isLast, 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\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos, shortenNumbers: this.constants.shortenNumbers})\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.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\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\tlabels: newLabels\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\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\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\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\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(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 newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\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 } 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\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},\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 => value * Math.pow(10, exponent));\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.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}\n\n\t\t// Set labels\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\tlet zeroData = {\n\t\tlabels: realData.labels.slice(0, -1),\n\t\tdatasets: realData.datasets.map(d => {\n\t\t\treturn {\n\t\t\t\tname: '',\n\t\t\t\tvalues: zeroArray.slice(0, -1),\n\t\t\t\tchartType: d.chartType\n\t\t\t};\n\t\t}),\n\t};\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\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\t\tthis.config.shortenYAxisNumbers = options.axisOptions.shortenYAxisNumbers || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.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\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\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\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tshortenNumbers: this.config.shortenYAxisNumbers\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\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\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\t\t\tlet index = d.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\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth * (1 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\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: s.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\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + 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\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\tspline: this.lineOptions.spline,\n\t\t\t\t\thideDots: this.lineOptions.hideDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\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},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\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 '../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 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"],"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","css","ref","insertAt","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","create","tag","o","i","val","parentNode","_typeof","Object","keys","map","prop","setAttribute","BASE_MEASURES","margins","paddings","baseHeight","titleHeight","legendHeight","titleFontSize","getTopOffset","m","getLeftOffset","getExtraHeight","getExtraWidth","DEFAULT_CHART_COLORS","DEFAULT_COLORS","bar","line","pie","percentage","heatmap","donut","ANGLE_RATIO","Math","PI","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","inside","this","className","innerHTML","hideTip","title","list","dataPointList","addEventListener","_this","index","length","classList","add","remove","set","color","_this2","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","parseFloat","toFixed","fillArray","array","count","start","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","round","getSplineCurvePointsStr","xList","yList","points","push","controlPoint","current","previous","next","reverse","pointA","pointB","lengthX","lengthY","sqrt","atan2","command","reduce","acc","point","a","pointStr","cps","cpe","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","id","x1","x2","y1","y2","setGradientStop","gradElem","offset","makeSVGGroup","transform","args","makePath","pathStr","stroke","strokeWidth","styles","makeGradient","lighter","gradientDef","opacities","makeRoundedCornerBarPath","makeRoundedCornerBarPathLast","heatSquare","size","data","rx","key","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","text","FONT_SIZE","makeHoriLine","lineType","shortenNumbers","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","parseInt","updateOverlay","attributes","values","filter","attr","includes","specified","nodeValue","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","b","toString","translate","oldCoord","newCoord","duration","old","join","translateHoriLine","yLine","newY","oldY","animatePathStr","oldPath","EASING","ease","linear","easein","easeout","easeinout","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","from","to","begin","keySplines","keyTimes","calcMode","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","svgContainer","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","setTimeout","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","showTooltip","showLegend","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","argHeight","state","initTimeout","overlays","configure","validColors","forEach","test","isValidColor","console","warn","boundDrawFn","draw","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","drawArea","render","update","renderLegend","setupNavigation","padding","baseWidth","getComputedStyle","paddingLeft","paddingRight","svg","svgDefs","titleEL","legendArea","updateTipOffset","Map","error","make","_this3","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","clone","styleEl","prepareForExport","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","downloadFile","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","center","textContent","legendTotals","barWidth","divisor","dot","truncate","textLabel","dx","textValue","group","legendDot","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","SEC_IN_DAY","getDaysBetween","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","donutSlices","sliceStrings","transition","newData","pieSlices","percentageBars","numberOfPoints","xPositions","isLast","isFirst","percentageBar","widths","barHeight","yAxis","positions","position","pos","mode","newPos","newLabels","oldPos","oldLabels","xAxis","xLine","calcLabels","newX","oldX","translateVertLine","yMarkers","labelPos","labelSvg","yMarker","_this5","newOptions","yRegions","region","yRegion","startPos","endPos","_this6","newStarts","oldStarts","rectGroup","newY1","newY2","oldY2","newHeight","animateRegion","heatDomain","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","_this7","toUpperCase","yyyyMmDd","dataValue","square","barGraph","unitType","units","yPositions","j","meta","minHeight","datasetBar","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","rectAnim","oldCoordStr","split","groupAnim","animateBar","lineGraph","paths","hideLine","pointsList","pointsStr","spline","path","heatline","gradient_id","regionFill","gradient_id_region","getPaths","hideDots","cx","cy","datasetDot","valuesOverPoints","newValues","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePath","animateDot","getComponent","k","assign","PercentageChart","barOptions","depth","component","xPos","bars","get","target","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","clockWise","prevSlicesProperties","slicesProperties","curAngle","curStart","curEnd","originDiffAngle","largeArc","diffAngle","endAngle","startPosition","endPosition","prevProperty","curPath","arcStartX","arcStartY","arcEndX","midArc","arcEndY","makeCircleStr","makeArcPathStr","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","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","scaleMultiplier","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","spacing","HEATMAP_SQUARE_SIZE","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","distribution","distributionSize","dataMaxValue","distributionStep","checkpoint","calcDistribution","domainConfigs","getDomains","lessCol","dayName","dayText","comp","daySquares","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","NO_OF_DAYS_IN_WEEK","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","zeroDataPrep","zeroData","AxisChart","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","shortenYAxisNumbers","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","cumulativeYPos","stacked","yExtremes","cumulative","allValueLists","chartWidth","isSeries","allowedSpace","seriesMultiple","allowedLetters","maxLabelLength","getShortenedLabels","barDatasets","lineDatasets","barsConfigs","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","yPos","formattedLabel","yExtreme","relX","relY","mapTooltipXPosition","goal","arr","closest","prev","curr","getClosestInArray","dbi","legendBar","overlayGuides","g","currentIndex","currentUnit","_this8","_this9","setCurrentDataPoint","_this10","data_point","properties","evt","createEvent","initEvent","dispatchEvent","fire","getDataPoint","datasetValues","splice","chartTypes","makeStrokeCircleStr","makeArcStrokePathStr","getChartByType"],"mappings":"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"} \ No newline at end of file diff --git a/dist/frappe-charts.esm.js.map b/dist/frappe-charts.esm.js.map new file mode 100644 index 0000000..4173e25 --- /dev/null +++ b/dist/frappe-charts.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"frappe-charts.esm.js","sources":["../src/js/utils/dom.js","../node_modules/style-inject/dist/style-inject.es.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/draw.js","../src/js/utils/colors.js","../src/js/utils/animate.js","../src/js/utils/animation.js","../src/js/charts/BaseChart.js","../src/js/utils/export.js","../src/css/chartsCss.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/chart.js","../src/js/charts/DonutChart.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","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 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.8;\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 = 16;\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 = 7.48;\nconst DEFAULT_CHART_COLORS = ['pink', 'blue', 'green', 'grey', 'red', 'yellow', 'purple', 'teal', 'cyan', 'orange'];\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.list = this.container.querySelector('.data-point-list');\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\n\t\tif (this.listValues.length > 4) {\n\t\t\tthis.list.classList.add('tooltip-grid');\n\t\t} else {\n\t\t\tthis.list.classList.remove('tooltip-grid');\n\t\t}\n\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\t\t\tlet li = $.create('li', {\n\t\t\t\tinnerHTML: `
      \n\t\t\t\t\t
      \n\t\t\t\t\t\t
      ${ value === 0 || value ? value : '' }
      \n\t\t\t\t\t\t
      ${set.title ? set.title : '' }
      \n\t\t\t\t\t
      `\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}","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","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR } from './constants';\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 = '#E2E6E9';\nconst FONT_FILL = '#313B44';\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 makeRoundedCornerBarPath(x, width, height) {\n\tlet radius = height/2;\n\n\treturn `M${x},0\n\t\t\th${width - radius}\n\t\t\tq${radius},0 ${radius},${radius}\n\t\t\tq0,${radius} -${radius},${radius}\n\t\t\th-${width - radius}\n\t\t\tv${height}z`;\n}\n\nexport function makeRoundedCornerBarPathLast(x, width, height) {\n\tlet radius = height/2;\n\n\treturn `M${x + radius},0\n\t\t\th${width - radius}\n\t\t\tv${height}\n\t\t\th-${width - radius}\n\t\t\tq-${radius}, 0 -${radius},-${radius}\n\t\t\tq0,-${radius} ${radius},-${radius}z`;\n}\n\n\nexport function percentageBar(x, y, width, height, isFirst, isLast, fill='none') {\n\t// https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90\n\t// \n\t// \n\n\tif (isLast) {\n\t\tlet pathStr = makeRoundedCornerBarPath(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\n\tif (isFirst) {\n\t\tlet pathStr = makeRoundedCornerBarPathLast(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\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};\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, radius, fill='none', label, value, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tx: 0,\n\t\ty: 4 - size,\n\t\theight: size,\n\t\twidth: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tlet textLabel = createSVG('text', {\n\t\tclassName: 'legend-dataset-label',\n\t\tx: size,\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.6) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet textValue = createSVG('text', {\n\t\tclassName: 'legend-dataset-value',\n\t\tx: size,\n\t\ty: FONT_SIZE + 10,\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: value\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(textLabel);\n\tgroup.appendChild(textValue);\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\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.lineType) options.lineType = '';\n\tif (options.shortenNumbers) label = shortenLargeNumber(label);\n\n\tlet className = 'line-horizontal ' + options.className +\n\t\t(options.lineType === \"dashed\" ? \"dashed\": \"\");\n\n\tlet l = createSVG('line', {\n\t\tclassName: className,\n\t\tx1: x1,\n\t\tx2: x2,\n\t\ty1: 0,\n\t\ty2: 0,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / 2 - 2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': x1 < x2 ? 'end' : 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(0, ${y})`,\n\t\t'stroke-opacity': 1\n\t});\n\n\tif(text === 0 || text === '0') {\n\t\tline.style.stroke = \"rgba(27, 31, 35, 0.6)\";\n\t}\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nexport function yLine(y, label, width, options={}) {\n\tif (!isValidNumber(y)) y = 0;\n\n\tif(!options.pos) options.pos = 'left';\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\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType,\n\t\tshortenNumbers: options.shortenNumbers\n\t});\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","const PRESET_COLOR_MAP = {\n\t'pink': '#F683AE',\n\t'blue': '#318AD8',\n\t'green': '#48BB74',\n\t'grey': '#A6B1B9',\n\t'red': '#F56B6B',\n\t'yellow': '#FACF7A',\n\t'purple': '#44427B',\n\t'teal': '#5FD8C4',\n\t'cyan': '#15CCEF',\n\t'orange': '#F8814F',\n\t'light-pink': '#FED7E5',\n\t'light-blue': '#BFDDF7',\n\t'light-green': '#48BB74',\n\t'light-grey': '#F4F5F6',\n\t'light-red': '#F6DFDF',\n\t'light-yellow': '#FEE9BF',\n\t'light-purple': '#E8E8F7',\n\t'light-teal': '#D3FDF6',\n\t'light-cyan': '#DDF8FD',\n\t'light-orange': '#FECDB8'\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\treturn PRESET_COLOR_MAP[color] || color;\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\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\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 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';\n\nexport default class BaseChart {\n\tconstructor(parent, 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\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\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}\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 { $ } 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","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;}.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 BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\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.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(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 += 60;\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 dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t12,\n\t\t\t\t3,\n\t\t\t\tthis.colors[i],\n\t\t\t\tlabel,\n\t\t\t\td,\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 { makeText, makePath, xLine, yLine, yMarker, yRegion, datasetBar, datasetDot, percentageBar, getPaths, heatSquare } from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport { translateHoriLine, translateVertLine, animateRegion, animateBar,\n\tanimateDot, animatePath, animatePathStr } from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n\tconstructor({\n\t\tlayerClass = '',\n\t\tlayerTransform = '',\n\t\tconstants,\n\n\t\tgetData,\n\t\tmakeElements,\n\t\tanimateElements\n\t}) {\n\t\tthis.layerTransform = layerTransform;\n\t\tthis.constants = constants;\n\n\t\tthis.makeElements = makeElements;\n\t\tthis.getData = getData;\n\n\t\tthis.animateElements = animateElements;\n\n\t\tthis.store = [];\n\t\tthis.labels = [];\n\n\t\tthis.layerClass = layerClass;\n\t\tthis.layerClass = typeof(this.layerClass) === 'function'\n\t\t\t? this.layerClass() : this.layerClass;\n\n\t\tthis.refresh();\n\t}\n\n\trefresh(data) {\n\t\tthis.data = data || this.getData();\n\t}\n\n\tsetup(parent) {\n\t\tthis.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n\t}\n\n\tmake() {\n\t\tthis.render(this.data);\n\t\tthis.oldData = this.data;\n\t}\n\n\trender(data) {\n\t\tthis.store = this.makeElements(data);\n\n\t\tthis.layer.textContent = '';\n\t\tthis.store.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t\tthis.labels.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t}\n\n\tupdate(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\tconst numberOfPoints = data.xPositions.length;\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\n\t\t\t\tlet isLast = i == numberOfPoints - 1;\n\t\t\t\tlet isFirst = i == 0;\n\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i], this.constants.barHeight, isFirst, isLast, 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\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos, shortenNumbers: this.constants.shortenNumbers})\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.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\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\tlabels: newLabels\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\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\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\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\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(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 newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\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 } 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\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},\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 => value * Math.pow(10, exponent));\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.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}\n\n\t\t// Set labels\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\tlet zeroData = {\n\t\tlabels: realData.labels.slice(0, -1),\n\t\tdatasets: realData.datasets.map(d => {\n\t\t\treturn {\n\t\t\t\tname: '',\n\t\t\t\tvalues: zeroArray.slice(0, -1),\n\t\t\t\tchartType: d.chartType\n\t\t\t};\n\t\t}),\n\t};\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\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\t\tthis.config.shortenYAxisNumbers = options.axisOptions.shortenYAxisNumbers || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.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\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\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\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tshortenNumbers: this.config.shortenYAxisNumbers\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\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\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\t\t\tlet index = d.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\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth * (1 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\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: s.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\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + 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\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\tspline: this.lineOptions.spline,\n\t\t\t\t\thideDots: this.lineOptions.hideDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\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},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\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 '../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 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"],"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","css","ref","insertAt","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","create","tag","o","i","val","parentNode","_typeof","Object","keys","map","prop","setAttribute","BASE_MEASURES","margins","paddings","baseHeight","titleHeight","legendHeight","titleFontSize","getTopOffset","m","getLeftOffset","getExtraHeight","getExtraWidth","DEFAULT_CHART_COLORS","DEFAULT_COLORS","bar","line","pie","percentage","heatmap","donut","ANGLE_RATIO","Math","PI","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","inside","this","className","innerHTML","hideTip","title","list","dataPointList","addEventListener","_this","index","length","classList","add","remove","set","color","_this2","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","parseFloat","toFixed","fillArray","array","count","start","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","round","getSplineCurvePointsStr","xList","yList","points","push","controlPoint","current","previous","next","reverse","pointA","pointB","lengthX","lengthY","sqrt","atan2","command","reduce","acc","point","a","pointStr","cps","cpe","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","id","x1","x2","y1","y2","setGradientStop","gradElem","offset","makeSVGGroup","transform","args","makePath","pathStr","stroke","strokeWidth","styles","makeGradient","lighter","gradientDef","opacities","makeRoundedCornerBarPath","makeRoundedCornerBarPathLast","heatSquare","size","data","rx","key","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","text","FONT_SIZE","makeHoriLine","lineType","shortenNumbers","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","parseInt","updateOverlay","attributes","values","filter","attr","includes","specified","nodeValue","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","b","toString","translate","oldCoord","newCoord","duration","old","join","translateHoriLine","yLine","newY","oldY","animatePathStr","oldPath","EASING","ease","linear","easein","easeout","easeinout","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","from","to","begin","keySplines","keyTimes","calcMode","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","svgContainer","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","setTimeout","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","showTooltip","showLegend","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","argHeight","state","initTimeout","overlays","configure","validColors","forEach","test","isValidColor","console","warn","boundDrawFn","draw","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","drawArea","render","update","renderLegend","setupNavigation","padding","baseWidth","getComputedStyle","paddingLeft","paddingRight","svg","svgDefs","titleEL","legendArea","updateTipOffset","Map","error","make","_this3","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","clone","styleEl","prepareForExport","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","downloadFile","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","center","textContent","legendTotals","barWidth","divisor","dot","truncate","textLabel","dx","textValue","group","legendDot","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","SEC_IN_DAY","getDaysBetween","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","donutSlices","sliceStrings","transition","newData","pieSlices","percentageBars","numberOfPoints","xPositions","isLast","isFirst","percentageBar","widths","barHeight","yAxis","positions","position","pos","mode","newPos","newLabels","oldPos","oldLabels","xAxis","xLine","calcLabels","newX","oldX","translateVertLine","yMarkers","labelPos","labelSvg","yMarker","_this5","newOptions","yRegions","region","yRegion","startPos","endPos","_this6","newStarts","oldStarts","rectGroup","newY1","newY2","oldY2","newHeight","animateRegion","heatDomain","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","_this7","toUpperCase","yyyyMmDd","dataValue","square","barGraph","unitType","units","yPositions","j","meta","minHeight","datasetBar","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","rectAnim","oldCoordStr","split","groupAnim","animateBar","lineGraph","paths","hideLine","pointsList","pointsStr","spline","path","heatline","gradient_id","regionFill","gradient_id_region","getPaths","hideDots","cx","cy","datasetDot","valuesOverPoints","newValues","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePath","animateDot","getComponent","k","assign","PercentageChart","barOptions","depth","component","xPos","bars","get","target","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","clockWise","prevSlicesProperties","slicesProperties","curAngle","curStart","curEnd","originDiffAngle","largeArc","diffAngle","endAngle","startPosition","endPosition","prevProperty","curPath","arcStartX","arcStartY","arcEndX","midArc","arcEndY","makeCircleStr","makeArcPathStr","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","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","scaleMultiplier","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","spacing","HEATMAP_SQUARE_SIZE","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","distribution","distributionSize","dataMaxValue","distributionStep","checkpoint","calcDistribution","domainConfigs","getDomains","lessCol","dayName","dayText","comp","daySquares","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","NO_OF_DAYS_IN_WEEK","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","zeroDataPrep","zeroData","AxisChart","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","shortenYAxisNumbers","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","cumulativeYPos","stacked","yExtremes","cumulative","allValueLists","chartWidth","isSeries","allowedSpace","seriesMultiple","allowedLetters","maxLabelLength","getShortenedLabels","barDatasets","lineDatasets","barsConfigs","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","yPos","formattedLabel","yExtreme","relX","relY","mapTooltipXPosition","goal","arr","closest","prev","curr","getClosestInArray","dbi","legendBar","overlayGuides","g","currentIndex","currentUnit","_this8","_this9","setCurrentDataPoint","_this10","data_point","properties","evt","createEvent","initEvent","dispatchEvent","fire","getDataPoint","datasetValues","splice","chartTypes","makeStrokeCircleStr","makeArcStrokePathStr","Chart","getChartByType"],"mappings":"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"} \ No newline at end of file diff --git a/dist/frappe-charts.min.css b/dist/frappe-charts.min.css index 1ad482f..ef0bed1 100644 --- a/dist/frappe-charts.min.css +++ b/dist/frappe-charts.min.css @@ -1,25 +1,35 @@ +:root { + --fr-label-color: #313b44; + --fr-axis-line-color: #E2E6E9; + --fr-stroke-width: 2px; + --fr-dataset-circle-stroke: #FFFFFF; + --fr-dataset-circle-stroke-width: var(--fr-stroke-width); + --fr-tooltip-title: var(--fr-label-color); + --fr-tooltip-label: var(--fr-label-color); + --fr-tooltip-value: #192734; + --fr-tooltip-bg: #FFFFFF; } + .chart-container { position: relative; /* for absolutely positioned tooltip */ - /* https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/ */ 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: #313B44; } + fill: var(--fr-label-color); } .chart-container .axis line, .chart-container .chart-label line { - stroke: #E2E6E9; } + stroke: var(--fr-axis-line-color); } .chart-container .dataset-units circle { - stroke: #fff; - stroke-width: 2; } + stroke: var(--fr-dataset-circle-stroke); + stroke-width: var(--fr-dataset-circle-stroke-width); } .chart-container .dataset-units path { fill: none; stroke-opacity: 1; - stroke-width: 2px; } + stroke-width: var(--fr-stroke-width); } .chart-container .dataset-path { - stroke-width: 2px; } + stroke-width: var(--fr-stroke-width); } .chart-container .path-group path { fill: none; stroke-opacity: 1; - stroke-width: 2px; } + stroke-width: var(--fr-stroke-width); } .chart-container line.dashed { stroke-dasharray: 5, 3; } .chart-container .axis-line .specific-value { @@ -28,9 +38,11 @@ text-anchor: end; } .chart-container .axis-line .x-line { text-anchor: middle; } - .chart-container .legend-dataset-text { - fill: #6c7680; + .chart-container .legend-dataset-label { + fill: var(--fr-tooltip-label); font-weight: 600; } + .chart-container .legend-dataset-value { + fill: var(--fr-tooltip-value); } .graph-svg-tip { position: absolute; @@ -38,7 +50,7 @@ padding: 10px; font-size: 12px; text-align: center; - background: #FFFFFF; + background: var(--fr-tooltip-bg); box-shadow: 0px 1px 4px rgba(17, 43, 66, 0.1), 0px 2px 6px rgba(17, 43, 66, 0.08), 0px 40px 30px -30px rgba(17, 43, 66, 0.1); border-radius: 6px; } .graph-svg-tip ul { @@ -55,7 +67,7 @@ height: 12px; width: 12px; border-radius: 2px; - background: white; + background: var(--fr-tooltip-bg); transform: rotate(45deg); margin-top: -7px; margin-left: -6px; } @@ -67,7 +79,7 @@ display: block; padding: 16px; margin: 0; - color: #313B44; + color: var(--fr-tooltip-title); font-weight: 600; line-height: 1; pointer-events: none; @@ -96,9 +108,9 @@ margin-top: 4px; font-size: 11px; max-width: 100px; - color: #313B44; + color: var(--fr-tooltip-label); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .graph-svg-tip.comparison li .tooltip-value { - color: #192734; } + color: var(--fr-tooltip-value); } diff --git a/dist/frappe-charts.umd.js b/dist/frappe-charts.umd.js index 9bbb915..20b5867 100644 --- a/dist/frappe-charts.umd.js +++ b/dist/frappe-charts.umd.js @@ -1 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self)["frappe-charts"]=e()}(this,(function(){"use strict";function t(e){return(t="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})(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,i=new Array(e);n=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}p.create=function(e,n){var i=document.createElement(e);for(var a in n){var s=n[a];if("inside"===a)p(s).appendChild(i);else if("around"===a){var r=p(s);r.parentNode.insertBefore(i,r),i.appendChild(r)}else"styles"===a?"object"===t(s)&&Object.keys(s).map((function(t){i.style[t]=s[t]})):a in i?i[a]=s:i.setAttribute(a,s)}return i};var y={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 b(t){return t.titleHeight+t.margins.top+t.paddings.top}function x(t){return t.margins.left+t.paddings.left}function k(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function w(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}var A=["pink","blue","green","grey","red","yellow","purple","teal","cyan","orange"],L={bar:A,line:A,pie:A,percentage:A,heatmap:["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],donut:A},P=Math.PI/180,D=function(){function t(n){var i=n.parent,a=void 0===i?null:i,s=n.colors,r=void 0===s?[]:s;e(this,t),this.parent=a,this.colors=r,this.titleName="",this.titleValue="",this.listValues=[],this.titleValueFirst=0,this.x=0,this.y=0,this.top=0,this.left=0,this.setup()}return i(t,[{key:"setup",value:function(){this.makeTooltip()}},{key:"refresh",value:function(){this.fill(),this.calcPosition()}},{key:"makeTooltip",value:function(){var t=this;this.container=p.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.list=this.container.querySelector(".data-point-list"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",(function(){t.hideTip()}))}},{key:"fill",value:function(){var t,e=this;this.index&&this.container.setAttribute("data-point-index",this.index),t=this.titleValueFirst?"".concat(this.titleValue,"").concat(this.titleName):"".concat(this.titleName,"").concat(this.titleValue,""),this.listValues.length>4?this.list.classList.add("tooltip-grid"):this.list.classList.remove("tooltip-grid"),this.title.innerHTML=t,this.dataPointList.innerHTML="",this.listValues.map((function(t,n){var i=e.colors[n]||"black",a=0===t.formatted||t.formatted?t.formatted:t.value,s=p.create("li",{innerHTML:'
        \n\t\t\t\t\t
        \n\t\t\t\t\t\t
        ').concat(0===a||a?a:"",'
        \n\t\t\t\t\t\t
        ').concat(t.title?t.title:"","
        \n\t\t\t\t\t
        ")});e.dataPointList.appendChild(s)}))}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-7.48,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,n=this.container.querySelector(".svg-pointer");if(this.left<0)n.style.left="calc(50% - ".concat(-1*this.left,"px)"),this.left=0;else if(this.left>e){var i=this.left-e,a="calc(50% + ".concat(i,"px)");n.style.left=a,this.left=e}else n.style.left="50%"}},{key:"setValues",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=n.name,this.titleValue=n.value,this.listValues=i,this.x=t,this.y=e,this.titleValueFirst=n.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"}}]),t}();function M(t){return parseFloat(t.toFixed(2))}function T(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n||(n=i?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(n);return t=i?a.concat(t):t.concat(a)}function C(t,e){return(t+"").length*e}function E(t,e){return{x:Math.sin(t*P)*e,y:Math.cos(t*P)*e}}function N(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 S(t,e){var n,i;return t<=e?(n=e-t,i=t):(n=t-e,i=e),[n,i]}function O(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return n>0?t=T(t,n):e=T(e,n),[t,e]}function F(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function z(t){var e;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var n=Math.floor(Math.log10(Math.abs(e)));if(n<=2)return e;var i=Math.floor(n/3),a=Math.pow(10,n-3*i)*+(e/Math.pow(10,n)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][i]}function W(t,e){for(var n=[],i=0;i255?255:t<0?0:t}function I(t,e){var n=j(t),i=!1;"#"==n[0]&&(n=n.slice(1),i=!0);var a=parseInt(n,16),s=R((a>>16)+e),r=R((a>>8&255)+e);return(i?"#":"")+(R((255&a)+e)|r<<8|s<<16).toString(16)}var j=function(t){return H[t]||t};function B(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function Y(e,n){var i=document.createElementNS("http://www.w3.org/2000/svg",e);for(var a in n){var s=n[a];if("inside"===a)B(s).appendChild(i);else if("around"===a){var r=B(s);r.parentNode.insertBefore(i,r),i.appendChild(r)}else"styles"===a?"object"===t(s)&&Object.keys(s).map((function(t){i.style[t]=s[t]})):("className"===a&&(a="class"),"innerHTML"===a?i.textContent=s:i.setAttribute(a,s))}return i}function V(t,e){return Y("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function _(t,e,n,i){return Y("stop",{inside:t,style:"stop-color: ".concat(n),offset:e,"stop-opacity":i})}function U(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,i={className:t,transform:e};return n&&(i.inside=n),Y("g",i)}function G(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:2;return Y("path",{className:e,d:t,styles:{stroke:n,fill:i,"stroke-width":a}})}function q(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="path-fill-gradient-"+e+"-"+(n?"lighter":"default"),a=V(t,i),s=[1,.6,.2];return n&&(s=[.4,.2,0]),_(a,"0%",e,s[0]),_(a,"50%",e,s[1]),_(a,"100%",e,s[2]),i}function X(t,e,n,i,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:n,width:i,height:i,rx:a,fill:s};return Object.keys(r).map((function(t){o[t]=r[t]})),Y("rect",o)}function J(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||10,r=void 0!==a.dy?a.dy:s/2,o=a.fill||"#313B44",l=a.textAnchor||"start";return Y("text",{className:t,x:e,y:n,dy:r+"px","font-size":s+"px",fill:o,"text-anchor":l,innerHTML:i})}function K(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke="#E2E6E9");var s=Y("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:n,y2:i,styles:{stroke:a.stroke}}),r=Y("text",{x:0,y:n>i?n+4:n-4-10,dy:"10px","font-size":"10px","text-anchor":"middle",innerHTML:e+""}),o=Y("g",{transform:"translate(".concat(t,", 0)")});return o.appendChild(s),o.appendChild(r),o}function $(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke="#E2E6E9"),a.lineType||(a.lineType=""),a.shortenNumbers&&(e=z(e));var s="line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),r=Y("line",{className:s,x1:n,x2:i,y1:0,y2:0,styles:{stroke:a.stroke}}),o=Y("text",{x:n3&&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 c=void 0;c="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),h=e[l],d={attributeName:l,from:u,to:h,begin:"0s",dur:n/1e3+"s",values:u+";"+h,keySplines:it[i],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};for(var f in a&&(d.type=a),d)c.setAttribute(f,d[f]);r.appendChild(c),a?o.setAttribute(l,"translate(".concat(h,")")):o.setAttribute(l,h)}return[r,o]}function st(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function rt(t,e){var n=[],i=[];e.map((function(t){var e,a,s=t[0],r=s.parentNode;t[0]=s;var o=u(at.apply(void 0,h(t)),2);e=o[0],a=o[1],n.push(a),i.push([e,r]),r.replaceChild(e,s)}));var a=t.cloneNode(!0);return i.map((function(t,i){t[1].replaceChild(n[i],t[0]),e[i][0]=n[i]})),a}function ot(t,e,n){if(0!==n.length){var i=rt(e,n);e.parentNode==t&&(t.removeChild(e),t.appendChild(i)),setTimeout((function(){i.parentNode==t&&(t.removeChild(i),t.appendChild(e))}),250)}}var lt=function(){function t(n,i){if(e(this,t),this.parent="string"==typeof n?document.querySelector(n):n,!(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(y));var a=this.measures;this.setMeasures(i),this.title.length||(a.titleHeight=0),this.config.showLegend||(a.legendHeight=0),this.argHeight=i.height||a.baseHeight,this.state={},this.options={},this.initTimeout=700,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return i(t,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var n=[];return(t=(t||[]).concat(L[e])).forEach((function(t){var e=j(t);!function(t){return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i.test(t)}(e)?console.warn('"'+t+'" is not a valid color.'):n.push(e)})),n}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-k(this.measures),this.boundDrawFn=function(){return t.draw(!0)},window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){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 t={inside:this.parent,className:"chart-container"};this.independentWidth&&(t.styles={width:this.independentWidth+"px"}),this.container=p.create("div",t)}},{key:"makeTooltip",value:function(){this.tip=new D({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&&g(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(){var t,e,n;this.baseWidth=(t=this.parent,e=window.getComputedStyle(t),n=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight),t.clientWidth-n),this.width=this.baseWidth-w(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t,e,n,i,a=this.measures;this.svg=(t=this.container,e="frappe-chart chart",n=this.baseWidth,i=this.baseHeight,Y("svg",{className:e,inside:t,width:n,height:i})),this.svgDefs=Y("defs",{inside:this.svg}),this.title.length&&(this.titleEL=J("title",a.margins.left,a.margins.top,this.title,{fontSize:a.titleFontSize,fill:"#666666",dy:a.titleFontSize}));var s=b(a);this.drawArea=U(this.type+"-chart chart-draw-area","translate(".concat(x(a),", ").concat(s,")")),this.config.showLegend&&(s+=this.height+a.paddings.bottom,this.legendArea=U("chart-legend","translate(".concat(x(a),", ").concat(s,")"))),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(x(a),b(a))}},{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)}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map((function(t){return t.parentNode.removeChild(t)}));var i=[];e.forEach((function(t){i=i.concat(t.update(n))})),i.length>0?(ot(this.container,this.svg,i),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){m(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=function(t){var e=t.cloneNode(!0);e.classList.add("chart-container"),e.setAttribute("xmlns","http://www.w3.org/2000/svg"),e.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=p.create("style",{innerHTML:".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;}.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}"});e.insertBefore(n,e.firstChild);var i=p.create("div");return i.appendChild(e),i.innerHTML}(this.svg);!function(t,e){var n=document.createElement("a");n.style="display: none";var i=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(i);n.href=a,n.download=t,document.body.appendChild(n),n.click(),setTimeout((function(){document.body.removeChild(n),window.URL.revokeObjectURL(a)}),300)}(this.title||"Chart",[t])}}]),t}(),ct=function(t){a(r,t);var n=l(r);function r(t,i){return e(this,r),n.call(this,t,i)}return i(r,[{key:"configure",value:function(t){c(s(r.prototype),"configure",this).call(this,t),this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,n=this.config.maxSlices;e.sliceTotals=[];var i=this.data.labels.map((function(e,n){var i=0;return t.data.datasets.map((function(t){i+=t.values[n]})),[i,e]})).filter((function(t){return t[0]>=0})),a=i;if(i.length>n){i.sort((function(t,e){return e[0]-t[0]})),a=i.slice(0,n-1);var s=i.slice(n-1),r=0;s.map((function(t){r+=t[0]})),a.push([r,"Rest"]),this.colors[n-1]="grey"}e.labels=[],a.map((function(t){e.sliceTotals.push(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 n=0,i=0;this.legendTotals.map((function(a,s){var r=150,o=Math.floor((t.width-w(t.measures))/r);t.legendTotals.lengtho&&(n=0,i+=20);var l=r*n+5,c=t.config.truncateLegends?F(e.labels[s],r/10):e.labels[s],u=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]&&arguments[5],r={className:"legend-dot",cx:0,cy:0,r:n,fill:i},o=Y("text",{className:"legend-dataset-text",x:0,y:0,dx:"10px",dy:10/3+"px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:a=s?F(a,15):a}),l=Y("g",{transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(Y("circle",r)),l.appendChild(o),l}(l,i,5,t.colors[s],"".concat(c,": ").concat(a),!1);t.legendArea.appendChild(u),n++}))}}]),r}(lt),ut=["January","February","March","April","May","June","July","August","September","October","November","December"],ht=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];function dt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),n=t.getMonth()+1;return[t.getFullYear(),(n>9?"":"0")+n,(e>9?"":"0")+e].join("-")}function pt(t){return new Date(t.getTime())}function vt(t,e){var n=bt(t);return Math.ceil(function(t,e){return(dt(e)-dt(t))/864e5}(n,e)/7)}function gt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function mt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=ut[t];return e?n.slice(0,3):n}function yt(t,e){return new Date(e,t+1,0)}function bt(t){var e=pt(t),n=e.getDay();return 0!==n&&xt(e,-1*n),e}function xt(t,e){t.setDate(t.getDate()+e)}var kt=function(){function t(n){var i=n.layerClass,a=void 0===i?"":i,s=n.layerTransform,r=void 0===s?"":s,o=n.constants,l=n.getData,c=n.makeElements,u=n.animateElements;e(this,t),this.layerTransform=r,this.constants=o,this.makeElements=c,this.getData=l,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=a,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return i(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=U(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){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}(),wt={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=G(e,"donut-path",t.colors[n],"none",t.strokeWidth);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return nt(e,t.sliceStrings[n])}))}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=G(e,"pie-path","none",t.colors[n]);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return nt(e,t.sliceStrings[n])}))}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map((function(n,i){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:2,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r={className:"percentage-bar",x:t,y:e,width:n,height:i,fill:s,styles:{stroke:I(s,-25),"stroke-dasharray":"0, ".concat(i+n,", ").concat(n,", ").concat(i),"stroke-width":a}};return Y("rect",r)}(n,0,t.widths[i],e.constants.barHeight,e.constants.barDepth,t.colors[i])}))},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};N(t)||(t=0),i.pos||(i.pos="left"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke="#E2E6E9"),i.className||(i.className="");var a=-6,s="span"===i.mode?n+6:0;return"tick"===i.mode&&"right"===i.pos&&(a=n+6,s=n),$(t,e,a+=i.offset,s+=i.offset,{stroke:i.stroke,className:i.className,lineType:i.lineType,shortenNumbers:i.shortenNumbers})}(n,t.labels[i],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})}))},animateElements:function(t){var e=t.positions,n=t.labels,i=this.oldData.positions,a=this.oldData.labels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,labels:n}),this.store.map((function(t,n){return et(t,e[n],i[n])}))}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};N(t)||(t=0),i.pos||(i.pos="bottom"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke="#E2E6E9"),i.className||(i.className="");var a=n+6,s="span"===i.mode?-6:n;return"tick"===i.mode&&"top"===i.pos&&(a=-6,s=0),K(t,e,a,s,{stroke:i.stroke,className:i.className,lineType:i.lineType})}(n,t.calcLabels[i],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})}))},animateElements:function(t){var e=t.positions,n=t.calcLabels,i=this.oldData.positions,a=this.oldData.calcLabels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,calcLabels:n}),this.store.map((function(t,n){return function(t,e,n){return tt(t,[n,0],[e,0],350)}(t,e[n],i[n])}))}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};i.labelPos||(i.labelPos="right");var a="left"===i.labelPos?4:n-C(e,5)-4,s=Y("text",{className:"chart-label",x:a,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:e+""}),r=$(t,"",0,n,{stroke:i.stroke||"#E2E6E9",className:i.className||"",lineType:i.lineType});return r.appendChild(s),r}(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.position})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.options})),s=this.oldData.map((function(t){return t.position}));return this.render(s.map((function(t,e){return{position:s[e],label:i[e],options:a[e]}}))),this.store.map((function(t,e){return et(t,n[e],s[e])}))}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=Y("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:"#E2E6E9","stroke-dasharray":"".concat(n,", ").concat(s)},x:0,y:0,width:n,height:s});a.labelPos||(a.labelPos="right");var o="left"===a.labelPos?4:n-C(i+"",4.5)-4,l=Y("text",{className:"chart-label",x:o,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:i+""}),c=Y("g",{transform:"translate(0, ".concat(e,")")});return c.appendChild(r),c.appendChild(l),c}(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.endPos})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.startPos})),s=t.map((function(t){return t.options})),r=this.oldData.map((function(t){return t.endPos})),o=this.oldData.map((function(t){return t.startPos}));this.render(r.map((function(t,e){return{startPos:o[e],endPos:r[e],label:i[e],options:s[e]}})));var l=[];return this.store.map((function(t,e){l=l.concat(function(t,e,n,i){var a=e-n,s=t.childNodes[0],r=s.getAttribute("width");return[[s,{height:a,"stroke-dasharray":"".concat(r,", ").concat(a)},350,"easein"],tt(t,[0,i],[0,n],350)]}(t,a[e],n[e],r[e]))})),l}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,n=this.constants,i=n.index,a=n.colWidth,s=n.rowHeight,r=n.squareSize,o=n.radius,l=n.xTranslate,c=l,u=0;return this.serializedSubDomains=[],t.cols.map((function(t,n){1===n&&e.labels.push(J("domain-name",c,-12,mt(i,!0).toUpperCase(),{fontSize:9})),t.map((function(t,n){if(t.fill){var i={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":n},a=X("day",c,u,r,o,t.fill,i);e.serializedSubDomains.push(a)}u+=s})),u=0,c+=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(n,i){return function(t,e,n,i){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=S(e,o.zeroLine),c=u(l,2),h=c[0],d=c[1];d-=r,0===h&&(h=o.minHeight,d-=o.minHeight),N(t)||(t=0),N(d)||(d=0),N(h,!0)||(h=0),N(n,!0)||(n=0);var f=Y("rect",{className:"bar mini",style:"fill: ".concat(i),"data-point-index":s,x:t,y:d,width:n,height:h});if((a+="")||a.length){f.setAttribute("y",0),f.setAttribute("x",0);var p=Y("text",{className:"data-point-value",x:n/2,y:0,dy:"-5px","font-size":"10px","text-anchor":"middle",innerHTML:a}),v=Y("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(d,")")});return v.appendChild(f),v.appendChild(p),v}return f}(t.xPositions[i],n,t.barWidth,e.color,t.labels[i],i,t.offsets[i],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})})),this.units},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,c=u(O(s,e),2);s=c[0],e=c[1];var h=u(O(r,n),2);r=h[0],n=h[1];var d=u(O(o,i),2);o=d[0],i=d[1];var f=u(O(l,a),2);l=f[0],a=f[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var p=[];return this.store.map((function(a,s){p=p.concat(function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=S(n,s.zeroLine),o=u(r,2),l=o[0],c=o[1];if(c-=a,"rect"!==t.nodeName){var h=t.childNodes[0],d=[h,{width:i,height:l},350,"easein"],f=t.getAttribute("transform").split("(")[1].slice(0,-1),p=tt(t,f,[e,c],350);return[d,p]}return[[t,{width:i,height:l,x:e,y:c},350,"easein"]]}(a,e[s],n[s],t.barWidth,i[s],{zeroLine:t.zeroLine}))})),p}},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=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map((function(e,n){return t[n]+","+e})),r=s.join("L");i.spline&&(r=W(t,e));var o=G("M"+r,"line-graph-path",n);if(i.heatline){var l=q(a.svgDefs,n);o.style.stroke="url(#".concat(l,")")}var c={path:o};if(i.regionFill){var u=q(a.svgDefs,n,!0),h="M"+"".concat(t[0],",").concat(a.zeroLine,"L")+r+"L".concat(t.slice(-1)[0],",").concat(a.zeroLine);c.region=G(h,"region-fill","none","url(#".concat(u,")"))}return c}(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(n,i){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=Y("circle",{style:"fill: ".concat(i),"data-point-index":s,cx:t,cy:e,r:n});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=Y("text",{className:"data-point-value",x:0,y:0,dy:-5-n+"px","font-size":"10px","text-anchor":"middle",innerHTML:a}),l=Y("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(r),l.appendChild(o),l}return r}(t.xPositions[i],n,t.radius,e.color,e.valuesOverPoints?t.values[i]:"",i)}))),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=u(O(a,e),2);a=o[0],e=o[1];var l=u(O(s,n),2);s=l[0],n=l[1];var c=u(O(r,i),2);r=c[0],i=c[1],this.render({xPositions:a,yPositions:s,values:i,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var h=[];return Object.keys(this.paths).length&&(h=h.concat(function(t,e,n,i,a){var s=[],r=n.map((function(t,n){return e[n]+","+t})).join("L");a&&(r=W(e,n));var o=[t.path,{d:"M"+r},350,"easein"];if(s.push(o),t.region){var l="".concat(e[0],",").concat(i,"L"),c="L".concat(e.slice(-1)[0],", ").concat(i),u=[t.region,{d:"M"+l+r+c},350,"easein"];s.push(u)}return s}(this.paths,e,n,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map((function(t,i){h=h.concat(function(t,e,n){if("circle"!==t.nodeName){var i=t.getAttribute("transform").split("(")[1].slice(0,-1);return[tt(t,i,[e,n],350)]}return[[t,{cx:e,cy:n},350,"easein"]]}(t,e[i],n[i]))})),h}}};function At(t,e,n){var i=Object.keys(wt).filter((function(e){return t.includes(e)})),a=wt[i[0]];return Object.assign(a,{constants:e,getData:n}),new kt(a)}var Lt=function(t){a(r,t);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="percentage",a.setup(),a}return i(r,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var n=this.barOptions;n.height=n.height||20,n.depth=n.depth||2,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(n.height+.5*n.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,h(t));return[t[0],e]})))}},{key:"calc",value:function(){var t=this;c(s(r.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,e=this.state;this.container.addEventListener("mousemove",(function(n){var i=t.components.get("percentageBars").store,a=n.target;if(i.includes(a)){var s=i.indexOf(a),r=v(t.container),o=v(a),l=o.left-r.left+parseInt(a.getAttribute("width"))/2,c=o.top-r.top,u=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[s]:t.state.labels[s])+": ",h=e.sliceTotals[s]/e.grandTotal;t.tip.setValues(l,c,{name:u,value:(100*h).toFixed(1)+"%"}),t.tip.showTip()}}))}}]),r}(ct),Pt=function(t){a(r,t);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="pie",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.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;c(s(r.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,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,f=i?-h:h,p=o+=f,v=E(u,n),g=E(p,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*n.y,u=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z\n\t\tL").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u," z")}(l,c,t.center,t.radius,i,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z")}(l,c,t.center,t.radius,i,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:p,angle:f})})),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,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=E(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){st(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.fill=I(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else st(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=a}}},{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,n=this.components.get("pieSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!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)}}]),r}(ct);function Dt(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 n=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,n)),n]}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Math.ceil(t),i=Math.floor(e),a=n-i,s=a,r=1;a>5&&(a%2!=0&&(a=++n-i),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(i+r*l);return o}function Tt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Dt(t),i=u(n,2),a=i[0],s=i[1],r=e?e/Math.pow(10,s):0,o=Mt(a=a.toFixed(6),r);return o=o.map((function(t){return t*Math.pow(10,s)}))}function Ct(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,h(t)),i=Math.min.apply(Math,h(t)),a=[];function s(t,e){for(var n=Tt(t),i=n[1]-n[0],a=0,s=1;a=0&&i>=0)Dt(n)[1],a=e?Tt(n,i):Tt(n);else if(n>0&&i<0){var r=Math.abs(i);if(n>=r)Dt(n)[1],a=s(n,r);else{Dt(r)[1];var o=s(r,n);a=o.map((function(t){return-1*t}))}}else if(n<=0&&i<=0){var l=Math.abs(i),c=Math.abs(n);Dt(l)[1],a=(a=e?Tt(l,c):Tt(l)).reverse().map((function(t){return-1*t}))}return a}function Et(t){var e,n=Nt(t);if(t.indexOf(0)>=0)e=t.indexOf(0);else if(t[0]>0){e=-1*t[0]/n}else{e=-1*t[t.length-1]/n+(t.length-1)}return e}function Nt(t){return t[1]-t[0]}function St(t){return t[t.length-1]-t[0]}function Ot(t,e){return M(e.zeroLine-t*e.scaleMultiplier)}var Ft=function(t){a(s,t);var n=l(s);function s(t,i){var a;e(this,s),(a=n.call(this,t,i)).type="heatmap",a.countLabel=i.countLabel||"";var r=["Sunday","Monday"],o=r.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return a.startSubDomainIndex=r.indexOf(o),a.setup(),a}return i(s,[{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=84+k(e);var n=this.data,i=this.discreteDomains?12:0;this.independentWidth=12*(vt(n.start,n.end)+i)+w(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+w(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(n){var i=new Date(1e3*n);e[ft(i)]=t.dataPoints[n]})),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=pt(this.data.start),t.end=pt(this.data.end),t.firstWeekStart=pt(t.start),t.noOfWeeks=vt(t.start,t.end),t.distribution=function(t,e){for(var n=Math.max.apply(Math,h(t)),i=1/(e-1),a=[],s=0;s1&&void 0!==arguments[1]?arguments[1]:"",n=[t.getMonth(),t.getFullYear()],i=n[0],a=n[1],s=bt(t),r={index:i,cols:[]};xt(e=pt(e)||yt(i,a),1);for(var o,l=vt(s,e),c=[],u=0;u2&&void 0!==arguments[2]&&arguments[2],i=this.state,a=pt(t),s=[],r=0;r<7;r++,xt(a,1)){var o={},l=a>=i.start&&a<=i.end;n||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e,n,i=ft(t),a=this.data.dataPoints[i];return{yyyyMmDd:i,dataValue:a||0,fill:this.colors[(e=a,n=this.state.distribution,n.filter((function(t){return tn?i.slice(0,n):T(i,n-i.length,0)}else t.values=a;t.chartType||(t.chartType=e)})),t.yRegions&&t.yRegions.map((function(t){if(t.end0&&void 0!==arguments[0]?arguments[0]:this.data;return zt(t,this.type)}},{key:"prepareFirstData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;return Wt(t)}},{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,n){return M(t.xOffset+n*t.unitWidth)}))}}},{key:"calcYAxisParameters",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=Ct(t,e),i=this.height/St(n),a=Nt(n)*i,s=this.height-Et(n)*a;this.state.yAxis={labels:n,positions:n.map((function(t){return s-t*i})),scaleMultiplier:i,zeroLine:s},this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e){return e.map((function(e){return Ot(e,t.yAxis)}))};t.datasets=this.data.datasets.map((function(t,n){var i=t.values,a=t.cumulativeYs||[];return{name:t.name,index:n,chartType:t.chartType,values:i,yPositions:e(i),cumulativeYs:a,cumulativeYPos:e(a)}}))}},{key:"calcYExtremes",value:function(){var t=this.state;this.barOptions.stacked?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,n){e1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=t/e.length;i<=0&&(i=1);var a,s=i/7;if(n){var r=Math.max.apply(Math,h(e.map((function(t){return t.length}))));a=Math.ceil(r/s)}var o=e.map((function(t,e){return(t+="").length>s&&(n?e%a!=0&&(t=""):t=s-3>0?t.slice(0,s-3)+" ...":t.slice(0,s)+".."),t}));return o}(this.width,t.xAxis.labels,this.config.xIsSeries),t.xAxis}.bind(this)],["yRegions",{width:this.width,pos:"right"},function(){return this.state.yRegions}.bind(this)]],n=this.state.datasets.filter((function(t){return"bar"===t.chartType})),i=this.state.datasets.filter((function(t){return"line"===t.chartType})),a=n.map((function(e){var i=e.index;return["barGraph-"+e.index,{index:i,color:t.colors[i],stacked:t.barOptions.stacked,valuesOverPoints:t.config.valuesOverPoints,minHeight:0*t.height},function(){var t=this.state,e=t.datasets[i],a=this.barOptions.stacked,s=this.barOptions.spaceRatio||.5,r=t.unitWidth*(1-s),o=r/(a?1:n.length),l=t.xAxis.positions.map((function(t){return t-r/2}));a||(l=l.map((function(t){return t+o*i})));var c=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(c=a&&e.index===t.datasets.length-1?e.cumulativeYs:e.values);var u=new Array(t.datasetLength).fill(0);return a&&(u=e.yPositions.map((function(t,n){return t-e.cumulativeYPos[n]}))),{xPositions:l,yPositions:e.yPositions,offsets:u,labels:c,zeroLine:t.yAxis.zeroLine,barsWidth:r,barWidth:o}}.bind(t)]})),s=i.map((function(e){var n=e.index;return["lineGraph-"+e.index,{index:n,color:t.colors[n],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[n],i=t.yAxis.positions[0]b(n)?t.mapTooltipXPosition(a):t.tip.hideTip()}))}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var n=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=e.reduce((function(e,n){return Math.abs(n-t)=0){var i=this.dataByIndex[n];this.tip.setValues(i.xPos+this.tip.offset.x,i.yExtreme+this.tip.offset.y,{name:i.formattedLabel,value:""},i.values,n),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,n){var i=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]&&arguments[5],r={className:"legend-bar",x:0,y:0,width:n,height:"2px",fill:i},o=Y("text",{className:"legend-dataset-text",x:0,y:0,dy:"20px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:a=s?F(a,15):a}),l=Y("g",{transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(Y("rect",r)),l.appendChild(o),l}(100*n,"0",100,t.colors[n],e.name,t.config.truncateLegends);t.legendArea.appendChild(i)})))}},{key:"makeOverlay",value:function(){var t=this;this.init?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 n=e.units[t.state.currentIndex];e.overlay=Q[e.type](n),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 n=e.getAttribute("data-point-index");t.setCurrentDataPoint(n)}))}))})),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 n=e.units[t.state.currentIndex];Z[e.type](n,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,n={index:t,label:e.xAxis.labels[t],values:e.datasets.map((function(e){return e.values[t]}))};return n}},{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,function(t,e,n){var i=document.createEvent("HTMLEvents");for(var a in i.initEvent(e,!0,!0),n)i[a]=n[a];t.dispatchEvent(i)}(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;c(s(r.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||(c(s(r.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,n){t[n]&&(e.values=t[n])})),this.update(this.data)}}]),r}(lt),Rt={bar:Ht,line:Ht,percentage:Lt,heatmap:Ft,pie:Pt,donut:function(t){a(r,t);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="donut",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.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;c(s(r.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,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,f=i?-h:h,p=o+=f,v=E(u,n),g=E(p,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*i+o,u=n.y+t.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c,"\n\t\tM").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u)}(l,c,t.center,t.radius,t.clockWise,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c)}(l,c,t.center,t.radius,t.clockWise,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:p,angle:f})})),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,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=E(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){st(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.stroke=I(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else st(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=a}}},{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,n=this.components.get("donutSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!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)}}]),r}(ct)};var It=Object.freeze({__proto__:null,Chart:function t(n,i){return e(this,t),function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0;return"axis-mixed"===t?(n.type="line",new Ht(e,n)):Rt[t]?new Rt[t](e,n):void console.error("Undefined chart type: "+t)}(i.type,n,i)},PercentageChart:Lt,PieChart:Pt,Heatmap:Ft,AxisChart:Ht}),jt={NAME:"Frappe Charts",VERSION:"1.5.2"};return jt=Object.assign({},jt,It)})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self)["frappe-charts"]=e()}(this,(function(){"use strict";function t(e){return(t="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})(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,i=new Array(e);n=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}p.create=function(e,n){var i=document.createElement(e);for(var a in n){var s=n[a];if("inside"===a)p(s).appendChild(i);else if("around"===a){var r=p(s);r.parentNode.insertBefore(i,r),i.appendChild(r)}else"styles"===a?"object"===t(s)&&Object.keys(s).map((function(t){i.style[t]=s[t]})):a in i?i[a]=s:i.setAttribute(a,s)}return i};var y={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 b(t){return t.titleHeight+t.margins.top+t.paddings.top}function x(t){return t.margins.left+t.paddings.left}function k(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function w(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}var A=["pink","blue","green","grey","red","yellow","purple","teal","cyan","orange"],L={bar:A,line:A,pie:A,percentage:A,heatmap:["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],donut:A},P=Math.PI/180,M=function(){function t(n){var i=n.parent,a=void 0===i?null:i,s=n.colors,r=void 0===s?[]:s;e(this,t),this.parent=a,this.colors=r,this.titleName="",this.titleValue="",this.listValues=[],this.titleValueFirst=0,this.x=0,this.y=0,this.top=0,this.left=0,this.setup()}return i(t,[{key:"setup",value:function(){this.makeTooltip()}},{key:"refresh",value:function(){this.fill(),this.calcPosition()}},{key:"makeTooltip",value:function(){var t=this;this.container=p.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.list=this.container.querySelector(".data-point-list"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",(function(){t.hideTip()}))}},{key:"fill",value:function(){var t,e=this;this.index&&this.container.setAttribute("data-point-index",this.index),t=this.titleValueFirst?"".concat(this.titleValue,"").concat(this.titleName):"".concat(this.titleName,"").concat(this.titleValue,""),this.listValues.length>4?this.list.classList.add("tooltip-grid"):this.list.classList.remove("tooltip-grid"),this.title.innerHTML=t,this.dataPointList.innerHTML="",this.listValues.map((function(t,n){var i=e.colors[n]||"black",a=0===t.formatted||t.formatted?t.formatted:t.value,s=p.create("li",{innerHTML:'
          \n\t\t\t\t\t
          \n\t\t\t\t\t\t
          ').concat(0===a||a?a:"",'
          \n\t\t\t\t\t\t
          ').concat(t.title?t.title:"","
          \n\t\t\t\t\t
          ")});e.dataPointList.appendChild(s)}))}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-7.48,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,n=this.container.querySelector(".svg-pointer");if(this.left<0)n.style.left="calc(50% - ".concat(-1*this.left,"px)"),this.left=0;else if(this.left>e){var i=this.left-e,a="calc(50% + ".concat(i,"px)");n.style.left=a,this.left=e}else n.style.left="50%"}},{key:"setValues",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=n.name,this.titleValue=n.value,this.listValues=i,this.x=t,this.y=e,this.titleValueFirst=n.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"}}]),t}();function T(t){return parseFloat(t.toFixed(2))}function D(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n||(n=i?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(n);return t=i?a.concat(t):t.concat(a)}function C(t,e){return(t+"").length*e}function E(t,e){return{x:Math.sin(t*P)*e,y:Math.cos(t*P)*e}}function N(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 S(t,e){var n,i;return t<=e?(n=e-t,i=t):(n=t-e,i=e),[n,i]}function O(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return n>0?t=D(t,n):e=D(e,n),[t,e]}function F(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function z(t){var e;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var n=Math.floor(Math.log10(Math.abs(e)));if(n<=2)return e;var i=Math.floor(n/3),a=Math.pow(10,n-3*i)*+(e/Math.pow(10,n)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][i]}function W(t,e){for(var n=[],i=0;i1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,i={className:t,transform:e};return n&&(i.inside=n),R("g",i)}function Y(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:2;return R("path",{className:e,d:t,styles:{stroke:n,fill:i,"stroke-width":a}})}function V(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="path-fill-gradient-"+e+"-"+(n?"lighter":"default"),a=I(t,i),s=[1,.6,.2];return n&&(s=[.4,.2,0]),j(a,"0%",e,s[0]),j(a,"50%",e,s[1]),j(a,"100%",e,s[2]),i}function _(t,e,n){var i=n/2;return"M".concat(t,",0\n\t\t\th").concat(e-i,"\n\t\t\tq").concat(i,",0 ").concat(i,",").concat(i,"\n\t\t\tq0,").concat(i," -").concat(i,",").concat(i,"\n\t\t\th-").concat(e-i,"\n\t\t\tv").concat(n,"z")}function U(t,e,n){var i=n/2;return"M".concat(t+i,",0\n\t\t\th").concat(e-i,"\n\t\t\tv").concat(n,"\n\t\t\th-").concat(e-i,"\n\t\t\tq-").concat(i,", 0 -").concat(i,",-").concat(i,"\n\t\t\tq0,-").concat(i," ").concat(i,",-").concat(i,"z")}function q(t,e,n,i,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:n,width:i,height:i,rx:a,fill:s};return Object.keys(r).map((function(t){o[t]=r[t]})),R("rect",o)}function G(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||10,r=void 0!==a.dy?a.dy:s/2,o=a.fill||"#313B44",l=a.textAnchor||"start";return R("text",{className:t,x:e,y:n,dy:r+"px","font-size":s+"px",fill:o,"text-anchor":l,innerHTML:i})}function X(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke="#E2E6E9");var s=R("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:n,y2:i,styles:{stroke:a.stroke}}),r=R("text",{x:0,y:n>i?n+4:n-4-10,dy:"10px","font-size":"10px","text-anchor":"middle",innerHTML:e+""}),o=R("g",{transform:"translate(".concat(t,", 0)")});return o.appendChild(s),o.appendChild(r),o}function J(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke="#E2E6E9"),a.lineType||(a.lineType=""),a.shortenNumbers&&(e=z(e));var s="line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),r=R("line",{className:s,x1:n,x2:i,y1:0,y2:0,styles:{stroke:a.stroke}}),o=R("text",{x:n255?255:t<0?0:t}function tt(t,e){var n=et(t),i=!1;"#"==n[0]&&(n=n.slice(1),i=!0);var a=parseInt(n,16),s=Z((a>>16)+e),r=Z((a>>8&255)+e);return(i?"#":"")+(Z((255&a)+e)|r<<8|s<<16).toString(16)}var et=function(t){return Q[t]||t};function nt(t,e,n,i){var a="string"==typeof e?e:e.join(", ");return[t,{transform:n.join(", ")},i,"easein","translate",{transform:a}]}function it(t,e,n){return nt(t,[0,n],[0,e],350)}function at(t,e){return[t,{d:e},350,"easein"]}var st={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"};function rt(t,e,n){var i=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 c=void 0;c="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),h=e[l],d={attributeName:l,from:u,to:h,begin:"0s",dur:n/1e3+"s",values:u+";"+h,keySplines:st[i],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};for(var f in a&&(d.type=a),d)c.setAttribute(f,d[f]);r.appendChild(c),a?o.setAttribute(l,"translate(".concat(h,")")):o.setAttribute(l,h)}return[r,o]}function ot(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function lt(t,e){var n=[],i=[];e.map((function(t){var e,a,s=t[0],r=s.parentNode;t[0]=s;var o=u(rt.apply(void 0,h(t)),2);e=o[0],a=o[1],n.push(a),i.push([e,r]),r.replaceChild(e,s)}));var a=t.cloneNode(!0);return i.map((function(t,i){t[1].replaceChild(n[i],t[0]),e[i][0]=n[i]})),a}function ct(t,e,n){if(0!==n.length){var i=lt(e,n);e.parentNode==t&&(t.removeChild(e),t.appendChild(i)),setTimeout((function(){i.parentNode==t&&(t.removeChild(i),t.appendChild(e))}),250)}}var ut=function(){function t(n,i){if(e(this,t),this.parent="string"==typeof n?document.querySelector(n):n,!(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(y));var a=this.measures;this.setMeasures(i),this.title.length||(a.titleHeight=0),this.config.showLegend||(a.legendHeight=0),this.argHeight=i.height||a.baseHeight,this.state={},this.options={},this.initTimeout=700,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return i(t,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var n=[];return(t=(t||[]).concat(L[e])).forEach((function(t){var e=et(t);!function(t){return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i.test(t)}(e)?console.warn('"'+t+'" is not a valid color.'):n.push(e)})),n}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-k(this.measures),this.boundDrawFn=function(){return t.draw(!0)},window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){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 t={inside:this.parent,className:"chart-container"};this.independentWidth&&(t.styles={width:this.independentWidth+"px"}),this.container=p.create("div",t)}},{key:"makeTooltip",value:function(){this.tip=new M({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&&g(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(){var t,e,n;this.baseWidth=(t=this.parent,e=window.getComputedStyle(t),n=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight),t.clientWidth-n),this.width=this.baseWidth-w(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t,e,n,i,a=this.measures;this.svg=(t=this.container,e="frappe-chart chart",n=this.baseWidth,i=this.baseHeight,R("svg",{className:e,inside:t,width:n,height:i})),this.svgDefs=R("defs",{inside:this.svg}),this.title.length&&(this.titleEL=G("title",a.margins.left,a.margins.top,this.title,{fontSize:a.titleFontSize,fill:"#666666",dy:a.titleFontSize}));var s=b(a);this.drawArea=B(this.type+"-chart chart-draw-area","translate(".concat(x(a),", ").concat(s,")")),this.config.showLegend&&(s+=this.height+a.paddings.bottom,this.legendArea=B("chart-legend","translate(".concat(x(a),", ").concat(s,")"))),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(x(a),b(a))}},{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)}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map((function(t){return t.parentNode.removeChild(t)}));var i=[];e.forEach((function(t){i=i.concat(t.update(n))})),i.length>0?(ct(this.container,this.svg,i),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){m(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=function(t){var e=t.cloneNode(!0);e.classList.add("chart-container"),e.setAttribute("xmlns","http://www.w3.org/2000/svg"),e.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=p.create("style",{innerHTML:".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;}.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}"});e.insertBefore(n,e.firstChild);var i=p.create("div");return i.appendChild(e),i.innerHTML}(this.svg);!function(t,e){var n=document.createElement("a");n.style="display: none";var i=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(i);n.href=a,n.download=t,document.body.appendChild(n),n.click(),setTimeout((function(){document.body.removeChild(n),window.URL.revokeObjectURL(a)}),300)}(this.title||"Chart",[t])}}]),t}(),ht=function(t){a(r,t);var n=l(r);function r(t,i){return e(this,r),n.call(this,t,i)}return i(r,[{key:"configure",value:function(t){c(s(r.prototype),"configure",this).call(this,t),this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,n=this.config.maxSlices;e.sliceTotals=[];var i=this.data.labels.map((function(e,n){var i=0;return t.data.datasets.map((function(t){i+=t.values[n]})),[i,e]})).filter((function(t){return t[0]>=0})),a=i;if(i.length>n){i.sort((function(t,e){return e[0]-t[0]})),a=i.slice(0,n-1);var s=i.slice(n-1),r=0;s.map((function(t){r+=t[0]})),a.push([r,"Rest"]),this.colors[n-1]="grey"}e.labels=[],a.map((function(t){e.sliceTotals.push(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 n=0,i=0;this.legendTotals.map((function(a,s){var r=150,o=Math.floor((t.width-w(t.measures))/r);t.legendTotals.lengtho&&(n=0,i+=60);var l=r*n+5,c=t.config.truncateLegends?F(e.labels[s],r/10):e.labels[s],u=function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"none",s=arguments.length>5?arguments[5]:void 0,r=arguments.length>6?arguments[6]:void 0,o=arguments.length>7&&void 0!==arguments[7]&&arguments[7],l={className:"legend-dot",x:0,y:4-n,height:n,width:n,rx:i,fill:a},c=R("text",{className:"legend-dataset-label",x:n,y:0,dx:"10px",dy:10/3+"px","font-size":"16px","text-anchor":"start",fill:"#313B44",innerHTML:s=o?F(s,15):s}),u=R("text",{className:"legend-dataset-value",x:n,y:20,dx:"10px",dy:10/3+"px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:r}),h=R("g",{transform:"translate(".concat(t,", ").concat(e,")")});return h.appendChild(R("rect",l)),h.appendChild(c),h.appendChild(u),h}(l,i,12,3,t.colors[s],c,a,!1);t.legendArea.appendChild(u),n++}))}}]),r}(ut),dt=["January","February","March","April","May","June","July","August","September","October","November","December"],ft=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function vt(t){var e=t.getDate(),n=t.getMonth()+1;return[t.getFullYear(),(n>9?"":"0")+n,(e>9?"":"0")+e].join("-")}function gt(t){return new Date(t.getTime())}function mt(t,e){var n=kt(t);return Math.ceil(function(t,e){return(pt(e)-pt(t))/864e5}(n,e)/7)}function yt(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],n=dt[t];return e?n.slice(0,3):n}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=gt(t),n=e.getDay();return 0!==n&&wt(e,-1*n),e}function wt(t,e){t.setDate(t.getDate()+e)}var At=function(){function t(n){var i=n.layerClass,a=void 0===i?"":i,s=n.layerTransform,r=void 0===s?"":s,o=n.constants,l=n.getData,c=n.makeElements,u=n.animateElements;e(this,t),this.layerTransform=r,this.constants=o,this.makeElements=c,this.getData=l,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=a,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return i(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=B(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){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}(),Lt={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=Y(e,"donut-path",t.colors[n],"none",t.strokeWidth);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return at(e,t.sliceStrings[n])}))}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=Y(e,"pie-path","none",t.colors[n]);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return at(e,t.sliceStrings[n])}))}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this,n=t.xPositions.length;return t.xPositions.map((function(i,a){var s=a==n-1,r=0==a;return function(t,e,n,i,a,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:"none";if(s){var o=_(t,n,i);return Y(o,"percentage-bar",null,r)}if(a){var l=U(t,n,i);return Y(l,"percentage-bar",null,r)}var c={className:"percentage-bar",x:t,y:e,width:n,height:i,fill:r};return R("rect",c)}(i,0,t.widths[a],e.constants.barHeight,r,s,t.colors[a])}))},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};N(t)||(t=0),i.pos||(i.pos="left"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke="#E2E6E9"),i.className||(i.className="");var a=-6,s="span"===i.mode?n+6:0;return"tick"===i.mode&&"right"===i.pos&&(a=n+6,s=n),J(t,e,a+=i.offset,s+=i.offset,{stroke:i.stroke,className:i.className,lineType:i.lineType,shortenNumbers:i.shortenNumbers})}(n,t.labels[i],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})}))},animateElements:function(t){var e=t.positions,n=t.labels,i=this.oldData.positions,a=this.oldData.labels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,labels:n}),this.store.map((function(t,n){return it(t,e[n],i[n])}))}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};N(t)||(t=0),i.pos||(i.pos="bottom"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke="#E2E6E9"),i.className||(i.className="");var a=n+6,s="span"===i.mode?-6:n;return"tick"===i.mode&&"top"===i.pos&&(a=-6,s=0),X(t,e,a,s,{stroke:i.stroke,className:i.className,lineType:i.lineType})}(n,t.calcLabels[i],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})}))},animateElements:function(t){var e=t.positions,n=t.calcLabels,i=this.oldData.positions,a=this.oldData.calcLabels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,calcLabels:n}),this.store.map((function(t,n){return function(t,e,n){return nt(t,[n,0],[e,0],350)}(t,e[n],i[n])}))}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};i.labelPos||(i.labelPos="right");var a="left"===i.labelPos?4:n-C(e,5)-4,s=R("text",{className:"chart-label",x:a,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:e+""}),r=J(t,"",0,n,{stroke:i.stroke||"#E2E6E9",className:i.className||"",lineType:i.lineType});return r.appendChild(s),r}(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.position})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.options})),s=this.oldData.map((function(t){return t.position}));return this.render(s.map((function(t,e){return{position:s[e],label:i[e],options:a[e]}}))),this.store.map((function(t,e){return it(t,n[e],s[e])}))}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=R("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:"#E2E6E9","stroke-dasharray":"".concat(n,", ").concat(s)},x:0,y:0,width:n,height:s});a.labelPos||(a.labelPos="right");var o="left"===a.labelPos?4:n-C(i+"",4.5)-4,l=R("text",{className:"chart-label",x:o,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:i+""}),c=R("g",{transform:"translate(0, ".concat(e,")")});return c.appendChild(r),c.appendChild(l),c}(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.endPos})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.startPos})),s=t.map((function(t){return t.options})),r=this.oldData.map((function(t){return t.endPos})),o=this.oldData.map((function(t){return t.startPos}));this.render(r.map((function(t,e){return{startPos:o[e],endPos:r[e],label:i[e],options:s[e]}})));var l=[];return this.store.map((function(t,e){l=l.concat(function(t,e,n,i){var a=e-n,s=t.childNodes[0],r=s.getAttribute("width");return[[s,{height:a,"stroke-dasharray":"".concat(r,", ").concat(a)},350,"easein"],nt(t,[0,i],[0,n],350)]}(t,a[e],n[e],r[e]))})),l}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,n=this.constants,i=n.index,a=n.colWidth,s=n.rowHeight,r=n.squareSize,o=n.radius,l=n.xTranslate,c=l,u=0;return this.serializedSubDomains=[],t.cols.map((function(t,n){1===n&&e.labels.push(G("domain-name",c,-12,bt(i,!0).toUpperCase(),{fontSize:9})),t.map((function(t,n){if(t.fill){var i={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":n},a=q("day",c,u,r,o,t.fill,i);e.serializedSubDomains.push(a)}u+=s})),u=0,c+=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(n,i){return function(t,e,n,i){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=S(e,o.zeroLine),c=u(l,2),h=c[0],d=c[1];d-=r,0===h&&(h=o.minHeight,d-=o.minHeight),N(t)||(t=0),N(d)||(d=0),N(h,!0)||(h=0),N(n,!0)||(n=0);var f=R("rect",{className:"bar mini",style:"fill: ".concat(i),"data-point-index":s,x:t,y:d,width:n,height:h});if((a+="")||a.length){f.setAttribute("y",0),f.setAttribute("x",0);var p=R("text",{className:"data-point-value",x:n/2,y:0,dy:"-5px","font-size":"10px","text-anchor":"middle",innerHTML:a}),v=R("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(d,")")});return v.appendChild(f),v.appendChild(p),v}return f}(t.xPositions[i],n,t.barWidth,e.color,t.labels[i],i,t.offsets[i],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})})),this.units},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,c=u(O(s,e),2);s=c[0],e=c[1];var h=u(O(r,n),2);r=h[0],n=h[1];var d=u(O(o,i),2);o=d[0],i=d[1];var f=u(O(l,a),2);l=f[0],a=f[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var p=[];return this.store.map((function(a,s){p=p.concat(function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=S(n,s.zeroLine),o=u(r,2),l=o[0],c=o[1];if(c-=a,"rect"!==t.nodeName){var h=t.childNodes[0],d=[h,{width:i,height:l},350,"easein"],f=t.getAttribute("transform").split("(")[1].slice(0,-1),p=nt(t,f,[e,c],350);return[d,p]}return[[t,{width:i,height:l,x:e,y:c},350,"easein"]]}(a,e[s],n[s],t.barWidth,i[s],{zeroLine:t.zeroLine}))})),p}},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=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map((function(e,n){return t[n]+","+e})),r=s.join("L");i.spline&&(r=W(t,e));var o=Y("M"+r,"line-graph-path",n);if(i.heatline){var l=V(a.svgDefs,n);o.style.stroke="url(#".concat(l,")")}var c={path:o};if(i.regionFill){var u=V(a.svgDefs,n,!0),h="M"+"".concat(t[0],",").concat(a.zeroLine,"L")+r+"L".concat(t.slice(-1)[0],",").concat(a.zeroLine);c.region=Y(h,"region-fill","none","url(#".concat(u,")"))}return c}(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(n,i){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=R("circle",{style:"fill: ".concat(i),"data-point-index":s,cx:t,cy:e,r:n});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=R("text",{className:"data-point-value",x:0,y:0,dy:-5-n+"px","font-size":"10px","text-anchor":"middle",innerHTML:a}),l=R("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(r),l.appendChild(o),l}return r}(t.xPositions[i],n,t.radius,e.color,e.valuesOverPoints?t.values[i]:"",i)}))),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=u(O(a,e),2);a=o[0],e=o[1];var l=u(O(s,n),2);s=l[0],n=l[1];var c=u(O(r,i),2);r=c[0],i=c[1],this.render({xPositions:a,yPositions:s,values:i,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var h=[];return Object.keys(this.paths).length&&(h=h.concat(function(t,e,n,i,a){var s=[],r=n.map((function(t,n){return e[n]+","+t})).join("L");a&&(r=W(e,n));var o=[t.path,{d:"M"+r},350,"easein"];if(s.push(o),t.region){var l="".concat(e[0],",").concat(i,"L"),c="L".concat(e.slice(-1)[0],", ").concat(i),u=[t.region,{d:"M"+l+r+c},350,"easein"];s.push(u)}return s}(this.paths,e,n,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map((function(t,i){h=h.concat(function(t,e,n){if("circle"!==t.nodeName){var i=t.getAttribute("transform").split("(")[1].slice(0,-1);return[nt(t,i,[e,n],350)]}return[[t,{cx:e,cy:n},350,"easein"]]}(t,e[i],n[i]))})),h}}};function Pt(t,e,n){var i=Object.keys(Lt).filter((function(e){return t.includes(e)})),a=Lt[i[0]];return Object.assign(a,{constants:e,getData:n}),new At(a)}var Mt=function(t){a(r,t);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="percentage",a.setup(),a}return i(r,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var n=this.barOptions;n.height=n.height||16,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(n.height+.5*n.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map((function(t){var e=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calc",value:function(){var t=this;c(s(r.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,e=this.state;this.container.addEventListener("mousemove",(function(n){var i=t.components.get("percentageBars").store,a=n.target;if(i.includes(a)){var s=i.indexOf(a),r=v(t.container),o=v(a),l=o.left-r.left+parseInt(a.getAttribute("width"))/2,c=o.top-r.top,u=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[s]:t.state.labels[s])+": ",h=e.sliceTotals[s]/e.grandTotal;t.tip.setValues(l,c,{name:u,value:(100*h).toFixed(1)+"%"}),t.tip.showTip()}}))}}]),r}(ht),Tt=function(t){a(r,t);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="pie",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.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;c(s(r.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,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,f=i?-h:h,p=o+=f,v=E(u,n),g=E(p,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*n.y,u=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z\n\t\tL").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u," z")}(l,c,t.center,t.radius,i,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z")}(l,c,t.center,t.radius,i,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:p,angle:f})})),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=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=E(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.fill=tt(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=a}}},{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,n=this.components.get("pieSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!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)}}]),r}(ht);function Dt(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 n=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,n)),n]}function Ct(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Math.ceil(t),i=Math.floor(e),a=n-i,s=a,r=1;a>5&&(a%2!=0&&(a=++n-i),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(i+r*l);return o}function Et(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Dt(t),i=u(n,2),a=i[0],s=i[1],r=e?e/Math.pow(10,s):0,o=Ct(a=a.toFixed(6),r);return o=o.map((function(t){return t*Math.pow(10,s)}))}function Nt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,h(t)),i=Math.min.apply(Math,h(t)),a=[];function s(t,e){for(var n=Et(t),i=n[1]-n[0],a=0,s=1;a=0&&i>=0)Dt(n)[1],a=e?Et(n,i):Et(n);else if(n>0&&i<0){var r=Math.abs(i);if(n>=r)Dt(n)[1],a=s(n,r);else{Dt(r)[1];var o=s(r,n);a=o.map((function(t){return-1*t}))}}else if(n<=0&&i<=0){var l=Math.abs(i),c=Math.abs(n);Dt(l)[1],a=(a=e?Et(l,c):Et(l)).reverse().map((function(t){return-1*t}))}return a}function St(t){var e,n=Ot(t);if(t.indexOf(0)>=0)e=t.indexOf(0);else if(t[0]>0){e=-1*t[0]/n}else{e=-1*t[t.length-1]/n+(t.length-1)}return e}function Ot(t){return t[1]-t[0]}function Ft(t){return t[t.length-1]-t[0]}function zt(t,e){return T(e.zeroLine-t*e.scaleMultiplier)}var Wt=function(t){a(s,t);var n=l(s);function s(t,i){var a;e(this,s),(a=n.call(this,t,i)).type="heatmap",a.countLabel=i.countLabel||"";var r=["Sunday","Monday"],o=r.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return a.startSubDomainIndex=r.indexOf(o),a.setup(),a}return i(s,[{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=84+k(e);var n=this.data,i=this.discreteDomains?12:0;this.independentWidth=12*(mt(n.start,n.end)+i)+w(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+w(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(n){var i=new Date(1e3*n);e[vt(i)]=t.dataPoints[n]})),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=gt(this.data.start),t.end=gt(this.data.end),t.firstWeekStart=gt(t.start),t.noOfWeeks=mt(t.start,t.end),t.distribution=function(t,e){for(var n=Math.max.apply(Math,h(t)),i=1/(e-1),a=[],s=0;s1&&void 0!==arguments[1]?arguments[1]:"",n=[t.getMonth(),t.getFullYear()],i=n[0],a=n[1],s=kt(t),r={index:i,cols:[]};wt(e=gt(e)||xt(i,a),1);for(var o,l=mt(s,e),c=[],u=0;u2&&void 0!==arguments[2]&&arguments[2],i=this.state,a=gt(t),s=[],r=0;r<7;r++,wt(a,1)){var o={},l=a>=i.start&&a<=i.end;n||a.getMonth()!==e||!l?o.yyyyMmDd=vt(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e,n,i=vt(t),a=this.data.dataPoints[i];return{yyyyMmDd:i,dataValue:a||0,fill:this.colors[(e=a,n=this.state.distribution,n.filter((function(t){return tn?i.slice(0,n):D(i,n-i.length,0)}else t.values=a;t.chartType||(t.chartType=e)})),t.yRegions&&t.yRegions.map((function(t){if(t.end0&&void 0!==arguments[0]?arguments[0]:this.data;return Ht(t,this.type)}},{key:"prepareFirstData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;return Rt(t)}},{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,n){return T(t.xOffset+n*t.unitWidth)}))}}},{key:"calcYAxisParameters",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=Nt(t,e),i=this.height/Ft(n),a=Ot(n)*i,s=this.height-St(n)*a;this.state.yAxis={labels:n,positions:n.map((function(t){return s-t*i})),scaleMultiplier:i,zeroLine:s},this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e){return e.map((function(e){return zt(e,t.yAxis)}))};t.datasets=this.data.datasets.map((function(t,n){var i=t.values,a=t.cumulativeYs||[];return{name:t.name,index:n,chartType:t.chartType,values:i,yPositions:e(i),cumulativeYs:a,cumulativeYPos:e(a)}}))}},{key:"calcYExtremes",value:function(){var t=this.state;this.barOptions.stacked?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,n){e1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=t/e.length;i<=0&&(i=1);var a,s=i/7;if(n){var r=Math.max.apply(Math,h(e.map((function(t){return t.length}))));a=Math.ceil(r/s)}var o=e.map((function(t,e){return(t+="").length>s&&(n?e%a!=0&&(t=""):t=s-3>0?t.slice(0,s-3)+" ...":t.slice(0,s)+".."),t}));return o}(this.width,t.xAxis.labels,this.config.xIsSeries),t.xAxis}.bind(this)],["yRegions",{width:this.width,pos:"right"},function(){return this.state.yRegions}.bind(this)]],n=this.state.datasets.filter((function(t){return"bar"===t.chartType})),i=this.state.datasets.filter((function(t){return"line"===t.chartType})),a=n.map((function(e){var i=e.index;return["barGraph-"+e.index,{index:i,color:t.colors[i],stacked:t.barOptions.stacked,valuesOverPoints:t.config.valuesOverPoints,minHeight:0*t.height},function(){var t=this.state,e=t.datasets[i],a=this.barOptions.stacked,s=this.barOptions.spaceRatio||.8,r=t.unitWidth*(1-s),o=r/(a?1:n.length),l=t.xAxis.positions.map((function(t){return t-r/2}));a||(l=l.map((function(t){return t+o*i})));var c=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(c=a&&e.index===t.datasets.length-1?e.cumulativeYs:e.values);var u=new Array(t.datasetLength).fill(0);return a&&(u=e.yPositions.map((function(t,n){return t-e.cumulativeYPos[n]}))),{xPositions:l,yPositions:e.yPositions,offsets:u,labels:c,zeroLine:t.yAxis.zeroLine,barsWidth:r,barWidth:o}}.bind(t)]})),s=i.map((function(e){var n=e.index;return["lineGraph-"+e.index,{index:n,color:t.colors[n],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[n],i=t.yAxis.positions[0]b(n)?t.mapTooltipXPosition(a):t.tip.hideTip()}))}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var n=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=e.reduce((function(e,n){return Math.abs(n-t)=0){var i=this.dataByIndex[n];this.tip.setValues(i.xPos+this.tip.offset.x,i.yExtreme+this.tip.offset.y,{name:i.formattedLabel,value:""},i.values,n),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,n){var i=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]&&arguments[5],r={className:"legend-bar",x:0,y:0,width:n,height:"2px",fill:i},o=R("text",{className:"legend-dataset-text",x:0,y:0,dy:"20px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:a=s?F(a,15):a}),l=R("g",{transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(R("rect",r)),l.appendChild(o),l}(100*n,"0",100,t.colors[n],e.name,t.config.truncateLegends);t.legendArea.appendChild(i)})))}},{key:"makeOverlay",value:function(){var t=this;this.init?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 n=e.units[t.state.currentIndex];e.overlay=K[e.type](n),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 n=e.getAttribute("data-point-index");t.setCurrentDataPoint(n)}))}))})),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 n=e.units[t.state.currentIndex];$[e.type](n,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,n={index:t,label:e.xAxis.labels[t],values:e.datasets.map((function(e){return e.values[t]}))};return n}},{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,function(t,e,n){var i=document.createEvent("HTMLEvents");for(var a in i.initEvent(e,!0,!0),n)i[a]=n[a];t.dispatchEvent(i)}(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;c(s(r.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||(c(s(r.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,n){t[n]&&(e.values=t[n])})),this.update(this.data)}}]),r}(ut),jt={bar:It,line:It,percentage:Mt,heatmap:Wt,pie:Tt,donut:function(t){a(r,t);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="donut",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.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;c(s(r.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,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,f=i?-h:h,p=o+=f,v=E(u,n),g=E(p,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*i+o,u=n.y+t.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c,"\n\t\tM").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u)}(l,c,t.center,t.radius,t.clockWise,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c)}(l,c,t.center,t.radius,t.clockWise,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:p,angle:f})})),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=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=E(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.stroke=tt(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=a}}},{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,n=this.components.get("donutSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!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)}}]),r}(ht)};var Bt=Object.freeze({__proto__:null,Chart:function t(n,i){return e(this,t),function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0;return"axis-mixed"===t?(n.type="line",new It(e,n)):jt[t]?new jt[t](e,n):void console.error("Undefined chart type: "+t)}(i.type,n,i)},PercentageChart:Mt,PieChart:Tt,Heatmap:Wt,AxisChart:It}),Yt={NAME:"Frappe Charts",VERSION:"1.5.2"};return Yt=Object.assign({},Yt,Bt)})); +//# sourceMappingURL=frappe-charts.umd.js.map diff --git a/dist/frappe-charts.umd.js.map b/dist/frappe-charts.umd.js.map new file mode 100644 index 0000000..01b1f3b --- /dev/null +++ b/dist/frappe-charts.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"frappe-charts.umd.js","sources":["../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/draw.js","../src/js/utils/colors.js","../src/js/utils/animate.js","../src/js/utils/animation.js","../src/js/charts/BaseChart.js","../src/js/utils/export.js","../src/css/chartsCss.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/chart.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.8;\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 = 16;\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 = 7.48;\nconst DEFAULT_CHART_COLORS = ['pink', 'blue', 'green', 'grey', 'red', 'yellow', 'purple', 'teal', 'cyan', 'orange'];\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.list = this.container.querySelector('.data-point-list');\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\n\t\tif (this.listValues.length > 4) {\n\t\t\tthis.list.classList.add('tooltip-grid');\n\t\t} else {\n\t\t\tthis.list.classList.remove('tooltip-grid');\n\t\t}\n\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\t\t\tlet li = $.create('li', {\n\t\t\t\tinnerHTML: `
            \n\t\t\t\t\t
            \n\t\t\t\t\t\t
            ${ value === 0 || value ? value : '' }
            \n\t\t\t\t\t\t
            ${set.title ? set.title : '' }
            \n\t\t\t\t\t
            `\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}","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","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR } from './constants';\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 = '#E2E6E9';\nconst FONT_FILL = '#313B44';\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 makeRoundedCornerBarPath(x, width, height) {\n\tlet radius = height/2;\n\n\treturn `M${x},0\n\t\t\th${width - radius}\n\t\t\tq${radius},0 ${radius},${radius}\n\t\t\tq0,${radius} -${radius},${radius}\n\t\t\th-${width - radius}\n\t\t\tv${height}z`;\n}\n\nexport function makeRoundedCornerBarPathLast(x, width, height) {\n\tlet radius = height/2;\n\n\treturn `M${x + radius},0\n\t\t\th${width - radius}\n\t\t\tv${height}\n\t\t\th-${width - radius}\n\t\t\tq-${radius}, 0 -${radius},-${radius}\n\t\t\tq0,-${radius} ${radius},-${radius}z`;\n}\n\n\nexport function percentageBar(x, y, width, height, isFirst, isLast, fill='none') {\n\t// https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90\n\t// \n\t// \n\n\tif (isLast) {\n\t\tlet pathStr = makeRoundedCornerBarPath(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\n\tif (isFirst) {\n\t\tlet pathStr = makeRoundedCornerBarPathLast(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\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};\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, radius, fill='none', label, value, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tx: 0,\n\t\ty: 4 - size,\n\t\theight: size,\n\t\twidth: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tlet textLabel = createSVG('text', {\n\t\tclassName: 'legend-dataset-label',\n\t\tx: size,\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.6) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet textValue = createSVG('text', {\n\t\tclassName: 'legend-dataset-value',\n\t\tx: size,\n\t\ty: FONT_SIZE + 10,\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: value\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(textLabel);\n\tgroup.appendChild(textValue);\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\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.lineType) options.lineType = '';\n\tif (options.shortenNumbers) label = shortenLargeNumber(label);\n\n\tlet className = 'line-horizontal ' + options.className +\n\t\t(options.lineType === \"dashed\" ? \"dashed\": \"\");\n\n\tlet l = createSVG('line', {\n\t\tclassName: className,\n\t\tx1: x1,\n\t\tx2: x2,\n\t\ty1: 0,\n\t\ty2: 0,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / 2 - 2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': x1 < x2 ? 'end' : 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(0, ${y})`,\n\t\t'stroke-opacity': 1\n\t});\n\n\tif(text === 0 || text === '0') {\n\t\tline.style.stroke = \"rgba(27, 31, 35, 0.6)\";\n\t}\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nexport function yLine(y, label, width, options={}) {\n\tif (!isValidNumber(y)) y = 0;\n\n\tif(!options.pos) options.pos = 'left';\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\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType,\n\t\tshortenNumbers: options.shortenNumbers\n\t});\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","const PRESET_COLOR_MAP = {\n\t'pink': '#F683AE',\n\t'blue': '#318AD8',\n\t'green': '#48BB74',\n\t'grey': '#A6B1B9',\n\t'red': '#F56B6B',\n\t'yellow': '#FACF7A',\n\t'purple': '#44427B',\n\t'teal': '#5FD8C4',\n\t'cyan': '#15CCEF',\n\t'orange': '#F8814F',\n\t'light-pink': '#FED7E5',\n\t'light-blue': '#BFDDF7',\n\t'light-green': '#48BB74',\n\t'light-grey': '#F4F5F6',\n\t'light-red': '#F6DFDF',\n\t'light-yellow': '#FEE9BF',\n\t'light-purple': '#E8E8F7',\n\t'light-teal': '#D3FDF6',\n\t'light-cyan': '#DDF8FD',\n\t'light-orange': '#FECDB8'\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\treturn PRESET_COLOR_MAP[color] || color;\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\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\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 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';\n\nexport default class BaseChart {\n\tconstructor(parent, 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\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\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}\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 { $ } 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","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;}.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 BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\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.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(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 += 60;\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 dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t12,\n\t\t\t\t3,\n\t\t\t\tthis.colors[i],\n\t\t\t\tlabel,\n\t\t\t\td,\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 { makeText, makePath, xLine, yLine, yMarker, yRegion, datasetBar, datasetDot, percentageBar, getPaths, heatSquare } from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport { translateHoriLine, translateVertLine, animateRegion, animateBar,\n\tanimateDot, animatePath, animatePathStr } from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n\tconstructor({\n\t\tlayerClass = '',\n\t\tlayerTransform = '',\n\t\tconstants,\n\n\t\tgetData,\n\t\tmakeElements,\n\t\tanimateElements\n\t}) {\n\t\tthis.layerTransform = layerTransform;\n\t\tthis.constants = constants;\n\n\t\tthis.makeElements = makeElements;\n\t\tthis.getData = getData;\n\n\t\tthis.animateElements = animateElements;\n\n\t\tthis.store = [];\n\t\tthis.labels = [];\n\n\t\tthis.layerClass = layerClass;\n\t\tthis.layerClass = typeof(this.layerClass) === 'function'\n\t\t\t? this.layerClass() : this.layerClass;\n\n\t\tthis.refresh();\n\t}\n\n\trefresh(data) {\n\t\tthis.data = data || this.getData();\n\t}\n\n\tsetup(parent) {\n\t\tthis.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n\t}\n\n\tmake() {\n\t\tthis.render(this.data);\n\t\tthis.oldData = this.data;\n\t}\n\n\trender(data) {\n\t\tthis.store = this.makeElements(data);\n\n\t\tthis.layer.textContent = '';\n\t\tthis.store.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t\tthis.labels.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t}\n\n\tupdate(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\tconst numberOfPoints = data.xPositions.length;\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\n\t\t\t\tlet isLast = i == numberOfPoints - 1;\n\t\t\t\tlet isFirst = i == 0;\n\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i], this.constants.barHeight, isFirst, isLast, 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\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos, shortenNumbers: this.constants.shortenNumbers})\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.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\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\tlabels: newLabels\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\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\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\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\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(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 newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\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 } 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\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},\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 => value * Math.pow(10, exponent));\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.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}\n\n\t\t// Set labels\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\tlet zeroData = {\n\t\tlabels: realData.labels.slice(0, -1),\n\t\tdatasets: realData.datasets.map(d => {\n\t\t\treturn {\n\t\t\t\tname: '',\n\t\t\t\tvalues: zeroArray.slice(0, -1),\n\t\t\t\tchartType: d.chartType\n\t\t\t};\n\t\t}),\n\t};\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\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\t\tthis.config.shortenYAxisNumbers = options.axisOptions.shortenYAxisNumbers || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.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\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\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\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tshortenNumbers: this.config.shortenYAxisNumbers\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\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\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\t\t\tlet index = d.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\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth * (1 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\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: s.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\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + 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\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\tspline: this.lineOptions.spline,\n\t\t\t\t\thideDots: this.lineOptions.hideDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\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},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\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 '../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 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.5.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","create","tag","o","createElement","i","val","appendChild","ref","parentNode","insertBefore","_typeof","Object","keys","map","prop","style","setAttribute","BASE_MEASURES","margins","paddings","baseHeight","titleHeight","legendHeight","titleFontSize","getTopOffset","m","getLeftOffset","getExtraHeight","getExtraWidth","DEFAULT_CHART_COLORS","DEFAULT_COLORS","bar","line","pie","percentage","heatmap","donut","ANGLE_RATIO","Math","PI","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","inside","this","className","innerHTML","hideTip","title","list","dataPointList","addEventListener","_this","index","length","classList","add","remove","set","color","_this2","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","parseFloat","toFixed","fillArray","array","count","start","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","round","getSplineCurvePointsStr","xList","yList","points","push","controlPoint","current","previous","next","reverse","pointA","pointB","lengthX","lengthY","sqrt","atan2","command","reduce","acc","point","a","pointStr","cps","cpe","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","id","x1","x2","y1","y2","setGradientStop","gradElem","offset","makeSVGGroup","transform","args","makePath","pathStr","stroke","strokeWidth","styles","makeGradient","lighter","gradientDef","opacities","makeRoundedCornerBarPath","makeRoundedCornerBarPathLast","heatSquare","size","data","rx","key","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","text","FONT_SIZE","makeHoriLine","lineType","shortenNumbers","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","parseInt","updateOverlay","attributes","values","filter","attr","includes","specified","nodeValue","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","b","toString","translate","oldCoord","newCoord","duration","old","join","translateHoriLine","yLine","newY","oldY","animatePathStr","oldPath","EASING","ease","linear","easein","easeout","easeinout","animateSVGElement","props","dur","easingType","type","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","from","to","begin","keySplines","keyTimes","calcMode","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","svgContainer","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","setTimeout","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","showTooltip","showLegend","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","argHeight","state","initTimeout","overlays","configure","validColors","forEach","test","isValidColor","console","warn","boundDrawFn","draw","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","drawArea","render","update","renderLegend","setupNavigation","padding","baseWidth","getComputedStyle","paddingLeft","paddingRight","svg","svgDefs","titleEL","legendArea","updateTipOffset","Map","error","make","_this3","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","clone","styleEl","firstChild","prepareForExport","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","downloadFile","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","center","textContent","legendTotals","barWidth","divisor","dot","truncate","textLabel","dx","textValue","group","legendDot","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","SEC_IN_DAY","getDaysBetween","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","donutSlices","sliceStrings","transition","newData","pieSlices","percentageBars","numberOfPoints","xPositions","isLast","isFirst","percentageBar","widths","barHeight","yAxis","positions","position","pos","mode","newPos","newLabels","oldPos","oldLabels","xAxis","xLine","calcLabels","newX","oldX","translateVertLine","yMarkers","labelPos","labelSvg","yMarker","_this5","newOptions","yRegions","region","yRegion","startPos","endPos","_this6","newStarts","oldStarts","rectGroup","newY1","newY2","oldY2","newHeight","animateRegion","heatDomain","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","_this7","toUpperCase","yyyyMmDd","dataValue","square","barGraph","unitType","units","yPositions","j","meta","minHeight","datasetBar","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","rectAnim","oldCoordStr","split","groupAnim","animateBar","lineGraph","paths","hideLine","pointsList","pointsStr","spline","path","heatline","gradient_id","regionFill","gradient_id_region","getPaths","hideDots","cx","cy","datasetDot","valuesOverPoints","newValues","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePath","animateDot","getComponent","k","assign","PercentageChart","barOptions","depth","component","xPos","bars","get","target","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","clockWise","prevSlicesProperties","slicesProperties","curAngle","curStart","curEnd","originDiffAngle","largeArc","diffAngle","endAngle","startPosition","endPosition","prevProperty","curPath","arcStartX","arcStartY","arcEndX","midArc","arcEndY","makeCircleStr","makeArcPathStr","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","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","scaleMultiplier","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","spacing","HEATMAP_SQUARE_SIZE","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","distribution","distributionSize","dataMaxValue","distributionStep","checkpoint","calcDistribution","domainConfigs","getDomains","lessCol","dayName","dayText","comp","daySquares","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","NO_OF_DAYS_IN_WEEK","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","zeroDataPrep","zeroData","AxisChart","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","shortenYAxisNumbers","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","cumulativeYPos","stacked","yExtremes","cumulative","allValueLists","chartWidth","isSeries","allowedSpace","seriesMultiple","allowedLetters","maxLabelLength","getShortenedLabels","barDatasets","lineDatasets","barsConfigs","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","yPos","formattedLabel","yExtreme","relX","relY","mapTooltipXPosition","goal","arr","closest","prev","curr","getClosestInArray","dbi","legendBar","overlayGuides","g","currentIndex","currentUnit","_this8","_this9","setCurrentDataPoint","_this10","data_point","properties","evt","createEvent","initEvent","dispatchEvent","fire","getDataPoint","datasetValues","splice","chartTypes","makeStrokeCircleStr","makeArcStrokePathStr","getChartByType","frappe","Charts"],"mappings":"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"} \ No newline at end of file