mirror of
https://github.com/flarum/framework.git
synced 2024-12-12 22:53:37 +08:00
1 line
176 KiB
Plaintext
1 line
176 KiB
Plaintext
{"version":3,"sources":["webpack://@flarum/statistics/webpack/bootstrap","webpack://@flarum/statistics/external \"flarum.core.compat['utils/abbreviateNumber']\"","webpack://@flarum/statistics/external \"flarum.core.compat['app']\"","webpack://@flarum/statistics/external \"flarum.core.compat['extend']\"","webpack://@flarum/statistics/external \"flarum.core.compat['components/DashboardPage']\"","webpack://@flarum/statistics/external \"flarum.core.compat['components/DashboardWidget']\"","webpack://@flarum/statistics/external \"flarum.core.compat['components/SelectDropdown']\"","webpack://@flarum/statistics/external \"flarum.core.compat['components/Button']\"","webpack://@flarum/statistics/external \"flarum.core.compat['helpers/icon']\"","webpack://@flarum/statistics/./node_modules/frappe-charts/dist/frappe-charts.esm.js","webpack://@flarum/statistics/./src/admin/components/StatisticsWidget.js","webpack://@flarum/statistics/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@flarum/statistics/./src/admin/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","flarum","core","compat","$","expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","tag","createElement","val","appendChild","ref","parentNode","insertBefore","keys","map","prop","style","setAttribute","BASE_MEASURES","margins","bottom","right","paddings","baseHeight","titleHeight","legendHeight","titleFontSize","getTopOffset","getLeftOffset","getExtraHeight","getExtraWidth","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","AXIS_DATASET_CHART_TYPES","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","PERCENTAGE_BAR_DEFAULT_HEIGHT","PERCENTAGE_BAR_DEFAULT_DEPTH","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","DEFAULT_CHAR_WIDTH","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","bar","line","pie","percentage","heatmap","ANGLE_RATIO","Math","PI","FULL_ANGLE","SvgTip","[object Object]","parent","colors","this","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","inside","className","innerHTML","hideTip","title","dataPointList","addEventListener","index","set","color","formatted","li","styles","border-top","width","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","opacity","floatTwo","parseFloat","toFixed","fillArray","array","count","start","length","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","PRESET_COLOR_MAP","light-blue","blue","violet","red","orange","yellow","green","light-green","purple","magenta","black","grey","light-grey","dark-grey","limitColor","lightenDarkenColor","amt","col","getColor","usePound","slice","num","parseInt","b","toString","AXIS_TICK_LENGTH","LABEL_MARGIN","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","$$1","createSVG","createElementNS","setGradientStop","gradElem","offset","stop-opacity","makeSVGGroup","transform","args","makePath","pathStr","stroke","makeGradient","svgDefElem","lighter","gradientId","gradientDef","id","x1","x2","y1","y2","renderVerticalGradient","opacities","heatSquare","size","data","makeText","content","options","fontSize","dy","undefined","font-size","text-anchor","textAnchor","makeHoriLine","label","lineType","text","stroke-opacity","xLine","pos","makeVertLine","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","dot","heat_square","updateOverlay","attributes","values","filter","attr","includes","specified","nodeValue","UNIT_ANIM_DUR","PATH_ANIM_DUR","MARKER_LINE_ANIM_DUR","REPLACE_ALL_NEW_DUR","STD_EASING","translate","oldCoord","newCoord","duration","old","join","translateHoriLine","yLine","newY","oldY","EASING","ease","linear","easein","easeout","easeinout","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","svgContainer","elements","newElements","animElements","animElement","newElement","props","dur","easingType","type","oldValues","attributeName","animateElement","currentValue","animAttr","from","to","begin","keySplines","keyTimes","calcMode","animateSVGElement","push","replaceChild","animSvg","CSSTEXT","BOUND_DRAW_FN","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","showTooltip","showLegend","isNavigable","animate","measures","JSON","parse","stringify","setMeasures","argHeight","state","initTimeout","overlays","configure","validColors","forEach","test","isValidColor","console","warn","boundDrawFn","window","draw","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","setTimeout","update","renderLegend","setupNavigation","padding","baseWidth","getComputedStyle","paddingLeft","paddingRight","clientWidth","svg","removeChild","svgDefs","titleEL","legendArea","updateTipOffset","Map","error","elementsToAnimate","svgElement","animSvgElement","runSMILAnimation","make","updateNav","bindUnits","bindOverlay","keyActions","13","onEnterKey","37","onLeftArrow","38","onUpArrow","39","onRightArrow","40","onDownArrow","e","el","innerHeight","clientHeight","innerWidth","isElementInViewport","event","keyCode","chartSvg","clone","classList","add","styleEl","firstChild","prepareForExport","filename","a","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","downloadFile","AggregationChart","super","maxSlices","maxLegendPoints","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","reduce","center","textContent","legendTotals","divisor","floor","cx","cy","dx","group","legendDot","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","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","millisecondsPerDay","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","pieSlices","sliceStrings","transition","newData","oldPath","animatePathStr","percentageBars","xPositions","depth","stroke-dasharray","stroke-width","percentageBar","widths","barHeight","barDepth","yAxis","positions","position","newPos","newLabels","oldPos","oldLabels","xAxis","calcLabels","newX","oldX","translateVertLine","yMarkers","labelPos","labelSvg","yMarker","newOptions","yRegions","region","yRegion","startPos","endPos","newStarts","oldStarts","rectGroup","newY1","newY2","oldY2","newHeight","animateRegion","heatDomain","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","data-date","yyyyMmDd","data-value","dataValue","data-day","square","barGraph","unitType","units","yPositions","j","meta","minHeight","data-point-index","datasetBar","barWidth","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","rectAnim","oldCoordStr","split","animateBar","lineGraph","paths","hideLine","xList","yList","pointsStr","path","heatline","gradient_id","regionFill","gradient_id_region","getPaths","hideDots","datasetDot","valuesOverPoints","newValues","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePath","animateDot","getComponent","k","assign","normalize","isNaN","mantissa","exponent","sig","isFinite","exp","log10","pow","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","intervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","getChartRangeIntervals","getIntervalSize","orderedArray","scale","scaleMultiplier","COL_WIDTH","ROW_HEIGHT","AxisChart","barOptions","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","formatTooltipX","formatTooltipY","datasetLength","zeroArray","vals","chartType","end","dataPrep","zeroData","zeroDataPrep","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","withMinimum","yPts","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","pseudoMaxValue","pseudoMinValue","reverse","calcChartIntervals","intervalHeight","zeroIndex","interval","indexOf","getZeroIndex","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","cumulativeYPos","stacked","yExtremes","cumulative","allValueLists","chartWidth","isSeries","allowedSpace","allowedLetters","getShortenedLabels","barDatasets","lineDatasets","barsConfigs","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","component","dataByIndex","formatX","formatY","yPos","formattedLabel","xPos","yExtreme","relX","pageX","relY","pageY","mapTooltipXPosition","goal","arr","closest","prev","curr","getClosestInArray","dbi","setValues","showTip","legendBar","overlayGuides","g","currentIndex","currentUnit","setCurrentDataPoint","target","properties","evt","createEvent","initEvent","dispatchEvent","fire","getDataPoint","datasetValues","addDataPoint","splice","removeDataPoint","chartTypes","bars","gOff","pOff","formattedLabels","fraction","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","noOfWeeks","setFullYear","dataPoints","points","timestampSec$$1","firstWeekStart","distribution","distributionSize","dataMaxValue","distributionStep","checkpoint","calcDistribution","domainConfigs","getDomains","lessCol","dayName","dayText","comp","daySquares","daySquare","dateParts","lessText","moreText","startMonth","startYear","endMonth","endYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","mouseMove","mouseLeave","hoverRadio","startAngle","clockWise","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","startPosition","endPosition","prevProperty","curStart","curEnd","curPath","arcStartX","arcStartY","arcEndX","arcEndY","makeArcPathStr","flag","calTranslateByAngle","g_off","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Chart","getChartByType","StatisticsWidget","subClass","superClass","constructor","__proto__","_DashboardWidget","today","setTime","app","statistics","timezoneOffset","setUTCHours","entities","periods","step","last_7_days","last_28_days","last_12_months","selectedEntity","selectedPeriod","_this","thisPeriod","translator","trans","SelectDropdown_default","buttonClassName","caretIcon","period","Button_default","active","onclick","changePeriod","icon","entity","totalCount","getTotalCount","thisPeriodCount","getPeriodCount","lastPeriodCount","getLastPeriod","periodChange","changeEntity","abbreviateNumber","drawChart","elm","isInitialized","context","chart","periodLength","lastPeriod","moment","unix","utc","format","forum","attribute","timed","time","DashboardWidget","initializers","extend","DashboardPage","widgets","StatisticsWidget_StatisticsWidget"],"mappings":"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","file":"admin.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 8);\n","module.exports = flarum.core.compat['utils/abbreviateNumber'];","module.exports = flarum.core.compat['app'];","module.exports = flarum.core.compat['extend'];","module.exports = flarum.core.compat['components/DashboardPage'];","module.exports = flarum.core.compat['components/DashboardWidget'];","module.exports = flarum.core.compat['components/SelectDropdown'];","module.exports = flarum.core.compat['components/Button'];","module.exports = flarum.core.compat['helpers/icon'];","function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\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\nfunction 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\nfunction 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\nfunction 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\n\n\n\n\nfunction 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/\n\nconst 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\nfunction getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nfunction getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nfunction 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\nfunction 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\nconst INIT_CHART_UPDATE_TIMEOUT = 700;\nconst CHART_POST_ANIMATE_TIMEOUT = 400;\n\nconst DEFAULT_AXIS_CHART_TYPE = 'line';\nconst AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nconst AXIS_LEGEND_BAR_SIZE = 100;\n\nconst BAR_CHART_SPACE_RATIO = 0.5;\nconst MIN_BAR_PERCENT_HEIGHT = 0.01;\n\nconst LINE_CHART_DOT_SIZE = 4;\nconst DOT_OVERLAY_SIZE_INCR = 4;\n\nconst PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nconst PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nconst HEATMAP_DISTRIBUTION_SIZE = 5;\n\nconst HEATMAP_SQUARE_SIZE = 10;\nconst HEATMAP_GUTTER_SIZE = 2;\n\nconst DEFAULT_CHAR_WIDTH = 7;\n\nconst TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\n\n\n\nconst 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};\n\n// Universal constants\nconst ANGLE_RATIO = Math.PI / 180;\nconst FULL_ANGLE = 360;\n\nclass 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: `<span class=\"title\"></span>\n\t\t\t\t<ul class=\"data-point-list\"></ul>\n\t\t\t\t<div class=\"svg-pointer\"></div>`\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `<strong>${this.titleValue}</strong>${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}<strong>${this.titleValue}</strong>`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `<strong style=\"display: block;\">${ value === 0 || value ? value : '' }</strong>\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n\nfunction 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 */\n\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\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 */\nfunction 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 */\nfunction getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\n\n\n// https://stackoverflow.com/a/29325222\n\n\nfunction 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\nfunction 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\nfunction 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\nconst PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nfunction 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\nfunction isValidColor(string) {\n\t// https://stackoverflow.com/a/8027444/6495043\n\treturn /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(string);\n}\n\nconst getColor = (color) => {\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n\nconst AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $$1(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nfunction 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$$1(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $$1(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\nfunction 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\nfunction makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nfunction 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\n\n\nfunction makePath(pathStr, className='', stroke='none', fill='none') {\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}\n\t});\n}\n\nfunction makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1){\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${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 0 ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nfunction 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\nfunction percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nfunction heatSquare(className, x, y, size, 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\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\nfunction legendBar(x, y, size, fill='none', label) {\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\nfunction legendDot(x, y, size, fill='none', label) {\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nfunction 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\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\nfunction yLine(y, label, width, options={}) {\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});\n}\n\nfunction xLine(x, label, height, options={}) {\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\nfunction 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\nfunction 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\nfunction 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\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\nfunction 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\nfunction getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\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\nlet 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\nlet 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\nconst UNIT_ANIM_DUR = 350;\nconst PATH_ANIM_DUR = 350;\nconst MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nconst REPLACE_ALL_NEW_DUR = 250;\n\nconst STD_EASING = 'easein';\n\nfunction 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\nfunction translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nfunction translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction animatePath(paths, newXList, newYList, zeroLine) {\n\tlet pathComponents = [];\n\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y));\n\tlet pathStr = pointsStr.join(\"L\");\n\n\tconst animPath = [paths.path, {d:\"M\"+pathStr}, 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 + pathStr + 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\nfunction animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n\n// Leveraging SMIL Animations\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\nfunction 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\nfunction 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\nconst CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";\n\nfunction 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\nfunction 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\nlet BOUND_DRAW_FN;\n\nclass 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: 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\tBOUND_DRAW_FN = this.boundDrawFn.bind(this);\n\t\twindow.addEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn.bind(this));\n\t}\n\n\tboundDrawFn() {\n\t\tthis.draw(true);\n\t}\n\n\tunbindWindowEvents() {\n\t\twindow.removeEventListener('resize', BOUND_DRAW_FN);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn.bind(this));\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\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();\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\nclass 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 = 110;\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(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${s.labels[i]}: ${d}`\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n\n// Playing around with dates\n\nconst NO_OF_YEAR_MONTHS = 12;\nconst NO_OF_DAYS_IN_WEEK = 7;\n\nconst NO_OF_MILLIS = 1000;\nconst SEC_IN_DAY = 86400;\n\nconst MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\n\n\nconst DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\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\nfunction 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\nfunction clone(date) {\n\treturn new Date(date.getTime());\n}\n\n\n\n\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nfunction getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nfunction getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nfunction areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nfunction getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nfunction getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nfunction 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\nfunction addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\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\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\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})\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, 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, 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},\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));\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\nfunction 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\nclass PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 80;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n\nclass 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\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 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 = makeArcPathStr(curStart, curEnd, this.center, this.radius, this.clockWise);\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\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\nfunction 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\nfunction 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\n\n\nfunction getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nfunction getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nfunction scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\n\n\n\n\nfunction 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\nfunction 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\nfunction getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nclass 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$$1 => {\n\t\t\t\tlet date = new Date(timestampSec$$1 * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec$$1];\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\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\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, 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\nfunction 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\nfunction 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\nfunction 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 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\tlet multiple = Math.ceil(label.length/allowedLetters);\n\t\t\t\tif(i % multiple !== 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\nclass 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\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\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\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\tlet dbi = this.dataByIndex[index];\n\n\t\tthis.tip.setValues(\n\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\tdbi.values,\n\t\t\tindex\n\t\t);\n\n\t\tthis.tip.showTip();\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\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\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart\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 };\n","/*\n * This file is part of Flarum.\n *\n * (c) Toby Zerner <toby.zerner@gmail.com>\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport DashboardWidget from 'flarum/components/DashboardWidget';\nimport SelectDropdown from 'flarum/components/SelectDropdown';\nimport Button from 'flarum/components/Button';\nimport icon from 'flarum/helpers/icon';\nimport abbreviateNumber from 'flarum/utils/abbreviateNumber';\n\nimport { Chart } from 'frappe-charts/dist/frappe-charts.esm.js';\n\nexport default class StatisticsWidget extends DashboardWidget {\n init() {\n super.init();\n\n // Create a Date object which represents the start of the day in the\n // configured timezone. To do this we convert a UTC time into that timezone,\n // reset to the first hour of the day, and then convert back into UTC time.\n // We'll be working with seconds rather than milliseconds throughout too.\n let today = new Date();\n today.setTime(today.getTime() + app.data.statistics.timezoneOffset * 1000);\n today.setUTCHours(0, 0, 0, 0);\n today.setTime(today.getTime() - app.data.statistics.timezoneOffset * 1000);\n today = today / 1000;\n\n this.entities = ['users', 'discussions', 'posts'];\n this.periods = {\n today: {start: today, end: today + 86400, step: 3600},\n last_7_days: {start: today - 86400 * 7, end: today, step: 86400},\n last_28_days: {start: today - 86400 * 28, end: today, step: 86400},\n last_12_months: {start: today - 86400 * 364, end: today, step: 86400 * 7}\n };\n\n this.selectedEntity = 'users';\n this.selectedPeriod = 'last_7_days';\n }\n\n className() {\n return 'StatisticsWidget';\n }\n\n content() {\n const thisPeriod = this.periods[this.selectedPeriod];\n\n return (\n <div className=\"StatisticsWidget-table\">\n <div className=\"StatisticsWidget-labels\">\n <div className=\"StatisticsWidget-label\">{app.translator.trans('flarum-statistics.admin.statistics.total_label')}</div>\n <div className=\"StatisticsWidget-label\">\n <SelectDropdown buttonClassName=\"Button Button--text\" caretIcon=\"fas fa-caret-down\">\n {Object.keys(this.periods).map(period => (\n <Button\n active={period === this.selectedPeriod}\n onclick={this.changePeriod.bind(this, period)}\n icon={period === this.selectedPeriod ? 'fas fa-check' : true}>\n {app.translator.trans(`flarum-statistics.admin.statistics.${period}_label`)}\n </Button>\n ))}\n </SelectDropdown>\n </div>\n </div>\n\n {this.entities.map(entity => {\n const totalCount = this.getTotalCount(entity);\n const thisPeriodCount = this.getPeriodCount(entity, thisPeriod);\n const lastPeriodCount = this.getPeriodCount(entity, this.getLastPeriod(thisPeriod));\n const periodChange = lastPeriodCount > 0 && (thisPeriodCount - lastPeriodCount) / lastPeriodCount * 100;\n\n return (\n <a className={'StatisticsWidget-entity'+(this.selectedEntity === entity ? ' active' : '')} onclick={this.changeEntity.bind(this, entity)}>\n <h3 className=\"StatisticsWidget-heading\">{app.translator.trans('flarum-statistics.admin.statistics.'+entity+'_heading')}</h3>\n <div className=\"StatisticsWidget-total\" title={totalCount}>{abbreviateNumber(totalCount)}</div>\n <div className=\"StatisticsWidget-period\" title={thisPeriodCount}>\n {abbreviateNumber(thisPeriodCount)}{' '}\n {periodChange ? (\n <span className={'StatisticsWidget-change StatisticsWidget-change--'+(periodChange > 0 ? 'up' : 'down')}>\n {icon('fas fa-arrow-'+(periodChange > 0 ? 'up' : 'down'))}\n {Math.abs(periodChange.toFixed(1))}%\n </span>\n ) : ''}\n </div>\n </a>\n );\n })}\n\n <div className=\"StatisticsWidget-chart\" config={this.drawChart.bind(this)}/>\n </div>\n );\n }\n\n drawChart(elm, isInitialized, context) {\n if (context.chart && context.entity === this.selectedEntity && context.period === this.selectedPeriod) {\n return;\n }\n\n const offset = app.data.statistics.timezoneOffset;\n const period = this.periods[this.selectedPeriod];\n const periodLength = period.end - period.start;\n const labels = [];\n const thisPeriod = [];\n const lastPeriod = [];\n\n for (let i = period.start; i < period.end; i += period.step) {\n let label;\n\n if (period.step < 86400) {\n label = moment.unix(i + offset).utc().format('h A');\n } else {\n label = moment.unix(i + offset).utc().format('D MMM');\n\n if (period.step > 86400) {\n label += ' - ' + moment.unix(i + offset + period.step - 1).utc().format('D MMM');\n }\n }\n\n labels.push(label);\n\n thisPeriod.push(this.getPeriodCount(this.selectedEntity, {start: i, end: i + period.step}));\n\n lastPeriod.push(this.getPeriodCount(this.selectedEntity, {start: i - periodLength, end: i - periodLength + period.step}));\n }\n\n const datasets = [\n {values: lastPeriod},\n {values: thisPeriod}\n ];\n const data = {\n labels,\n datasets\n };\n\n if (!context.chart) {\n context.chart = new Chart(elm, {\n data,\n type: 'line',\n height: 280,\n axisOptions: {\n xAxisMode: 'tick',\n yAxisMode: 'span',\n xIsSeries: true\n },\n lineOptions: {\n hideDots: 1\n },\n colors: ['black', app.forum.attribute('themePrimaryColor')]\n });\n } else {\n context.chart.update(data);\n }\n\n context.entity = this.selectedEntity;\n context.period = this.selectedPeriod;\n }\n\n changeEntity(entity) {\n this.selectedEntity = entity;\n }\n\n changePeriod(period) {\n this.selectedPeriod = period;\n }\n\n getTotalCount(entity) {\n return app.data.statistics[entity].total;\n }\n\n getPeriodCount(entity, period) {\n const timed = app.data.statistics[entity].timed;\n let count = 0;\n\n for (const time in timed) {\n if (time >= period.start && time < period.end) {\n count += timed[time];\n }\n }\n\n return count;\n }\n\n getLastPeriod(thisPeriod) {\n return {\n start: thisPeriod.start - (thisPeriod.end - thisPeriod.start),\n end: thisPeriod.start\n };\n }\n}\n","export default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}","import app from 'flarum/app';\nimport { extend } from 'flarum/extend';\n\nimport DashboardPage from 'flarum/components/DashboardPage';\n\nimport StatisticsWidget from './components/StatisticsWidget';\n\napp.initializers.add('flarum-statistics', () => {\n extend(DashboardPage.prototype, 'availableWidgets', widgets => {\n widgets.push(<StatisticsWidget/>);\n });\n});\n"],"sourceRoot":""} |