diff --git a/dist/frappe-charts.cjs.js b/dist/frappe-charts.cjs.js deleted file mode 100644 index 3b269ea..0000000 --- a/dist/frappe-charts.cjs.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,i=new Array(e);n=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}!function(t,e){void 0===e&&(e={});var n=e.insertAt;if(t&&"undefined"!=typeof document){var i=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===n&&i.firstChild?i.insertBefore(a,i.firstChild):i.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}(":root {\n --fr-label-color: #313b44;\n --fr-axis-line-color: #F4F5F6;\n --fr-stroke-width: 2px;\n --fr-dataset-circle-stroke: #FFFFFF;\n --fr-dataset-circle-stroke-width: var(--fr-stroke-width);\n --fr-tooltip-title: var(--fr-label-color);\n --fr-tooltip-label: var(--fr-label-color);\n --fr-tooltip-value: #192734;\n --fr-tooltip-bg: #FFFFFF; }\n\n.chart-container {\n position: relative;\n /* for absolutely positioned tooltip */\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; }\n .chart-container .axis, .chart-container .chart-label {\n fill: var(--fr-label-color); }\n .chart-container .axis line, .chart-container .chart-label line {\n stroke: var(--fr-axis-line-color); }\n .chart-container .dataset-units circle {\n stroke: var(--fr-dataset-circle-stroke);\n stroke-width: var(--fr-dataset-circle-stroke-width); }\n .chart-container .dataset-units path {\n fill: none;\n stroke-opacity: 1;\n stroke-width: var(--fr-stroke-width); }\n .chart-container .dataset-path {\n stroke-width: var(--fr-stroke-width); }\n .chart-container .path-group path {\n fill: none;\n stroke-opacity: 1;\n stroke-width: var(--fr-stroke-width); }\n .chart-container line.dashed {\n stroke-dasharray: 5, 3; }\n .chart-container .axis-line .specific-value {\n text-anchor: start; }\n .chart-container .axis-line .y-line {\n text-anchor: end; }\n .chart-container .axis-line .x-line {\n text-anchor: middle; }\n .chart-container .legend-dataset-label {\n fill: var(--fr-tooltip-label);\n font-weight: 600; }\n .chart-container .legend-dataset-value {\n fill: var(--fr-tooltip-value); }\n\n.graph-svg-tip {\n position: absolute;\n z-index: 99999;\n padding: 10px;\n font-size: 12px;\n text-align: center;\n background: var(--fr-tooltip-bg);\n box-shadow: 0px 1px 4px rgba(17, 43, 66, 0.1), 0px 2px 6px rgba(17, 43, 66, 0.08), 0px 40px 30px -30px rgba(17, 43, 66, 0.1);\n border-radius: 6px; }\n .graph-svg-tip ul {\n padding-left: 0;\n display: flex; }\n .graph-svg-tip ol {\n padding-left: 0;\n display: flex; }\n .graph-svg-tip ul.data-point-list li {\n min-width: 90px;\n font-weight: 600; }\n .graph-svg-tip .svg-pointer {\n position: absolute;\n height: 12px;\n width: 12px;\n border-radius: 2px;\n background: var(--fr-tooltip-bg);\n transform: rotate(45deg);\n margin-top: -7px;\n margin-left: -6px; }\n .graph-svg-tip.comparison {\n text-align: left;\n padding: 0px;\n pointer-events: none; }\n .graph-svg-tip.comparison .title {\n display: block;\n padding: 16px;\n margin: 0;\n color: var(--fr-tooltip-title);\n font-weight: 600;\n line-height: 1;\n pointer-events: none;\n text-transform: uppercase; }\n .graph-svg-tip.comparison ul {\n margin: 0;\n white-space: nowrap;\n list-style: none; }\n .graph-svg-tip.comparison ul.tooltip-grid {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 5px; }\n .graph-svg-tip.comparison li {\n display: inline-block;\n display: flex;\n flex-direction: row;\n font-weight: 600;\n line-height: 1;\n padding: 5px 15px 15px 15px; }\n .graph-svg-tip.comparison li .tooltip-legend {\n height: 12px;\n width: 12px;\n margin-right: 8px;\n border-radius: 2px; }\n .graph-svg-tip.comparison li .tooltip-label {\n margin-top: 4px;\n font-size: 11px;\n max-width: 100px;\n color: var(--fr-tooltip-label);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .graph-svg-tip.comparison li .tooltip-value {\n color: var(--fr-tooltip-value); }\n"),f.create=function(e,n){var i=document.createElement(e);for(var a in n){var s=n[a];if("inside"===a)f(s).appendChild(i);else if("around"===a){var r=f(s);r.parentNode.insertBefore(i,r),i.appendChild(r)}else"styles"===a?"object"===t(s)&&Object.keys(s).map((function(t){i.style[t]=s[t]})):a in i?i[a]=s:i.setAttribute(a,s)}return i};var y={margins:{top:10,bottom:10,left:20,right:20},paddings:{top:20,bottom:40,left:30,right:10},baseHeight:240,titleHeight:20,legendHeight:30,titleFontSize:12};function x(t){return t.titleHeight+t.margins.top+t.paddings.top}function b(t){return t.margins.left+t.paddings.left}function k(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function w(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}var A=["pink","blue","green","grey","red","yellow","purple","teal","cyan","orange"],L={bar:A,line:A,pie:A,percentage:A,heatmap:["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],donut:A},P=Math.PI/180,M=function(){function t(n){var i=n.parent,a=void 0===i?null:i,s=n.colors,r=void 0===s?[]:s;e(this,t),this.parent=a,this.colors=r,this.titleName="",this.titleValue="",this.listValues=[],this.titleValueFirst=0,this.x=0,this.y=0,this.top=0,this.left=0,this.setup()}return i(t,[{key:"setup",value:function(){this.makeTooltip()}},{key:"refresh",value:function(){this.fill(),this.calcPosition()}},{key:"makeTooltip",value:function(){var t=this;this.container=f.create("div",{inside:this.parent,className:"graph-svg-tip comparison",innerHTML:'\n\t\t\t\t\n\t\t\t\t
'}),this.hideTip(),this.title=this.container.querySelector(".title"),this.list=this.container.querySelector(".data-point-list"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",(function(){t.hideTip()}))}},{key:"fill",value:function(){var t,e=this;this.index&&this.container.setAttribute("data-point-index",this.index),t=this.titleValueFirst?"".concat(this.titleValue,"").concat(this.titleName):"".concat(this.titleName,"").concat(this.titleValue,""),this.listValues.length>4?this.list.classList.add("tooltip-grid"):this.list.classList.remove("tooltip-grid"),this.title.innerHTML=t,this.dataPointList.innerHTML="",this.listValues.map((function(t,n){var i=e.colors[n]||"black",a=0===t.formatted||t.formatted?t.formatted:t.value,s=f.create("li",{innerHTML:'
\n\t\t\t\t\t
\n\t\t\t\t\t\t
').concat(0===a||a?a:"",'
\n\t\t\t\t\t\t
').concat(t.title?t.title:"","
\n\t\t\t\t\t
")});e.dataPointList.appendChild(s)}))}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-7.48,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,n=this.container.querySelector(".svg-pointer");if(this.left<0)n.style.left="calc(50% - ".concat(-1*this.left,"px)"),this.left=0;else if(this.left>e){var i=this.left-e,a="calc(50% + ".concat(i,"px)");n.style.left=a,this.left=e}else n.style.left="50%"}},{key:"setValues",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=n.name,this.titleValue=n.value,this.listValues=i,this.x=t,this.y=e,this.titleValueFirst=n.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),t}();function T(t){return parseFloat(t.toFixed(2))}function C(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n||(n=i?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(n);return t=i?a.concat(t):t.concat(a)}function D(t,e){return(t+"").length*e}function N(t,e){return{x:Math.sin(t*P)*e,y:Math.cos(t*P)*e}}function S(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function E(t,e){var n,i;return t<=e?(n=e-t,i=t):(n=t-e,i=e),[n,i]}function O(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return n>0?t=C(t,n):e=C(e,n),[t,e]}function F(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function z(t){var e;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var n=Math.floor(Math.log10(Math.abs(e)));if(n<=2)return e;var i=Math.floor(n/3),a=Math.pow(10,n-3*i)*+(e/Math.pow(10,n)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][i]}function H(t,e){for(var n=[],i=0;i1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,i={className:t,transform:e};return n&&(i.inside=n),R("g",i)}function Y(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:2;return R("path",{className:e,d:t,styles:{stroke:n,fill:i,"stroke-width":a}})}function V(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="path-fill-gradient-"+e+"-"+(n?"lighter":"default"),a=B(t,i),s=[1,.6,.2];return n&&(s=[.4,.05,0]),I(a,"0%",e,s[0]),I(a,"50%",e,s[1]),I(a,"100%",e,s[2]),i}function U(t,e,n){var i=n/2,a=e-i;return"M".concat(t,",0 h").concat(a," q").concat(i,",0 ").concat(i,",").concat(i," q0,").concat(i," -").concat(i,",").concat(i," h-").concat(a," v").concat(n,"z")}function _(t,e,n){var i=n/2,a=e-i;return"M".concat(t+i,",0 h").concat(a," v").concat(n," h-").concat(a," q-").concat(i,", 0 -").concat(i,",-").concat(i," q0,-").concat(i," ").concat(i,",-").concat(i,"z")}function q(t,e,n,i,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:n,width:i,height:i,rx:a,fill:s};return Object.keys(r).map((function(t){o[t]=r[t]})),R("rect",o)}function G(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||10,r=void 0!==a.dy?a.dy:s/2,o=a.fill||"#313B44",l=a.textAnchor||"start";return R("text",{className:t,x:e,y:n,dy:r+"px","font-size":s+"px",fill:o,"text-anchor":l,innerHTML:i})}function X(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=R("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:n,y2:i,styles:{stroke:a.stroke}}),r=R("text",{x:0,y:n>i?n+4:n-4-10,dy:"10px","font-size":"10px","text-anchor":"middle",innerHTML:e+""}),o=R("g",{transform:"translate(".concat(t,", 0)")});return o.appendChild(s),o.appendChild(r),o}function J(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.lineType||(a.lineType=""),a.shortenNumbers&&(e=z(e));var s="line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),r=R("line",{className:s,x1:n,x2:i,y1:0,y2:0,styles:{stroke:a.stroke}}),o=R("text",{x:n255?255:t<0?0:t}function tt(t,e){var n=et(t),i=!1;"#"==n[0]&&(n=n.slice(1),i=!0);var a=parseInt(n,16),s=Z((a>>16)+e),r=Z((a>>8&255)+e);return(i?"#":"")+(Z((255&a)+e)|r<<8|s<<16).toString(16)}var et=function(t){return Q[t]||t};function nt(t,e,n,i){var a="string"==typeof e?e:e.join(", ");return[t,{transform:n.join(", ")},i,"easein","translate",{transform:a}]}function it(t,e,n){return nt(t,[0,n],[0,e],350)}function at(t,e){return[t,{d:e},350,"easein"]}var st={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"};function rt(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var c=void 0;c="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),h=e[l],d={attributeName:l,from:u,to:h,begin:"0s",dur:n/1e3+"s",values:u+";"+h,keySplines:st[i],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};for(var p in a&&(d.type=a),d)c.setAttribute(p,d[p]);r.appendChild(c),a?o.setAttribute(l,"translate(".concat(h,")")):o.setAttribute(l,h)}return[r,o]}function ot(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function lt(t,e){var n=[],i=[];e.map((function(t){var e,a,s=t[0],r=s.parentNode;t[0]=s;var o=u(rt.apply(void 0,h(t)),2);e=o[0],a=o[1],n.push(a),i.push([e,r]),r.replaceChild(e,s)}));var a=t.cloneNode(!0);return i.map((function(t,i){t[1].replaceChild(n[i],t[0]),e[i][0]=n[i]})),a}function ct(t,e,n){if(0!==n.length){var i=lt(e,n);e.parentNode==t&&(t.removeChild(e),t.appendChild(i)),setTimeout((function(){i.parentNode==t&&(t.removeChild(i),t.appendChild(e))}),250)}}var ut=function(){function t(n,i){if(e(this,t),this.parent="string"==typeof n?document.querySelector(n):n,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(y));var a=this.measures;this.setMeasures(i),this.title.length||(a.titleHeight=0),this.config.showLegend||(a.legendHeight=0),this.argHeight=i.height||a.baseHeight,this.state={},this.options={},this.initTimeout=700,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return i(t,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var n=[];return(t=(t||[]).concat(L[e])).forEach((function(t){var e=et(t);!function(t){return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i.test(t)}(e)?console.warn('"'+t+'" is not a valid color.'):n.push(e)})),n}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-k(this.measures),this.boundDrawFn=function(){return t.draw(!0)},window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var t={inside:this.parent,className:"chart-container"};this.independentWidth&&(t.styles={width:this.independentWidth+"px"}),this.container=f.create("div",t)}},{key:"makeTooltip",value:function(){this.tip=new M({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&g(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach((function(e){return e.setup(t.drawArea)})),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout((function(){t.update(t.data)}),this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){var t,e,n;this.baseWidth=(t=this.parent,e=window.getComputedStyle(t),n=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight),t.clientWidth-n),this.width=this.baseWidth-w(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t,e,n,i,a=this.measures;this.svg=(t=this.container,e="frappe-chart chart",n=this.baseWidth,i=this.baseHeight,R("svg",{className:e,inside:t,width:n,height:i})),this.svgDefs=R("defs",{inside:this.svg}),this.title.length&&(this.titleEL=G("title",a.margins.left,a.margins.top,this.title,{fontSize:a.titleFontSize,fill:"#666666",dy:a.titleFontSize}));var s=x(a);this.drawArea=j(this.type+"-chart chart-draw-area","translate(".concat(b(a),", ").concat(s,")")),this.config.showLegend&&(s+=this.height+a.paddings.bottom,this.legendArea=j("chart-legend","translate(".concat(b(a),", ").concat(s,")"))),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(b(a),x(a))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate)}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map((function(t){return t.parentNode.removeChild(t)}));var i=[];e.forEach((function(t){i=i.concat(t.update(n))})),i.length>0?(ct(this.container,this.svg,i),setTimeout((function(){e.forEach((function(t){return t.make()})),t.updateNav()}),400)):(e.forEach((function(t){return t.make()})),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",(function(e){m(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())})))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=function(t){var e=t.cloneNode(!0);e.classList.add("chart-container"),e.setAttribute("xmlns","http://www.w3.org/2000/svg"),e.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=f.create("style",{innerHTML:".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}"});e.insertBefore(n,e.firstChild);var i=f.create("div");return i.appendChild(e),i.innerHTML}(this.svg);!function(t,e){var n=document.createElement("a");n.style="display: none";var i=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(i);n.href=a,n.download=t,document.body.appendChild(n),n.click(),setTimeout((function(){document.body.removeChild(n),window.URL.revokeObjectURL(a)}),300)}(this.title||"Chart",[t])}}]),t}(),ht=function(t){a(r,ut);var n=l(r);function r(t,i){return e(this,r),n.call(this,t,i)}return i(r,[{key:"configure",value:function(t){c(s(r.prototype),"configure",this).call(this,t),this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,n=this.config.maxSlices;e.sliceTotals=[];var i=this.data.labels.map((function(e,n){var i=0;return t.data.datasets.map((function(t){i+=t.values[n]})),[i,e]})).filter((function(t){return t[0]>=0})),a=i;if(i.length>n){i.sort((function(t,e){return e[0]-t[0]})),a=i.slice(0,n-1);var s=i.slice(n-1),r=0;s.map((function(t){r+=t[0]})),a.push([r,"Rest"]),this.colors[n-1]="grey"}e.labels=[],a.map((function(t){e.sliceTotals.push(t[0]),e.labels.push(t[1])})),e.grandTotal=e.sliceTotals.reduce((function(t,e){return t+e}),0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var n=0,i=0;this.legendTotals.map((function(a,s){var r=120,o=Math.floor((t.width-w(t.measures))/r);t.legendTotals.lengtho&&(n=0,i+=60);var l=r*n+5,c=t.config.truncateLegends?F(e.labels[s],r/10):e.labels[s],u=function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"none",s=arguments.length>5?arguments[5]:void 0,r=arguments.length>6?arguments[6]:void 0,o=arguments.length>7&&void 0!==arguments[7]&&arguments[7],l={className:"legend-dot",x:0,y:4-n,height:n,width:n,rx:i,fill:a},c=R("text",{className:"legend-dataset-label",x:n,y:0,dx:"10px",dy:10/3+"px","font-size":"16px","text-anchor":"start",fill:"#313B44",innerHTML:s=o?F(s,15):s}),u=R("text",{className:"legend-dataset-value",x:n,y:20,dx:"10px",dy:10/3+"px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:r}),h=R("g",{transform:"translate(".concat(t,", ").concat(e,")")});return h.appendChild(R("rect",l)),h.appendChild(c),h.appendChild(u),h}(l,i,12,3,t.colors[s],c,a,!1);t.legendArea.appendChild(u),n++}))}}]),r}(),dt=["January","February","March","April","May","June","July","August","September","October","November","December"],pt=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];function ft(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function vt(t){var e=t.getDate(),n=t.getMonth()+1;return[t.getFullYear(),(n>9?"":"0")+n,(e>9?"":"0")+e].join("-")}function gt(t){return new Date(t.getTime())}function mt(t,e){var n=kt(t);return Math.ceil(function(t,e){return(ft(e)-ft(t))/864e5}(n,e)/7)}function yt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function xt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=dt[t];return e?n.slice(0,3):n}function bt(t,e){return new Date(e,t+1,0)}function kt(t){var e=gt(t),n=e.getDay();return 0!==n&&wt(e,-1*n),e}function wt(t,e){t.setDate(t.getDate()+e)}var At=function(){function t(n){var i=n.layerClass,a=void 0===i?"":i,s=n.layerTransform,r=void 0===s?"":s,o=n.constants,l=n.getData,c=n.makeElements,u=n.animateElements;e(this,t),this.layerTransform=r,this.constants=o,this.makeElements=c,this.getData=l,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=a,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return i(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=j(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach((function(t){e.layer.appendChild(t)})),this.labels.forEach((function(t){e.layer.appendChild(t)}))}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Lt={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=Y(e,"donut-path",t.colors[n],"none",t.strokeWidth);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return at(e,t.sliceStrings[n])}))}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=Y(e,"pie-path","none",t.colors[n]);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return at(e,t.sliceStrings[n])}))}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this,n=t.xPositions.length;return t.xPositions.map((function(i,a){var s=a==n-1,r=0==a;return function(t,e,n,i,a,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:"none";if(s){var o=U(t,n,i);return Y(o,"percentage-bar",null,r)}if(a){var l=_(t,n,i);return Y(l,"percentage-bar",null,r)}var c={className:"percentage-bar",x:t,y:e,width:n,height:i,fill:r};return R("rect",c)}(i,0,t.widths[a],e.constants.barHeight,r,s,t.colors[a])}))},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};S(t)||(t=0),i.pos||(i.pos="left"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke="#E2E6E9"),i.className||(i.className="");var a=-6,s="span"===i.mode?n+6:0;return"tick"===i.mode&&"right"===i.pos&&(a=n+6,s=n),J(t,e,a+=i.offset,s+=i.offset,{className:i.className,lineType:i.lineType,shortenNumbers:i.shortenNumbers})}(n,t.labels[i],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})}))},animateElements:function(t){var e=t.positions,n=t.labels,i=this.oldData.positions,a=this.oldData.labels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,labels:n}),this.store.map((function(t,n){return it(t,e[n],i[n])}))}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};S(t)||(t=0),i.pos||(i.pos="bottom"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.className||(i.className="");var a=n+6,s="span"===i.mode?-6:n;return"tick"===i.mode&&"top"===i.pos&&(a=-6,s=0),X(t,e,a,s,{className:i.className,lineType:i.lineType})}(n,t.calcLabels[i],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})}))},animateElements:function(t){var e=t.positions,n=t.calcLabels,i=this.oldData.positions,a=this.oldData.calcLabels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,calcLabels:n}),this.store.map((function(t,n){return function(t,e,n){return nt(t,[n,0],[e,0],350)}(t,e[n],i[n])}))}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};i.labelPos||(i.labelPos="right");var a="left"===i.labelPos?4:n-D(e,5)-4,s=R("text",{className:"chart-label",x:a,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:e+""}),r=J(t,"",0,n,{stroke:i.stroke||"#E2E6E9",className:i.className||"",lineType:i.lineType});return r.appendChild(s),r}(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.position})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.options})),s=this.oldData.map((function(t){return t.position}));return this.render(s.map((function(t,e){return{position:s[e],label:i[e],options:a[e]}}))),this.store.map((function(t,e){return it(t,n[e],s[e])}))}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=R("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:"#E2E6E9","stroke-dasharray":"".concat(n,", ").concat(s)},x:0,y:0,width:n,height:s});a.labelPos||(a.labelPos="right");var o="left"===a.labelPos?4:n-D(i+"",4.5)-4,l=R("text",{className:"chart-label",x:o,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:i+""}),c=R("g",{transform:"translate(0, ".concat(e,")")});return c.appendChild(r),c.appendChild(l),c}(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.endPos})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.startPos})),s=t.map((function(t){return t.options})),r=this.oldData.map((function(t){return t.endPos})),o=this.oldData.map((function(t){return t.startPos}));this.render(r.map((function(t,e){return{startPos:o[e],endPos:r[e],label:i[e],options:s[e]}})));var l=[];return this.store.map((function(t,e){l=l.concat(function(t,e,n,i){var a=e-n,s=t.childNodes[0],r=s.getAttribute("width");return[[s,{height:a,"stroke-dasharray":"".concat(r,", ").concat(a)},350,"easein"],nt(t,[0,i],[0,n],350)]}(t,a[e],n[e],r[e]))})),l}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,n=this.constants,i=n.index,a=n.colWidth,s=n.rowHeight,r=n.squareSize,o=n.radius,l=n.xTranslate,c=l,u=0;return this.serializedSubDomains=[],t.cols.map((function(t,n){1===n&&e.labels.push(G("domain-name",c,-12,xt(i,!0).toUpperCase(),{fontSize:9})),t.map((function(t,n){if(t.fill){var i={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":n},a=q("day",c,u,r,o,t.fill,i);e.serializedSubDomains.push(a)}u+=s})),u=0,c+=a})),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map((function(n,i){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=E(e,o.zeroLine),c=u(l,2),h=c[0],d=c[1];d-=r,0===h&&(h=o.minHeight,d-=o.minHeight),S(t)||(t=0),S(d)||(d=0),S(h,!0)||(h=0),S(n,!0)||(n=0);var p=R("rect",{className:"bar mini",style:"fill: ".concat(i),"data-point-index":s,x:t,y:d,width:n,height:h});if((a+="")||a.length){p.setAttribute("y",0),p.setAttribute("x",0);var f=R("text",{className:"data-point-value",x:n/2,y:0,dy:"-5px","font-size":"10px","text-anchor":"middle",innerHTML:a}),v=R("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(d,")")});return v.appendChild(p),v.appendChild(f),v}return p}(t.xPositions[i],n,t.barWidth,e.color,t.labels[i],i,t.offsets[i],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})})),this.units},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,c=u(O(s,e),2);s=c[0],e=c[1];var h=u(O(r,n),2);r=h[0],n=h[1];var d=u(O(o,i),2);o=d[0],i=d[1];var p=u(O(l,a),2);l=p[0],a=p[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var f=[];return this.store.map((function(a,s){f=f.concat(function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=E(n,s.zeroLine),o=u(r,2),l=o[0],c=o[1];if(c-=a,"rect"!==t.nodeName){var h=t.childNodes[0],d=[h,{width:i,height:l},350,"easein"],p=t.getAttribute("transform").split("(")[1].slice(0,-1),f=nt(t,p,[e,c],350);return[d,f]}return[[t,{width:i,height:l,x:e,y:c},350,"easein"]]}(a,e[s],n[s],t.barWidth,i[s],{zeroLine:t.zeroLine}))})),f}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map((function(e,n){return t[n]+","+e})),r=s.join("L");i.spline&&(r=H(t,e));var o=Y("M"+r,"line-graph-path",n);if(i.heatline){var l=V(a.svgDefs,n);o.style.stroke="url(#".concat(l,")")}var c={path:o};if(i.regionFill){var u=V(a.svgDefs,n,!0),h="M"+"".concat(t[0],",").concat(a.zeroLine,"L")+r+"L".concat(t.slice(-1)[0],",").concat(a.zeroLine);c.region=Y(h,"region-fill","none","url(#".concat(u,")"))}return c}(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.showDots&&(this.units=t.yPositions.map((function(n,i){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=R("circle",{style:"fill: ".concat(i),"data-point-index":s,cx:t,cy:e,r:n});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=R("text",{className:"data-point-value",x:0,y:0,dy:-5-n+"px","font-size":"10px","text-anchor":"middle",innerHTML:a}),l=R("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(r),l.appendChild(o),l}return r}(t.xPositions[i],n,t.radius,e.color,e.valuesOverPoints?t.values[i]:"",i)}))),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=u(O(a,e),2);a=o[0],e=o[1];var l=u(O(s,n),2);s=l[0],n=l[1];var c=u(O(r,i),2);r=c[0],i=c[1],this.render({xPositions:a,yPositions:s,values:i,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var h=[];return Object.keys(this.paths).length&&(h=h.concat(function(t,e,n,i,a){var s=[],r=n.map((function(t,n){return e[n]+","+t})).join("L");a&&(r=H(e,n));var o=[t.path,{d:"M"+r},350,"easein"];if(s.push(o),t.region){var l="".concat(e[0],",").concat(i,"L"),c="L".concat(e.slice(-1)[0],", ").concat(i),u=[t.region,{d:"M"+l+r+c},350,"easein"];s.push(u)}return s}(this.paths,e,n,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map((function(t,i){h=h.concat(function(t,e,n){if("circle"!==t.nodeName){var i=t.getAttribute("transform").split("(")[1].slice(0,-1);return[nt(t,i,[e,n],350)]}return[[t,{cx:e,cy:n},350,"easein"]]}(t,e[i],n[i]))})),h}}};function Pt(t,e,n){var i=Object.keys(Lt).filter((function(e){return t.includes(e)})),a=Lt[i[0]];return Object.assign(a,{constants:e,getData:n}),new At(a)}var Mt=function(t){a(r,ht);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="percentage",a.setup(),a}return i(r,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var n=this.barOptions;n.height=n.height||16,e.paddings.right=30,e.paddings.top=60,e.paddings.bottom=0,e.legendHeight=80,e.baseHeight=8*n.height+k(e)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map((function(t){var e=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calc",value:function(){var t=this;c(s(r.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map((function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a}))}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,e=this.state;this.container.addEventListener("mousemove",(function(n){var i=t.components.get("percentageBars").store,a=n.target;if(i.includes(a)){var s=i.indexOf(a),r=v(t.container),o=v(a),l=a.getAttribute("width")||a.getBoundingClientRect().width,c=o.left-r.left+parseInt(l)/2,u=o.top-r.top,h=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[s]:t.state.labels[s])+": ",d=e.sliceTotals[s]/e.grandTotal;t.tip.setValues(c,u,{name:h,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}}))}}]),r}(),Tt=function(t){a(r,ht);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="pie",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;c(s(r.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,p=i?-h:h,f=o+=p,v=N(u,n),g=N(f,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*n.y,u=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z\n\t\tL").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u," z")}(l,c,t.center,t.radius,i,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z")}(l,c,t.center,t.radius,i,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:f,angle:p})})),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map((function(t){var e=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=N(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.fill=tt(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=a}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,n=this.components.get("pieSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),r}();function Ct(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var n=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,n)),n]}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Math.ceil(t),i=Math.floor(e),a=n-i,s=a,r=1;a>5&&(a%2!=0&&(a=++n-i),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(i+r*l);return o}function Nt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Ct(t),i=u(n,2),a=i[0],s=i[1],r=e?e/Math.pow(10,s):0,o=Dt(a=a.toFixed(6),r);return o=o.map((function(t){return t*Math.pow(10,s)}))}function St(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,h(t)),i=Math.min.apply(Math,h(t)),a=[];function s(t,e){for(var n=Nt(t),i=n[1]-n[0],a=0,s=1;a=0&&i>=0)Ct(n)[1],a=e?Nt(n,i):Nt(n);else if(n>0&&i<0){var r=Math.abs(i);if(n>=r)Ct(n)[1],a=s(n,r);else{Ct(r)[1];var o=s(r,n);a=o.map((function(t){return-1*t}))}}else if(n<=0&&i<=0){var l=Math.abs(i),c=Math.abs(n);Ct(l)[1],a=(a=e?Nt(l,c):Nt(l)).reverse().map((function(t){return-1*t}))}return a}function Et(t){var e,n=Ot(t);if(t.indexOf(0)>=0)e=t.indexOf(0);else if(t[0]>0){e=-1*t[0]/n}else{e=-1*t[t.length-1]/n+(t.length-1)}return e}function Ot(t){return t[1]-t[0]}function Ft(t){return t[t.length-1]-t[0]}function zt(t,e){return T(e.zeroLine-t*e.scaleMultiplier)}var Ht=function(t){a(s,ut);var n=l(s);function s(t,i){var a;e(this,s),(a=n.call(this,t,i)).type="heatmap",a.countLabel=i.countLabel||"";var r=["Sunday","Monday"],o=r.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return a.startSubDomainIndex=r.indexOf(o),a.setup(),a}return i(s,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=84+k(e);var n=this.data,i=this.discreteDomains?12:0;this.independentWidth=12*(mt(n.start,n.end)+i)+w(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+w(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach((function(n){var i=new Date(1e3*n);e[vt(i)]=t.dataPoints[n]})),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=gt(this.data.start),t.end=gt(this.data.end),t.firstWeekStart=gt(t.start),t.noOfWeeks=mt(t.start,t.end),t.distribution=function(t,e){for(var n=Math.max.apply(Math,h(t)),i=1/(e-1),a=[],s=0;s1&&void 0!==arguments[1]?arguments[1]:"",n=[t.getMonth(),t.getFullYear()],i=n[0],a=n[1],s=kt(t),r={index:i,cols:[]};wt(e=gt(e)||bt(i,a),1);for(var o,l=mt(s,e),c=[],u=0;u2&&void 0!==arguments[2]&&arguments[2],i=this.state,a=gt(t),s=[],r=0;r<7;r++,wt(a,1)){var o={},l=a>=i.start&&a<=i.end;n||a.getMonth()!==e||!l?o.yyyyMmDd=vt(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e,n,i=vt(t),a=this.data.dataPoints[i];return{yyyyMmDd:i,dataValue:a||0,fill:this.colors[(e=a,n=this.state.distribution,n.filter((function(t){return tn?i.slice(0,n):C(i,n-i.length,0)}else t.values=a;t.chartType||(t.chartType=e)})),t.yRegions&&t.yRegions.map((function(t){if(t.end0&&void 0!==arguments[0]?arguments[0]:this.data;return Wt(t,this.type)}},{key:"prepareFirstData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;return Rt(t)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map((function(e,n){return T(t.xOffset+n*t.unitWidth)}))}}},{key:"calcYAxisParameters",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=St(t,e),i=this.height/Ft(n),a=Ot(n)*i,s=this.height-Et(n)*a;this.state.yAxis={labels:n,positions:n.map((function(t){return s-t*i})),scaleMultiplier:i,zeroLine:s},this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e){return e.map((function(e){return zt(e,t.yAxis)}))};t.datasets=this.data.datasets.map((function(t,n){var i=t.values,a=t.cumulativeYs||[];return{name:t.name,index:n,chartType:t.chartType,values:i,yPositions:e(i),cumulativeYs:a,cumulativeYPos:e(a)}}))}},{key:"calcYExtremes",value:function(){var t=this.state;this.barOptions.stacked?t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos:(t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map((function(e){e.yPositions.map((function(e,n){e1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=t/e.length*.6;i<=0&&(i=1);var a,s=i/7;if(n){var r=Math.max.apply(Math,h(e.map((function(t){return t.length}))));a=Math.ceil(r/s)}var o=e.map((function(t,i){return(t+="").length>s&&(n?i%a!=0&&i!==e.length-1&&(t=""):t=s-3>0?t.slice(0,s-3)+" ...":t.slice(0,s)+".."),t}));return o}(this.width,t.xAxis.labels,this.config.xIsSeries),t.xAxis}.bind(this)],["yRegions",{width:this.width,pos:"right"},function(){return this.state.yRegions}.bind(this)]],n=this.state.datasets.filter((function(t){return"bar"===t.chartType})),i=this.state.datasets.filter((function(t){return"line"===t.chartType})),a=n.map((function(e){var i=e.index;return["barGraph-"+e.index,{index:i,color:t.colors[i],stacked:t.barOptions.stacked,valuesOverPoints:t.config.valuesOverPoints,minHeight:0*t.height},function(){var t=this.state,e=t.datasets[i],a=this.barOptions.stacked,s=this.barOptions.spaceRatio||.5,r=t.unitWidth*(1-s),o=r/(a?1:n.length),l=t.xAxis.positions.map((function(t){return t-r/2}));a||(l=l.map((function(t){return t+o*i})));var c=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(c=a&&e.index===t.datasets.length-1?e.cumulativeYs:e.values);var u=new Array(t.datasetLength).fill(0);return a&&(u=e.yPositions.map((function(t,n){return t-e.cumulativeYPos[n]}))),{xPositions:l,yPositions:e.yPositions,offsets:u,labels:c,zeroLine:t.yAxis.zeroLine,barsWidth:r,barWidth:o}}.bind(t)]})),s=i.map((function(e){var n=e.index;return["lineGraph-"+e.index,{index:n,color:t.colors[n],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,showDots:t.lineOptions.showDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[n],i=t.yAxis.positions[0]x(n)?t.mapTooltipXPosition(a):t.tip.hideTip()}))}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var n=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=e.reduce((function(e,n){return Math.abs(n-t)=0){var i=this.dataByIndex[n];this.tip.setValues(i.xPos+this.tip.offset.x,i.yExtreme+this.tip.offset.y,{name:i.formattedLabel,value:""},i.values,n),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map((function(e,n){var i=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]&&arguments[5],r={className:"legend-bar",x:0,y:0,width:n,height:"2px",fill:i},o=R("text",{className:"legend-dataset-text",x:0,y:0,dy:"20px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:a=s?F(a,15):a}),l=R("g",{transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(R("rect",r)),l.appendChild(o),l}(100*n,"0",100,t.colors[n],e.name,t.config.truncateLegends);t.legendArea.appendChild(i)})))}},{key:"makeOverlay",value:function(){var t=this;this.init?this.init=0:(this.overlayGuides&&this.overlayGuides.forEach((function(t){var e=t.overlay;e.parentNode.removeChild(e)})),this.overlayGuides=this.dataUnitComponents.map((function(t){return{type:t.unitType,overlay:void 0,units:t.units}})),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map((function(e){var n=e.units[t.state.currentIndex];e.overlay=K[e.type](n),t.drawArea.appendChild(e.overlay)})))}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach((function(t){var e=t.overlay;e.parentNode.removeChild(e)}))}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",(function(){t.updateOverlay()}))}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map((function(e){e.units.map((function(e){e.addEventListener("click",(function(){var n=e.getAttribute("data-point-index");t.setCurrentDataPoint(n)}))}))})),this.tip.container.addEventListener("click",(function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)}))}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map((function(e){var n=e.units[t.state.currentIndex];$[e.type](n,e.overlay)}))}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state,n={index:t,label:e.xAxis.labels[t],values:e.datasets.map((function(e){return e.values[t]}))};return n}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,function(t,e,n){var i=document.createEvent("HTMLEvents");for(var a in i.initEvent(e,!0,!0),n)i[a]=n[a];t.dispatchEvent(i)}(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;c(s(r.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map((function(t,i){t.values.splice(n,0,e[i])})),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(c(s(r.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map((function(e){e.values.splice(t,1)})),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map((function(e,n){t[n]&&(e.values=t[n])})),this.update(this.data)}}]),r}(),It={bar:Bt,line:Bt,percentage:Mt,heatmap:Ht,pie:Tt,donut:function(t){a(r,ht);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="donut",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;c(s(r.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,p=i?-h:h,f=o+=p,v=N(u,n),g=N(f,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*i+o,u=n.y+t.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c,"\n\t\tM").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u)}(l,c,t.center,t.radius,t.clockWise,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c)}(l,c,t.center,t.radius,t.clockWise,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:f,angle:p})})),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map((function(t){var e=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=N(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.stroke=tt(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=a}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,n=this.components.get("donutSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),r}()};exports.AxisChart=Bt,exports.Chart=function t(n,i){return e(this,t),function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0;return"axis-mixed"===t?(n.type="line",new Bt(e,n)):It[t]?new It[t](e,n):void console.error("Undefined chart type: "+t)}(i.type,n,i)},exports.Heatmap=Ht,exports.PercentageChart=Mt,exports.PieChart=Tt; -//# sourceMappingURL=frappe-charts.cjs.js.map diff --git a/dist/frappe-charts.cjs.js.map b/dist/frappe-charts.cjs.js.map deleted file mode 100644 index c0eb49f..0000000 --- a/dist/frappe-charts.cjs.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"frappe-charts.cjs.js","sources":["../src/js/utils/dom.js","../node_modules/style-inject/dist/style-inject.es.js","../src/js/utils/constants.js","../src/js/objects/SvgTip.js","../src/js/utils/helpers.js","../src/js/utils/draw-utils.js","../src/js/utils/draw.js","../src/js/utils/colors.js","../src/js/utils/animate.js","../src/js/utils/animation.js","../src/js/charts/BaseChart.js","../src/js/utils/export.js","../src/css/chartsCss.js","../src/js/charts/AggregationChart.js","../src/js/utils/date-utils.js","../src/js/objects/ChartComponents.js","../src/js/charts/PercentageChart.js","../src/js/charts/PieChart.js","../src/js/utils/intervals.js","../src/js/charts/Heatmap.js","../src/js/utils/axis-chart-utils.js","../src/js/charts/AxisChart.js","../src/js/chart.js","../src/js/charts/DonutChart.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\nexport const SERIES_LABEL_SPACE_RATIO = 0.6;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 16;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 7.48;\nconst DEFAULT_CHART_COLORS = ['pink', 'blue', 'green', 'grey', 'red', 'yellow', 'purple', 'teal', 'cyan', 'orange'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
    \n\t\t\t\t
    `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.list = this.container.querySelector('.data-point-list');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\n\t\tif (this.listValues.length > 4) {\n\t\t\tthis.list.classList.add('tooltip-grid');\n\t\t} else {\n\t\t\tthis.list.classList.remove('tooltip-grid');\n\t\t}\n\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\t\t\tlet li = $.create('li', {\n\t\t\t\tinnerHTML: `
    \n\t\t\t\t\t
    \n\t\t\t\t\t\t
    ${ value === 0 || value ? value : '' }
    \n\t\t\t\t\t\t
    ${set.title ? set.title : '' }
    \n\t\t\t\t\t
    `\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR } from './constants';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#E2E6E9';\nconst FONT_FILL = '#313B44';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif (lighter) {\n\t\topacities = [0.4, 0.05, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function rightRoundedBar(x, width, height) {\n\t// https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90\n\tlet radius = height/2;\n\tlet xOffset = width - radius;\n\n\treturn `M${x},0 h${xOffset} q${radius},0 ${radius},${radius} q0,${radius} -${radius},${radius} h-${xOffset} v${height}z`;\n}\n\nexport function leftRoundedBar(x, width, height) {\n\tlet radius = height/2;\n\tlet xOffset = width - radius;\n\n\treturn `M${x + radius},0 h${xOffset} v${height} h-${xOffset} q-${radius}, 0 -${radius},-${radius} q0,-${radius} ${radius},-${radius}z`;\n}\n\nexport function percentageBar(x, y, width, height, isFirst, isLast, fill='none') {\n\tif (isLast) {\n\t\tlet pathStr = rightRoundedBar(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\n\tif (isFirst) {\n\t\tlet pathStr = leftRoundedBar(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, radius, fill='none', label, value, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tx: 0,\n\t\ty: 4 - size,\n\t\theight: size,\n\t\twidth: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tlet textLabel = createSVG('text', {\n\t\tclassName: 'legend-dataset-label',\n\t\tx: size,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.6) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet textValue = createSVG('text', {\n\t\tclassName: 'legend-dataset-value',\n\t\tx: size,\n\t\ty: FONT_SIZE + 10,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: value\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(textLabel);\n\tgroup.appendChild(textValue);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\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.lineType) options.lineType = '';\n\tif (options.shortenNumbers) label = shortenLargeNumber(label);\n\n\tlet className = 'line-horizontal ' + options.className +\n\t\t(options.lineType === \"dashed\" ? \"dashed\": \"\");\n\n\tlet l = createSVG('line', {\n\t\tclassName: className,\n\t\tx1: x1,\n\t\tx2: x2,\n\t\ty1: 0,\n\t\ty2: 0,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / 2 - 2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': x1 < x2 ? 'end' : 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(0, ${y})`,\n\t\t'stroke-opacity': 1\n\t});\n\n\tif(text === 0 || text === '0') {\n\t\tline.style.stroke = \"rgba(27, 31, 35, 0.6)\";\n\t}\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nexport function yLine(y, label, width, options={}) {\n\tif (!isValidNumber(y)) y = 0;\n\n\tif(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tclassName: options.className,\n\t\tlineType: options.lineType,\n\t\tshortenNumbers: options.shortenNumbers\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.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\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\t// x y h w\n\n\t// M{x},{y+r}\n\t// q0,-{r} {r},-{r}\n\t// q{r},0 {r},{r}\n\t// v{h-r}\n\t// h-{w}z\n\n\t// let radius = width/2;\n\t// let pathStr = `M${x},${y+radius} q0,-${radius} ${radius},-${radius} q${radius},0 ${radius},${radius} v${height-radius} h-${width}z`\n\n\t// let rect = createSVG('path', {\n\t// \tclassName: 'bar mini',\n\t// \td: pathStr,\n\t// \tstyles: { fill: color },\n\t// \tx: x,\n\t// \ty: y,\n\t// \t'data-point-index': index,\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\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","const PRESET_COLOR_MAP = {\n\t'pink': '#F683AE',\n\t'blue': '#318AD8',\n\t'green': '#48BB74',\n\t'grey': '#A6B1B9',\n\t'red': '#F56B6B',\n\t'yellow': '#FACF7A',\n\t'purple': '#44427B',\n\t'teal': '#5FD8C4',\n\t'cyan': '#15CCEF',\n\t'orange': '#F8814F',\n\t'light-pink': '#FED7E5',\n\t'light-blue': '#BFDDF7',\n\t'light-green': '#48BB74',\n\t'light-grey': '#F4F5F6',\n\t'light-red': '#F6DFDF',\n\t'light-yellow': '#FEE9BF',\n\t'light-purple': '#E8E8F7',\n\t'light-teal': '#D3FDF6',\n\t'light-cyan': '#DDF8FD',\n\t'light-orange': '#FECDB8'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(d[0]);\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 120;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 60;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t12,\n\t\t\t\t3,\n\t\t\t\tthis.colors[i],\n\t\t\t\tlabel,\n\t\t\t\td,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { makeText, makePath, xLine, yLine, yMarker, yRegion, datasetBar, datasetDot, percentageBar, getPaths, heatSquare } from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport { translateHoriLine, translateVertLine, animateRegion, animateBar,\n\tanimateDot, animatePath, animatePathStr } from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n\tconstructor({\n\t\tlayerClass = '',\n\t\tlayerTransform = '',\n\t\tconstants,\n\n\t\tgetData,\n\t\tmakeElements,\n\t\tanimateElements\n\t}) {\n\t\tthis.layerTransform = layerTransform;\n\t\tthis.constants = constants;\n\n\t\tthis.makeElements = makeElements;\n\t\tthis.getData = getData;\n\n\t\tthis.animateElements = animateElements;\n\n\t\tthis.store = [];\n\t\tthis.labels = [];\n\n\t\tthis.layerClass = layerClass;\n\t\tthis.layerClass = typeof(this.layerClass) === 'function'\n\t\t\t? this.layerClass() : this.layerClass;\n\n\t\tthis.refresh();\n\t}\n\n\trefresh(data) {\n\t\tthis.data = data || this.getData();\n\t}\n\n\tsetup(parent) {\n\t\tthis.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n\t}\n\n\tmake() {\n\t\tthis.render(this.data);\n\t\tthis.oldData = this.data;\n\t}\n\n\trender(data) {\n\t\tthis.store = this.makeElements(data);\n\n\t\tthis.layer.textContent = '';\n\t\tthis.store.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t\tthis.labels.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t}\n\n\tupdate(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\tconst numberOfPoints = data.xPositions.length;\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\n\t\t\t\tlet isLast = i == numberOfPoints - 1;\n\t\t\t\tlet isFirst = i == 0;\n\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i], this.constants.barHeight, isFirst, isLast, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos, shortenNumbers: this.constants.shortenNumbers})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tlabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(c.showDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, getExtraHeight } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\n\t\tm.paddings.right = 30;\n\t\tm.paddings.top = 60;\n\t\tm.paddings.bottom = 0;\n\n\t\tm.legendHeight = 80;\n\t\tm.baseHeight = (b.height) * 8 + getExtraHeight(m);\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif (bars.includes(bar)) {\n\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 width = bar.getAttribute('width') || bar.getBoundingClientRect().width;\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(width)/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => value * Math.pow(10, exponent));\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH,\n\tSERIES_LABEL_SPACE_RATIO } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t}\n\n\t\t// Set labels\n\t\t//\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n\tlet zeroData = {\n\t\tlabels: realData.labels.slice(0, -1),\n\t\tdatasets: realData.datasets.map(d => {\n\t\t\treturn {\n\t\t\t\tname: '',\n\t\t\t\tvalues: zeroArray.slice(0, -1),\n\t\t\t\tchartType: d.chartType\n\t\t\t};\n\t\t}),\n\t};\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = (chartWidth / labels.length) * SERIES_LABEL_SPACE_RATIO;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0 && i !== (labels.length - 1)) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\t\tthis.config.shortenYAxisNumbers = options.axisOptions.shortenYAxisNumbers || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tshortenNumbers: this.config.shortenYAxisNumbers\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth * (1 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: s.yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\tspline: this.lineOptions.spline,\n\t\t\t\t\tshowDots: this.lineOptions.showDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n"],"names":["$","expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","css","ref","insertAt","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","create","tag","o","i","val","parentNode","_typeof","Object","keys","map","prop","setAttribute","BASE_MEASURES","margins","paddings","baseHeight","titleHeight","legendHeight","titleFontSize","getTopOffset","m","getLeftOffset","getExtraHeight","getExtraWidth","DEFAULT_CHART_COLORS","DEFAULT_COLORS","bar","line","pie","percentage","heatmap","donut","ANGLE_RATIO","Math","PI","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","inside","this","className","innerHTML","hideTip","title","list","dataPointList","addEventListener","_this","index","length","classList","add","remove","set","color","_this2","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","parseFloat","toFixed","fillArray","array","count","start","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","round","getSplineCurvePointsStr","xList","yList","points","push","controlPoint","current","previous","next","reverse","pointA","pointB","lengthX","lengthY","sqrt","atan2","command","reduce","acc","point","a","pointStr","cps","cpe","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","id","x1","x2","y1","y2","setGradientStop","gradElem","offset","makeSVGGroup","transform","args","makePath","pathStr","stroke","strokeWidth","styles","makeGradient","lighter","gradientDef","opacities","rightRoundedBar","xOffset","leftRoundedBar","heatSquare","size","data","rx","key","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","text","FONT_SIZE","makeHoriLine","lineType","shortenNumbers","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","parseInt","updateOverlay","attributes","values","filter","attr","includes","specified","nodeValue","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","b","toString","translate","oldCoord","newCoord","duration","old","join","translateHoriLine","yLine","newY","oldY","animatePathStr","oldPath","EASING","ease","linear","easein","easeout","easeinout","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","from","to","begin","keySplines","keyTimes","calcMode","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","svgContainer","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","setTimeout","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","showTooltip","showLegend","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","argHeight","state","initTimeout","overlays","configure","validColors","forEach","test","isValidColor","console","warn","boundDrawFn","draw","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","drawArea","render","update","renderLegend","setupNavigation","padding","baseWidth","getComputedStyle","paddingLeft","paddingRight","svg","svgDefs","titleEL","legendArea","updateTipOffset","Map","error","make","_this3","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","clone","styleEl","prepareForExport","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","downloadFile","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","center","textContent","legendTotals","barWidth","divisor","dot","truncate","textLabel","dx","textValue","group","legendDot","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","SEC_IN_DAY","getDaysBetween","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","donutSlices","sliceStrings","transition","newData","pieSlices","percentageBars","numberOfPoints","xPositions","isLast","isFirst","percentageBar","widths","barHeight","yAxis","positions","position","pos","mode","newPos","newLabels","oldPos","oldLabels","xAxis","xLine","calcLabels","newX","oldX","translateVertLine","yMarkers","labelPos","labelSvg","yMarker","_this5","newOptions","yRegions","region","yRegion","startPos","endPos","_this6","newStarts","oldStarts","rectGroup","newY1","newY2","oldY2","newHeight","animateRegion","heatDomain","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","_this7","toUpperCase","yyyyMmDd","dataValue","square","barGraph","unitType","units","yPositions","j","meta","minHeight","datasetBar","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","rectAnim","oldCoordStr","split","groupAnim","animateBar","lineGraph","paths","hideLine","pointsList","pointsStr","spline","path","heatline","gradient_id","regionFill","gradient_id_region","getPaths","showDots","cx","cy","datasetDot","valuesOverPoints","newValues","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePath","animateDot","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","target","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","clockWise","prevSlicesProperties","slicesProperties","curAngle","curStart","curEnd","originDiffAngle","largeArc","diffAngle","endAngle","startPosition","endPosition","prevProperty","curPath","arcStartX","arcStartY","arcEndX","midArc","arcEndY","makeCircleStr","makeArcPathStr","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","scaleMultiplier","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","spacing","HEATMAP_SQUARE_SIZE","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","distribution","distributionSize","dataMaxValue","distributionStep","checkpoint","calcDistribution","domainConfigs","getDomains","lessCol","dayName","dayText","comp","daySquares","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","NO_OF_DAYS_IN_WEEK","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","zeroDataPrep","zeroData","AxisChart","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","shortenYAxisNumbers","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","cumulativeYPos","stacked","yExtremes","cumulative","allValueLists","chartWidth","isSeries","allowedSpace","seriesMultiple","allowedLetters","maxLabelLength","getShortenedLabels","barDatasets","lineDatasets","barsConfigs","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","yPos","formattedLabel","yExtreme","relX","relY","mapTooltipXPosition","goal","arr","closest","prev","curr","getClosestInArray","dbi","legendBar","overlayGuides","g","currentIndex","currentUnit","_this8","_this9","setCurrentDataPoint","_this10","data_point","properties","evt","createEvent","initEvent","dispatchEvent","fire","getDataPoint","datasetValues","splice","chartTypes","makeStrokeCircleStr","makeArcStrokePathStr","getChartByType"],"mappings":"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"} \ No newline at end of file diff --git a/dist/frappe-charts.esm.js b/dist/frappe-charts.esm.js deleted file mode 100644 index 837c293..0000000 --- a/dist/frappe-charts.esm.js +++ /dev/null @@ -1,4467 +0,0 @@ -function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); -} - -function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} - -function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} - -function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; -} - -function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) _setPrototypeOf(subClass, superClass); -} - -function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); -} - -function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); -} - -function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { - return false; - } -} - -function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; -} - -function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - - return _assertThisInitialized(self); -} - -function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } - - return _possibleConstructorReturn(this, result); - }; -} - -function _superPropBase(object, property) { - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = _getPrototypeOf(object); - if (object === null) break; - } - - return object; -} - -function _get(target, property, receiver) { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; - } else { - _get = function _get(target, property, receiver) { - var base = _superPropBase(target, property); - - if (!base) return; - var desc = Object.getOwnPropertyDescriptor(base, property); - - if (desc.get) { - return desc.get.call(receiver); - } - - return desc.value; - }; - } - - return _get(target, property, receiver || target); -} - -function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); -} - -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); -} - -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); -} - -function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; -} - -function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); -} - -function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; -} - -function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); -} - -function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; -} - -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); -} - -function styleInject(css, ref) { - if ( ref === void 0 ) ref = {}; - var insertAt = ref.insertAt; - - if (!css || typeof document === 'undefined') { return; } - - var head = document.head || document.getElementsByTagName('head')[0]; - var style = document.createElement('style'); - style.type = 'text/css'; - - if (insertAt === 'top') { - if (head.firstChild) { - head.insertBefore(style, head.firstChild); - } else { - head.appendChild(style); - } - } else { - head.appendChild(style); - } - - if (style.styleSheet) { - style.styleSheet.cssText = css; - } else { - style.appendChild(document.createTextNode(css)); - } -} - -var css_248z = ".chart-container {\n position: relative;\n /* for absolutely positioned tooltip */\n /* https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/ */\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; }\n .chart-container .axis, .chart-container .chart-label {\n fill: #313B44; }\n .chart-container .axis line, .chart-container .chart-label line {\n stroke: #E2E6E9; }\n .chart-container .dataset-units circle {\n stroke: #fff;\n stroke-width: 2; }\n .chart-container .dataset-units path {\n fill: none;\n stroke-opacity: 1;\n stroke-width: 2px; }\n .chart-container .dataset-path {\n stroke-width: 2px; }\n .chart-container .path-group path {\n fill: none;\n stroke-opacity: 1;\n stroke-width: 2px; }\n .chart-container line.dashed {\n stroke-dasharray: 5, 3; }\n .chart-container .axis-line .specific-value {\n text-anchor: start; }\n .chart-container .axis-line .y-line {\n text-anchor: end; }\n .chart-container .axis-line .x-line {\n text-anchor: middle; }\n .chart-container .legend-dataset-text {\n fill: #6c7680;\n font-weight: 600; }\n\n.graph-svg-tip {\n position: absolute;\n z-index: 99999;\n padding: 10px;\n font-size: 12px;\n text-align: center;\n background: #FFFFFF;\n box-shadow: 0px 1px 4px rgba(17, 43, 66, 0.1), 0px 2px 6px rgba(17, 43, 66, 0.08), 0px 40px 30px -30px rgba(17, 43, 66, 0.1);\n border-radius: 6px; }\n .graph-svg-tip ul {\n padding-left: 0;\n display: flex; }\n .graph-svg-tip ol {\n padding-left: 0;\n display: flex; }\n .graph-svg-tip ul.data-point-list li {\n min-width: 90px;\n font-weight: 600; }\n .graph-svg-tip .svg-pointer {\n position: absolute;\n height: 12px;\n width: 12px;\n border-radius: 2px;\n background: white;\n transform: rotate(45deg);\n margin-top: -7px;\n margin-left: -6px; }\n .graph-svg-tip.comparison {\n text-align: left;\n padding: 0px;\n pointer-events: none; }\n .graph-svg-tip.comparison .title {\n display: block;\n padding: 16px;\n margin: 0;\n color: #313B44;\n font-weight: 600;\n line-height: 1;\n pointer-events: none;\n text-transform: uppercase; }\n .graph-svg-tip.comparison ul {\n margin: 0;\n white-space: nowrap;\n list-style: none; }\n .graph-svg-tip.comparison ul.tooltip-grid {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 5px; }\n .graph-svg-tip.comparison li {\n display: inline-block;\n display: flex;\n flex-direction: row;\n font-weight: 600;\n line-height: 1;\n padding: 5px 15px 15px 15px; }\n .graph-svg-tip.comparison li .tooltip-legend {\n height: 12px;\n width: 12px;\n margin-right: 8px;\n border-radius: 2px; }\n .graph-svg-tip.comparison li .tooltip-label {\n margin-top: 4px;\n font-size: 11px;\n max-width: 100px;\n color: #313B44;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .graph-svg-tip.comparison li .tooltip-value {\n color: #192734; }\n"; -styleInject(css_248z); - -function $(expr, con) { - return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null; -} - -$.create = function (tag, o) { - var element = document.createElement(tag); - - for (var i in o) { - var val = o[i]; - - if (i === "inside") { - $(val).appendChild(element); - } else if (i === "around") { - var ref = $(val); - ref.parentNode.insertBefore(element, ref); - element.appendChild(ref); - } else if (i === "styles") { - if (_typeof(val) === "object") { - Object.keys(val).map(function (prop) { - element.style[prop] = val[prop]; - }); - } - } else if (i in element) { - element[i] = val; - } else { - element.setAttribute(i, val); - } - } - - return element; -}; - -function getOffset(element) { - var rect = element.getBoundingClientRect(); - return { - // https://stackoverflow.com/a/7436602/6495043 - // rect.top varies with scroll, so we add whatever has been - // scrolled to it to get absolute distance from actual page top - top: rect.top + (document.documentElement.scrollTop || document.body.scrollTop), - left: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft) - }; -} // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent -// an element's offsetParent property will return null whenever it, or any of its parents, -// is hidden via the display style property. - -function isHidden(el) { - return el.offsetParent === null; -} -function isElementInViewport(el) { - // Although straightforward: https://stackoverflow.com/a/7557433/6495043 - var rect = el.getBoundingClientRect(); - return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && - /*or $(window).height() */ - rect.right <= (window.innerWidth || document.documentElement.clientWidth) - /*or $(window).width() */ - ; -} -function getElementContentWidth(element) { - var styles = window.getComputedStyle(element); - var padding = parseFloat(styles.paddingLeft) + parseFloat(styles.paddingRight); - return element.clientWidth - padding; -} -function fire(target, type, properties) { - var evt = document.createEvent("HTMLEvents"); - evt.initEvent(type, true, true); - - for (var j in properties) { - evt[j] = properties[j]; - } - - return target.dispatchEvent(evt); -} // https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/ - -var BASE_MEASURES = { - margins: { - top: 10, - bottom: 10, - left: 20, - right: 20 - }, - paddings: { - top: 20, - bottom: 40, - left: 30, - right: 10 - }, - baseHeight: 240, - titleHeight: 20, - legendHeight: 30, - titleFontSize: 12 -}; -function getTopOffset(m) { - return m.titleHeight + m.margins.top + m.paddings.top; -} -function getLeftOffset(m) { - return m.margins.left + m.paddings.left; -} -function getExtraHeight(m) { - var totalExtraHeight = m.margins.top + m.margins.bottom + m.paddings.top + m.paddings.bottom + m.titleHeight + m.legendHeight; - return totalExtraHeight; -} -function getExtraWidth(m) { - var totalExtraWidth = m.margins.left + m.margins.right + m.paddings.left + m.paddings.right; - return totalExtraWidth; -} -var INIT_CHART_UPDATE_TIMEOUT = 700; -var CHART_POST_ANIMATE_TIMEOUT = 400; -var AXIS_LEGEND_BAR_SIZE = 100; -var BAR_CHART_SPACE_RATIO = 0.5; -var MIN_BAR_PERCENT_HEIGHT = 0.00; -var LINE_CHART_DOT_SIZE = 4; -var DOT_OVERLAY_SIZE_INCR = 4; -var PERCENTAGE_BAR_DEFAULT_HEIGHT = 20; -var PERCENTAGE_BAR_DEFAULT_DEPTH = 2; // Fixed 5-color theme, -// More colors are difficult to parse visually - -var HEATMAP_DISTRIBUTION_SIZE = 5; -var HEATMAP_SQUARE_SIZE = 10; -var HEATMAP_GUTTER_SIZE = 2; -var DEFAULT_CHAR_WIDTH = 7; -var TOOLTIP_POINTER_TRIANGLE_HEIGHT = 7.48; -var DEFAULT_CHART_COLORS = ['pink', 'blue', 'green', 'grey', 'red', 'yellow', 'purple', 'teal', 'cyan', 'orange']; -var HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127']; -var DEFAULT_COLORS = { - bar: DEFAULT_CHART_COLORS, - line: DEFAULT_CHART_COLORS, - pie: DEFAULT_CHART_COLORS, - percentage: DEFAULT_CHART_COLORS, - heatmap: HEATMAP_COLORS_GREEN, - donut: DEFAULT_CHART_COLORS -}; // Universal constants - -var ANGLE_RATIO = Math.PI / 180; -var FULL_ANGLE = 360; - -var SvgTip = /*#__PURE__*/function () { - function SvgTip(_ref) { - var _ref$parent = _ref.parent, - parent = _ref$parent === void 0 ? null : _ref$parent, - _ref$colors = _ref.colors, - colors = _ref$colors === void 0 ? [] : _ref$colors; - - _classCallCheck(this, SvgTip); - - this.parent = parent; - this.colors = colors; - this.titleName = ''; - this.titleValue = ''; - this.listValues = []; - this.titleValueFirst = 0; - this.x = 0; - this.y = 0; - this.top = 0; - this.left = 0; - this.setup(); - } - - _createClass(SvgTip, [{ - key: "setup", - value: function setup() { - this.makeTooltip(); - } - }, { - key: "refresh", - value: function refresh() { - this.fill(); - this.calcPosition(); - } - }, { - key: "makeTooltip", - value: function makeTooltip() { - var _this = this; - - this.container = $.create('div', { - inside: this.parent, - className: 'graph-svg-tip comparison', - innerHTML: "\n\t\t\t\t
      \n\t\t\t\t
      " - }); - this.hideTip(); - this.title = this.container.querySelector('.title'); - this.list = this.container.querySelector('.data-point-list'); - this.dataPointList = this.container.querySelector('.data-point-list'); - this.parent.addEventListener('mouseleave', function () { - _this.hideTip(); - }); - } - }, { - key: "fill", - value: function fill() { - var _this2 = this; - - var title; - - if (this.index) { - this.container.setAttribute('data-point-index', this.index); - } - - if (this.titleValueFirst) { - title = "".concat(this.titleValue, "").concat(this.titleName); - } else { - title = "".concat(this.titleName, "").concat(this.titleValue, ""); - } - - if (this.listValues.length > 4) { - this.list.classList.add('tooltip-grid'); - } else { - this.list.classList.remove('tooltip-grid'); - } - - this.title.innerHTML = title; - this.dataPointList.innerHTML = ''; - this.listValues.map(function (set, i) { - var color = _this2.colors[i] || 'black'; - var value = set.formatted === 0 || set.formatted ? set.formatted : set.value; - var li = $.create('li', { - innerHTML: "
      \n\t\t\t\t\t
      \n\t\t\t\t\t\t
      ").concat(value === 0 || value ? value : '', "
      \n\t\t\t\t\t\t
      ").concat(set.title ? set.title : '', "
      \n\t\t\t\t\t
      ") - }); - - _this2.dataPointList.appendChild(li); - }); - } - }, { - key: "calcPosition", - value: function calcPosition() { - var width = this.container.offsetWidth; - this.top = this.y - this.container.offsetHeight - TOOLTIP_POINTER_TRIANGLE_HEIGHT; - this.left = this.x - width / 2; - var maxLeft = this.parent.offsetWidth - width; - var pointer = this.container.querySelector('.svg-pointer'); - - if (this.left < 0) { - pointer.style.left = "calc(50% - ".concat(-1 * this.left, "px)"); - this.left = 0; - } else if (this.left > maxLeft) { - var delta = this.left - maxLeft; - var pointerOffset = "calc(50% + ".concat(delta, "px)"); - pointer.style.left = pointerOffset; - this.left = maxLeft; - } else { - pointer.style.left = "50%"; - } - } - }, { - key: "setValues", - value: function setValues(x, y) { - var title = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var listValues = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; - var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; - this.titleName = title.name; - this.titleValue = title.value; - this.listValues = listValues; - this.x = x; - this.y = y; - this.titleValueFirst = title.valueFirst || 0; - this.index = index; - this.refresh(); - } - }, { - key: "hideTip", - value: function hideTip() { - this.container.style.top = '0px'; - this.container.style.left = '0px'; - this.container.style.opacity = '0'; - } - }, { - key: "showTip", - value: function showTip() { - this.container.style.top = this.top + 'px'; - this.container.style.left = this.left + 'px'; - this.container.style.opacity = '1'; - } - }]); - - return SvgTip; -}(); - -/** - * Returns the value of a number upto 2 decimal places. - * @param {Number} d Any number - */ - -function floatTwo(d) { - return parseFloat(d.toFixed(2)); -} -/** - * Fill an array with extra points - * @param {Array} array Array - * @param {Number} count number of filler elements - * @param {Object} element element to fill with - * @param {Boolean} start fill at start? - */ - -function fillArray(array, count, element) { - var start = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - - if (!element) { - element = start ? array[0] : array[array.length - 1]; - } - - var fillerArray = new Array(Math.abs(count)).fill(element); - array = start ? fillerArray.concat(array) : array.concat(fillerArray); - return array; -} -/** - * Returns pixel width of string. - * @param {String} string - * @param {Number} charWidth Width of single char in pixels - */ - -function getStringWidth(string, charWidth) { - return (string + "").length * charWidth; -} -function getPositionByAngle(angle, radius) { - return { - x: Math.sin(angle * ANGLE_RATIO) * radius, - y: Math.cos(angle * ANGLE_RATIO) * radius - }; -} -/** - * Check if a number is valid for svg attributes - * @param {object} candidate Candidate to test - * @param {Boolean} nonNegative flag to treat negative number as invalid - */ - -function isValidNumber(candidate) { - var nonNegative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - if (Number.isNaN(candidate)) return false;else if (candidate === undefined) return false;else if (!Number.isFinite(candidate)) return false;else if (nonNegative && candidate < 0) return false;else return true; -} - -/** - * Round a number to the closes precision, max max precision 4 - * @param {Number} d Any Number - */ -function round(d) { - // https://floating-point-gui.de/ - // https://www.jacklmoore.com/notes/rounding-in-javascript/ - return Number(Math.round(d + 'e4') + 'e-4'); -} - -function getBarHeightAndYAttr(yTop, zeroLine) { - var height, y; - - if (yTop <= zeroLine) { - height = zeroLine - yTop; - y = yTop; - } else { - height = yTop - zeroLine; - y = zeroLine; - } - - return [height, y]; -} -function equilizeNoOfElements(array1, array2) { - var extraCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : array2.length - array1.length; - - // Doesn't work if either has zero elements. - if (extraCount > 0) { - array1 = fillArray(array1, extraCount); - } else { - array2 = fillArray(array2, extraCount); - } - - return [array1, array2]; -} -function truncateString(txt, len) { - if (!txt) { - return; - } - - if (txt.length > len) { - return txt.slice(0, len - 3) + '...'; - } else { - return txt; - } -} -function shortenLargeNumber(label) { - var number; - if (typeof label === 'number') number = label;else if (typeof label === 'string') { - number = Number(label); - if (Number.isNaN(number)) return label; - } // Using absolute since log wont work for negative numbers - - var p = Math.floor(Math.log10(Math.abs(number))); - if (p <= 2) return number; // Return as is for a 3 digit number of less - - var l = Math.floor(p / 3); - var shortened = Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1); // Correct for floating point error upto 2 decimal places - - return Math.round(shortened * 100) / 100 + ' ' + ['', 'K', 'M', 'B', 'T'][l]; -} // cubic bezier curve calculation (from example by François Romain) - -function getSplineCurvePointsStr(xList, yList) { - var points = []; - - for (var i = 0; i < xList.length; i++) { - points.push([xList[i], yList[i]]); - } - - var smoothing = 0.2; - - var line = function line(pointA, pointB) { - var lengthX = pointB[0] - pointA[0]; - var lengthY = pointB[1] - pointA[1]; - return { - length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)), - angle: Math.atan2(lengthY, lengthX) - }; - }; - - var controlPoint = function controlPoint(current, previous, next, reverse) { - var p = previous || current; - var n = next || current; - var o = line(p, n); - var angle = o.angle + (reverse ? Math.PI : 0); - var length = o.length * smoothing; - var x = current[0] + Math.cos(angle) * length; - var y = current[1] + Math.sin(angle) * length; - return [x, y]; - }; - - var bezierCommand = function bezierCommand(point, i, a) { - var cps = controlPoint(a[i - 1], a[i - 2], point); - var cpe = controlPoint(point, a[i - 1], a[i + 1], true); - return "C ".concat(cps[0], ",").concat(cps[1], " ").concat(cpe[0], ",").concat(cpe[1], " ").concat(point[0], ",").concat(point[1]); - }; - - var pointStr = function pointStr(points, command) { - return points.reduce(function (acc, point, i, a) { - return i === 0 ? "".concat(point[0], ",").concat(point[1]) : "".concat(acc, " ").concat(command(point, i, a)); - }, ''); - }; - - return pointStr(points, bezierCommand); -} - -var PRESET_COLOR_MAP = { - 'pink': '#F683AE', - 'blue': '#318AD8', - 'green': '#48BB74', - 'grey': '#A6B1B9', - 'red': '#F56B6B', - 'yellow': '#FACF7A', - 'purple': '#44427B', - 'teal': '#5FD8C4', - 'cyan': '#15CCEF', - 'orange': '#F8814F', - 'light-pink': '#FED7E5', - 'light-blue': '#BFDDF7', - 'light-green': '#48BB74', - 'light-grey': '#F4F5F6', - 'light-red': '#F6DFDF', - 'light-yellow': '#FEE9BF', - 'light-purple': '#E8E8F7', - 'light-teal': '#D3FDF6', - 'light-cyan': '#DDF8FD', - 'light-orange': '#FECDB8' -}; - -function limitColor(r) { - if (r > 255) return 255;else if (r < 0) return 0; - return r; -} - -function lightenDarkenColor(color, amt) { - var col = getColor(color); - var usePound = false; - - if (col[0] == "#") { - col = col.slice(1); - usePound = true; - } - - var num = parseInt(col, 16); - var r = limitColor((num >> 16) + amt); - var b = limitColor((num >> 8 & 0x00FF) + amt); - var g = limitColor((num & 0x0000FF) + amt); - return (usePound ? "#" : "") + (g | b << 8 | r << 16).toString(16); -} -function isValidColor(string) { - // https://stackoverflow.com/a/32685393 - var HEX_RE = /(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i; - var RGB_RE = /(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i; - return HEX_RE.test(string) || RGB_RE.test(string); -} -var getColor = function getColor(color) { - return PRESET_COLOR_MAP[color] || color; -}; - -var AXIS_TICK_LENGTH = 6; -var LABEL_MARGIN = 4; -var LABEL_MAX_CHARS = 15; -var FONT_SIZE = 10; -var BASE_LINE_COLOR = '#E2E6E9'; -var FONT_FILL = '#313B44'; - -function $$1(expr, con) { - return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null; -} - -function createSVG(tag, o) { - var element = document.createElementNS("http://www.w3.org/2000/svg", tag); - - for (var i in o) { - var val = o[i]; - - if (i === "inside") { - $$1(val).appendChild(element); - } else if (i === "around") { - var ref = $$1(val); - ref.parentNode.insertBefore(element, ref); - element.appendChild(ref); - } else if (i === "styles") { - if (_typeof(val) === "object") { - Object.keys(val).map(function (prop) { - element.style[prop] = val[prop]; - }); - } - } else { - if (i === "className") { - i = "class"; - } - - if (i === "innerHTML") { - element['textContent'] = val; - } else { - element.setAttribute(i, val); - } - } - } - - return element; -} - -function renderVerticalGradient(svgDefElem, gradientId) { - return createSVG('linearGradient', { - inside: svgDefElem, - id: gradientId, - x1: 0, - x2: 0, - y1: 0, - y2: 1 - }); -} - -function setGradientStop(gradElem, offset, color, opacity) { - return createSVG('stop', { - 'inside': gradElem, - 'style': "stop-color: ".concat(color), - 'offset': offset, - 'stop-opacity': opacity - }); -} - -function makeSVGContainer(parent, className, width, height) { - return createSVG('svg', { - className: className, - inside: parent, - width: width, - height: height - }); -} -function makeSVGDefs(svgContainer) { - return createSVG('defs', { - inside: svgContainer - }); -} -function makeSVGGroup(className) { - var transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var parent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - var args = { - className: className, - transform: transform - }; - if (parent) args.inside = parent; - return createSVG('g', args); -} -function makePath(pathStr) { - var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var stroke = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'none'; - var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; - var strokeWidth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 2; - return createSVG('path', { - className: className, - d: pathStr, - styles: { - stroke: stroke, - fill: fill, - 'stroke-width': strokeWidth - } - }); -} -function makeArcPathStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - arcEndY = center.y + endPosition.y; - return "M".concat(center.x, " ").concat(center.y, "\n\t\tL").concat(arcStartX, " ").concat(arcStartY, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(arcEndY, " z"); -} -function makeCircleStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - midArc = center.y * 2, - arcEndY = center.y + endPosition.y; - return "M".concat(center.x, " ").concat(center.y, "\n\t\tL").concat(arcStartX, " ").concat(arcStartY, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(midArc, " z\n\t\tL").concat(arcStartX, " ").concat(midArc, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(arcEndY, " z"); -} -function makeArcStrokePathStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - arcEndY = center.y + endPosition.y; - return "M".concat(arcStartX, " ").concat(arcStartY, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(arcEndY); -} -function makeStrokeCircleStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - midArc = radius * 2 + arcStartY, - arcEndY = center.y + startPosition.y; - return "M".concat(arcStartX, " ").concat(arcStartY, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(midArc, "\n\t\tM").concat(arcStartX, " ").concat(midArc, "\n\t\tA ").concat(radius, " ").concat(radius, " 0 ").concat(largeArc, " ").concat(clockWise ? 1 : 0, "\n\t\t").concat(arcEndX, " ").concat(arcEndY); -} -function makeGradient(svgDefElem, color) { - var lighter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var gradientId = 'path-fill-gradient' + '-' + color + '-' + (lighter ? 'lighter' : 'default'); - var gradientDef = renderVerticalGradient(svgDefElem, gradientId); - var opacities = [1, 0.6, 0.2]; - - if (lighter) { - opacities = [0.4, 0.2, 0]; - } - - setGradientStop(gradientDef, "0%", color, opacities[0]); - setGradientStop(gradientDef, "50%", color, opacities[1]); - setGradientStop(gradientDef, "100%", color, opacities[2]); - return gradientId; -} -function percentageBar(x, y, width, height) { - var depth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : PERCENTAGE_BAR_DEFAULT_DEPTH; - var fill = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'none'; - var args = { - className: 'percentage-bar', - x: x, - y: y, - width: width, - height: height, - fill: fill, - styles: { - 'stroke': lightenDarkenColor(fill, -25), - // Diabolically good: https://stackoverflow.com/a/9000859 - // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray - 'stroke-dasharray': "0, ".concat(height + width, ", ").concat(width, ", ").concat(height), - 'stroke-width': depth - } - }; - return createSVG("rect", args); -} -function heatSquare(className, x, y, size, radius) { - var fill = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'none'; - var data = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {}; - var args = { - className: className, - x: x, - y: y, - width: size, - height: size, - rx: radius, - fill: fill - }; - Object.keys(data).map(function (key) { - args[key] = data[key]; - }); - return createSVG("rect", args); -} -function legendBar(x, y, size) { - var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; - var label = arguments.length > 4 ? arguments[4] : undefined; - var truncate = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - var args = { - className: 'legend-bar', - x: 0, - y: 0, - width: size, - height: '2px', - fill: fill - }; - var text = createSVG('text', { - className: 'legend-dataset-text', - x: 0, - y: 0, - dy: FONT_SIZE * 2 + 'px', - 'font-size': FONT_SIZE * 1.2 + 'px', - 'text-anchor': 'start', - fill: FONT_FILL, - innerHTML: label - }); - var group = createSVG('g', { - transform: "translate(".concat(x, ", ").concat(y, ")") - }); - group.appendChild(createSVG("rect", args)); - group.appendChild(text); - return group; -} -function legendDot(x, y, size) { - var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; - var label = arguments.length > 4 ? arguments[4] : undefined; - var truncate = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - var args = { - className: 'legend-dot', - cx: 0, - cy: 0, - r: size, - fill: fill - }; - var text = createSVG('text', { - className: 'legend-dataset-text', - x: 0, - y: 0, - dx: FONT_SIZE + 'px', - dy: FONT_SIZE / 3 + 'px', - 'font-size': FONT_SIZE * 1.2 + 'px', - 'text-anchor': 'start', - fill: FONT_FILL, - innerHTML: label - }); - var group = createSVG('g', { - transform: "translate(".concat(x, ", ").concat(y, ")") - }); - group.appendChild(createSVG("circle", args)); - group.appendChild(text); - return group; -} -function makeText(className, x, y, content) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - var fontSize = options.fontSize || FONT_SIZE; - var dy = options.dy !== undefined ? options.dy : fontSize / 2; - var fill = options.fill || FONT_FILL; - var textAnchor = options.textAnchor || 'start'; - return createSVG('text', { - className: className, - x: x, - y: y, - dy: dy + 'px', - 'font-size': fontSize + 'px', - fill: fill, - 'text-anchor': textAnchor, - innerHTML: content - }); -} - -function makeVertLine(x, label, y1, y2) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - var l = createSVG('line', { - className: 'line-vertical ' + options.className, - x1: 0, - x2: 0, - y1: y1, - y2: y2, - styles: { - stroke: options.stroke - } - }); - var text = createSVG('text', { - x: 0, - y: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE, - dy: FONT_SIZE + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'middle', - innerHTML: label + "" - }); - var line = createSVG('g', { - transform: "translate(".concat(x, ", 0)") - }); - line.appendChild(l); - line.appendChild(text); - return line; -} - -function makeHoriLine(y, label, x1, x2) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.lineType) options.lineType = ''; - if (options.shortenNumbers) label = shortenLargeNumber(label); - var className = 'line-horizontal ' + options.className + (options.lineType === "dashed" ? "dashed" : ""); - var l = createSVG('line', { - className: className, - x1: x1, - x2: x2, - y1: 0, - y2: 0, - styles: { - stroke: options.stroke - } - }); - var text = createSVG('text', { - x: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN, - y: 0, - dy: FONT_SIZE / 2 - 2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': x1 < x2 ? 'end' : 'start', - innerHTML: label + "" - }); - var line = createSVG('g', { - transform: "translate(0, ".concat(y, ")"), - 'stroke-opacity': 1 - }); - - if (text === 0 || text === '0') { - line.style.stroke = "rgba(27, 31, 35, 0.6)"; - } - - line.appendChild(l); - line.appendChild(text); - return line; -} - -function yLine(y, label, width) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - if (!isValidNumber(y)) y = 0; - if (!options.pos) options.pos = 'left'; - if (!options.offset) options.offset = 0; - if (!options.mode) options.mode = 'span'; - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.className) options.className = ''; - var x1 = -1 * AXIS_TICK_LENGTH; - var x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; - - if (options.mode === 'tick' && options.pos === 'right') { - x1 = width + AXIS_TICK_LENGTH; - x2 = width; - } // let offset = options.pos === 'left' ? -1 * options.offset : options.offset; - - - x1 += options.offset; - x2 += options.offset; - return makeHoriLine(y, label, x1, x2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType, - shortenNumbers: options.shortenNumbers - }); -} -function xLine(x, label, height) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - if (!isValidNumber(x)) x = 0; - if (!options.pos) options.pos = 'bottom'; - if (!options.offset) options.offset = 0; - if (!options.mode) options.mode = 'span'; - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.className) options.className = ''; // Draw X axis line in span/tick mode with optional label - // y2(span) - // | - // | - // x line | - // | - // | - // ---------------------+-- y2(tick) - // | - // y1 - - var y1 = height + AXIS_TICK_LENGTH; - var y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height; - - if (options.mode === 'tick' && options.pos === 'top') { - // top axis ticks - y1 = -1 * AXIS_TICK_LENGTH; - y2 = 0; - } - - return makeVertLine(x, label, y1, y2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType - }); -} -function yMarker(y, label, width) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - if (!options.labelPos) options.labelPos = 'right'; - var x = options.labelPos === 'left' ? LABEL_MARGIN : width - getStringWidth(label, 5) - LABEL_MARGIN; - var labelSvg = createSVG('text', { - className: 'chart-label', - x: x, - y: 0, - dy: FONT_SIZE / -2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'start', - innerHTML: label + "" - }); - var line = makeHoriLine(y, '', 0, width, { - stroke: options.stroke || BASE_LINE_COLOR, - className: options.className || '', - lineType: options.lineType - }); - line.appendChild(labelSvg); - return line; -} -function yRegion(y1, y2, width, label) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - // return a group - var height = y1 - y2; - var rect = createSVG('rect', { - className: "bar mini", - // remove class - styles: { - fill: "rgba(228, 234, 239, 0.49)", - stroke: BASE_LINE_COLOR, - 'stroke-dasharray': "".concat(width, ", ").concat(height) - }, - // 'data-point-index': index, - x: 0, - y: 0, - width: width, - height: height - }); - if (!options.labelPos) options.labelPos = 'right'; - var x = options.labelPos === 'left' ? LABEL_MARGIN : width - getStringWidth(label + "", 4.5) - LABEL_MARGIN; - var labelSvg = createSVG('text', { - className: 'chart-label', - x: x, - y: 0, - dy: FONT_SIZE / -2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'start', - innerHTML: label + "" - }); - var region = createSVG('g', { - transform: "translate(0, ".concat(y2, ")") - }); - region.appendChild(rect); - region.appendChild(labelSvg); - return region; -} -function datasetBar(x, yTop, width, color) { - var label = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; - var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var offset = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0; - var meta = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : {}; - - var _getBarHeightAndYAttr = getBarHeightAndYAttr(yTop, meta.zeroLine), - _getBarHeightAndYAttr2 = _slicedToArray(_getBarHeightAndYAttr, 2), - height = _getBarHeightAndYAttr2[0], - y = _getBarHeightAndYAttr2[1]; - - y -= offset; - - if (height === 0) { - height = meta.minHeight; - y -= meta.minHeight; - } // Preprocess numbers to avoid svg building errors - - - if (!isValidNumber(x)) x = 0; - if (!isValidNumber(y)) y = 0; - if (!isValidNumber(height, true)) height = 0; - if (!isValidNumber(width, true)) width = 0; - var rect = createSVG('rect', { - className: "bar mini", - style: "fill: ".concat(color), - 'data-point-index': index, - x: x, - y: y, - width: width, - height: height - }); - label += ""; - - if (!label && !label.length) { - return rect; - } else { - rect.setAttribute('y', 0); - rect.setAttribute('x', 0); - var text = createSVG('text', { - className: 'data-point-value', - x: width / 2, - y: 0, - dy: FONT_SIZE / 2 * -1 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'middle', - innerHTML: label - }); - var group = createSVG('g', { - 'data-point-index': index, - transform: "translate(".concat(x, ", ").concat(y, ")") - }); - group.appendChild(rect); - group.appendChild(text); - return group; - } -} -function datasetDot(x, y, radius, color) { - var label = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; - var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var dot = createSVG('circle', { - style: "fill: ".concat(color), - 'data-point-index': index, - cx: x, - cy: y, - r: radius - }); - label += ""; - - if (!label && !label.length) { - return dot; - } else { - dot.setAttribute('cy', 0); - dot.setAttribute('cx', 0); - var text = createSVG('text', { - className: 'data-point-value', - x: 0, - y: 0, - dy: FONT_SIZE / 2 * -1 - radius + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'middle', - innerHTML: label - }); - var group = createSVG('g', { - 'data-point-index': index, - transform: "translate(".concat(x, ", ").concat(y, ")") - }); - group.appendChild(dot); - group.appendChild(text); - return group; - } -} -function getPaths(xList, yList, color) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - var meta = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - var pointsList = yList.map(function (y, i) { - return xList[i] + ',' + y; - }); - var pointsStr = pointsList.join("L"); // Spline - - if (options.spline) pointsStr = getSplineCurvePointsStr(xList, yList); - var path = makePath("M" + pointsStr, 'line-graph-path', color); // HeatLine - - if (options.heatline) { - var gradient_id = makeGradient(meta.svgDefs, color); - path.style.stroke = "url(#".concat(gradient_id, ")"); - } - - var paths = { - path: path - }; // Region - - if (options.regionFill) { - var gradient_id_region = makeGradient(meta.svgDefs, color, true); - var pathStr = "M" + "".concat(xList[0], ",").concat(meta.zeroLine, "L") + pointsStr + "L".concat(xList.slice(-1)[0], ",").concat(meta.zeroLine); - paths.region = makePath(pathStr, "region-fill", 'none', "url(#".concat(gradient_id_region, ")")); - } - - return paths; -} -var makeOverlay = { - 'bar': function bar(unit) { - var transformValue; - - if (unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - - var overlay = unit.cloneNode(); - overlay.style.fill = '#000000'; - overlay.style.opacity = '0.4'; - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - - return overlay; - }, - 'dot': function dot(unit) { - var transformValue; - - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - - var overlay = unit.cloneNode(); - var radius = unit.getAttribute('r'); - var fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - - return overlay; - }, - 'heat_square': function heat_square(unit) { - var transformValue; - - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - - var overlay = unit.cloneNode(); - var radius = unit.getAttribute('r'); - var fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - - return overlay; - } -}; -var updateOverlay = { - 'bar': function bar(unit, overlay) { - var transformValue; - - if (unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - - var attributes = ['x', 'y', 'width', 'height']; - Object.values(unit.attributes).filter(function (attr) { - return attributes.includes(attr.name) && attr.specified; - }).map(function (attr) { - overlay.setAttribute(attr.name, attr.nodeValue); - }); - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, - 'dot': function dot(unit, overlay) { - var transformValue; - - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - - var attributes = ['cx', 'cy']; - Object.values(unit.attributes).filter(function (attr) { - return attributes.includes(attr.name) && attr.specified; - }).map(function (attr) { - overlay.setAttribute(attr.name, attr.nodeValue); - }); - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, - 'heat_square': function heat_square(unit, overlay) { - var transformValue; - - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - - var attributes = ['cx', 'cy']; - Object.values(unit.attributes).filter(function (attr) { - return attributes.includes(attr.name) && attr.specified; - }).map(function (attr) { - overlay.setAttribute(attr.name, attr.nodeValue); - }); - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - } -}; - -var UNIT_ANIM_DUR = 350; -var PATH_ANIM_DUR = 350; -var MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR; -var REPLACE_ALL_NEW_DUR = 250; -var STD_EASING = 'easein'; -function translate(unit, oldCoord, newCoord, duration) { - var old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', '); - return [unit, { - transform: newCoord.join(', ') - }, duration, STD_EASING, "translate", { - transform: old - }]; -} -function translateVertLine(xLine, newX, oldX) { - return translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR); -} -function translateHoriLine(yLine, newY, oldY) { - return translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR); -} -function animateRegion(rectGroup, newY1, newY2, oldY2) { - var newHeight = newY1 - newY2; - var rect = rectGroup.childNodes[0]; - var width = rect.getAttribute("width"); - var rectAnim = [rect, { - height: newHeight, - 'stroke-dasharray': "".concat(width, ", ").concat(newHeight) - }, MARKER_LINE_ANIM_DUR, STD_EASING]; - var groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR); - return [rectAnim, groupAnim]; -} -function animateBar(bar, x, yTop, width) { - var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; - var meta = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; - - var _getBarHeightAndYAttr = getBarHeightAndYAttr(yTop, meta.zeroLine), - _getBarHeightAndYAttr2 = _slicedToArray(_getBarHeightAndYAttr, 2), - height = _getBarHeightAndYAttr2[0], - y = _getBarHeightAndYAttr2[1]; - - y -= offset; - - if (bar.nodeName !== 'rect') { - var rect = bar.childNodes[0]; - var rectAnim = [rect, { - width: width, - height: height - }, UNIT_ANIM_DUR, STD_EASING]; - var oldCoordStr = bar.getAttribute("transform").split("(")[1].slice(0, -1); - var groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); - return [rectAnim, groupAnim]; - } else { - return [[bar, { - width: width, - height: height, - x: x, - y: y - }, UNIT_ANIM_DUR, STD_EASING]]; - } // bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein); - -} -function animateDot(dot, x, y) { - if (dot.nodeName !== 'circle') { - var oldCoordStr = dot.getAttribute("transform").split("(")[1].slice(0, -1); - var groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); - return [groupAnim]; - } else { - return [[dot, { - cx: x, - cy: y - }, UNIT_ANIM_DUR, STD_EASING]]; - } // dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein); - -} -function animatePath(paths, newXList, newYList, zeroLine, spline) { - var pathComponents = []; - var pointsStr = newYList.map(function (y, i) { - return newXList[i] + ',' + y; - }).join("L"); - if (spline) pointsStr = getSplineCurvePointsStr(newXList, newYList); - var animPath = [paths.path, { - d: "M" + pointsStr - }, PATH_ANIM_DUR, STD_EASING]; - pathComponents.push(animPath); - - if (paths.region) { - var regStartPt = "".concat(newXList[0], ",").concat(zeroLine, "L"); - var regEndPt = "L".concat(newXList.slice(-1)[0], ", ").concat(zeroLine); - var animRegion = [paths.region, { - d: "M" + regStartPt + pointsStr + regEndPt - }, PATH_ANIM_DUR, STD_EASING]; - pathComponents.push(animRegion); - } - - return pathComponents; -} -function animatePathStr(oldPath, pathStr) { - return [oldPath, { - d: pathStr - }, UNIT_ANIM_DUR, STD_EASING]; -} - -var EASING = { - ease: "0.25 0.1 0.25 1", - linear: "0 0 1 1", - // easein: "0.42 0 1 1", - easein: "0.1 0.8 0.2 1", - easeout: "0 0 0.58 1", - easeinout: "0.42 0 0.58 1" -}; - -function animateSVGElement(element, props, dur) { - var easingType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "linear"; - var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; - var oldValues = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; - var animElement = element.cloneNode(true); - var newElement = element.cloneNode(true); - - for (var attributeName in props) { - var animateElement = void 0; - - if (attributeName === 'transform') { - animateElement = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform"); - } else { - animateElement = document.createElementNS("http://www.w3.org/2000/svg", "animate"); - } - - var currentValue = oldValues[attributeName] || element.getAttribute(attributeName); - var value = props[attributeName]; - var animAttr = { - attributeName: attributeName, - from: currentValue, - to: value, - begin: "0s", - dur: dur / 1000 + "s", - values: currentValue + ";" + value, - keySplines: EASING[easingType], - keyTimes: "0;1", - calcMode: "spline", - fill: 'freeze' - }; - - if (type) { - animAttr["type"] = type; - } - - for (var i in animAttr) { - animateElement.setAttribute(i, animAttr[i]); - } - - animElement.appendChild(animateElement); - - if (type) { - newElement.setAttribute(attributeName, "translate(".concat(value, ")")); - } else { - newElement.setAttribute(attributeName, value); - } - } - - return [animElement, newElement]; -} - -function transform(element, style) { - // eslint-disable-line no-unused-vars - element.style.transform = style; - element.style.webkitTransform = style; - element.style.msTransform = style; - element.style.mozTransform = style; - element.style.oTransform = style; -} - -function animateSVG(svgContainer, elements) { - var newElements = []; - var animElements = []; - elements.map(function (element) { - var unit = element[0]; - var parent = unit.parentNode; - var animElement, newElement; - element[0] = unit; - - var _animateSVGElement = animateSVGElement.apply(void 0, _toConsumableArray(element)); - - var _animateSVGElement2 = _slicedToArray(_animateSVGElement, 2); - - animElement = _animateSVGElement2[0]; - newElement = _animateSVGElement2[1]; - newElements.push(newElement); - animElements.push([animElement, parent]); - parent.replaceChild(animElement, unit); - }); - var animSvg = svgContainer.cloneNode(true); - animElements.map(function (animElement, i) { - animElement[1].replaceChild(newElements[i], animElement[0]); - elements[i][0] = newElements[i]; - }); - return animSvg; -} - -function runSMILAnimation(parent, svgElement, elementsToAnimate) { - if (elementsToAnimate.length === 0) return; - var animSvgElement = animateSVG(svgElement, elementsToAnimate); - - if (svgElement.parentNode == parent) { - parent.removeChild(svgElement); - parent.appendChild(animSvgElement); - } // Replace the new svgElement (data has already been replaced) - - - setTimeout(function () { - if (animSvgElement.parentNode == parent) { - parent.removeChild(animSvgElement); - parent.appendChild(svgElement); - } - }, REPLACE_ALL_NEW_DUR); -} - -var CSSTEXT = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}"; - -function downloadFile(filename, data) { - var a = document.createElement('a'); - a.style = "display: none"; - var blob = new Blob(data, { - type: "image/svg+xml; charset=utf-8" - }); - var url = window.URL.createObjectURL(blob); - a.href = url; - a.download = filename; - document.body.appendChild(a); - a.click(); - setTimeout(function () { - document.body.removeChild(a); - window.URL.revokeObjectURL(url); - }, 300); -} -function prepareForExport(svg) { - var clone = svg.cloneNode(true); - clone.classList.add('chart-container'); - clone.setAttribute('xmlns', "http://www.w3.org/2000/svg"); - clone.setAttribute('xmlns:xlink', "http://www.w3.org/1999/xlink"); - var styleEl = $.create('style', { - 'innerHTML': CSSTEXT - }); - clone.insertBefore(styleEl, clone.firstChild); - var container = $.create('div'); - container.appendChild(clone); - return container.innerHTML; -} - -var BaseChart = /*#__PURE__*/function () { - function BaseChart(parent, options) { - _classCallCheck(this, BaseChart); - - this.parent = typeof parent === 'string' ? document.querySelector(parent) : parent; - - if (!(this.parent instanceof HTMLElement)) { - throw new Error('No `parent` element to render on was provided.'); - } - - this.rawChartArgs = options; - this.title = options.title || ''; - this.type = options.type || ''; - this.realData = this.prepareData(options.data); - this.data = this.prepareFirstData(this.realData); - this.colors = this.validateColors(options.colors, this.type); - this.config = { - showTooltip: 1, - // calculate - showLegend: 1, - // calculate - isNavigable: options.isNavigable || 0, - animate: typeof options.animate !== 'undefined' ? options.animate : 1, - truncateLegends: options.truncateLegends || 1 - }; - this.measures = JSON.parse(JSON.stringify(BASE_MEASURES)); - var m = this.measures; - this.setMeasures(options); - - if (!this.title.length) { - m.titleHeight = 0; - } - - if (!this.config.showLegend) m.legendHeight = 0; - this.argHeight = options.height || m.baseHeight; - this.state = {}; - this.options = {}; - this.initTimeout = INIT_CHART_UPDATE_TIMEOUT; - - if (this.config.isNavigable) { - this.overlays = []; - } - - this.configure(options); - } - - _createClass(BaseChart, [{ - key: "prepareData", - value: function prepareData(data) { - return data; - } - }, { - key: "prepareFirstData", - value: function prepareFirstData(data) { - return data; - } - }, { - key: "validateColors", - value: function validateColors(colors, type) { - var validColors = []; - colors = (colors || []).concat(DEFAULT_COLORS[type]); - colors.forEach(function (string) { - var color = getColor(string); - - if (!isValidColor(color)) { - console.warn('"' + string + '" is not a valid color.'); - } else { - validColors.push(color); - } - }); - return validColors; - } - }, { - key: "setMeasures", - value: function setMeasures() {// Override measures, including those for title and legend - // set config for legend and title - } - }, { - key: "configure", - value: function configure() { - var _this = this; - - var height = this.argHeight; - this.baseHeight = height; - this.height = height - getExtraHeight(this.measures); // Bind window events - - this.boundDrawFn = function () { - return _this.draw(true); - }; - - window.addEventListener('resize', this.boundDrawFn); - window.addEventListener('orientationchange', this.boundDrawFn); - } - }, { - key: "destroy", - value: function destroy() { - window.removeEventListener('resize', this.boundDrawFn); - window.removeEventListener('orientationchange', this.boundDrawFn); - } // Has to be called manually - - }, { - key: "setup", - value: function setup() { - this.makeContainer(); - this.updateWidth(); - this.makeTooltip(); - this.draw(false, true); - } - }, { - key: "makeContainer", - value: function makeContainer() { - // Chart needs a dedicated parent element - this.parent.innerHTML = ''; - var args = { - inside: this.parent, - className: 'chart-container' - }; - - if (this.independentWidth) { - args.styles = { - width: this.independentWidth + 'px' - }; - } - - this.container = $.create('div', args); - } - }, { - key: "makeTooltip", - value: function makeTooltip() { - this.tip = new SvgTip({ - parent: this.container, - colors: this.colors - }); - this.bindTooltip(); - } - }, { - key: "bindTooltip", - value: function bindTooltip() {} - }, { - key: "draw", - value: function draw() { - var _this2 = this; - - var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (onlyWidthChange && isHidden(this.parent)) { - // Don't update anything if the chart is hidden - return; - } - - this.updateWidth(); - this.calc(onlyWidthChange); - this.makeChartArea(); - this.setupComponents(); - this.components.forEach(function (c) { - return c.setup(_this2.drawArea); - }); // this.components.forEach(c => c.make()); - - this.render(this.components, false); - - if (init) { - this.data = this.realData; - setTimeout(function () { - _this2.update(_this2.data); - }, this.initTimeout); - } - - this.renderLegend(); - this.setupNavigation(init); - } - }, { - key: "calc", - value: function calc() {} // builds state - - }, { - key: "updateWidth", - value: function updateWidth() { - this.baseWidth = getElementContentWidth(this.parent); - this.width = this.baseWidth - getExtraWidth(this.measures); - } - }, { - key: "makeChartArea", - value: function makeChartArea() { - if (this.svg) { - this.container.removeChild(this.svg); - } - - var m = this.measures; - this.svg = makeSVGContainer(this.container, 'frappe-chart chart', this.baseWidth, this.baseHeight); - this.svgDefs = makeSVGDefs(this.svg); - - if (this.title.length) { - this.titleEL = makeText('title', m.margins.left, m.margins.top, this.title, { - fontSize: m.titleFontSize, - fill: '#666666', - dy: m.titleFontSize - }); - } - - var top = getTopOffset(m); - this.drawArea = makeSVGGroup(this.type + '-chart chart-draw-area', "translate(".concat(getLeftOffset(m), ", ").concat(top, ")")); - - if (this.config.showLegend) { - top += this.height + m.paddings.bottom; - this.legendArea = makeSVGGroup('chart-legend', "translate(".concat(getLeftOffset(m), ", ").concat(top, ")")); - } - - if (this.title.length) { - this.svg.appendChild(this.titleEL); - } - - this.svg.appendChild(this.drawArea); - - if (this.config.showLegend) { - this.svg.appendChild(this.legendArea); - } - - this.updateTipOffset(getLeftOffset(m), getTopOffset(m)); - } - }, { - key: "updateTipOffset", - value: function updateTipOffset(x, y) { - this.tip.offset = { - x: x, - y: y - }; - } - }, { - key: "setupComponents", - value: function setupComponents() { - this.components = new Map(); - } - }, { - key: "update", - value: function update(data) { - if (!data) { - console.error('No data to update.'); - } - - this.data = this.prepareData(data); - this.calc(); // builds state - - this.render(this.components, this.config.animate); - } - }, { - key: "render", - value: function render() { - var _this3 = this; - - var components = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.components; - var animate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - - if (this.config.isNavigable) { - // Remove all existing overlays - this.overlays.map(function (o) { - return o.parentNode.removeChild(o); - }); // ref.parentNode.insertBefore(element, ref); - } - - var elementsToAnimate = []; // Can decouple to this.refreshComponents() first to save animation timeout - - components.forEach(function (c) { - elementsToAnimate = elementsToAnimate.concat(c.update(animate)); - }); - - if (elementsToAnimate.length > 0) { - runSMILAnimation(this.container, this.svg, elementsToAnimate); - setTimeout(function () { - components.forEach(function (c) { - return c.make(); - }); - - _this3.updateNav(); - }, CHART_POST_ANIMATE_TIMEOUT); - } else { - components.forEach(function (c) { - return c.make(); - }); - this.updateNav(); - } - } - }, { - key: "updateNav", - value: function updateNav() { - if (this.config.isNavigable) { - this.makeOverlay(); - this.bindUnits(); - } - } - }, { - key: "renderLegend", - value: function renderLegend() {} - }, { - key: "setupNavigation", - value: function setupNavigation() { - var _this4 = this; - - var init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - if (!this.config.isNavigable) return; - - if (init) { - this.bindOverlay(); - this.keyActions = { - '13': this.onEnterKey.bind(this), - '37': this.onLeftArrow.bind(this), - '38': this.onUpArrow.bind(this), - '39': this.onRightArrow.bind(this), - '40': this.onDownArrow.bind(this) - }; - document.addEventListener('keydown', function (e) { - if (isElementInViewport(_this4.container)) { - e = e || window.event; - - if (_this4.keyActions[e.keyCode]) { - _this4.keyActions[e.keyCode](); - } - } - }); - } - } - }, { - key: "makeOverlay", - value: function makeOverlay() {} - }, { - key: "updateOverlay", - value: function updateOverlay() {} - }, { - key: "bindOverlay", - value: function bindOverlay() {} - }, { - key: "bindUnits", - value: function bindUnits() {} - }, { - key: "onLeftArrow", - value: function onLeftArrow() {} - }, { - key: "onRightArrow", - value: function onRightArrow() {} - }, { - key: "onUpArrow", - value: function onUpArrow() {} - }, { - key: "onDownArrow", - value: function onDownArrow() {} - }, { - key: "onEnterKey", - value: function onEnterKey() {} - }, { - key: "addDataPoint", - value: function addDataPoint() {} - }, { - key: "removeDataPoint", - value: function removeDataPoint() {} - }, { - key: "getDataPoint", - value: function getDataPoint() {} - }, { - key: "setCurrentDataPoint", - value: function setCurrentDataPoint() {} - }, { - key: "updateDataset", - value: function updateDataset() {} - }, { - key: "export", - value: function _export() { - var chartSvg = prepareForExport(this.svg); - downloadFile(this.title || 'Chart', [chartSvg]); - } - }]); - - return BaseChart; -}(); - -var AggregationChart = /*#__PURE__*/function (_BaseChart) { - _inherits(AggregationChart, _BaseChart); - - var _super = _createSuper(AggregationChart); - - function AggregationChart(parent, args) { - _classCallCheck(this, AggregationChart); - - return _super.call(this, parent, args); - } - - _createClass(AggregationChart, [{ - key: "configure", - value: function configure(args) { - _get(_getPrototypeOf(AggregationChart.prototype), "configure", this).call(this, args); - - this.config.maxSlices = args.maxSlices || 20; - this.config.maxLegendPoints = args.maxLegendPoints || 20; - } - }, { - key: "calc", - value: function calc() { - var _this = this; - - var s = this.state; - var maxSlices = this.config.maxSlices; - s.sliceTotals = []; - var allTotals = this.data.labels.map(function (label, i) { - var total = 0; - - _this.data.datasets.map(function (e) { - total += e.values[i]; - }); - - return [total, label]; - }).filter(function (d) { - return d[0] >= 0; - }); // keep only positive results - - var totals = allTotals; - - if (allTotals.length > maxSlices) { - // Prune and keep a grey area for rest as per maxSlices - allTotals.sort(function (a, b) { - return b[0] - a[0]; - }); - totals = allTotals.slice(0, maxSlices - 1); - var remaining = allTotals.slice(maxSlices - 1); - var sumOfRemaining = 0; - remaining.map(function (d) { - sumOfRemaining += d[0]; - }); - totals.push([sumOfRemaining, 'Rest']); - this.colors[maxSlices - 1] = 'grey'; - } - - s.labels = []; - totals.map(function (d) { - s.sliceTotals.push(d[0]); - s.labels.push(d[1]); - }); - s.grandTotal = s.sliceTotals.reduce(function (a, b) { - return a + b; - }, 0); - this.center = { - x: this.width / 2, - y: this.height / 2 - }; - } - }, { - key: "renderLegend", - value: function renderLegend() { - var _this2 = this; - - var s = this.state; - this.legendArea.textContent = ''; - this.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints); - var count = 0; - var y = 0; - this.legendTotals.map(function (d, i) { - var barWidth = 150; - var divisor = Math.floor((_this2.width - getExtraWidth(_this2.measures)) / barWidth); - - if (_this2.legendTotals.length < divisor) { - barWidth = _this2.width / _this2.legendTotals.length; - } - - if (count > divisor) { - count = 0; - y += 20; - } - - var x = barWidth * count + 5; - var label = _this2.config.truncateLegends ? truncateString(s.labels[i], barWidth / 10) : s.labels[i]; - var dot = legendDot(x, y, 5, _this2.colors[i], "".concat(label, ": ").concat(d), false); - - _this2.legendArea.appendChild(dot); - - count++; - }); - } - }]); - - return AggregationChart; -}(BaseChart); - -// Playing around with dates -var NO_OF_YEAR_MONTHS = 12; -var NO_OF_DAYS_IN_WEEK = 7; -var NO_OF_MILLIS = 1000; -var SEC_IN_DAY = 86400; -var MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; -var DAY_NAMES_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; - -function treatAsUtc(date) { - var result = new Date(date); - result.setMinutes(result.getMinutes() - result.getTimezoneOffset()); - return result; -} - -function getYyyyMmDd(date) { - var dd = date.getDate(); - var mm = date.getMonth() + 1; // getMonth() is zero-based - - return [date.getFullYear(), (mm > 9 ? '' : '0') + mm, (dd > 9 ? '' : '0') + dd].join('-'); -} -function clone(date) { - return new Date(date.getTime()); -} - -function getWeeksBetween(startDate, endDate) { - var weekStartDate = setDayToSunday(startDate); - return Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK); -} -function getDaysBetween(startDate, endDate) { - var millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS; - return (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay; -} -function areInSameMonth(startDate, endDate) { - return startDate.getMonth() === endDate.getMonth() && startDate.getFullYear() === endDate.getFullYear(); -} -function getMonthName(i) { - var short = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var monthName = MONTH_NAMES[i]; - return short ? monthName.slice(0, 3) : monthName; -} -function getLastDateInMonth(month, year) { - return new Date(year, month + 1, 0); // 0: last day in previous month -} // mutates - -function setDayToSunday(date) { - var newDate = clone(date); - var day = newDate.getDay(); - - if (day !== 0) { - addDays(newDate, -1 * day); - } - - return newDate; -} // mutates - -function addDays(date, numberOfDays) { - date.setDate(date.getDate() + numberOfDays); -} - -var ChartComponent = /*#__PURE__*/function () { - function ChartComponent(_ref) { - var _ref$layerClass = _ref.layerClass, - layerClass = _ref$layerClass === void 0 ? '' : _ref$layerClass, - _ref$layerTransform = _ref.layerTransform, - layerTransform = _ref$layerTransform === void 0 ? '' : _ref$layerTransform, - constants = _ref.constants, - getData = _ref.getData, - makeElements = _ref.makeElements, - animateElements = _ref.animateElements; - - _classCallCheck(this, ChartComponent); - - this.layerTransform = layerTransform; - this.constants = constants; - this.makeElements = makeElements; - this.getData = getData; - this.animateElements = animateElements; - this.store = []; - this.labels = []; - this.layerClass = layerClass; - this.layerClass = typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass; - this.refresh(); - } - - _createClass(ChartComponent, [{ - key: "refresh", - value: function refresh(data) { - this.data = data || this.getData(); - } - }, { - key: "setup", - value: function setup(parent) { - this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent); - } - }, { - key: "make", - value: function make() { - this.render(this.data); - this.oldData = this.data; - } - }, { - key: "render", - value: function render(data) { - var _this = this; - - this.store = this.makeElements(data); - this.layer.textContent = ''; - this.store.forEach(function (element) { - _this.layer.appendChild(element); - }); - this.labels.forEach(function (element) { - _this.layer.appendChild(element); - }); - } - }, { - key: "update", - value: function update() { - var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - this.refresh(); - var animateElements = []; - - if (animate) { - animateElements = this.animateElements(this.data) || []; - } - - return animateElements; - } - }]); - - return ChartComponent; -}(); - -var componentConfigs = { - donutSlices: { - layerClass: 'donut-slices', - makeElements: function makeElements(data) { - return data.sliceStrings.map(function (s, i) { - var slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth); - slice.style.transition = 'transform .3s;'; - return slice; - }); - }, - animateElements: function animateElements(newData) { - return this.store.map(function (slice, i) { - return animatePathStr(slice, newData.sliceStrings[i]); - }); - } - }, - pieSlices: { - layerClass: 'pie-slices', - makeElements: function makeElements(data) { - return data.sliceStrings.map(function (s, i) { - var slice = makePath(s, 'pie-path', 'none', data.colors[i]); - slice.style.transition = 'transform .3s;'; - return slice; - }); - }, - animateElements: function animateElements(newData) { - return this.store.map(function (slice, i) { - return animatePathStr(slice, newData.sliceStrings[i]); - }); - } - }, - percentageBars: { - layerClass: 'percentage-bars', - makeElements: function makeElements(data) { - var _this2 = this; - - return data.xPositions.map(function (x, i) { - var y = 0; - var bar = percentageBar(x, y, data.widths[i], _this2.constants.barHeight, _this2.constants.barDepth, data.colors[i]); - return bar; - }); - }, - animateElements: function animateElements(newData) { - if (newData) return []; - } - }, - yAxis: { - layerClass: 'y axis', - makeElements: function makeElements(data) { - var _this3 = this; - - return data.positions.map(function (position, i) { - return yLine(position, data.labels[i], _this3.constants.width, { - mode: _this3.constants.mode, - pos: _this3.constants.pos, - shortenNumbers: _this3.constants.shortenNumbers - }); - }); - }, - animateElements: function animateElements(newData) { - var newPos = newData.positions; - var newLabels = newData.labels; - var oldPos = this.oldData.positions; - var oldLabels = this.oldData.labels; - - var _equilizeNoOfElements = equilizeNoOfElements(oldPos, newPos); - - var _equilizeNoOfElements2 = _slicedToArray(_equilizeNoOfElements, 2); - - oldPos = _equilizeNoOfElements2[0]; - newPos = _equilizeNoOfElements2[1]; - - var _equilizeNoOfElements3 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements4 = _slicedToArray(_equilizeNoOfElements3, 2); - - oldLabels = _equilizeNoOfElements4[0]; - newLabels = _equilizeNoOfElements4[1]; - this.render({ - positions: oldPos, - labels: newLabels - }); - return this.store.map(function (line, i) { - return translateHoriLine(line, newPos[i], oldPos[i]); - }); - } - }, - xAxis: { - layerClass: 'x axis', - makeElements: function makeElements(data) { - var _this4 = this; - - return data.positions.map(function (position, i) { - return xLine(position, data.calcLabels[i], _this4.constants.height, { - mode: _this4.constants.mode, - pos: _this4.constants.pos - }); - }); - }, - animateElements: function animateElements(newData) { - var newPos = newData.positions; - var newLabels = newData.calcLabels; - var oldPos = this.oldData.positions; - var oldLabels = this.oldData.calcLabels; - - var _equilizeNoOfElements5 = equilizeNoOfElements(oldPos, newPos); - - var _equilizeNoOfElements6 = _slicedToArray(_equilizeNoOfElements5, 2); - - oldPos = _equilizeNoOfElements6[0]; - newPos = _equilizeNoOfElements6[1]; - - var _equilizeNoOfElements7 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements8 = _slicedToArray(_equilizeNoOfElements7, 2); - - oldLabels = _equilizeNoOfElements8[0]; - newLabels = _equilizeNoOfElements8[1]; - this.render({ - positions: oldPos, - calcLabels: newLabels - }); - return this.store.map(function (line, i) { - return translateVertLine(line, newPos[i], oldPos[i]); - }); - } - }, - yMarkers: { - layerClass: 'y-markers', - makeElements: function makeElements(data) { - var _this5 = this; - - return data.map(function (m) { - return yMarker(m.position, m.label, _this5.constants.width, { - labelPos: m.options.labelPos, - mode: 'span', - lineType: 'dashed' - }); - }); - }, - animateElements: function animateElements(newData) { - var _equilizeNoOfElements9 = equilizeNoOfElements(this.oldData, newData); - - var _equilizeNoOfElements10 = _slicedToArray(_equilizeNoOfElements9, 2); - - this.oldData = _equilizeNoOfElements10[0]; - newData = _equilizeNoOfElements10[1]; - var newPos = newData.map(function (d) { - return d.position; - }); - var newLabels = newData.map(function (d) { - return d.label; - }); - var newOptions = newData.map(function (d) { - return d.options; - }); - var oldPos = this.oldData.map(function (d) { - return d.position; - }); - this.render(oldPos.map(function (pos, i) { - return { - position: oldPos[i], - label: newLabels[i], - options: newOptions[i] - }; - })); - return this.store.map(function (line, i) { - return translateHoriLine(line, newPos[i], oldPos[i]); - }); - } - }, - yRegions: { - layerClass: 'y-regions', - makeElements: function makeElements(data) { - var _this6 = this; - - return data.map(function (r) { - return yRegion(r.startPos, r.endPos, _this6.constants.width, r.label, { - labelPos: r.options.labelPos - }); - }); - }, - animateElements: function animateElements(newData) { - var _equilizeNoOfElements11 = equilizeNoOfElements(this.oldData, newData); - - var _equilizeNoOfElements12 = _slicedToArray(_equilizeNoOfElements11, 2); - - this.oldData = _equilizeNoOfElements12[0]; - newData = _equilizeNoOfElements12[1]; - var newPos = newData.map(function (d) { - return d.endPos; - }); - var newLabels = newData.map(function (d) { - return d.label; - }); - var newStarts = newData.map(function (d) { - return d.startPos; - }); - var newOptions = newData.map(function (d) { - return d.options; - }); - var oldPos = this.oldData.map(function (d) { - return d.endPos; - }); - var oldStarts = this.oldData.map(function (d) { - return d.startPos; - }); - this.render(oldPos.map(function (pos, i) { - return { - startPos: oldStarts[i], - endPos: oldPos[i], - label: newLabels[i], - options: newOptions[i] - }; - })); - var animateElements = []; - this.store.map(function (rectGroup, i) { - animateElements = animateElements.concat(animateRegion(rectGroup, newStarts[i], newPos[i], oldPos[i])); - }); - return animateElements; - } - }, - heatDomain: { - layerClass: function layerClass() { - return 'heat-domain domain-' + this.constants.index; - }, - makeElements: function makeElements(data) { - var _this7 = this; - - var _this$constants = this.constants, - index = _this$constants.index, - colWidth = _this$constants.colWidth, - rowHeight = _this$constants.rowHeight, - squareSize = _this$constants.squareSize, - radius = _this$constants.radius, - xTranslate = _this$constants.xTranslate; - var monthNameHeight = -12; - var x = xTranslate, - y = 0; - this.serializedSubDomains = []; - data.cols.map(function (week, weekNo) { - if (weekNo === 1) { - _this7.labels.push(makeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(), { - fontSize: 9 - })); - } - - week.map(function (day, i) { - if (day.fill) { - var _data = { - 'data-date': day.yyyyMmDd, - 'data-value': day.dataValue, - 'data-day': i - }; - var square = heatSquare('day', x, y, squareSize, radius, day.fill, _data); - - _this7.serializedSubDomains.push(square); - } - - y += rowHeight; - }); - y = 0; - x += colWidth; - }); - return this.serializedSubDomains; - }, - animateElements: function animateElements(newData) { - if (newData) return []; - } - }, - barGraph: { - layerClass: function layerClass() { - return 'dataset-units dataset-bars dataset-' + this.constants.index; - }, - makeElements: function makeElements(data) { - var c = this.constants; - this.unitType = 'bar'; - this.units = data.yPositions.map(function (y, j) { - return datasetBar(data.xPositions[j], y, data.barWidth, c.color, data.labels[j], j, data.offsets[j], { - zeroLine: data.zeroLine, - barsWidth: data.barsWidth, - minHeight: c.minHeight - }); - }); - return this.units; - }, - animateElements: function animateElements(newData) { - var newXPos = newData.xPositions; - var newYPos = newData.yPositions; - var newOffsets = newData.offsets; - var newLabels = newData.labels; - var oldXPos = this.oldData.xPositions; - var oldYPos = this.oldData.yPositions; - var oldOffsets = this.oldData.offsets; - var oldLabels = this.oldData.labels; - - var _equilizeNoOfElements13 = equilizeNoOfElements(oldXPos, newXPos); - - var _equilizeNoOfElements14 = _slicedToArray(_equilizeNoOfElements13, 2); - - oldXPos = _equilizeNoOfElements14[0]; - newXPos = _equilizeNoOfElements14[1]; - - var _equilizeNoOfElements15 = equilizeNoOfElements(oldYPos, newYPos); - - var _equilizeNoOfElements16 = _slicedToArray(_equilizeNoOfElements15, 2); - - oldYPos = _equilizeNoOfElements16[0]; - newYPos = _equilizeNoOfElements16[1]; - - var _equilizeNoOfElements17 = equilizeNoOfElements(oldOffsets, newOffsets); - - var _equilizeNoOfElements18 = _slicedToArray(_equilizeNoOfElements17, 2); - - oldOffsets = _equilizeNoOfElements18[0]; - newOffsets = _equilizeNoOfElements18[1]; - - var _equilizeNoOfElements19 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements20 = _slicedToArray(_equilizeNoOfElements19, 2); - - oldLabels = _equilizeNoOfElements20[0]; - newLabels = _equilizeNoOfElements20[1]; - this.render({ - xPositions: oldXPos, - yPositions: oldYPos, - offsets: oldOffsets, - labels: newLabels, - zeroLine: this.oldData.zeroLine, - barsWidth: this.oldData.barsWidth, - barWidth: this.oldData.barWidth - }); - var animateElements = []; - this.store.map(function (bar, i) { - animateElements = animateElements.concat(animateBar(bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], { - zeroLine: newData.zeroLine - })); - }); - return animateElements; - } - }, - lineGraph: { - layerClass: function layerClass() { - return 'dataset-units dataset-line dataset-' + this.constants.index; - }, - makeElements: function makeElements(data) { - var c = this.constants; - this.unitType = 'dot'; - this.paths = {}; - - if (!c.hideLine) { - this.paths = getPaths(data.xPositions, data.yPositions, c.color, { - heatline: c.heatline, - regionFill: c.regionFill, - spline: c.spline - }, { - svgDefs: c.svgDefs, - zeroLine: data.zeroLine - }); - } - - this.units = []; - - if (!c.hideDots) { - this.units = data.yPositions.map(function (y, j) { - return datasetDot(data.xPositions[j], y, data.radius, c.color, c.valuesOverPoints ? data.values[j] : '', j); - }); - } - - return Object.values(this.paths).concat(this.units); - }, - animateElements: function animateElements(newData) { - var newXPos = newData.xPositions; - var newYPos = newData.yPositions; - var newValues = newData.values; - var oldXPos = this.oldData.xPositions; - var oldYPos = this.oldData.yPositions; - var oldValues = this.oldData.values; - - var _equilizeNoOfElements21 = equilizeNoOfElements(oldXPos, newXPos); - - var _equilizeNoOfElements22 = _slicedToArray(_equilizeNoOfElements21, 2); - - oldXPos = _equilizeNoOfElements22[0]; - newXPos = _equilizeNoOfElements22[1]; - - var _equilizeNoOfElements23 = equilizeNoOfElements(oldYPos, newYPos); - - var _equilizeNoOfElements24 = _slicedToArray(_equilizeNoOfElements23, 2); - - oldYPos = _equilizeNoOfElements24[0]; - newYPos = _equilizeNoOfElements24[1]; - - var _equilizeNoOfElements25 = equilizeNoOfElements(oldValues, newValues); - - var _equilizeNoOfElements26 = _slicedToArray(_equilizeNoOfElements25, 2); - - oldValues = _equilizeNoOfElements26[0]; - newValues = _equilizeNoOfElements26[1]; - this.render({ - xPositions: oldXPos, - yPositions: oldYPos, - values: newValues, - zeroLine: this.oldData.zeroLine, - radius: this.oldData.radius - }); - var animateElements = []; - - if (Object.keys(this.paths).length) { - animateElements = animateElements.concat(animatePath(this.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline)); - } - - if (this.units.length) { - this.units.map(function (dot, i) { - animateElements = animateElements.concat(animateDot(dot, newXPos[i], newYPos[i])); - }); - } - - return animateElements; - } - } -}; -function getComponent(name, constants, getData) { - var keys = Object.keys(componentConfigs).filter(function (k) { - return name.includes(k); - }); - var config = componentConfigs[keys[0]]; - Object.assign(config, { - constants: constants, - getData: getData - }); - return new ChartComponent(config); -} - -var PercentageChart = /*#__PURE__*/function (_AggregationChart) { - _inherits(PercentageChart, _AggregationChart); - - var _super = _createSuper(PercentageChart); - - function PercentageChart(parent, args) { - var _this; - - _classCallCheck(this, PercentageChart); - - _this = _super.call(this, parent, args); - _this.type = 'percentage'; - - _this.setup(); - - return _this; - } - - _createClass(PercentageChart, [{ - key: "setMeasures", - value: function setMeasures(options) { - var m = this.measures; - this.barOptions = options.barOptions || {}; - var b = this.barOptions; - b.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT; - b.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH; - m.paddings.right = 30; - m.legendHeight = 60; - m.baseHeight = (b.height + b.depth * 0.5) * 8; - } - }, { - key: "setupComponents", - value: function setupComponents() { - var s = this.state; - var componentConfigs = [['percentageBars', { - barHeight: this.barOptions.height, - barDepth: this.barOptions.depth - }, function () { - return { - xPositions: s.xPositions, - widths: s.widths, - colors: this.colors - }; - }.bind(this)]]; - this.components = new Map(componentConfigs.map(function (args) { - var component = getComponent.apply(void 0, _toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: "calc", - value: function calc() { - var _this2 = this; - - _get(_getPrototypeOf(PercentageChart.prototype), "calc", this).call(this); - - var s = this.state; - s.xPositions = []; - s.widths = []; - var xPos = 0; - s.sliceTotals.map(function (value) { - var width = _this2.width * value / s.grandTotal; - s.widths.push(width); - s.xPositions.push(xPos); - xPos += width; - }); - } - }, { - key: "makeDataByIndex", - value: function makeDataByIndex() {} - }, { - key: "bindTooltip", - value: function bindTooltip() { - var _this3 = this; - - var s = this.state; - this.container.addEventListener('mousemove', function (e) { - var bars = _this3.components.get('percentageBars').store; - - var bar = e.target; - - if (bars.includes(bar)) { - var i = bars.indexOf(bar); - var gOff = getOffset(_this3.container), - pOff = getOffset(bar); - var x = pOff.left - gOff.left + parseInt(bar.getAttribute('width')) / 2; - var y = pOff.top - gOff.top; - var title = (_this3.formattedLabels && _this3.formattedLabels.length > 0 ? _this3.formattedLabels[i] : _this3.state.labels[i]) + ': '; - var fraction = s.sliceTotals[i] / s.grandTotal; - - _this3.tip.setValues(x, y, { - name: title, - value: (fraction * 100).toFixed(1) + "%" - }); - - _this3.tip.showTip(); - } - }); - } - }]); - - return PercentageChart; -}(AggregationChart); - -var PieChart = /*#__PURE__*/function (_AggregationChart) { - _inherits(PieChart, _AggregationChart); - - var _super = _createSuper(PieChart); - - function PieChart(parent, args) { - var _this; - - _classCallCheck(this, PieChart); - - _this = _super.call(this, parent, args); - _this.type = 'pie'; - _this.initTimeout = 0; - _this.init = 1; - - _this.setup(); - - return _this; - } - - _createClass(PieChart, [{ - key: "configure", - value: function configure(args) { - _get(_getPrototypeOf(PieChart.prototype), "configure", this).call(this, args); - - this.mouseMove = this.mouseMove.bind(this); - this.mouseLeave = this.mouseLeave.bind(this); - this.hoverRadio = args.hoverRadio || 0.1; - this.config.startAngle = args.startAngle || 0; - this.clockWise = args.clockWise || false; - } - }, { - key: "calc", - value: function calc() { - var _this2 = this; - - _get(_getPrototypeOf(PieChart.prototype), "calc", this).call(this); - - var s = this.state; - this.radius = this.height > this.width ? this.center.x : this.center.y; - var radius = this.radius, - clockWise = this.clockWise; - var prevSlicesProperties = s.slicesProperties || []; - s.sliceStrings = []; - s.slicesProperties = []; - var curAngle = 180 - this.config.startAngle; - s.sliceTotals.map(function (total, i) { - var startAngle = curAngle; - var originDiffAngle = total / s.grandTotal * FULL_ANGLE; - var largeArc = originDiffAngle > 180 ? 1 : 0; - var diffAngle = clockWise ? -originDiffAngle : originDiffAngle; - var endAngle = curAngle = curAngle + diffAngle; - var startPosition = getPositionByAngle(startAngle, radius); - var endPosition = getPositionByAngle(endAngle, radius); - var prevProperty = _this2.init && prevSlicesProperties[i]; - var curStart, curEnd; - - if (_this2.init) { - curStart = prevProperty ? prevProperty.startPosition : startPosition; - curEnd = prevProperty ? prevProperty.endPosition : startPosition; - } else { - curStart = startPosition; - curEnd = endPosition; - } - - var curPath = originDiffAngle === 360 ? makeCircleStr(curStart, curEnd, _this2.center, _this2.radius, clockWise, largeArc) : makeArcPathStr(curStart, curEnd, _this2.center, _this2.radius, clockWise, largeArc); - s.sliceStrings.push(curPath); - s.slicesProperties.push({ - startPosition: startPosition, - endPosition: endPosition, - value: total, - total: s.grandTotal, - startAngle: startAngle, - endAngle: endAngle, - angle: diffAngle - }); - }); - this.init = 0; - } - }, { - key: "setupComponents", - value: function setupComponents() { - var s = this.state; - var componentConfigs = [['pieSlices', {}, function () { - return { - sliceStrings: s.sliceStrings, - colors: this.colors - }; - }.bind(this)]]; - this.components = new Map(componentConfigs.map(function (args) { - var component = getComponent.apply(void 0, _toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: "calTranslateByAngle", - value: function calTranslateByAngle(property) { - var radius = this.radius, - hoverRadio = this.hoverRadio; - var position = getPositionByAngle(property.startAngle + property.angle / 2, radius); - return "translate3d(".concat(position.x * hoverRadio, "px,").concat(position.y * hoverRadio, "px,0)"); - } - }, { - key: "hoverSlice", - value: function hoverSlice(path, i, flag, e) { - if (!path) return; - var color = this.colors[i]; - - if (flag) { - transform(path, this.calTranslateByAngle(this.state.slicesProperties[i])); - path.style.fill = lightenDarkenColor(color, 50); - var g_off = getOffset(this.svg); - var x = e.pageX - g_off.left + 10; - var y = e.pageY - g_off.top - 10; - var title = (this.formatted_labels && this.formatted_labels.length > 0 ? this.formatted_labels[i] : this.state.labels[i]) + ': '; - var percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1); - this.tip.setValues(x, y, { - name: title, - value: percent + "%" - }); - this.tip.showTip(); - } else { - transform(path, 'translate3d(0,0,0)'); - this.tip.hideTip(); - path.style.fill = color; - } - } - }, { - key: "bindTooltip", - value: function bindTooltip() { - this.container.addEventListener('mousemove', this.mouseMove); - this.container.addEventListener('mouseleave', this.mouseLeave); - } - }, { - key: "mouseMove", - value: function mouseMove(e) { - var target = e.target; - var slices = this.components.get('pieSlices').store; - var prevIndex = this.curActiveSliceIndex; - var prevAcitve = this.curActiveSlice; - - if (slices.includes(target)) { - var i = slices.indexOf(target); - this.hoverSlice(prevAcitve, prevIndex, false); - this.curActiveSlice = target; - this.curActiveSliceIndex = i; - this.hoverSlice(target, i, true, e); - } else { - this.mouseLeave(); - } - } - }, { - key: "mouseLeave", - value: function mouseLeave() { - this.hoverSlice(this.curActiveSlice, this.curActiveSliceIndex, false); - } - }]); - - return PieChart; -}(AggregationChart); - -function normalize(x) { - // Calculates mantissa and exponent of a number - // Returns normalized number and exponent - // https://stackoverflow.com/q/9383593/6495043 - if (x === 0) { - return [0, 0]; - } - - if (isNaN(x)) { - return { - mantissa: -6755399441055744, - exponent: 972 - }; - } - - var sig = x > 0 ? 1 : -1; - - if (!isFinite(x)) { - return { - mantissa: sig * 4503599627370496, - exponent: 972 - }; - } - - x = Math.abs(x); - var exp = Math.floor(Math.log10(x)); - var man = x / Math.pow(10, exp); - return [sig * man, exp]; -} - -function getChartRangeIntervals(max) { - var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - var upperBound = Math.ceil(max); - var lowerBound = Math.floor(min); - var range = upperBound - lowerBound; - var noOfParts = range; - var partSize = 1; // To avoid too many partitions - - if (range > 5) { - if (range % 2 !== 0) { - upperBound++; // Recalc range - - range = upperBound - lowerBound; - } - - if(maxValue >= absMinValue) { - exponent = normalize(maxValue)[1]; - intervals = getPositiveFirstIntervals(maxValue, absMinValue); - } else { - // Mirror: maxValue => absMinValue, then change sign - exponent = normalize(absMinValue)[1]; - let posIntervals = getPositiveFirstIntervals(absMinValue, maxValue); - intervals = posIntervals.reverse().map(d => d * (-1)); - } - - - if (range <= 2) { - noOfParts = 4; - partSize = range / noOfParts; - } // Special case: 0 - - - if (range === 0) { - noOfParts = 5; - partSize = 1; - } - - var intervals = []; - - for (var i = 0; i <= noOfParts; i++) { - intervals.push(lowerBound + partSize * i); - } - - return intervals; -} - -function getChartIntervals(maxValue) { - var minValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var _normalize = normalize(maxValue), - _normalize2 = _slicedToArray(_normalize, 2), - normalMaxValue = _normalize2[0], - exponent = _normalize2[1]; - - var normalMinValue = minValue ? minValue / Math.pow(10, exponent) : 0; // Allow only 7 significant digits - - normalMaxValue = normalMaxValue.toFixed(6); - var intervals = getChartRangeIntervals(normalMaxValue, normalMinValue); - intervals = intervals.map(function (value) { - return value * Math.pow(10, exponent); - }); - return intervals; -} - -function calcChartIntervals(values) { - var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - //*** Where the magic happens *** - // Calculates best-fit y intervals from given values - // and returns the interval array - var maxValue = Math.max.apply(Math, _toConsumableArray(values)); - var minValue = Math.min.apply(Math, _toConsumableArray(values)); // Exponent to be used for pretty print - - var exponent = 0, - intervals = []; // eslint-disable-line no-unused-vars - - function getPositiveFirstIntervals(maxValue, absMinValue) { - var intervals = getChartIntervals(maxValue); - var intervalSize = intervals[1] - intervals[0]; // Then unshift the negative values - - var value = 0; - - for (var i = 1; value < absMinValue; i++) { - value += intervalSize; - intervals.unshift(-1 * value); - } - - return intervals; - } // CASE I: Both non-negative - - - if (maxValue >= 0 && minValue >= 0) { - exponent = normalize(maxValue)[1]; - - if (!withMinimum) { - intervals = getChartIntervals(maxValue); - } else { - intervals = getChartIntervals(maxValue, minValue); - } - } // CASE II: Only minValue negative - else if (maxValue > 0 && minValue < 0) { - // `withMinimum` irrelevant in this case, - // We'll be handling both sides of zero separately - // (both starting from zero) - // Because ceil() and floor() behave differently - // in those two regions - var absMinValue = Math.abs(minValue); - - if (maxValue >= absMinValue) { - exponent = normalize(maxValue)[1]; - intervals = getPositiveFirstIntervals(maxValue, absMinValue); - } else { - // Mirror: maxValue => absMinValue, then change sign - exponent = normalize(absMinValue)[1]; - var posIntervals = getPositiveFirstIntervals(absMinValue, maxValue); - intervals = posIntervals.map(function (d) { - return d * -1; - }); - } - } // CASE III: Both non-positive - else if (maxValue <= 0 && minValue <= 0) { - // Mirrored Case I: - // Work with positives, then reverse the sign and array - var pseudoMaxValue = Math.abs(minValue); - var pseudoMinValue = Math.abs(maxValue); - exponent = normalize(pseudoMaxValue)[1]; - - if (!withMinimum) { - intervals = getChartIntervals(pseudoMaxValue); - } else { - intervals = getChartIntervals(pseudoMaxValue, pseudoMinValue); - } - - intervals = intervals.reverse().map(function (d) { - return d * -1; - }); - } - - return intervals; -} -function getZeroIndex(yPts) { - var zeroIndex; - var interval = getIntervalSize(yPts); - - if (yPts.indexOf(0) >= 0) { - // the range has a given zero - // zero-line on the chart - zeroIndex = yPts.indexOf(0); - } else if (yPts[0] > 0) { - // Minimum value is positive - // zero-line is off the chart: below - var min = yPts[0]; - zeroIndex = -1 * min / interval; - } else { - // Maximum value is negative - // zero-line is off the chart: above - var max = yPts[yPts.length - 1]; - zeroIndex = -1 * max / interval + (yPts.length - 1); - } - - return zeroIndex; -} -function getIntervalSize(orderedArray) { - return orderedArray[1] - orderedArray[0]; -} -function getValueRange(orderedArray) { - return orderedArray[orderedArray.length - 1] - orderedArray[0]; -} -function scale(val, yAxis) { - return floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier); -} -function getClosestInArray(goal, arr) { - var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var closest = arr.reduce(function (prev, curr) { - return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev; - }, []); - return index ? arr.indexOf(closest) : closest; -} -function calcDistribution(values, distributionSize) { - // Assume non-negative values, - // implying distribution minimum at zero - var dataMaxValue = Math.max.apply(Math, _toConsumableArray(values)); - var distributionStep = 1 / (distributionSize - 1); - var distribution = []; - - for (var i = 0; i < distributionSize; i++) { - var checkpoint = dataMaxValue * (distributionStep * i); - distribution.push(checkpoint); - } - - return distribution; -} -function getMaxCheckpoint(value, distribution) { - return distribution.filter(function (d) { - return d < value; - }).length; -} - -var COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE; -var ROW_HEIGHT = COL_WIDTH; // const DAY_INCR = 1; - -var Heatmap = /*#__PURE__*/function (_BaseChart) { - _inherits(Heatmap, _BaseChart); - - var _super = _createSuper(Heatmap); - - function Heatmap(parent, options) { - var _this; - - _classCallCheck(this, Heatmap); - - _this = _super.call(this, parent, options); - _this.type = 'heatmap'; - _this.countLabel = options.countLabel || ''; - var validStarts = ['Sunday', 'Monday']; - var startSubDomain = validStarts.includes(options.startSubDomain) ? options.startSubDomain : 'Sunday'; - _this.startSubDomainIndex = validStarts.indexOf(startSubDomain); - - _this.setup(); - - return _this; - } - - _createClass(Heatmap, [{ - key: "setMeasures", - value: function setMeasures(options) { - var m = this.measures; - this.discreteDomains = options.discreteDomains === 0 ? 0 : 1; - m.paddings.top = ROW_HEIGHT * 3; - m.paddings.bottom = 0; - m.legendHeight = ROW_HEIGHT * 2; - m.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK + getExtraHeight(m); - var d = this.data; - var spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0; - this.independentWidth = (getWeeksBetween(d.start, d.end) + spacing) * COL_WIDTH + getExtraWidth(m); - } - }, { - key: "updateWidth", - value: function updateWidth() { - var spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0; - var noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52; - this.baseWidth = (noOfWeeks + spacing) * COL_WIDTH + getExtraWidth(this.measures); - } - }, { - key: "prepareData", - value: function prepareData() { - var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; - - if (data.start && data.end && data.start > data.end) { - throw new Error('Start date cannot be greater than end date.'); - } - - if (!data.start) { - data.start = new Date(); - data.start.setFullYear(data.start.getFullYear() - 1); - } - - if (!data.end) { - data.end = new Date(); - } - - data.dataPoints = data.dataPoints || {}; - - if (parseInt(Object.keys(data.dataPoints)[0]) > 100000) { - var points = {}; - Object.keys(data.dataPoints).forEach(function (timestampSec) { - var date = new Date(timestampSec * NO_OF_MILLIS); - points[getYyyyMmDd(date)] = data.dataPoints[timestampSec]; - }); - data.dataPoints = points; - } - - return data; - } - }, { - key: "calc", - value: function calc() { - var s = this.state; - s.start = clone(this.data.start); - s.end = clone(this.data.end); - s.firstWeekStart = clone(s.start); - s.noOfWeeks = getWeeksBetween(s.start, s.end); - s.distribution = calcDistribution(Object.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE); - s.domainConfigs = this.getDomains(); - } - }, { - key: "setupComponents", - value: function setupComponents() { - var _this2 = this; - - var s = this.state; - var lessCol = this.discreteDomains ? 0 : 1; - var componentConfigs = s.domainConfigs.map(function (config, i) { - return ['heatDomain', { - index: config.index, - colWidth: COL_WIDTH, - rowHeight: ROW_HEIGHT, - squareSize: HEATMAP_SQUARE_SIZE, - radius: _this2.rawChartArgs.radius || 0, - xTranslate: s.domainConfigs.filter(function (config, j) { - return j < i; - }).map(function (config) { - return config.cols.length - lessCol; - }).reduce(function (a, b) { - return a + b; - }, 0) * COL_WIDTH - }, function () { - return s.domainConfigs[i]; - }.bind(_this2)]; - }); - this.components = new Map(componentConfigs.map(function (args, i) { - var component = getComponent.apply(void 0, _toConsumableArray(args)); - return [args[0] + '-' + i, component]; - })); - var y = 0; - DAY_NAMES_SHORT.forEach(function (dayName, i) { - if ([1, 3, 5].includes(i)) { - var dayText = makeText('subdomain-name', -COL_WIDTH / 2, y, dayName, { - fontSize: HEATMAP_SQUARE_SIZE, - dy: 8, - textAnchor: 'end' - }); - - _this2.drawArea.appendChild(dayText); - } - - y += ROW_HEIGHT; - }); - } - }, { - key: "update", - value: function update(data) { - if (!data) { - console.error('No data to update.'); - } - - this.data = this.prepareData(data); - this.draw(); - this.bindTooltip(); - } - }, { - key: "bindTooltip", - value: function bindTooltip() { - var _this3 = this; - - this.container.addEventListener('mousemove', function (e) { - _this3.components.forEach(function (comp) { - var daySquares = comp.store; - var daySquare = e.target; - - if (daySquares.includes(daySquare)) { - var count = daySquare.getAttribute('data-value'); - var dateParts = daySquare.getAttribute('data-date').split('-'); - var month = getMonthName(parseInt(dateParts[1]) - 1, true); - - var gOff = _this3.container.getBoundingClientRect(), - pOff = daySquare.getBoundingClientRect(); - - var width = parseInt(e.target.getAttribute('width')); - var x = pOff.left - gOff.left + width / 2; - var y = pOff.top - gOff.top; - var value = count + ' ' + _this3.countLabel; - var name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2]; - - _this3.tip.setValues(x, y, { - name: name, - value: value, - valueFirst: 1 - }, []); - - _this3.tip.showTip(); - } - }); - }); - } - }, { - key: "renderLegend", - value: function renderLegend() { - var _this4 = this; - - this.legendArea.textContent = ''; - var x = 0; - var y = ROW_HEIGHT; - var radius = this.rawChartArgs.radius || 0; - var lessText = makeText('subdomain-name', x, y, 'Less', { - fontSize: HEATMAP_SQUARE_SIZE + 1, - dy: 9 - }); - x = COL_WIDTH * 2 + COL_WIDTH / 2; - this.legendArea.appendChild(lessText); - this.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map(function (color, i) { - var square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i, y, HEATMAP_SQUARE_SIZE, radius, color); - - _this4.legendArea.appendChild(square); - }); - var moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH / 4; - var moreText = makeText('subdomain-name', moreTextX, y, 'More', { - fontSize: HEATMAP_SQUARE_SIZE + 1, - dy: 9 - }); - this.legendArea.appendChild(moreText); - } - }, { - key: "getDomains", - value: function getDomains() { - var s = this.state; - var _ref = [s.start.getMonth(), s.start.getFullYear()], - startMonth = _ref[0], - startYear = _ref[1]; - var _ref2 = [s.end.getMonth(), s.end.getFullYear()], - endMonth = _ref2[0], - endYear = _ref2[1]; - var noOfMonths = endMonth - startMonth + 1 + (endYear - startYear) * 12; - var domainConfigs = []; - var startOfMonth = clone(s.start); - - for (var i = 0; i < noOfMonths; i++) { - var endDate = s.end; - - if (!areInSameMonth(startOfMonth, s.end)) { - var _ref3 = [startOfMonth.getMonth(), startOfMonth.getFullYear()], - month = _ref3[0], - year = _ref3[1]; - endDate = getLastDateInMonth(month, year); - } - - domainConfigs.push(this.getDomainConfig(startOfMonth, endDate)); - addDays(endDate, 1); - startOfMonth = endDate; - } - - return domainConfigs; - } - }, { - key: "getDomainConfig", - value: function getDomainConfig(startDate) { - var endDate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var _ref4 = [startDate.getMonth(), startDate.getFullYear()], - month = _ref4[0], - year = _ref4[1]; - var startOfWeek = setDayToSunday(startDate); // TODO: Monday as well - - endDate = clone(endDate) || getLastDateInMonth(month, year); - var domainConfig = { - index: month, - cols: [] - }; - addDays(endDate, 1); - var noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate); - var cols = [], - col; - - for (var i = 0; i < noOfMonthWeeks; i++) { - col = this.getCol(startOfWeek, month); - cols.push(col); - startOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd); - addDays(startOfWeek, 1); - } - - if (col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) { - addDays(startOfWeek, 1); - cols.push(this.getCol(startOfWeek, month, true)); - } - - domainConfig.cols = cols; - return domainConfig; - } - }, { - key: "getCol", - value: function getCol(startDate, month) { - var empty = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var s = this.state; // startDate is the start of week - - var currentDate = clone(startDate); - var col = []; - - for (var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) { - var config = {}; // Non-generic adjustment for entire heatmap, needs state - - var currentDateWithinData = currentDate >= s.start && currentDate <= s.end; - - if (empty || currentDate.getMonth() !== month || !currentDateWithinData) { - config.yyyyMmDd = getYyyyMmDd(currentDate); - } else { - config = this.getSubDomainConfig(currentDate); - } - - col.push(config); - } - - return col; - } - }, { - key: "getSubDomainConfig", - value: function getSubDomainConfig(date) { - var yyyyMmDd = getYyyyMmDd(date); - var dataValue = this.data.dataPoints[yyyyMmDd]; - var config = { - yyyyMmDd: yyyyMmDd, - dataValue: dataValue || 0, - fill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)] - }; - return config; - } - }]); - - return Heatmap; -}(BaseChart); - -function dataPrep(data, type) { - data.labels = data.labels || []; - var datasetLength = data.labels.length; // Datasets - - var datasets = data.datasets; - var zeroArray = new Array(datasetLength).fill(0); - - if (!datasets) { - // default - datasets = [{ - values: zeroArray - }]; - } - - datasets.map(function (d) { - // Set values - if (!d.values) { - d.values = zeroArray; - } else { - // Check for non values - var vals = d.values; - vals = vals.map(function (val) { - return !isNaN(val) ? val : 0; - }); // Trim or extend - - if (vals.length > datasetLength) { - vals = vals.slice(0, datasetLength); - } else { - vals = fillArray(vals, datasetLength - vals.length, 0); - } - } // Set labels - // - // Set type - - - if (!d.chartType) { - d.chartType = type; - } - }); // Markers - // Regions - // data.yRegions = data.yRegions || []; - - if (data.yRegions) { - data.yRegions.map(function (d) { - if (d.end < d.start) { - var _ref = [d.end, d.start]; - d.start = _ref[0]; - d.end = _ref[1]; - } - }); - } - - return data; -} -function zeroDataPrep(realData) { - var datasetLength = realData.labels.length; - var zeroArray = new Array(datasetLength).fill(0); - var zeroData = { - labels: realData.labels.slice(0, -1), - datasets: realData.datasets.map(function (d) { - return { - name: '', - values: zeroArray.slice(0, -1), - chartType: d.chartType - }; - }) - }; - - if (realData.yMarkers) { - zeroData.yMarkers = [{ - value: 0, - label: '' - }]; - } - - if (realData.yRegions) { - zeroData.yRegions = [{ - start: 0, - end: 0, - label: '' - }]; - } - - return zeroData; -} -function getShortenedLabels(chartWidth) { - var labels = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - var isSeries = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - var allowedSpace = chartWidth / labels.length; - if (allowedSpace <= 0) allowedSpace = 1; - var allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH; - var seriesMultiple; - - if (isSeries) { - // Find the maximum label length for spacing calculations - var maxLabelLength = Math.max.apply(Math, _toConsumableArray(labels.map(function (label) { - return label.length; - }))); - seriesMultiple = Math.ceil(maxLabelLength / allowedLetters); - } - - var calcLabels = labels.map(function (label, i) { - label += ""; - - if (label.length > allowedLetters) { - if (!isSeries) { - if (allowedLetters - 3 > 0) { - label = label.slice(0, allowedLetters - 3) + " ..."; - } else { - label = label.slice(0, allowedLetters) + '..'; - } - } else { - if (i % seriesMultiple !== 0) { - label = ""; - } - } - } - - return label; - }); - return calcLabels; -} - -var AxisChart = /*#__PURE__*/function (_BaseChart) { - _inherits(AxisChart, _BaseChart); - - var _super = _createSuper(AxisChart); - - function AxisChart(parent, args) { - var _this; - - _classCallCheck(this, AxisChart); - - _this = _super.call(this, parent, args); - _this.barOptions = args.barOptions || {}; - _this.lineOptions = args.lineOptions || {}; - _this.type = args.type || 'line'; - _this.init = 1; - - _this.setup(); - - return _this; - } - - _createClass(AxisChart, [{ - key: "setMeasures", - value: function setMeasures() { - if (this.data.datasets.length <= 1) { - this.config.showLegend = 0; - this.measures.paddings.bottom = 30; - } - } - }, { - key: "configure", - value: function configure(options) { - _get(_getPrototypeOf(AxisChart.prototype), "configure", this).call(this, options); - - options.axisOptions = options.axisOptions || {}; - options.tooltipOptions = options.tooltipOptions || {}; - this.config.xAxisMode = options.axisOptions.xAxisMode || 'span'; - this.config.yAxisMode = options.axisOptions.yAxisMode || 'span'; - this.config.xIsSeries = options.axisOptions.xIsSeries || 0; - this.config.shortenYAxisNumbers = options.axisOptions.shortenYAxisNumbers || 0; - this.config.formatTooltipX = options.tooltipOptions.formatTooltipX; - this.config.formatTooltipY = options.tooltipOptions.formatTooltipY; - this.config.valuesOverPoints = options.valuesOverPoints; - } - }, { - key: "prepareData", - value: function prepareData() { - var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; - return dataPrep(data, this.type); - } - }, { - key: "prepareFirstData", - value: function prepareFirstData() { - var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; - return zeroDataPrep(data); - } - }, { - key: "calc", - value: function calc() { - var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - this.calcXPositions(); - - if (!onlyWidthChange) { - this.calcYAxisParameters(this.getAllYValues(), this.type === 'line'); - } - - this.makeDataByIndex(); - } - }, { - key: "calcXPositions", - value: function calcXPositions() { - var s = this.state; - var labels = this.data.labels; - s.datasetLength = labels.length; - s.unitWidth = this.width / s.datasetLength; // Default, as per bar, and mixed. Only line will be a special case - - s.xOffset = s.unitWidth / 2; // // For a pure Line Chart - // s.unitWidth = this.width/(s.datasetLength - 1); - // s.xOffset = 0; - - s.xAxis = { - labels: labels, - positions: labels.map(function (d, i) { - return floatTwo(s.xOffset + i * s.unitWidth); - }) - }; - } - }, { - key: "calcYAxisParameters", - value: function calcYAxisParameters(dataValues) { - var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'false'; - var yPts = calcChartIntervals(dataValues, withMinimum); - var scaleMultiplier = this.height / getValueRange(yPts); - var intervalHeight = getIntervalSize(yPts) * scaleMultiplier; - var zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; - this.state.yAxis = { - labels: yPts, - positions: yPts.map(function (d) { - return zeroLine - d * scaleMultiplier; - }), - scaleMultiplier: scaleMultiplier, - zeroLine: zeroLine - }; // Dependent if above changes - - this.calcDatasetPoints(); - this.calcYExtremes(); - this.calcYRegions(); - } - }, { - key: "calcDatasetPoints", - value: function calcDatasetPoints() { - var s = this.state; - - var scaleAll = function scaleAll(values) { - return values.map(function (val) { - return scale(val, s.yAxis); - }); - }; - - s.datasets = this.data.datasets.map(function (d, i) { - var values = d.values; - var cumulativeYs = d.cumulativeYs || []; - return { - name: d.name, - index: i, - chartType: d.chartType, - values: values, - yPositions: scaleAll(values), - cumulativeYs: cumulativeYs, - cumulativeYPos: scaleAll(cumulativeYs) - }; - }); - } - }, { - key: "calcYExtremes", - value: function calcYExtremes() { - var s = this.state; - - if (this.barOptions.stacked) { - s.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos; - return; - } - - s.yExtremes = new Array(s.datasetLength).fill(9999); - s.datasets.map(function (d) { - d.yPositions.map(function (pos, j) { - if (pos < s.yExtremes[j]) { - s.yExtremes[j] = pos; - } - }); - }); - } - }, { - key: "calcYRegions", - value: function calcYRegions() { - var s = this.state; - - if (this.data.yMarkers) { - this.state.yMarkers = this.data.yMarkers.map(function (d) { - d.position = scale(d.value, s.yAxis); - if (!d.options) d.options = {}; // if(!d.label.includes(':')) { - // d.label += ': ' + d.value; - // } - - return d; - }); - } - - if (this.data.yRegions) { - this.state.yRegions = this.data.yRegions.map(function (d) { - d.startPos = scale(d.start, s.yAxis); - d.endPos = scale(d.end, s.yAxis); - if (!d.options) d.options = {}; - return d; - }); - } - } - }, { - key: "getAllYValues", - value: function getAllYValues() { - var _this2 = this, - _ref; - - var key = 'values'; - - if (this.barOptions.stacked) { - key = 'cumulativeYs'; - var cumulative = new Array(this.state.datasetLength).fill(0); - this.data.datasets.map(function (d, i) { - var values = _this2.data.datasets[i].values; - d[key] = cumulative = cumulative.map(function (c, i) { - return c + values[i]; - }); - }); - } - - var allValueLists = this.data.datasets.map(function (d) { - return d[key]; - }); - - if (this.data.yMarkers) { - allValueLists.push(this.data.yMarkers.map(function (d) { - return d.value; - })); - } - - if (this.data.yRegions) { - this.data.yRegions.map(function (d) { - allValueLists.push([d.end, d.start]); - }); - } - - return (_ref = []).concat.apply(_ref, _toConsumableArray(allValueLists)); - } - }, { - key: "setupComponents", - value: function setupComponents() { - var _this3 = this; - - var componentConfigs = [['yAxis', { - mode: this.config.yAxisMode, - width: this.width, - shortenNumbers: this.config.shortenYAxisNumbers // pos: 'right' - - }, function () { - return this.state.yAxis; - }.bind(this)], ['xAxis', { - mode: this.config.xAxisMode, - height: this.height // pos: 'right' - - }, function () { - var s = this.state; - s.xAxis.calcLabels = getShortenedLabels(this.width, s.xAxis.labels, this.config.xIsSeries); - return s.xAxis; - }.bind(this)], ['yRegions', { - width: this.width, - pos: 'right' - }, function () { - return this.state.yRegions; - }.bind(this)]]; - var barDatasets = this.state.datasets.filter(function (d) { - return d.chartType === 'bar'; - }); - var lineDatasets = this.state.datasets.filter(function (d) { - return d.chartType === 'line'; - }); - var barsConfigs = barDatasets.map(function (d) { - var index = d.index; - return ['barGraph' + '-' + d.index, { - index: index, - color: _this3.colors[index], - stacked: _this3.barOptions.stacked, - // same for all datasets - valuesOverPoints: _this3.config.valuesOverPoints, - minHeight: _this3.height * MIN_BAR_PERCENT_HEIGHT - }, function () { - var s = this.state; - var d = s.datasets[index]; - var stacked = this.barOptions.stacked; - var spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO; - var barsWidth = s.unitWidth * (1 - spaceRatio); - var barWidth = barsWidth / (stacked ? 1 : barDatasets.length); - var xPositions = s.xAxis.positions.map(function (x) { - return x - barsWidth / 2; - }); - - if (!stacked) { - xPositions = xPositions.map(function (p) { - return p + barWidth * index; - }); - } - - var labels = new Array(s.datasetLength).fill(''); - - if (this.config.valuesOverPoints) { - if (stacked && d.index === s.datasets.length - 1) { - labels = d.cumulativeYs; - } else { - labels = d.values; - } - } - - var offsets = new Array(s.datasetLength).fill(0); - - if (stacked) { - offsets = d.yPositions.map(function (y, j) { - return y - d.cumulativeYPos[j]; - }); - } - - return { - xPositions: xPositions, - yPositions: d.yPositions, - offsets: offsets, - // values: d.values, - labels: labels, - zeroLine: s.yAxis.zeroLine, - barsWidth: barsWidth, - barWidth: barWidth - }; - }.bind(_this3)]; - }); - var lineConfigs = lineDatasets.map(function (d) { - var index = d.index; - return ['lineGraph' + '-' + d.index, { - index: index, - color: _this3.colors[index], - svgDefs: _this3.svgDefs, - heatline: _this3.lineOptions.heatline, - regionFill: _this3.lineOptions.regionFill, - spline: _this3.lineOptions.spline, - hideDots: _this3.lineOptions.hideDots, - hideLine: _this3.lineOptions.hideLine, - // same for all datasets - valuesOverPoints: _this3.config.valuesOverPoints - }, function () { - var s = this.state; - var d = s.datasets[index]; - var minLine = s.yAxis.positions[0] < s.yAxis.zeroLine ? s.yAxis.positions[0] : s.yAxis.zeroLine; - return { - xPositions: s.xAxis.positions, - yPositions: d.yPositions, - values: d.values, - zeroLine: minLine, - radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE - }; - }.bind(_this3)]; - }); - var markerConfigs = [['yMarkers', { - width: this.width, - pos: 'right' - }, function () { - return this.state.yMarkers; - }.bind(this)]]; - componentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs); - var optionals = ['yMarkers', 'yRegions']; - this.dataUnitComponents = []; - this.components = new Map(componentConfigs.filter(function (args) { - return !optionals.includes(args[0]) || _this3.state[args[0]]; - }).map(function (args) { - var component = getComponent.apply(void 0, _toConsumableArray(args)); - - if (args[0].includes('lineGraph') || args[0].includes('barGraph')) { - _this3.dataUnitComponents.push(component); - } - - return [args[0], component]; - })); - } - }, { - key: "makeDataByIndex", - value: function makeDataByIndex() { - var _this4 = this; - - this.dataByIndex = {}; - var s = this.state; - var formatX = this.config.formatTooltipX; - var formatY = this.config.formatTooltipY; - var titles = s.xAxis.labels; - titles.map(function (label, index) { - var values = _this4.state.datasets.map(function (set, i) { - var value = set.values[index]; - return { - title: set.name, - value: value, - yPos: set.yPositions[index], - color: _this4.colors[i], - formatted: formatY ? formatY(value) : value - }; - }); - - _this4.dataByIndex[index] = { - label: label, - formattedLabel: formatX ? formatX(label) : label, - xPos: s.xAxis.positions[index], - values: values, - yExtreme: s.yExtremes[index] - }; - }); - } - }, { - key: "bindTooltip", - value: function bindTooltip() { - var _this5 = this; - - // NOTE: could be in tooltip itself, as it is a given functionality for its parent - this.container.addEventListener('mousemove', function (e) { - var m = _this5.measures; - var o = getOffset(_this5.container); - var relX = e.pageX - o.left - getLeftOffset(m); - var relY = e.pageY - o.top; - - if (relY < _this5.height + getTopOffset(m) && relY > getTopOffset(m)) { - _this5.mapTooltipXPosition(relX); - } else { - _this5.tip.hideTip(); - } - }); - } - }, { - key: "mapTooltipXPosition", - value: function mapTooltipXPosition(relX) { - var s = this.state; - if (!s.yExtremes) return; - var index = getClosestInArray(relX, s.xAxis.positions, true); - - if (index >= 0) { - var dbi = this.dataByIndex[index]; - this.tip.setValues(dbi.xPos + this.tip.offset.x, dbi.yExtreme + this.tip.offset.y, { - name: dbi.formattedLabel, - value: '' - }, dbi.values, index); - this.tip.showTip(); - } - } - }, { - key: "renderLegend", - value: function renderLegend() { - var _this6 = this; - - var s = this.data; - - if (s.datasets.length > 1) { - this.legendArea.textContent = ''; - s.datasets.map(function (d, i) { - var barWidth = AXIS_LEGEND_BAR_SIZE; // let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right; - // let multiplier = s.datasets.length - i; - - var rect = legendBar( // rightEndPoint - multiplier * barWidth, // To right align - barWidth * i, '0', barWidth, _this6.colors[i], d.name, _this6.config.truncateLegends); - - _this6.legendArea.appendChild(rect); - }); - } - } // Overlay - - }, { - key: "makeOverlay", - value: function makeOverlay$1() { - var _this7 = this; - - if (this.init) { - this.init = 0; - return; - } - - if (this.overlayGuides) { - this.overlayGuides.forEach(function (g) { - var o = g.overlay; - o.parentNode.removeChild(o); - }); - } - - this.overlayGuides = this.dataUnitComponents.map(function (c) { - return { - type: c.unitType, - overlay: undefined, - units: c.units - }; - }); - - if (this.state.currentIndex === undefined) { - this.state.currentIndex = this.state.datasetLength - 1; - } // Render overlays - - - this.overlayGuides.map(function (d) { - var currentUnit = d.units[_this7.state.currentIndex]; - d.overlay = makeOverlay[d.type](currentUnit); - - _this7.drawArea.appendChild(d.overlay); - }); - } - }, { - key: "updateOverlayGuides", - value: function updateOverlayGuides() { - if (this.overlayGuides) { - this.overlayGuides.forEach(function (g) { - var o = g.overlay; - o.parentNode.removeChild(o); - }); - } - } - }, { - key: "bindOverlay", - value: function bindOverlay() { - var _this8 = this; - - this.parent.addEventListener('data-select', function () { - _this8.updateOverlay(); - }); - } - }, { - key: "bindUnits", - value: function bindUnits() { - var _this9 = this; - - this.dataUnitComponents.map(function (c) { - c.units.map(function (unit) { - unit.addEventListener('click', function () { - var index = unit.getAttribute('data-point-index'); - - _this9.setCurrentDataPoint(index); - }); - }); - }); // Note: Doesn't work as tooltip is absolutely positioned - - this.tip.container.addEventListener('click', function () { - var index = _this9.tip.container.getAttribute('data-point-index'); - - _this9.setCurrentDataPoint(index); - }); - } - }, { - key: "updateOverlay", - value: function updateOverlay$1() { - var _this10 = this; - - this.overlayGuides.map(function (d) { - var currentUnit = d.units[_this10.state.currentIndex]; - - updateOverlay[d.type](currentUnit, d.overlay); - }); - } - }, { - key: "onLeftArrow", - value: function onLeftArrow() { - this.setCurrentDataPoint(this.state.currentIndex - 1); - } - }, { - key: "onRightArrow", - value: function onRightArrow() { - this.setCurrentDataPoint(this.state.currentIndex + 1); - } - }, { - key: "getDataPoint", - value: function getDataPoint() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentIndex; - var s = this.state; - var data_point = { - index: index, - label: s.xAxis.labels[index], - values: s.datasets.map(function (d) { - return d.values[index]; - }) - }; - return data_point; - } - }, { - key: "setCurrentDataPoint", - value: function setCurrentDataPoint(index) { - var s = this.state; - index = parseInt(index); - if (index < 0) index = 0; - if (index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1; - if (index === s.currentIndex) return; - s.currentIndex = index; - fire(this.parent, "data-select", this.getDataPoint()); - } // API - - }, { - key: "addDataPoint", - value: function addDataPoint(label, datasetValues) { - var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.state.datasetLength; - - _get(_getPrototypeOf(AxisChart.prototype), "addDataPoint", this).call(this, label, datasetValues, index); - - this.data.labels.splice(index, 0, label); - this.data.datasets.map(function (d, i) { - d.values.splice(index, 0, datasetValues[i]); - }); - this.update(this.data); - } - }, { - key: "removeDataPoint", - value: function removeDataPoint() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.datasetLength - 1; - - if (this.data.labels.length <= 1) { - return; - } - - _get(_getPrototypeOf(AxisChart.prototype), "removeDataPoint", this).call(this, index); - - this.data.labels.splice(index, 1); - this.data.datasets.map(function (d) { - d.values.splice(index, 1); - }); - this.update(this.data); - } - }, { - key: "updateDataset", - value: function updateDataset(datasetValues) { - var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - this.data.datasets[index].values = datasetValues; - this.update(this.data); - } // addDataset(dataset, index) {} - // removeDataset(index = 0) {} - - }, { - key: "updateDatasets", - value: function updateDatasets(datasets) { - this.data.datasets.map(function (d, i) { - if (datasets[i]) { - d.values = datasets[i]; - } - }); - this.update(this.data); - } // updateDataPoint(dataPoint, index = 0) {} - // addDataPoint(dataPoint, index = 0) {} - // removeDataPoint(index = 0) {} - - }]); - - return AxisChart; -}(BaseChart); - -var DonutChart = /*#__PURE__*/function (_AggregationChart) { - _inherits(DonutChart, _AggregationChart); - - var _super = _createSuper(DonutChart); - - function DonutChart(parent, args) { - var _this; - - _classCallCheck(this, DonutChart); - - _this = _super.call(this, parent, args); - _this.type = 'donut'; - _this.initTimeout = 0; - _this.init = 1; - - _this.setup(); - - return _this; - } - - _createClass(DonutChart, [{ - key: "configure", - value: function configure(args) { - _get(_getPrototypeOf(DonutChart.prototype), "configure", this).call(this, args); - - this.mouseMove = this.mouseMove.bind(this); - this.mouseLeave = this.mouseLeave.bind(this); - this.hoverRadio = args.hoverRadio || 0.1; - this.config.startAngle = args.startAngle || 0; - this.clockWise = args.clockWise || false; - this.strokeWidth = args.strokeWidth || 30; - } - }, { - key: "calc", - value: function calc() { - var _this2 = this; - - _get(_getPrototypeOf(DonutChart.prototype), "calc", this).call(this); - - var s = this.state; - this.radius = this.height > this.width ? this.center.x - this.strokeWidth / 2 : this.center.y - this.strokeWidth / 2; - var radius = this.radius, - clockWise = this.clockWise; - var prevSlicesProperties = s.slicesProperties || []; - s.sliceStrings = []; - s.slicesProperties = []; - var curAngle = 180 - this.config.startAngle; - s.sliceTotals.map(function (total, i) { - var startAngle = curAngle; - var originDiffAngle = total / s.grandTotal * FULL_ANGLE; - var largeArc = originDiffAngle > 180 ? 1 : 0; - var diffAngle = clockWise ? -originDiffAngle : originDiffAngle; - var endAngle = curAngle = curAngle + diffAngle; - var startPosition = getPositionByAngle(startAngle, radius); - var endPosition = getPositionByAngle(endAngle, radius); - var prevProperty = _this2.init && prevSlicesProperties[i]; - var curStart, curEnd; - - if (_this2.init) { - curStart = prevProperty ? prevProperty.startPosition : startPosition; - curEnd = prevProperty ? prevProperty.endPosition : startPosition; - } else { - curStart = startPosition; - curEnd = endPosition; - } - - var curPath = originDiffAngle === 360 ? makeStrokeCircleStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise, largeArc) : makeArcStrokePathStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise, largeArc); - s.sliceStrings.push(curPath); - s.slicesProperties.push({ - startPosition: startPosition, - endPosition: endPosition, - value: total, - total: s.grandTotal, - startAngle: startAngle, - endAngle: endAngle, - angle: diffAngle - }); - }); - this.init = 0; - } - }, { - key: "setupComponents", - value: function setupComponents() { - var s = this.state; - var componentConfigs = [['donutSlices', {}, function () { - return { - sliceStrings: s.sliceStrings, - colors: this.colors, - strokeWidth: this.strokeWidth - }; - }.bind(this)]]; - this.components = new Map(componentConfigs.map(function (args) { - var component = getComponent.apply(void 0, _toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: "calTranslateByAngle", - value: function calTranslateByAngle(property) { - var radius = this.radius, - hoverRadio = this.hoverRadio; - var position = getPositionByAngle(property.startAngle + property.angle / 2, radius); - return "translate3d(".concat(position.x * hoverRadio, "px,").concat(position.y * hoverRadio, "px,0)"); - } - }, { - key: "hoverSlice", - value: function hoverSlice(path, i, flag, e) { - if (!path) return; - var color = this.colors[i]; - - if (flag) { - transform(path, this.calTranslateByAngle(this.state.slicesProperties[i])); - path.style.stroke = lightenDarkenColor(color, 50); - var g_off = getOffset(this.svg); - var x = e.pageX - g_off.left + 10; - var y = e.pageY - g_off.top - 10; - var title = (this.formatted_labels && this.formatted_labels.length > 0 ? this.formatted_labels[i] : this.state.labels[i]) + ': '; - var percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1); - this.tip.setValues(x, y, { - name: title, - value: percent + "%" - }); - this.tip.showTip(); - } else { - transform(path, 'translate3d(0,0,0)'); - this.tip.hideTip(); - path.style.stroke = color; - } - } - }, { - key: "bindTooltip", - value: function bindTooltip() { - this.container.addEventListener('mousemove', this.mouseMove); - this.container.addEventListener('mouseleave', this.mouseLeave); - } - }, { - key: "mouseMove", - value: function mouseMove(e) { - var target = e.target; - var slices = this.components.get('donutSlices').store; - var prevIndex = this.curActiveSliceIndex; - var prevAcitve = this.curActiveSlice; - - if (slices.includes(target)) { - var i = slices.indexOf(target); - this.hoverSlice(prevAcitve, prevIndex, false); - this.curActiveSlice = target; - this.curActiveSliceIndex = i; - this.hoverSlice(target, i, true, e); - } else { - this.mouseLeave(); - } - } - }, { - key: "mouseLeave", - value: function mouseLeave() { - this.hoverSlice(this.curActiveSlice, this.curActiveSliceIndex, false); - } - }]); - - return DonutChart; -}(AggregationChart); - -var chartTypes = { - bar: AxisChart, - line: AxisChart, - // multiaxis: MultiAxisChart, - percentage: PercentageChart, - heatmap: Heatmap, - pie: PieChart, - donut: DonutChart -}; - -function getChartByType() { - var chartType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'line'; - var parent = arguments.length > 1 ? arguments[1] : undefined; - var options = arguments.length > 2 ? arguments[2] : undefined; - - if (chartType === 'axis-mixed') { - options.type = 'line'; - return new AxisChart(parent, options); - } - - if (!chartTypes[chartType]) { - console.error("Undefined chart type: " + chartType); - return; - } - - return new chartTypes[chartType](parent, options); -} - -var Chart = function Chart(parent, options) { - _classCallCheck(this, Chart); - - return getChartByType(options.type, parent, options); -}; - -export { AxisChart, Chart, Heatmap, PercentageChart, PieChart }; diff --git a/dist/frappe-charts.esm.js.map b/dist/frappe-charts.esm.js.map deleted file mode 100644 index 87e96f4..0000000 --- a/dist/frappe-charts.esm.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"frappe-charts.esm.js","sources":["../src/js/utils/dom.js","../node_modules/style-inject/dist/style-inject.es.js","../src/js/utils/constants.js","../src/js/objects/SvgTip.js","../src/js/utils/helpers.js","../src/js/utils/draw-utils.js","../src/js/utils/draw.js","../src/js/utils/colors.js","../src/js/utils/animate.js","../src/js/utils/animation.js","../src/js/charts/BaseChart.js","../src/js/utils/export.js","../src/css/chartsCss.js","../src/js/charts/AggregationChart.js","../src/js/utils/date-utils.js","../src/js/objects/ChartComponents.js","../src/js/charts/PercentageChart.js","../src/js/charts/PieChart.js","../src/js/utils/intervals.js","../src/js/charts/Heatmap.js","../src/js/utils/axis-chart-utils.js","../src/js/charts/AxisChart.js","../src/js/chart.js","../src/js/charts/DonutChart.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\nexport const SERIES_LABEL_SPACE_RATIO = 0.6;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 16;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 7.48;\nconst DEFAULT_CHART_COLORS = ['pink', 'blue', 'green', 'grey', 'red', 'yellow', 'purple', 'teal', 'cyan', 'orange'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
        \n\t\t\t\t
        `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.list = this.container.querySelector('.data-point-list');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\n\t\tif (this.listValues.length > 4) {\n\t\t\tthis.list.classList.add('tooltip-grid');\n\t\t} else {\n\t\t\tthis.list.classList.remove('tooltip-grid');\n\t\t}\n\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\t\t\tlet li = $.create('li', {\n\t\t\t\tinnerHTML: `
        \n\t\t\t\t\t
        \n\t\t\t\t\t\t
        ${ value === 0 || value ? value : '' }
        \n\t\t\t\t\t\t
        ${set.title ? set.title : '' }
        \n\t\t\t\t\t
        `\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR } from './constants';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#E2E6E9';\nconst FONT_FILL = '#313B44';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif (lighter) {\n\t\topacities = [0.4, 0.05, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function rightRoundedBar(x, width, height) {\n\t// https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90\n\tlet radius = height/2;\n\tlet xOffset = width - radius;\n\n\treturn `M${x},0 h${xOffset} q${radius},0 ${radius},${radius} q0,${radius} -${radius},${radius} h-${xOffset} v${height}z`;\n}\n\nexport function leftRoundedBar(x, width, height) {\n\tlet radius = height/2;\n\tlet xOffset = width - radius;\n\n\treturn `M${x + radius},0 h${xOffset} v${height} h-${xOffset} q-${radius}, 0 -${radius},-${radius} q0,-${radius} ${radius},-${radius}z`;\n}\n\nexport function percentageBar(x, y, width, height, isFirst, isLast, fill='none') {\n\tif (isLast) {\n\t\tlet pathStr = rightRoundedBar(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\n\tif (isFirst) {\n\t\tlet pathStr = leftRoundedBar(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, radius, fill='none', label, value, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tx: 0,\n\t\ty: 4 - size,\n\t\theight: size,\n\t\twidth: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tlet textLabel = createSVG('text', {\n\t\tclassName: 'legend-dataset-label',\n\t\tx: size,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.6) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet textValue = createSVG('text', {\n\t\tclassName: 'legend-dataset-value',\n\t\tx: size,\n\t\ty: FONT_SIZE + 10,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: value\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(textLabel);\n\tgroup.appendChild(textValue);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\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.lineType) options.lineType = '';\n\tif (options.shortenNumbers) label = shortenLargeNumber(label);\n\n\tlet className = 'line-horizontal ' + options.className +\n\t\t(options.lineType === \"dashed\" ? \"dashed\": \"\");\n\n\tlet l = createSVG('line', {\n\t\tclassName: className,\n\t\tx1: x1,\n\t\tx2: x2,\n\t\ty1: 0,\n\t\ty2: 0,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / 2 - 2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': x1 < x2 ? 'end' : 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(0, ${y})`,\n\t\t'stroke-opacity': 1\n\t});\n\n\tif(text === 0 || text === '0') {\n\t\tline.style.stroke = \"rgba(27, 31, 35, 0.6)\";\n\t}\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nexport function yLine(y, label, width, options={}) {\n\tif (!isValidNumber(y)) y = 0;\n\n\tif(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tclassName: options.className,\n\t\tlineType: options.lineType,\n\t\tshortenNumbers: options.shortenNumbers\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.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\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\t// x y h w\n\n\t// M{x},{y+r}\n\t// q0,-{r} {r},-{r}\n\t// q{r},0 {r},{r}\n\t// v{h-r}\n\t// h-{w}z\n\n\t// let radius = width/2;\n\t// let pathStr = `M${x},${y+radius} q0,-${radius} ${radius},-${radius} q${radius},0 ${radius},${radius} v${height-radius} h-${width}z`\n\n\t// let rect = createSVG('path', {\n\t// \tclassName: 'bar mini',\n\t// \td: pathStr,\n\t// \tstyles: { fill: color },\n\t// \tx: x,\n\t// \ty: y,\n\t// \t'data-point-index': index,\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\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","const PRESET_COLOR_MAP = {\n\t'pink': '#F683AE',\n\t'blue': '#318AD8',\n\t'green': '#48BB74',\n\t'grey': '#A6B1B9',\n\t'red': '#F56B6B',\n\t'yellow': '#FACF7A',\n\t'purple': '#44427B',\n\t'teal': '#5FD8C4',\n\t'cyan': '#15CCEF',\n\t'orange': '#F8814F',\n\t'light-pink': '#FED7E5',\n\t'light-blue': '#BFDDF7',\n\t'light-green': '#48BB74',\n\t'light-grey': '#F4F5F6',\n\t'light-red': '#F6DFDF',\n\t'light-yellow': '#FEE9BF',\n\t'light-purple': '#E8E8F7',\n\t'light-teal': '#D3FDF6',\n\t'light-cyan': '#DDF8FD',\n\t'light-orange': '#FECDB8'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(d[0]);\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 120;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 60;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t12,\n\t\t\t\t3,\n\t\t\t\tthis.colors[i],\n\t\t\t\tlabel,\n\t\t\t\td,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { makeText, makePath, xLine, yLine, yMarker, yRegion, datasetBar, datasetDot, percentageBar, getPaths, heatSquare } from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport { translateHoriLine, translateVertLine, animateRegion, animateBar,\n\tanimateDot, animatePath, animatePathStr } from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n\tconstructor({\n\t\tlayerClass = '',\n\t\tlayerTransform = '',\n\t\tconstants,\n\n\t\tgetData,\n\t\tmakeElements,\n\t\tanimateElements\n\t}) {\n\t\tthis.layerTransform = layerTransform;\n\t\tthis.constants = constants;\n\n\t\tthis.makeElements = makeElements;\n\t\tthis.getData = getData;\n\n\t\tthis.animateElements = animateElements;\n\n\t\tthis.store = [];\n\t\tthis.labels = [];\n\n\t\tthis.layerClass = layerClass;\n\t\tthis.layerClass = typeof(this.layerClass) === 'function'\n\t\t\t? this.layerClass() : this.layerClass;\n\n\t\tthis.refresh();\n\t}\n\n\trefresh(data) {\n\t\tthis.data = data || this.getData();\n\t}\n\n\tsetup(parent) {\n\t\tthis.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n\t}\n\n\tmake() {\n\t\tthis.render(this.data);\n\t\tthis.oldData = this.data;\n\t}\n\n\trender(data) {\n\t\tthis.store = this.makeElements(data);\n\n\t\tthis.layer.textContent = '';\n\t\tthis.store.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t\tthis.labels.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t}\n\n\tupdate(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\tconst numberOfPoints = data.xPositions.length;\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\n\t\t\t\tlet isLast = i == numberOfPoints - 1;\n\t\t\t\tlet isFirst = i == 0;\n\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i], this.constants.barHeight, isFirst, isLast, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos, shortenNumbers: this.constants.shortenNumbers})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tlabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(c.showDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, getExtraHeight } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\n\t\tm.paddings.right = 30;\n\t\tm.paddings.top = 60;\n\t\tm.paddings.bottom = 0;\n\n\t\tm.legendHeight = 80;\n\t\tm.baseHeight = (b.height) * 8 + getExtraHeight(m);\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif (bars.includes(bar)) {\n\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 width = bar.getAttribute('width') || bar.getBoundingClientRect().width;\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(width)/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => value * Math.pow(10, exponent));\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH,\n\tSERIES_LABEL_SPACE_RATIO } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t}\n\n\t\t// Set labels\n\t\t//\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n\tlet zeroData = {\n\t\tlabels: realData.labels.slice(0, -1),\n\t\tdatasets: realData.datasets.map(d => {\n\t\t\treturn {\n\t\t\t\tname: '',\n\t\t\t\tvalues: zeroArray.slice(0, -1),\n\t\t\t\tchartType: d.chartType\n\t\t\t};\n\t\t}),\n\t};\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = (chartWidth / labels.length) * SERIES_LABEL_SPACE_RATIO;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0 && i !== (labels.length - 1)) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\t\tthis.config.shortenYAxisNumbers = options.axisOptions.shortenYAxisNumbers || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tshortenNumbers: this.config.shortenYAxisNumbers\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth * (1 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: s.yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\tspline: this.lineOptions.spline,\n\t\t\t\t\tshowDots: this.lineOptions.showDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n"],"names":["$","expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","css","ref","insertAt","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","create","tag","o","i","val","parentNode","_typeof","Object","keys","map","prop","setAttribute","BASE_MEASURES","margins","paddings","baseHeight","titleHeight","legendHeight","titleFontSize","getTopOffset","m","getLeftOffset","getExtraHeight","getExtraWidth","DEFAULT_CHART_COLORS","DEFAULT_COLORS","bar","line","pie","percentage","heatmap","donut","ANGLE_RATIO","Math","PI","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","inside","this","className","innerHTML","hideTip","title","list","dataPointList","addEventListener","_this","index","length","classList","add","remove","set","color","_this2","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","parseFloat","toFixed","fillArray","array","count","start","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","round","getSplineCurvePointsStr","xList","yList","points","push","controlPoint","current","previous","next","reverse","pointA","pointB","lengthX","lengthY","sqrt","atan2","command","reduce","acc","point","a","pointStr","cps","cpe","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","id","x1","x2","y1","y2","setGradientStop","gradElem","offset","makeSVGGroup","transform","args","makePath","pathStr","stroke","strokeWidth","styles","makeGradient","lighter","gradientDef","opacities","rightRoundedBar","xOffset","leftRoundedBar","heatSquare","size","data","rx","key","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","text","FONT_SIZE","makeHoriLine","lineType","shortenNumbers","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","parseInt","updateOverlay","attributes","values","filter","attr","includes","specified","nodeValue","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","b","toString","translate","oldCoord","newCoord","duration","old","join","translateHoriLine","yLine","newY","oldY","animatePathStr","oldPath","EASING","ease","linear","easein","easeout","easeinout","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","from","to","begin","keySplines","keyTimes","calcMode","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","svgContainer","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","setTimeout","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","showTooltip","showLegend","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","argHeight","state","initTimeout","overlays","configure","validColors","forEach","test","isValidColor","console","warn","boundDrawFn","draw","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","drawArea","render","update","renderLegend","setupNavigation","padding","baseWidth","getComputedStyle","paddingLeft","paddingRight","svg","svgDefs","titleEL","legendArea","updateTipOffset","Map","error","make","_this3","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","clone","styleEl","prepareForExport","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","downloadFile","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","center","textContent","legendTotals","barWidth","divisor","dot","truncate","textLabel","dx","textValue","group","legendDot","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","SEC_IN_DAY","getDaysBetween","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","donutSlices","sliceStrings","transition","newData","pieSlices","percentageBars","numberOfPoints","xPositions","isLast","isFirst","percentageBar","widths","barHeight","yAxis","positions","position","pos","mode","newPos","newLabels","oldPos","oldLabels","xAxis","xLine","calcLabels","newX","oldX","translateVertLine","yMarkers","labelPos","labelSvg","yMarker","_this5","newOptions","yRegions","region","yRegion","startPos","endPos","_this6","newStarts","oldStarts","rectGroup","newY1","newY2","oldY2","newHeight","animateRegion","heatDomain","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","_this7","toUpperCase","yyyyMmDd","dataValue","square","barGraph","unitType","units","yPositions","j","meta","minHeight","datasetBar","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","rectAnim","oldCoordStr","split","groupAnim","animateBar","lineGraph","paths","hideLine","pointsList","pointsStr","spline","path","heatline","gradient_id","regionFill","gradient_id_region","getPaths","showDots","cx","cy","datasetDot","valuesOverPoints","newValues","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePath","animateDot","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","target","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","clockWise","prevSlicesProperties","slicesProperties","curAngle","curStart","curEnd","originDiffAngle","largeArc","diffAngle","endAngle","startPosition","endPosition","prevProperty","curPath","arcStartX","arcStartY","arcEndX","midArc","arcEndY","makeCircleStr","makeArcPathStr","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","scaleMultiplier","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","spacing","HEATMAP_SQUARE_SIZE","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","distribution","distributionSize","dataMaxValue","distributionStep","checkpoint","calcDistribution","domainConfigs","getDomains","lessCol","dayName","dayText","comp","daySquares","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","NO_OF_DAYS_IN_WEEK","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","zeroDataPrep","zeroData","AxisChart","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","shortenYAxisNumbers","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","cumulativeYPos","stacked","yExtremes","cumulative","allValueLists","chartWidth","isSeries","allowedSpace","seriesMultiple","allowedLetters","maxLabelLength","getShortenedLabels","barDatasets","lineDatasets","barsConfigs","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","yPos","formattedLabel","yExtreme","relX","relY","mapTooltipXPosition","goal","arr","closest","prev","curr","getClosestInArray","dbi","legendBar","overlayGuides","g","currentIndex","currentUnit","_this8","_this9","setCurrentDataPoint","_this10","data_point","properties","evt","createEvent","initEvent","dispatchEvent","fire","getDataPoint","datasetValues","splice","chartTypes","makeStrokeCircleStr","makeArcStrokePathStr","Chart","getChartByType"],"mappings":"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"} \ No newline at end of file diff --git a/dist/frappe-charts.min.css b/dist/frappe-charts.min.css deleted file mode 100644 index eca4085..0000000 --- a/dist/frappe-charts.min.css +++ /dev/null @@ -1,116 +0,0 @@ -:root { - --fr-label-color: #313b44; - --fr-axis-line-color: #F4F5F6; - --fr-stroke-width: 2px; - --fr-dataset-circle-stroke: #FFFFFF; - --fr-dataset-circle-stroke-width: var(--fr-stroke-width); - --fr-tooltip-title: var(--fr-label-color); - --fr-tooltip-label: var(--fr-label-color); - --fr-tooltip-value: #192734; - --fr-tooltip-bg: #FFFFFF; } - -.chart-container { - position: relative; - /* for absolutely positioned tooltip */ - 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: var(--fr-label-color); } - .chart-container .axis line, .chart-container .chart-label line { - stroke: var(--fr-axis-line-color); } - .chart-container .dataset-units circle { - stroke: var(--fr-dataset-circle-stroke); - stroke-width: var(--fr-dataset-circle-stroke-width); } - .chart-container .dataset-units path { - fill: none; - stroke-opacity: 1; - stroke-width: var(--fr-stroke-width); } - .chart-container .dataset-path { - stroke-width: var(--fr-stroke-width); } - .chart-container .path-group path { - fill: none; - stroke-opacity: 1; - stroke-width: var(--fr-stroke-width); } - .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-label { - fill: var(--fr-tooltip-label); - font-weight: 600; } - .chart-container .legend-dataset-value { - fill: var(--fr-tooltip-value); } - -.graph-svg-tip { - position: absolute; - z-index: 99999; - padding: 10px; - font-size: 12px; - text-align: center; - background: var(--fr-tooltip-bg); - box-shadow: 0px 1px 4px rgba(17, 43, 66, 0.1), 0px 2px 6px rgba(17, 43, 66, 0.08), 0px 40px 30px -30px rgba(17, 43, 66, 0.1); - border-radius: 6px; } - .graph-svg-tip ul { - 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; - font-weight: 600; } - .graph-svg-tip .svg-pointer { - position: absolute; - height: 12px; - width: 12px; - border-radius: 2px; - background: var(--fr-tooltip-bg); - transform: rotate(45deg); - margin-top: -7px; - margin-left: -6px; } - .graph-svg-tip.comparison { - text-align: left; - padding: 0px; - pointer-events: none; } - .graph-svg-tip.comparison .title { - display: block; - padding: 16px; - margin: 0; - color: var(--fr-tooltip-title); - font-weight: 600; - line-height: 1; - pointer-events: none; - text-transform: uppercase; } - .graph-svg-tip.comparison ul { - margin: 0; - white-space: nowrap; - list-style: none; } - .graph-svg-tip.comparison ul.tooltip-grid { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 5px; } - .graph-svg-tip.comparison li { - display: inline-block; - display: flex; - flex-direction: row; - font-weight: 600; - line-height: 1; - padding: 5px 15px 15px 15px; } - .graph-svg-tip.comparison li .tooltip-legend { - height: 12px; - width: 12px; - margin-right: 8px; - border-radius: 2px; } - .graph-svg-tip.comparison li .tooltip-label { - margin-top: 4px; - font-size: 11px; - max-width: 100px; - color: var(--fr-tooltip-label); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .graph-svg-tip.comparison li .tooltip-value { - color: var(--fr-tooltip-value); } diff --git a/dist/frappe-charts.umd.js b/dist/frappe-charts.umd.js deleted file mode 100644 index 0bbd57c..0000000 --- a/dist/frappe-charts.umd.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self)["frappe-charts"]=e()}(this,(function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,i=new Array(e);n=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}p.create=function(e,n){var i=document.createElement(e);for(var a in n){var s=n[a];if("inside"===a)p(s).appendChild(i);else if("around"===a){var r=p(s);r.parentNode.insertBefore(i,r),i.appendChild(r)}else"styles"===a?"object"===t(s)&&Object.keys(s).map((function(t){i.style[t]=s[t]})):a in i?i[a]=s:i.setAttribute(a,s)}return i};var y={margins:{top:10,bottom:10,left:20,right:20},paddings:{top:20,bottom:40,left:30,right:10},baseHeight:240,titleHeight:20,legendHeight:30,titleFontSize:12};function b(t){return t.titleHeight+t.margins.top+t.paddings.top}function x(t){return t.margins.left+t.paddings.left}function k(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function w(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}var A=["pink","blue","green","grey","red","yellow","purple","teal","cyan","orange"],L={bar:A,line:A,pie:A,percentage:A,heatmap:["#ebedf0","#c6e48b","#7bc96f","#239a3b","#196127"],donut:A},P=Math.PI/180,M=function(){function t(n){var i=n.parent,a=void 0===i?null:i,s=n.colors,r=void 0===s?[]:s;e(this,t),this.parent=a,this.colors=r,this.titleName="",this.titleValue="",this.listValues=[],this.titleValueFirst=0,this.x=0,this.y=0,this.top=0,this.left=0,this.setup()}return i(t,[{key:"setup",value:function(){this.makeTooltip()}},{key:"refresh",value:function(){this.fill(),this.calcPosition()}},{key:"makeTooltip",value:function(){var t=this;this.container=p.create("div",{inside:this.parent,className:"graph-svg-tip comparison",innerHTML:'\n\t\t\t\t
          \n\t\t\t\t
          '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.list=this.container.querySelector(".data-point-list"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",(function(){t.hideTip()}))}},{key:"fill",value:function(){var t,e=this;this.index&&this.container.setAttribute("data-point-index",this.index),t=this.titleValueFirst?"".concat(this.titleValue,"").concat(this.titleName):"".concat(this.titleName,"").concat(this.titleValue,""),this.listValues.length>4?this.list.classList.add("tooltip-grid"):this.list.classList.remove("tooltip-grid"),this.title.innerHTML=t,this.dataPointList.innerHTML="",this.listValues.map((function(t,n){var i=e.colors[n]||"black",a=0===t.formatted||t.formatted?t.formatted:t.value,s=p.create("li",{innerHTML:'
          \n\t\t\t\t\t
          \n\t\t\t\t\t\t
          ').concat(0===a||a?a:"",'
          \n\t\t\t\t\t\t
          ').concat(t.title?t.title:"","
          \n\t\t\t\t\t
          ")});e.dataPointList.appendChild(s)}))}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-7.48,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,n=this.container.querySelector(".svg-pointer");if(this.left<0)n.style.left="calc(50% - ".concat(-1*this.left,"px)"),this.left=0;else if(this.left>e){var i=this.left-e,a="calc(50% + ".concat(i,"px)");n.style.left=a,this.left=e}else n.style.left="50%"}},{key:"setValues",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=n.name,this.titleValue=n.value,this.listValues=i,this.x=t,this.y=e,this.titleValueFirst=n.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),t}();function T(t){return parseFloat(t.toFixed(2))}function D(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n||(n=i?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(n);return t=i?a.concat(t):t.concat(a)}function C(t,e){return(t+"").length*e}function N(t,e){return{x:Math.sin(t*P)*e,y:Math.cos(t*P)*e}}function E(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function S(t,e){var n,i;return t<=e?(n=e-t,i=t):(n=t-e,i=e),[n,i]}function O(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return n>0?t=D(t,n):e=D(e,n),[t,e]}function F(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function z(t){var e;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var n=Math.floor(Math.log10(Math.abs(e)));if(n<=2)return e;var i=Math.floor(n/3),a=Math.pow(10,n-3*i)*+(e/Math.pow(10,n)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][i]}function W(t,e){for(var n=[],i=0;i1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,i={className:t,transform:e};return n&&(i.inside=n),R("g",i)}function Y(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:2;return R("path",{className:e,d:t,styles:{stroke:n,fill:i,"stroke-width":a}})}function V(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i="path-fill-gradient-"+e+"-"+(n?"lighter":"default"),a=I(t,i),s=[1,.6,.2];return n&&(s=[.4,.05,0]),j(a,"0%",e,s[0]),j(a,"50%",e,s[1]),j(a,"100%",e,s[2]),i}function _(t,e,n){var i=n/2,a=e-i;return"M".concat(t,",0 h").concat(a," q").concat(i,",0 ").concat(i,",").concat(i," q0,").concat(i," -").concat(i,",").concat(i," h-").concat(a," v").concat(n,"z")}function U(t,e,n){var i=n/2,a=e-i;return"M".concat(t+i,",0 h").concat(a," v").concat(n," h-").concat(a," q-").concat(i,", 0 -").concat(i,",-").concat(i," q0,-").concat(i," ").concat(i,",-").concat(i,"z")}function q(t,e,n,i,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:n,width:i,height:i,rx:a,fill:s};return Object.keys(r).map((function(t){o[t]=r[t]})),R("rect",o)}function G(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||10,r=void 0!==a.dy?a.dy:s/2,o=a.fill||"#313B44",l=a.textAnchor||"start";return R("text",{className:t,x:e,y:n,dy:r+"px","font-size":s+"px",fill:o,"text-anchor":l,innerHTML:i})}function X(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=R("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:n,y2:i,styles:{stroke:a.stroke}}),r=R("text",{x:0,y:n>i?n+4:n-4-10,dy:"10px","font-size":"10px","text-anchor":"middle",innerHTML:e+""}),o=R("g",{transform:"translate(".concat(t,", 0)")});return o.appendChild(s),o.appendChild(r),o}function J(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.lineType||(a.lineType=""),a.shortenNumbers&&(e=z(e));var s="line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),r=R("line",{className:s,x1:n,x2:i,y1:0,y2:0,styles:{stroke:a.stroke}}),o=R("text",{x:n255?255:t<0?0:t}function tt(t,e){var n=et(t),i=!1;"#"==n[0]&&(n=n.slice(1),i=!0);var a=parseInt(n,16),s=Z((a>>16)+e),r=Z((a>>8&255)+e);return(i?"#":"")+(Z((255&a)+e)|r<<8|s<<16).toString(16)}var et=function(t){return Q[t]||t};function nt(t,e,n,i){var a="string"==typeof e?e:e.join(", ");return[t,{transform:n.join(", ")},i,"easein","translate",{transform:a}]}function it(t,e,n){return nt(t,[0,n],[0,e],350)}function at(t,e){return[t,{d:e},350,"easein"]}var st={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"};function rt(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var c=void 0;c="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),h=e[l],d={attributeName:l,from:u,to:h,begin:"0s",dur:n/1e3+"s",values:u+";"+h,keySplines:st[i],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};for(var f in a&&(d.type=a),d)c.setAttribute(f,d[f]);r.appendChild(c),a?o.setAttribute(l,"translate(".concat(h,")")):o.setAttribute(l,h)}return[r,o]}function ot(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function lt(t,e){var n=[],i=[];e.map((function(t){var e,a,s=t[0],r=s.parentNode;t[0]=s;var o=u(rt.apply(void 0,h(t)),2);e=o[0],a=o[1],n.push(a),i.push([e,r]),r.replaceChild(e,s)}));var a=t.cloneNode(!0);return i.map((function(t,i){t[1].replaceChild(n[i],t[0]),e[i][0]=n[i]})),a}function ct(t,e,n){if(0!==n.length){var i=lt(e,n);e.parentNode==t&&(t.removeChild(e),t.appendChild(i)),setTimeout((function(){i.parentNode==t&&(t.removeChild(i),t.appendChild(e))}),250)}}var ut=function(){function t(n,i){if(e(this,t),this.parent="string"==typeof n?document.querySelector(n):n,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(y));var a=this.measures;this.setMeasures(i),this.title.length||(a.titleHeight=0),this.config.showLegend||(a.legendHeight=0),this.argHeight=i.height||a.baseHeight,this.state={},this.options={},this.initTimeout=700,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return i(t,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var n=[];return(t=(t||[]).concat(L[e])).forEach((function(t){var e=et(t);!function(t){return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i.test(t)}(e)?console.warn('"'+t+'" is not a valid color.'):n.push(e)})),n}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-k(this.measures),this.boundDrawFn=function(){return t.draw(!0)},window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var t={inside:this.parent,className:"chart-container"};this.independentWidth&&(t.styles={width:this.independentWidth+"px"}),this.container=p.create("div",t)}},{key:"makeTooltip",value:function(){this.tip=new M({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&g(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach((function(e){return e.setup(t.drawArea)})),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout((function(){t.update(t.data)}),this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){var t,e,n;this.baseWidth=(t=this.parent,e=window.getComputedStyle(t),n=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight),t.clientWidth-n),this.width=this.baseWidth-w(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t,e,n,i,a=this.measures;this.svg=(t=this.container,e="frappe-chart chart",n=this.baseWidth,i=this.baseHeight,R("svg",{className:e,inside:t,width:n,height:i})),this.svgDefs=R("defs",{inside:this.svg}),this.title.length&&(this.titleEL=G("title",a.margins.left,a.margins.top,this.title,{fontSize:a.titleFontSize,fill:"#666666",dy:a.titleFontSize}));var s=b(a);this.drawArea=B(this.type+"-chart chart-draw-area","translate(".concat(x(a),", ").concat(s,")")),this.config.showLegend&&(s+=this.height+a.paddings.bottom,this.legendArea=B("chart-legend","translate(".concat(x(a),", ").concat(s,")"))),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(x(a),b(a))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate)}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map((function(t){return t.parentNode.removeChild(t)}));var i=[];e.forEach((function(t){i=i.concat(t.update(n))})),i.length>0?(ct(this.container,this.svg,i),setTimeout((function(){e.forEach((function(t){return t.make()})),t.updateNav()}),400)):(e.forEach((function(t){return t.make()})),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",(function(e){m(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())})))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=function(t){var e=t.cloneNode(!0);e.classList.add("chart-container"),e.setAttribute("xmlns","http://www.w3.org/2000/svg"),e.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=p.create("style",{innerHTML:".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}"});e.insertBefore(n,e.firstChild);var i=p.create("div");return i.appendChild(e),i.innerHTML}(this.svg);!function(t,e){var n=document.createElement("a");n.style="display: none";var i=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(i);n.href=a,n.download=t,document.body.appendChild(n),n.click(),setTimeout((function(){document.body.removeChild(n),window.URL.revokeObjectURL(a)}),300)}(this.title||"Chart",[t])}}]),t}(),ht=function(t){a(r,t);var n=l(r);function r(t,i){return e(this,r),n.call(this,t,i)}return i(r,[{key:"configure",value:function(t){c(s(r.prototype),"configure",this).call(this,t),this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,n=this.config.maxSlices;e.sliceTotals=[];var i=this.data.labels.map((function(e,n){var i=0;return t.data.datasets.map((function(t){i+=t.values[n]})),[i,e]})).filter((function(t){return t[0]>=0})),a=i;if(i.length>n){i.sort((function(t,e){return e[0]-t[0]})),a=i.slice(0,n-1);var s=i.slice(n-1),r=0;s.map((function(t){r+=t[0]})),a.push([r,"Rest"]),this.colors[n-1]="grey"}e.labels=[],a.map((function(t){e.sliceTotals.push(t[0]),e.labels.push(t[1])})),e.grandTotal=e.sliceTotals.reduce((function(t,e){return t+e}),0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var n=0,i=0;this.legendTotals.map((function(a,s){var r=120,o=Math.floor((t.width-w(t.measures))/r);t.legendTotals.lengtho&&(n=0,i+=60);var l=r*n+5,c=t.config.truncateLegends?F(e.labels[s],r/10):e.labels[s],u=function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"none",s=arguments.length>5?arguments[5]:void 0,r=arguments.length>6?arguments[6]:void 0,o=arguments.length>7&&void 0!==arguments[7]&&arguments[7],l={className:"legend-dot",x:0,y:4-n,height:n,width:n,rx:i,fill:a},c=R("text",{className:"legend-dataset-label",x:n,y:0,dx:"10px",dy:10/3+"px","font-size":"16px","text-anchor":"start",fill:"#313B44",innerHTML:s=o?F(s,15):s}),u=R("text",{className:"legend-dataset-value",x:n,y:20,dx:"10px",dy:10/3+"px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:r}),h=R("g",{transform:"translate(".concat(t,", ").concat(e,")")});return h.appendChild(R("rect",l)),h.appendChild(c),h.appendChild(u),h}(l,i,12,3,t.colors[s],c,a,!1);t.legendArea.appendChild(u),n++}))}}]),r}(ut),dt=["January","February","March","April","May","June","July","August","September","October","November","December"],ft=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function vt(t){var e=t.getDate(),n=t.getMonth()+1;return[t.getFullYear(),(n>9?"":"0")+n,(e>9?"":"0")+e].join("-")}function gt(t){return new Date(t.getTime())}function mt(t,e){var n=kt(t);return Math.ceil(function(t,e){return(pt(e)-pt(t))/864e5}(n,e)/7)}function yt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=dt[t];return e?n.slice(0,3):n}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=gt(t),n=e.getDay();return 0!==n&&wt(e,-1*n),e}function wt(t,e){t.setDate(t.getDate()+e)}var At=function(){function t(n){var i=n.layerClass,a=void 0===i?"":i,s=n.layerTransform,r=void 0===s?"":s,o=n.constants,l=n.getData,c=n.makeElements,u=n.animateElements;e(this,t),this.layerTransform=r,this.constants=o,this.makeElements=c,this.getData=l,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=a,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return i(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=B(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach((function(t){e.layer.appendChild(t)})),this.labels.forEach((function(t){e.layer.appendChild(t)}))}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Lt={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=Y(e,"donut-path",t.colors[n],"none",t.strokeWidth);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return at(e,t.sliceStrings[n])}))}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map((function(e,n){var i=Y(e,"pie-path","none",t.colors[n]);return i.style.transition="transform .3s;",i}))},animateElements:function(t){return this.store.map((function(e,n){return at(e,t.sliceStrings[n])}))}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this,n=t.xPositions.length;return t.xPositions.map((function(i,a){var s=a==n-1,r=0==a;return function(t,e,n,i,a,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:"none";if(s){var o=_(t,n,i);return Y(o,"percentage-bar",null,r)}if(a){var l=U(t,n,i);return Y(l,"percentage-bar",null,r)}var c={className:"percentage-bar",x:t,y:e,width:n,height:i,fill:r};return R("rect",c)}(i,0,t.widths[a],e.constants.barHeight,r,s,t.colors[a])}))},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};E(t)||(t=0),i.pos||(i.pos="left"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.stroke||(i.stroke="#E2E6E9"),i.className||(i.className="");var a=-6,s="span"===i.mode?n+6:0;return"tick"===i.mode&&"right"===i.pos&&(a=n+6,s=n),J(t,e,a+=i.offset,s+=i.offset,{className:i.className,lineType:i.lineType,shortenNumbers:i.shortenNumbers})}(n,t.labels[i],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})}))},animateElements:function(t){var e=t.positions,n=t.labels,i=this.oldData.positions,a=this.oldData.labels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,labels:n}),this.store.map((function(t,n){return it(t,e[n],i[n])}))}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map((function(n,i){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};E(t)||(t=0),i.pos||(i.pos="bottom"),i.offset||(i.offset=0),i.mode||(i.mode="span"),i.className||(i.className="");var a=n+6,s="span"===i.mode?-6:n;return"tick"===i.mode&&"top"===i.pos&&(a=-6,s=0),X(t,e,a,s,{className:i.className,lineType:i.lineType})}(n,t.calcLabels[i],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})}))},animateElements:function(t){var e=t.positions,n=t.calcLabels,i=this.oldData.positions,a=this.oldData.calcLabels,s=u(O(i,e),2);i=s[0],e=s[1];var r=u(O(a,n),2);return a=r[0],n=r[1],this.render({positions:i,calcLabels:n}),this.store.map((function(t,n){return function(t,e,n){return nt(t,[n,0],[e,0],350)}(t,e[n],i[n])}))}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};i.labelPos||(i.labelPos="right");var a="left"===i.labelPos?4:n-C(e,5)-4,s=R("text",{className:"chart-label",x:a,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:e+""}),r=J(t,"",0,n,{stroke:i.stroke||"#E2E6E9",className:i.className||"",lineType:i.lineType});return r.appendChild(s),r}(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.position})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.options})),s=this.oldData.map((function(t){return t.position}));return this.render(s.map((function(t,e){return{position:s[e],label:i[e],options:a[e]}}))),this.store.map((function(t,e){return it(t,n[e],s[e])}))}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map((function(t){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=R("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:"#E2E6E9","stroke-dasharray":"".concat(n,", ").concat(s)},x:0,y:0,width:n,height:s});a.labelPos||(a.labelPos="right");var o="left"===a.labelPos?4:n-C(i+"",4.5)-4,l=R("text",{className:"chart-label",x:o,y:0,dy:"-5px","font-size":"10px","text-anchor":"start",innerHTML:i+""}),c=R("g",{transform:"translate(0, ".concat(e,")")});return c.appendChild(r),c.appendChild(l),c}(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})}))},animateElements:function(t){var e=u(O(this.oldData,t),2);this.oldData=e[0];var n=(t=e[1]).map((function(t){return t.endPos})),i=t.map((function(t){return t.label})),a=t.map((function(t){return t.startPos})),s=t.map((function(t){return t.options})),r=this.oldData.map((function(t){return t.endPos})),o=this.oldData.map((function(t){return t.startPos}));this.render(r.map((function(t,e){return{startPos:o[e],endPos:r[e],label:i[e],options:s[e]}})));var l=[];return this.store.map((function(t,e){l=l.concat(function(t,e,n,i){var a=e-n,s=t.childNodes[0],r=s.getAttribute("width");return[[s,{height:a,"stroke-dasharray":"".concat(r,", ").concat(a)},350,"easein"],nt(t,[0,i],[0,n],350)]}(t,a[e],n[e],r[e]))})),l}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,n=this.constants,i=n.index,a=n.colWidth,s=n.rowHeight,r=n.squareSize,o=n.radius,l=n.xTranslate,c=l,u=0;return this.serializedSubDomains=[],t.cols.map((function(t,n){1===n&&e.labels.push(G("domain-name",c,-12,bt(i,!0).toUpperCase(),{fontSize:9})),t.map((function(t,n){if(t.fill){var i={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":n},a=q("day",c,u,r,o,t.fill,i);e.serializedSubDomains.push(a)}u+=s})),u=0,c+=a})),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map((function(n,i){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=S(e,o.zeroLine),c=u(l,2),h=c[0],d=c[1];d-=r,0===h&&(h=o.minHeight,d-=o.minHeight),E(t)||(t=0),E(d)||(d=0),E(h,!0)||(h=0),E(n,!0)||(n=0);var f=R("rect",{className:"bar mini",style:"fill: ".concat(i),"data-point-index":s,x:t,y:d,width:n,height:h});if((a+="")||a.length){f.setAttribute("y",0),f.setAttribute("x",0);var p=R("text",{className:"data-point-value",x:n/2,y:0,dy:"-5px","font-size":"10px","text-anchor":"middle",innerHTML:a}),v=R("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(d,")")});return v.appendChild(f),v.appendChild(p),v}return f}(t.xPositions[i],n,t.barWidth,e.color,t.labels[i],i,t.offsets[i],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})})),this.units},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,c=u(O(s,e),2);s=c[0],e=c[1];var h=u(O(r,n),2);r=h[0],n=h[1];var d=u(O(o,i),2);o=d[0],i=d[1];var f=u(O(l,a),2);l=f[0],a=f[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var p=[];return this.store.map((function(a,s){p=p.concat(function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=S(n,s.zeroLine),o=u(r,2),l=o[0],c=o[1];if(c-=a,"rect"!==t.nodeName){var h=t.childNodes[0],d=[h,{width:i,height:l},350,"easein"],f=t.getAttribute("transform").split("(")[1].slice(0,-1),p=nt(t,f,[e,c],350);return[d,p]}return[[t,{width:i,height:l,x:e,y:c},350,"easein"]]}(a,e[s],n[s],t.barWidth,i[s],{zeroLine:t.zeroLine}))})),p}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map((function(e,n){return t[n]+","+e})),r=s.join("L");i.spline&&(r=W(t,e));var o=Y("M"+r,"line-graph-path",n);if(i.heatline){var l=V(a.svgDefs,n);o.style.stroke="url(#".concat(l,")")}var c={path:o};if(i.regionFill){var u=V(a.svgDefs,n,!0),h="M"+"".concat(t[0],",").concat(a.zeroLine,"L")+r+"L".concat(t.slice(-1)[0],",").concat(a.zeroLine);c.region=Y(h,"region-fill","none","url(#".concat(u,")"))}return c}(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.showDots&&(this.units=t.yPositions.map((function(n,i){return function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=R("circle",{style:"fill: ".concat(i),"data-point-index":s,cx:t,cy:e,r:n});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=R("text",{className:"data-point-value",x:0,y:0,dy:-5-n+"px","font-size":"10px","text-anchor":"middle",innerHTML:a}),l=R("g",{"data-point-index":s,transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(r),l.appendChild(o),l}return r}(t.xPositions[i],n,t.radius,e.color,e.valuesOverPoints?t.values[i]:"",i)}))),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,n=t.yPositions,i=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=u(O(a,e),2);a=o[0],e=o[1];var l=u(O(s,n),2);s=l[0],n=l[1];var c=u(O(r,i),2);r=c[0],i=c[1],this.render({xPositions:a,yPositions:s,values:i,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var h=[];return Object.keys(this.paths).length&&(h=h.concat(function(t,e,n,i,a){var s=[],r=n.map((function(t,n){return e[n]+","+t})).join("L");a&&(r=W(e,n));var o=[t.path,{d:"M"+r},350,"easein"];if(s.push(o),t.region){var l="".concat(e[0],",").concat(i,"L"),c="L".concat(e.slice(-1)[0],", ").concat(i),u=[t.region,{d:"M"+l+r+c},350,"easein"];s.push(u)}return s}(this.paths,e,n,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map((function(t,i){h=h.concat(function(t,e,n){if("circle"!==t.nodeName){var i=t.getAttribute("transform").split("(")[1].slice(0,-1);return[nt(t,i,[e,n],350)]}return[[t,{cx:e,cy:n},350,"easein"]]}(t,e[i],n[i]))})),h}}};function Pt(t,e,n){var i=Object.keys(Lt).filter((function(e){return t.includes(e)})),a=Lt[i[0]];return Object.assign(a,{constants:e,getData:n}),new At(a)}var Mt=function(t){a(r,t);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="percentage",a.setup(),a}return i(r,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var n=this.barOptions;n.height=n.height||16,e.paddings.right=30,e.paddings.top=60,e.paddings.bottom=0,e.legendHeight=80,e.baseHeight=8*n.height+k(e)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map((function(t){var e=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calc",value:function(){var t=this;c(s(r.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map((function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a}))}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,e=this.state;this.container.addEventListener("mousemove",(function(n){var i=t.components.get("percentageBars").store,a=n.target;if(i.includes(a)){var s=i.indexOf(a),r=v(t.container),o=v(a),l=a.getAttribute("width")||a.getBoundingClientRect().width,c=o.left-r.left+parseInt(l)/2,u=o.top-r.top,h=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[s]:t.state.labels[s])+": ",d=e.sliceTotals[s]/e.grandTotal;t.tip.setValues(c,u,{name:h,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}}))}}]),r}(ht),Tt=function(t){a(r,t);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="pie",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;c(s(r.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,f=i?-h:h,p=o+=f,v=N(u,n),g=N(p,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*n.y,u=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z\n\t\tL").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u," z")}(l,c,t.center,t.radius,i,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(n.x," ").concat(n.y,"\n\t\tL").concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c," z")}(l,c,t.center,t.radius,i,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:p,angle:f})})),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map((function(t){var e=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=N(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.fill=tt(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=a}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,n=this.components.get("pieSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),r}(ht);function Dt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var n=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,n)),n]}function Ct(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Math.ceil(t),i=Math.floor(e),a=n-i,s=a,r=1;a>5&&(a%2!=0&&(a=++n-i),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(i+r*l);return o}function Nt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=Dt(t),i=u(n,2),a=i[0],s=i[1],r=e?e/Math.pow(10,s):0,o=Ct(a=a.toFixed(6),r);return o=o.map((function(t){return t*Math.pow(10,s)}))}function Et(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,h(t)),i=Math.min.apply(Math,h(t)),a=[];function s(t,e){for(var n=Nt(t),i=n[1]-n[0],a=0,s=1;a=0&&i>=0)Dt(n)[1],a=e?Nt(n,i):Nt(n);else if(n>0&&i<0){var r=Math.abs(i);if(n>=r)Dt(n)[1],a=s(n,r);else{Dt(r)[1];var o=s(r,n);a=o.map((function(t){return-1*t}))}}else if(n<=0&&i<=0){var l=Math.abs(i),c=Math.abs(n);Dt(l)[1],a=(a=e?Nt(l,c):Nt(l)).reverse().map((function(t){return-1*t}))}return a}function St(t){var e,n=Ot(t);if(t.indexOf(0)>=0)e=t.indexOf(0);else if(t[0]>0){e=-1*t[0]/n}else{e=-1*t[t.length-1]/n+(t.length-1)}return e}function Ot(t){return t[1]-t[0]}function Ft(t){return t[t.length-1]-t[0]}function zt(t,e){return T(e.zeroLine-t*e.scaleMultiplier)}var Wt=function(t){a(s,t);var n=l(s);function s(t,i){var a;e(this,s),(a=n.call(this,t,i)).type="heatmap",a.countLabel=i.countLabel||"";var r=["Sunday","Monday"],o=r.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return a.startSubDomainIndex=r.indexOf(o),a.setup(),a}return i(s,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=84+k(e);var n=this.data,i=this.discreteDomains?12:0;this.independentWidth=12*(mt(n.start,n.end)+i)+w(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+w(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach((function(n){var i=new Date(1e3*n);e[vt(i)]=t.dataPoints[n]})),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=gt(this.data.start),t.end=gt(this.data.end),t.firstWeekStart=gt(t.start),t.noOfWeeks=mt(t.start,t.end),t.distribution=function(t,e){for(var n=Math.max.apply(Math,h(t)),i=1/(e-1),a=[],s=0;s1&&void 0!==arguments[1]?arguments[1]:"",n=[t.getMonth(),t.getFullYear()],i=n[0],a=n[1],s=kt(t),r={index:i,cols:[]};wt(e=gt(e)||xt(i,a),1);for(var o,l=mt(s,e),c=[],u=0;u2&&void 0!==arguments[2]&&arguments[2],i=this.state,a=gt(t),s=[],r=0;r<7;r++,wt(a,1)){var o={},l=a>=i.start&&a<=i.end;n||a.getMonth()!==e||!l?o.yyyyMmDd=vt(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e,n,i=vt(t),a=this.data.dataPoints[i];return{yyyyMmDd:i,dataValue:a||0,fill:this.colors[(e=a,n=this.state.distribution,n.filter((function(t){return tn?i.slice(0,n):D(i,n-i.length,0)}else t.values=a;t.chartType||(t.chartType=e)})),t.yRegions&&t.yRegions.map((function(t){if(t.end0&&void 0!==arguments[0]?arguments[0]:this.data;return Ht(t,this.type)}},{key:"prepareFirstData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;return Rt(t)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map((function(e,n){return T(t.xOffset+n*t.unitWidth)}))}}},{key:"calcYAxisParameters",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=Et(t,e),i=this.height/Ft(n),a=Ot(n)*i,s=this.height-St(n)*a;this.state.yAxis={labels:n,positions:n.map((function(t){return s-t*i})),scaleMultiplier:i,zeroLine:s},this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e){return e.map((function(e){return zt(e,t.yAxis)}))};t.datasets=this.data.datasets.map((function(t,n){var i=t.values,a=t.cumulativeYs||[];return{name:t.name,index:n,chartType:t.chartType,values:i,yPositions:e(i),cumulativeYs:a,cumulativeYPos:e(a)}}))}},{key:"calcYExtremes",value:function(){var t=this.state;this.barOptions.stacked?t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos:(t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map((function(e){e.yPositions.map((function(e,n){e1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=t/e.length*.6;i<=0&&(i=1);var a,s=i/7;if(n){var r=Math.max.apply(Math,h(e.map((function(t){return t.length}))));a=Math.ceil(r/s)}var o=e.map((function(t,i){return(t+="").length>s&&(n?i%a!=0&&i!==e.length-1&&(t=""):t=s-3>0?t.slice(0,s-3)+" ...":t.slice(0,s)+".."),t}));return o}(this.width,t.xAxis.labels,this.config.xIsSeries),t.xAxis}.bind(this)],["yRegions",{width:this.width,pos:"right"},function(){return this.state.yRegions}.bind(this)]],n=this.state.datasets.filter((function(t){return"bar"===t.chartType})),i=this.state.datasets.filter((function(t){return"line"===t.chartType})),a=n.map((function(e){var i=e.index;return["barGraph-"+e.index,{index:i,color:t.colors[i],stacked:t.barOptions.stacked,valuesOverPoints:t.config.valuesOverPoints,minHeight:0*t.height},function(){var t=this.state,e=t.datasets[i],a=this.barOptions.stacked,s=this.barOptions.spaceRatio||.5,r=t.unitWidth*(1-s),o=r/(a?1:n.length),l=t.xAxis.positions.map((function(t){return t-r/2}));a||(l=l.map((function(t){return t+o*i})));var c=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(c=a&&e.index===t.datasets.length-1?e.cumulativeYs:e.values);var u=new Array(t.datasetLength).fill(0);return a&&(u=e.yPositions.map((function(t,n){return t-e.cumulativeYPos[n]}))),{xPositions:l,yPositions:e.yPositions,offsets:u,labels:c,zeroLine:t.yAxis.zeroLine,barsWidth:r,barWidth:o}}.bind(t)]})),s=i.map((function(e){var n=e.index;return["lineGraph-"+e.index,{index:n,color:t.colors[n],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,showDots:t.lineOptions.showDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[n],i=t.yAxis.positions[0]b(n)?t.mapTooltipXPosition(a):t.tip.hideTip()}))}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var n=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=e.reduce((function(e,n){return Math.abs(n-t)=0){var i=this.dataByIndex[n];this.tip.setValues(i.xPos+this.tip.offset.x,i.yExtreme+this.tip.offset.y,{name:i.formattedLabel,value:""},i.values,n),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map((function(e,n){var i=function(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments.length>4?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]&&arguments[5],r={className:"legend-bar",x:0,y:0,width:n,height:"2px",fill:i},o=R("text",{className:"legend-dataset-text",x:0,y:0,dy:"20px","font-size":"12px","text-anchor":"start",fill:"#313B44",innerHTML:a=s?F(a,15):a}),l=R("g",{transform:"translate(".concat(t,", ").concat(e,")")});return l.appendChild(R("rect",r)),l.appendChild(o),l}(100*n,"0",100,t.colors[n],e.name,t.config.truncateLegends);t.legendArea.appendChild(i)})))}},{key:"makeOverlay",value:function(){var t=this;this.init?this.init=0:(this.overlayGuides&&this.overlayGuides.forEach((function(t){var e=t.overlay;e.parentNode.removeChild(e)})),this.overlayGuides=this.dataUnitComponents.map((function(t){return{type:t.unitType,overlay:void 0,units:t.units}})),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map((function(e){var n=e.units[t.state.currentIndex];e.overlay=K[e.type](n),t.drawArea.appendChild(e.overlay)})))}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach((function(t){var e=t.overlay;e.parentNode.removeChild(e)}))}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",(function(){t.updateOverlay()}))}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map((function(e){e.units.map((function(e){e.addEventListener("click",(function(){var n=e.getAttribute("data-point-index");t.setCurrentDataPoint(n)}))}))})),this.tip.container.addEventListener("click",(function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)}))}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map((function(e){var n=e.units[t.state.currentIndex];$[e.type](n,e.overlay)}))}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state,n={index:t,label:e.xAxis.labels[t],values:e.datasets.map((function(e){return e.values[t]}))};return n}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,function(t,e,n){var i=document.createEvent("HTMLEvents");for(var a in i.initEvent(e,!0,!0),n)i[a]=n[a];t.dispatchEvent(i)}(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;c(s(r.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map((function(t,i){t.values.splice(n,0,e[i])})),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(c(s(r.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map((function(e){e.values.splice(t,1)})),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map((function(e,n){t[n]&&(e.values=t[n])})),this.update(this.data)}}]),r}(ut),jt={bar:It,line:It,percentage:Mt,heatmap:Wt,pie:Tt,donut:function(t){a(r,t);var n=l(r);function r(t,i){var a;return e(this,r),(a=n.call(this,t,i)).type="donut",a.initTimeout=0,a.init=1,a.setup(),a}return i(r,[{key:"configure",value:function(t){c(s(r.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;c(s(r.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,i=this.clockWise,a=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var o=180-this.config.startAngle;e.sliceTotals.map((function(s,r){var l,c,u=o,h=s/e.grandTotal*360,d=h>180?1:0,f=i?-h:h,p=o+=f,v=N(u,n),g=N(p,n),m=t.init&&a[r];t.init?(l=m?m.startPosition:v,c=m?m.endPosition:v):(l=v,c=g);var y=360===h?function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=2*i+o,u=n.y+t.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c,"\n\t\tM").concat(r," ").concat(c,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(u)}(l,c,t.center,t.radius,t.clockWise,d):function(t,e,n,i){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=n.x+t.x,o=n.y+t.y,l=n.x+e.x,c=n.y+e.y;return"M".concat(r," ").concat(o,"\n\t\tA ").concat(i," ").concat(i," 0 ").concat(s," ").concat(a?1:0,"\n\t\t").concat(l," ").concat(c)}(l,c,t.center,t.radius,t.clockWise,d);e.sliceStrings.push(y),e.slicesProperties.push({startPosition:v,endPosition:g,value:s,total:e.grandTotal,startAngle:u,endAngle:p,angle:f})})),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map((function(t){var e=Pt.apply(void 0,h(t));return[t[0],e]})))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,n=this.hoverRadio,i=N(t.startAngle+t.angle/2,e);return"translate3d(".concat(i.x*n,"px,").concat(i.y*n,"px,0)")}},{key:"hoverSlice",value:function(t,e,n,i){if(t){var a=this.colors[e];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[e])),t.style.stroke=tt(a,50);var s=v(this.svg),r=i.pageX-s.left+10,o=i.pageY-s.top-10,l=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[e]:this.state.labels[e])+": ",c=(100*this.state.sliceTotals[e]/this.state.grandTotal).toFixed(1);this.tip.setValues(r,o,{name:l,value:c+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=a}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,n=this.components.get("donutSlices").store,i=this.curActiveSliceIndex,a=this.curActiveSlice;if(n.includes(e)){var s=n.indexOf(e);this.hoverSlice(a,i,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),r}(ht)};var Bt=Object.freeze({__proto__:null,Chart:function t(n,i){return e(this,t),function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0;return"axis-mixed"===t?(n.type="line",new It(e,n)):jt[t]?new jt[t](e,n):void console.error("Undefined chart type: "+t)}(i.type,n,i)},PercentageChart:Mt,PieChart:Tt,Heatmap:Wt,AxisChart:It}),Yt={NAME:"Frappe Charts",VERSION:"1.5.2"};return Yt=Object.assign({},Yt,Bt)})); -//# sourceMappingURL=frappe-charts.umd.js.map diff --git a/dist/frappe-charts.umd.js.map b/dist/frappe-charts.umd.js.map deleted file mode 100644 index 73517ea..0000000 --- a/dist/frappe-charts.umd.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"frappe-charts.umd.js","sources":["../src/js/utils/dom.js","../src/js/utils/constants.js","../src/js/objects/SvgTip.js","../src/js/utils/helpers.js","../src/js/utils/draw-utils.js","../src/js/utils/draw.js","../src/js/utils/colors.js","../src/js/utils/animate.js","../src/js/utils/animation.js","../src/js/charts/BaseChart.js","../src/js/utils/export.js","../src/css/chartsCss.js","../src/js/charts/AggregationChart.js","../src/js/utils/date-utils.js","../src/js/objects/ChartComponents.js","../src/js/charts/PercentageChart.js","../src/js/charts/PieChart.js","../src/js/utils/intervals.js","../src/js/charts/Heatmap.js","../src/js/utils/axis-chart-utils.js","../src/js/charts/AxisChart.js","../src/js/chart.js","../src/js/charts/DonutChart.js","../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\nexport const SERIES_LABEL_SPACE_RATIO = 0.6;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 16;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 7.48;\nconst DEFAULT_CHART_COLORS = ['pink', 'blue', 'green', 'grey', 'red', 'yellow', 'purple', 'teal', 'cyan', 'orange'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
            \n\t\t\t\t
            `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.list = this.container.querySelector('.data-point-list');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\n\t\tif (this.listValues.length > 4) {\n\t\t\tthis.list.classList.add('tooltip-grid');\n\t\t} else {\n\t\t\tthis.list.classList.remove('tooltip-grid');\n\t\t}\n\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\t\t\tlet li = $.create('li', {\n\t\t\t\tinnerHTML: `
            \n\t\t\t\t\t
            \n\t\t\t\t\t\t
            ${ value === 0 || value ? value : '' }
            \n\t\t\t\t\t\t
            ${set.title ? set.title : '' }
            \n\t\t\t\t\t
            `\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR } from './constants';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#E2E6E9';\nconst FONT_FILL = '#313B44';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif (lighter) {\n\t\topacities = [0.4, 0.05, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function rightRoundedBar(x, width, height) {\n\t// https://medium.com/@dennismphil/one-side-rounded-rectangle-using-svg-fb31cf318d90\n\tlet radius = height/2;\n\tlet xOffset = width - radius;\n\n\treturn `M${x},0 h${xOffset} q${radius},0 ${radius},${radius} q0,${radius} -${radius},${radius} h-${xOffset} v${height}z`;\n}\n\nexport function leftRoundedBar(x, width, height) {\n\tlet radius = height/2;\n\tlet xOffset = width - radius;\n\n\treturn `M${x + radius},0 h${xOffset} v${height} h-${xOffset} q-${radius}, 0 -${radius},-${radius} q0,-${radius} ${radius},-${radius}z`;\n}\n\nexport function percentageBar(x, y, width, height, isFirst, isLast, fill='none') {\n\tif (isLast) {\n\t\tlet pathStr = rightRoundedBar(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\n\tif (isFirst) {\n\t\tlet pathStr = leftRoundedBar(x, width, height);\n\t\treturn makePath(pathStr, 'percentage-bar', null, fill);\n\t}\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, radius, fill='none', label, value, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tx: 0,\n\t\ty: 4 - size,\n\t\theight: size,\n\t\twidth: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tlet textLabel = createSVG('text', {\n\t\tclassName: 'legend-dataset-label',\n\t\tx: size,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.6) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet textValue = createSVG('text', {\n\t\tclassName: 'legend-dataset-value',\n\t\tx: size,\n\t\ty: FONT_SIZE + 10,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: value\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(textLabel);\n\tgroup.appendChild(textValue);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\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.lineType) options.lineType = '';\n\tif (options.shortenNumbers) label = shortenLargeNumber(label);\n\n\tlet className = 'line-horizontal ' + options.className +\n\t\t(options.lineType === \"dashed\" ? \"dashed\": \"\");\n\n\tlet l = createSVG('line', {\n\t\tclassName: className,\n\t\tx1: x1,\n\t\tx2: x2,\n\t\ty1: 0,\n\t\ty2: 0,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / 2 - 2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': x1 < x2 ? 'end' : 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(0, ${y})`,\n\t\t'stroke-opacity': 1\n\t});\n\n\tif(text === 0 || text === '0') {\n\t\tline.style.stroke = \"rgba(27, 31, 35, 0.6)\";\n\t}\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nexport function yLine(y, label, width, options={}) {\n\tif (!isValidNumber(y)) y = 0;\n\n\tif(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tclassName: options.className,\n\t\tlineType: options.lineType,\n\t\tshortenNumbers: options.shortenNumbers\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.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\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\t// x y h w\n\n\t// M{x},{y+r}\n\t// q0,-{r} {r},-{r}\n\t// q{r},0 {r},{r}\n\t// v{h-r}\n\t// h-{w}z\n\n\t// let radius = width/2;\n\t// let pathStr = `M${x},${y+radius} q0,-${radius} ${radius},-${radius} q${radius},0 ${radius},${radius} v${height-radius} h-${width}z`\n\n\t// let rect = createSVG('path', {\n\t// \tclassName: 'bar mini',\n\t// \td: pathStr,\n\t// \tstyles: { fill: color },\n\t// \tx: x,\n\t// \ty: y,\n\t// \t'data-point-index': index,\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\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","const PRESET_COLOR_MAP = {\n\t'pink': '#F683AE',\n\t'blue': '#318AD8',\n\t'green': '#48BB74',\n\t'grey': '#A6B1B9',\n\t'red': '#F56B6B',\n\t'yellow': '#FACF7A',\n\t'purple': '#44427B',\n\t'teal': '#5FD8C4',\n\t'cyan': '#15CCEF',\n\t'orange': '#F8814F',\n\t'light-pink': '#FED7E5',\n\t'light-blue': '#BFDDF7',\n\t'light-green': '#48BB74',\n\t'light-grey': '#F4F5F6',\n\t'light-red': '#F6DFDF',\n\t'light-yellow': '#FEE9BF',\n\t'light-purple': '#E8E8F7',\n\t'light-teal': '#D3FDF6',\n\t'light-cyan': '#DDF8FD',\n\t'light-orange': '#FECDB8'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\n\t\tparent.replaceChild(animElement, unit);\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\telements[i][0] = newElements[i];\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(d[0]);\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 120;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 60;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t12,\n\t\t\t\t3,\n\t\t\t\tthis.colors[i],\n\t\t\t\tlabel,\n\t\t\t\td,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { makeText, makePath, xLine, yLine, yMarker, yRegion, datasetBar, datasetDot, percentageBar, getPaths, heatSquare } from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport { translateHoriLine, translateVertLine, animateRegion, animateBar,\n\tanimateDot, animatePath, animatePathStr } from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n\tconstructor({\n\t\tlayerClass = '',\n\t\tlayerTransform = '',\n\t\tconstants,\n\n\t\tgetData,\n\t\tmakeElements,\n\t\tanimateElements\n\t}) {\n\t\tthis.layerTransform = layerTransform;\n\t\tthis.constants = constants;\n\n\t\tthis.makeElements = makeElements;\n\t\tthis.getData = getData;\n\n\t\tthis.animateElements = animateElements;\n\n\t\tthis.store = [];\n\t\tthis.labels = [];\n\n\t\tthis.layerClass = layerClass;\n\t\tthis.layerClass = typeof(this.layerClass) === 'function'\n\t\t\t? this.layerClass() : this.layerClass;\n\n\t\tthis.refresh();\n\t}\n\n\trefresh(data) {\n\t\tthis.data = data || this.getData();\n\t}\n\n\tsetup(parent) {\n\t\tthis.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n\t}\n\n\tmake() {\n\t\tthis.render(this.data);\n\t\tthis.oldData = this.data;\n\t}\n\n\trender(data) {\n\t\tthis.store = this.makeElements(data);\n\n\t\tthis.layer.textContent = '';\n\t\tthis.store.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t\tthis.labels.forEach(element => {\n\t\t\tthis.layer.appendChild(element);\n\t\t});\n\t}\n\n\tupdate(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\tconst numberOfPoints = data.xPositions.length;\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\n\t\t\t\tlet isLast = i == numberOfPoints - 1;\n\t\t\t\tlet isFirst = i == 0;\n\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i], this.constants.barHeight, isFirst, isLast, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos, shortenNumbers: this.constants.shortenNumbers})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tlabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(c.showDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, getExtraHeight } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\n\t\tm.paddings.right = 30;\n\t\tm.paddings.top = 60;\n\t\tm.paddings.bottom = 0;\n\n\t\tm.legendHeight = 80;\n\t\tm.baseHeight = (b.height) * 8 + getExtraHeight(m);\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif (bars.includes(bar)) {\n\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 width = bar.getAttribute('width') || bar.getBoundingClientRect().width;\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(width)/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => value * Math.pow(10, exponent));\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH,\n\tSERIES_LABEL_SPACE_RATIO } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t}\n\n\t\t// Set labels\n\t\t//\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n\tlet zeroData = {\n\t\tlabels: realData.labels.slice(0, -1),\n\t\tdatasets: realData.datasets.map(d => {\n\t\t\treturn {\n\t\t\t\tname: '',\n\t\t\t\tvalues: zeroArray.slice(0, -1),\n\t\t\t\tchartType: d.chartType\n\t\t\t};\n\t\t}),\n\t};\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = (chartWidth / labels.length) * SERIES_LABEL_SPACE_RATIO;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0 && i !== (labels.length - 1)) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n\t\tsuper.configure(options);\n\n\t\toptions.axisOptions = options.axisOptions || {};\n\t\toptions.tooltipOptions = options.tooltipOptions || {};\n\n\t\tthis.config.xAxisMode = options.axisOptions.xAxisMode || 'span';\n\t\tthis.config.yAxisMode = options.axisOptions.yAxisMode || 'span';\n\t\tthis.config.xIsSeries = options.axisOptions.xIsSeries || 0;\n\t\tthis.config.shortenYAxisNumbers = options.axisOptions.shortenYAxisNumbers || 0;\n\n\t\tthis.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n\t\tthis.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n\t\tthis.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\tcalcYAxisParameters(dataValues, withMinimum = 'false') {\n\t\tconst yPts = calcChartIntervals(dataValues, withMinimum);\n\t\tconst scaleMultiplier = this.height / getValueRange(yPts);\n\t\tconst intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n\t\tconst zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight);\n\n\t\tthis.state.yAxis = {\n\t\t\tlabels: yPts,\n\t\t\tpositions: yPts.map(d => zeroLine - d * scaleMultiplier),\n\t\t\tscaleMultiplier: scaleMultiplier,\n\t\t\tzeroLine: zeroLine,\n\t\t};\n\n\t\t// Dependent if above changes\n\t\tthis.calcDatasetPoints();\n\t\tthis.calcYExtremes();\n\t\tthis.calcYRegions();\n\t}\n\n\tcalcDatasetPoints() {\n\t\tlet s = this.state;\n\t\tlet scaleAll = values => values.map(val => scale(val, s.yAxis));\n\n\t\ts.datasets = this.data.datasets.map((d, i) => {\n\t\t\tlet values = d.values;\n\t\t\tlet cumulativeYs = d.cumulativeYs || [];\n\t\t\treturn {\n\t\t\t\tname: d.name,\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tshortenNumbers: this.config.shortenYAxisNumbers\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth * (1 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: s.yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\tspline: this.lineOptions.spline,\n\t\t\t\t\tshowDots: this.lineOptions.showDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.5.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["$","expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","create","tag","o","createElement","i","val","appendChild","ref","parentNode","insertBefore","_typeof","Object","keys","map","prop","style","setAttribute","BASE_MEASURES","margins","paddings","baseHeight","titleHeight","legendHeight","titleFontSize","getTopOffset","m","getLeftOffset","getExtraHeight","getExtraWidth","DEFAULT_CHART_COLORS","DEFAULT_COLORS","bar","line","pie","percentage","heatmap","donut","ANGLE_RATIO","Math","PI","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","inside","this","className","innerHTML","hideTip","title","list","dataPointList","addEventListener","_this","index","length","classList","add","remove","set","color","_this2","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","parseFloat","toFixed","fillArray","array","count","start","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","round","getSplineCurvePointsStr","xList","yList","points","push","controlPoint","current","previous","next","reverse","pointA","pointB","lengthX","lengthY","sqrt","atan2","command","reduce","acc","point","a","pointStr","cps","cpe","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","id","x1","x2","y1","y2","setGradientStop","gradElem","offset","makeSVGGroup","transform","args","makePath","pathStr","stroke","strokeWidth","styles","makeGradient","lighter","gradientDef","opacities","rightRoundedBar","xOffset","leftRoundedBar","heatSquare","size","data","rx","key","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","text","FONT_SIZE","makeHoriLine","lineType","shortenNumbers","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","parseInt","updateOverlay","attributes","values","filter","attr","includes","specified","nodeValue","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","b","toString","translate","oldCoord","newCoord","duration","old","join","translateHoriLine","yLine","newY","oldY","animatePathStr","oldPath","EASING","ease","linear","easein","easeout","easeinout","animateSVGElement","props","dur","easingType","type","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","from","to","begin","keySplines","keyTimes","calcMode","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","svgContainer","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","setTimeout","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","showTooltip","showLegend","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","argHeight","state","initTimeout","overlays","configure","validColors","forEach","test","isValidColor","console","warn","boundDrawFn","draw","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","c","drawArea","render","update","renderLegend","setupNavigation","padding","baseWidth","getComputedStyle","paddingLeft","paddingRight","svg","svgDefs","titleEL","legendArea","updateTipOffset","Map","error","make","_this3","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","clone","styleEl","firstChild","prepareForExport","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","downloadFile","AggregationChart","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","center","textContent","legendTotals","barWidth","divisor","dot","truncate","textLabel","dx","textValue","group","legendDot","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","Date","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getTime","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","SEC_IN_DAY","getDaysBetween","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","donutSlices","sliceStrings","transition","newData","pieSlices","percentageBars","numberOfPoints","xPositions","isLast","isFirst","percentageBar","widths","barHeight","yAxis","positions","position","pos","mode","newPos","newLabels","oldPos","oldLabels","xAxis","xLine","calcLabels","newX","oldX","translateVertLine","yMarkers","labelPos","labelSvg","yMarker","_this5","newOptions","yRegions","region","yRegion","startPos","endPos","_this6","newStarts","oldStarts","rectGroup","newY1","newY2","oldY2","newHeight","animateRegion","heatDomain","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","_this7","toUpperCase","yyyyMmDd","dataValue","square","barGraph","unitType","units","yPositions","j","meta","minHeight","datasetBar","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","rectAnim","oldCoordStr","split","groupAnim","animateBar","lineGraph","paths","hideLine","pointsList","pointsStr","spline","path","heatline","gradient_id","regionFill","gradient_id_region","getPaths","showDots","cx","cy","datasetDot","valuesOverPoints","newValues","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePath","animateDot","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","target","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","clockWise","prevSlicesProperties","slicesProperties","curAngle","curStart","curEnd","originDiffAngle","largeArc","diffAngle","endAngle","startPosition","endPosition","prevProperty","curPath","arcStartX","arcStartY","arcEndX","midArc","arcEndY","makeCircleStr","makeArcPathStr","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","scaleMultiplier","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","spacing","HEATMAP_SQUARE_SIZE","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","distribution","distributionSize","dataMaxValue","distributionStep","checkpoint","calcDistribution","domainConfigs","getDomains","lessCol","dayName","dayText","comp","daySquares","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","NO_OF_DAYS_IN_WEEK","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","zeroDataPrep","zeroData","AxisChart","lineOptions","axisOptions","tooltipOptions","xAxisMode","yAxisMode","xIsSeries","shortenYAxisNumbers","formatTooltipX","formatTooltipY","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","cumulativeYPos","stacked","yExtremes","cumulative","allValueLists","chartWidth","isSeries","allowedSpace","seriesMultiple","allowedLetters","maxLabelLength","getShortenedLabels","barDatasets","lineDatasets","barsConfigs","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","yPos","formattedLabel","yExtreme","relX","relY","mapTooltipXPosition","goal","arr","closest","prev","curr","getClosestInArray","dbi","legendBar","overlayGuides","g","currentIndex","currentUnit","_this8","_this9","setCurrentDataPoint","_this10","data_point","properties","evt","createEvent","initEvent","dispatchEvent","fire","getDataPoint","datasetValues","splice","chartTypes","makeStrokeCircleStr","makeArcStrokePathStr","getChartByType","frappe","Charts"],"mappings":"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"} \ No newline at end of file