From 539bc5088362836de216c85630c820462dd2ea97 Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Fri, 12 Nov 2021 18:57:02 -0800 Subject: [PATCH 1/9] Feat: Adding multi y-Axis support and configurable labes --- docs/assets/js/frappe-charts.min.js | 2 +- docs/assets/js/frappe-charts.min.js.map | 2 +- src/js/charts/AxisChart.js | 419 +++++--- src/js/objects/ChartComponents.js | 121 ++- src/js/utils/axis-chart-utils.js | 22 +- src/js/utils/draw.js | 1225 ++++++++++++----------- 6 files changed, 1054 insertions(+), 737 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index c0a8d0d..a5bc39e 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -1,2 +1,2 @@ -var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function u(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function h(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*Zt)*e,y:Math.cos(t*Zt)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ht(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function m(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function y(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ie(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function T(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function L(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)T(a).appendChild(i);else if("around"===n){var s=T(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ht(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function O(t,e){return L("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function M(t,e,i,n){return L("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function C(t,e,i,n){return L("svg",{className:e,inside:t,width:i,height:n})}function D(t){return L("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),L("g",n)}function S(t){return L("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*i.y,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z\n\t\tL"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*n+o,h=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+"\n\t\tM"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function F(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=O(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),M(a,"0%",e,s[0]),M(a,"50%",e,s[1]),M(a,"100%",e,s[2]),n}function H(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Jt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return L("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function j(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),L("rect",o)}function I(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,se):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=L("text",{className:"legend-dataset-text",x:0,y:0,dy:2*re+"px","font-size":1.2*re+"px","text-anchor":"start",fill:le,innerHTML:a}),o=L("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(L("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,se):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=L("text",{className:"legend-dataset-text",x:0,y:0,dx:re+"px",dy:re/3+"px","font-size":1.2*re+"px","text-anchor":"start",fill:le,innerHTML:a}),o=L("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(L("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||re;return L("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||le,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=oe);var s=L("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=L("text",{x:0,y:i>n?i+ae:i-ae-re,dy:re+"px","font-size":re+"px","text-anchor":"middle",innerHTML:e+""}),o=L("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=oe),a.lineType||(a.lineType=""),a.shortenNumbers&&(e=x(e));var s=L("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=L("text",{x:i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=oe),n.className||(n.className="");var a=-1*ne,s="span"===n.mode?i+ne:0;return"tick"===n.mode&&"right"===n.pos&&(a=i+ne,s=i),a+=n.offset,s+=n.offset,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,shortenNumbers:n.shortenNumbers})}function G(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=oe),n.className||(n.className="");var a=i+ne,s="span"===n.mode?-1*ne:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ne,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=L("text",{className:"chart-label",x:"left"===n.labelPos?ae:i-d(e,5)-ae,y:0,dy:re/-2+"px","font-size":re+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||oe,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function X(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=L("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:oe,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=L("text",{className:"chart-label",x:"left"===a.labelPos?ae:i-d(n+"",4.5)-ae,y:0,dy:re/-2+"px","font-size":re+"px","text-anchor":"start",innerHTML:n+""}),l=L("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=m(e,o.zeroLine),u=Vt(l,2),h=u[0],c=u[1];c-=r,0===h&&(h=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(h,!0)||(h=0),f(i,!0)||(i=0);var d=L("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:h});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=L("text",{className:"data-point-value",x:i/2,y:0,dy:re/2*-1+"px","font-size":re+"px","text-anchor":"middle",innerHTML:a}),v=L("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=L("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=L("text",{className:"data-point-value",x:0,y:0,dy:re/2*-1-i+"px","font-size":re+"px","text-anchor":"middle",innerHTML:a}),l=L("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function $(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=F(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var u=F(a.svgDefs,i,!0),h="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(h,"region-fill","none","url(#"+u+")")}return l}function Q(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ve,"translate",{transform:a}]}function Z(t,e,i){return Q(t,[i,0],[e,0],pe)}function tt(t,e,i){return Q(t,[0,i],[0,e],pe)}function et(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},pe,ve],Q(t,[0,n],[0,i],pe)]}function it(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=m(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Vt(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},ce,ve],Q(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],pe)]:[[t,{width:n,height:o,x:e,y:l},ce,ve]]}function nt(t,e,i){return"circle"!==t.nodeName?[Q(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],pe)]:[[t,{cx:e,cy:i},ce,ve]]}function at(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},de,ve];if(s.push(o),t.region){var l=e[0]+","+n+"L",u="L"+e.slice(-1)[0]+", "+n,h=[t.region,{d:"M"+l+r+u},de,ve];s.push(h)}return s}function st(t,e){return[t,{d:e},ce,ve]}function rt(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var u=void 0;u="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:h,to:c,begin:"0s",dur:i/1e3+"s",values:h+";"+c,keySplines:ge[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)u.setAttribute(p,d[p]);r.appendChild(u),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}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 i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=rt.apply(void 0,Ut(t)),l=Vt(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ut(t,e,i){if(0!==i.length){var n=lt(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},fe)}}function ht(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function ct(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function dt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function pt(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function ft(t){return new Date(t.getTime())}function vt(t,e){var i=xt(t);return Math.ceil(gt(i,e)/xe)}function gt(t,e){var i=we*ke;return(dt(e)-dt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function yt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Ae[t];return e?i.slice(0,3):i}function bt(t,e){return new Date(e,t+1,0)}function xt(t){var e=ft(t),i=e.getDay();return 0!==i&&kt(e,-1*i),e}function kt(t,e){t.setDate(t.getDate()+e)}function wt(t,e,i){var n=Object.keys(Le).filter(function(e){return t.includes(e)}),a=Le[n[0]];return Object.assign(a,{constants:e,getData:i}),new Te(a)}function At(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Pt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Tt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=At(t),n=Vt(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Pt(a=a.toFixed(6),r);return o=o.map(function(t){return t*Math.pow(10,s)})}function Lt(t){function e(t,e){for(var i=Tt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Ut(t)),a=Math.min.apply(Math,Ut(t)),s=[];if(n>=0&&a>=0)At(n)[1],s=i?Tt(n,a):Tt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(At(n)[1],s=e(n,r)):(At(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);At(o)[1],s=(s=i?Tt(o,l):Tt(o)).reverse().map(function(t){return-1*t})}return s}function Ot(t){var e=Mt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Mt(t){return t[1]-t[0]}function Ct(t){return t[t.length-1]-t[0]}function Dt(t,e){return h(e.zeroLine-t*e.scaleMultiplier)}function Nt(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Xt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/Kt,s=void 0;if(i){var r=Math.max.apply(Math,Ut(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Ft(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new De(e,i)):Se[t]?new Se[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ht="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),It=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
    \n\t\t\t\t
    '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ee={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ie=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ee[t]||t},ne=6,ae=4,se=15,re=10,oe="#dadada",le="#555b51",ue={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},he={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},ce=350,de=350,pe=ce,fe=250,ve="easein",ge={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",ye=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(Gt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=qt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return It(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Qt[e])).forEach(function(t){var e=ie(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new te({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-u(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=C(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=D(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ut(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=ct(this.svg);ht(this.title||"Chart",[t])}}]),e}(),be=function(t){function e(t,i){return jt(this,e),Bt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Yt(e,t),It(e,[{key:"configure",value:function(t){Rt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-u(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,h=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],h+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(ye),xe=7,ke=1e3,we=86400,Ae=["January","February","March","April","May","June","July","August","September","October","November","December"],Pe=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Te=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,u=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return It(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){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}(),Le={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return st(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return st(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return H(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return U(i,t.labels[n],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})})},animateElements:function(t){var e=t.positions,i=t.labels,n=this.oldData.positions,a=this.oldData.labels,s=y(n,e),r=Vt(s,2);n=r[0],e=r[1];var o=y(a,i),l=Vt(o,2);return a=l[0],i=l[1],this.render({positions:n,labels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return G(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=y(n,e),r=Vt(s,2);n=r[0],e=r[1];var o=y(a,i),l=Vt(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return Z(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return q(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=y(this.oldData,t),i=Vt(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return tt(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return X(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=y(this.oldData,t),i=Vt(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var u=[];return this.store.map(function(t,e){u=u.concat(et(t,s[e],n[e],o[e]))}),u}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,u=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,yt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=j("day",l,u,r,o,t.fill,n);e.serializedSubDomains.push(a)}u+=s}),u=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return J(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,u=y(s,e),h=Vt(u,2);s=h[0],e=h[1];var c=y(r,i),d=Vt(c,2);r=d[0],i=d[1];var p=y(o,n),f=Vt(p,2);o=f[0],n=f[1];var v=y(l,a),g=Vt(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var m=[];return this.store.map(function(a,s){m=m.concat(it(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),m}},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=$(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=y(a,e),l=Vt(o,2);a=l[0],e=l[1];var u=y(s,i),h=Vt(u,2);s=h[0],i=h[1];var c=y(r,n),d=Vt(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(at(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(nt(t,e[n],i[n]))}),p}}},Oe=function(t){function i(t,e){jt(this,i);var n=Bt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Yt(i,t),It(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Jt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=wt.apply(void 0,Ut(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Rt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),u=l.left-o.left+parseInt(s.getAttribute("width"))/2,h=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(u,h,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(be),Me=function(t){function i(t,e){jt(this,i);var n=Bt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Yt(i,t),It(i,[{key:"configure",value:function(t){Rt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Rt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],m=void 0,y=void 0;t.init?(m=g?g.startPosition:f,y=g?g.endPosition:f):(m=f,y=v);var b=360===u?_(m,y,t.center,t.radius,a,h):E(m,y,t.center,t.radius,a,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=wt.apply(void 0,Ut(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(be),Ce=function(t){function e(t,i){jt(this,e);var n=Bt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Yt(e,t),It(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*xe+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(vt(i.start,i.end)+n)+u(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+u(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*ke);e[pt(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=ft(this.data.start),t.end=ft(this.data.end),t.firstWeekStart=ft(t.start),t.noOfWeeks=vt(t.start,t.end),t.distribution=St(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=xt(t),r={index:n,cols:[]};kt(e=ft(e)||bt(n,a),1);for(var o=vt(s,e),l=[],u=void 0,h=0;h2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=ft(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=pt(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=pt(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[Et(i,this.state.distribution)]}}}]),e}(ye),De=function(t){function i(t,e){jt(this,i);var n=Bt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Yt(i,t),It(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Rt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),t.axisOptions=t.axisOptions||{},t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=t.axisOptions.xAxisMode||"span",this.config.yAxisMode=t.axisOptions.yAxisMode||"span",this.config.xIsSeries=t.axisOptions.xIsSeries||0,this.config.shortenYAxisNumbers=t.axisOptions.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return _t(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return h(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=Lt(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false"),i=this.height/Ct(e),n=Mt(e)*i,a=this.height-Ot(e)*n;this.state.yAxis={labels:e,positions:e.map(function(t){return a-t*i}),scaleMultiplier:i,zeroLine:a},this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e){return e.map(function(e){return Dt(e,t.yAxis)})};t.datasets=this.data.datasets.map(function(t,i){var n=t.values,a=t.cumulativeYs||[];return{name:t.name&&t.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:i,chartType:t.chartType,values:n,yPositions:e(n),cumulativeYs:a,cumulativeYPos:e(a)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){er(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=Nt(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=I(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=ue[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];he[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Rt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Rt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(ye),Ne=function(t){function i(t,e){jt(this,i);var n=Bt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Yt(i,t),It(i,[{key:"configure",value:function(t){Rt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Rt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],m=void 0,y=void 0;t.init?(m=g?g.startPosition:f,y=g?g.endPosition:f):(m=f,y=v);var b=360===u?W(m,y,t.center,t.radius,t.clockWise,h):z(m,y,t.center,t.radius,t.clockWise,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=wt.apply(void 0,Ut(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){ot(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else ot(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(be),Se={bar:De,line:De,percentage:Oe,heatmap:Ce,pie:Me,donut:Ne},Ee=function t(e,i){return jt(this,t),Ft(i.type,e,i)},_e=Object.freeze({Chart:Ee,PercentageChart:Oe,PieChart:Me,Heatmap:Ce,AxisChart:De}),ze={};return ze.NAME="Frappe Charts",ze.VERSION="1.5.8",ze=Object.assign({},ze,_e)}(); +var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function u(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function h(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function D(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function M(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)D(a).appendChild(i);else if("around"===n){var s=D(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function T(t,e){return M("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function C(t,e,i,n){return M("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return M("svg",{className:e,inside:t,width:i,height:n})}function O(t){return M("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),M("g",n)}function S(t){return M("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*i.y,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z\n\t\tL"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*n+o,h=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+"\n\t\tM"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=T(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),C(a,"0%",e,s[0]),C(a,"50%",e,s[1]),C(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return M("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),M("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dy:2*oe+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dx:oe+"px",dy:oe/3+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||oe;return M("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le);var s=M("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=M("text",{x:0,y:i>n?i+se:i-se-oe,dy:oe+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:e+""}),o=M("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=M("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=M("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:oe/2-2+"px","font-size":oe+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=M("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||le,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=M("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:le,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=M("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:n+""}),l=M("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),u=Ut(l,2),h=u[0],c=u[1];c-=r,0===h&&(h=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(h,!0)||(h=0),f(i,!0)||(i=0);var d=M("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:h});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=M("text",{className:"data-point-value",x:i/2,y:0,dy:oe/2*-1+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),v=M("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=M("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=M("text",{className:"data-point-value",x:0,y:0,dy:oe/2*-1-i+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),l=M("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var u=H(a.svgDefs,i,!0),h="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(h,"region-fill","none","url(#"+u+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ge,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],fe)}function et(t,e,i){return Z(t,[0,i],[0,e],fe)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},fe,ge],Z(t,[0,n],[0,i],fe)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},de,ge],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],fe)]:[[t,{width:n,height:o,x:e,y:l},de,ge]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],fe)]:[[t,{cx:e,cy:i},de,ge]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},pe,ge];if(s.push(o),t.region){var l=e[0]+","+n+"L",u="L"+e.slice(-1)[0]+", "+n,h=[t.region,{d:"M"+l+r+u},pe,ge];s.push(h)}return s}function rt(t,e){return[t,{d:e},de,ge]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var u=void 0;u="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:h,to:c,begin:"0s",dur:i/1e3+"s",values:h+";"+c,keySplines:ye[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)u.setAttribute(p,d[p]);r.appendChild(u),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ut(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ht(t,e,i){if(0!==i.length){var n=ut(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ve)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/ke)}function yt(t,e){var i=Ae*we;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Pe[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new Me(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Dt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Tt(t){function e(t,e){for(var i=Mt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Mt(n,a):Mt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Mt(o,l):Mt(o)).reverse().map(function(t){return-1*t})}return s}function Ct(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return h(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ne(e,i)):Ee[t]?new Ee[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
      \n\t\t\t\t
      '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=10,le="#dadada",ue="#555b51",he={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},ce={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},de=350,pe=350,fe=de,ve=250,ge="easein",ye={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",be=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-u(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ht(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),xe=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-u(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,h=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],h+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(be),ke=7,we=1e3,Ae=86400,Pe=["January","February","March","April","May","June","July","August","September","October","November","December"],De=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Me=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,u=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(t,n){t.positions.map(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:e.constants.width}))}),i):t.positions.map(function(i,n){return G(i,t.labels[n],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})})},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var u=[];return this.store.map(function(t,e){u=u.concat(it(t,s[e],n[e],o[e]))}),u}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,u=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,u,r,o,t.fill,n);e.serializedSubDomains.push(a)}u+=s}),u=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,u=m(s,e),h=Ut(u,2);s=h[0],e=h[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var u=m(s,i),h=Ut(u,2);s=h[0],i=h[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Ce=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),u=l.left-o.left+parseInt(s.getAttribute("width"))/2,h=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(u,h,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(xe),Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?_(y,m,t.center,t.radius,a,h):E(y,m,t.center,t.radius,a,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Oe=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*ke+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+u(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+u(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*we);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],u=void 0,h=0;h2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(be),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):this.config.yAxisMode=n.yAxisMode||"span",this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return h(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0;if(t instanceof Array)n=Tt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Ct(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var l in t)!function(l){var u=t[l];n=Tt(u,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Ct(n)*s,o=n.map(function(t){return r-t*a});var h=e.config.yAxisConfig.find(function(t){return l===t.id})||[],c=h?h.position:"right";if(e.state.yAxis.length){var d=[],p=e.state.yAxis[0];p.positions.forEach(function(t){d.push(Math.ceil(t/a))}),n=d.reverse(),r=e.height-Ct(n)*s,o=p.positions}e.state.yAxis.push({axisID:l||"left-axis",labels:n,title:h.title,pos:c,scaleMultiplier:a,zeroLine:r,positions:o})}(l)}this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e,i){return e.map(function(e){var n=t.yAxis;return n instanceof Array&&(n=n.length>1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-h/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:h,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=he[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];ce[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(be),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?I(y,m,t.center,t.radius,t.clockWise,h):z(y,m,t.center,t.radius,t.clockWise,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Ee={bar:Ne,line:Ne,percentage:Ce,heatmap:Oe,pie:Le,donut:Se},_e=function t(e,i){return jt(this,t),Wt(i.type,e,i)},ze=Object.freeze({Chart:_e,PercentageChart:Ce,PieChart:Le,Heatmap:Oe,AxisChart:Ne}),Ie={};return Ie.NAME="Frappe Charts",Ie.VERSION="1.6.2",Ie=Object.assign({},Ie,ze)}(); //# sourceMappingURL=frappe-charts.min.js.map diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index b73b038..52e147e 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.lineType) options.lineType = '';\n\tif (options.shortenNumbers) label = shortenLargeNumber(label);\n\n\tlet className = 'line-horizontal ' + options.className +\n\t\t(options.lineType === \"dashed\" ? \"dashed\": \"\");\n\n\tlet l = createSVG('line', {\n\t\tclassName: className,\n\t\tx1: x1,\n\t\tx2: x2,\n\t\ty1: 0,\n\t\ty2: 0,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / 2 - 2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': x1 < x2 ? 'end' : 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(0, ${y})`,\n\t\t'stroke-opacity': 1\n\t});\n\n\tif(text === 0 || text === '0') {\n\t\tline.style.stroke = \"rgba(27, 31, 35, 0.6)\";\n\t}\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nexport function yLine(y, label, width, options={}) {\n\tif (!isValidNumber(y)) y = 0;\n\n\tif(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType,\n\t\tshortenNumbers: options.shortenNumbers\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { 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\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\tyAxis: {\n\t\tlayerClass: 'y axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\tyLine(position, data.labels[i], this.constants.width,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos, shortenNumbers: this.constants.shortenNumbers})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.labels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tlabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { 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.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n\tlet zeroData = {\n\t\tlabels: realData.labels.slice(0, -1),\n\t\tdatasets: realData.datasets.map(d => {\n\t\t\treturn {\n\t\t\t\tname: '',\n\t\t\t\tvalues: zeroArray.slice(0, -1),\n\t\t\t\tchartType: d.chartType\n\t\t\t};\n\t\t}),\n\t};\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
        \n\t\t\t\t
        `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n\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 && d.name.replace(/<|>|&/g, (char) => char == '&' ? '&' : char == '<' ? '<' : '>'),\n\t\t\t\tindex: i,\n\t\t\t\tchartType: d.chartType,\n\n\t\t\t\tvalues: values,\n\t\t\t\tyPositions: scaleAll(values),\n\n\t\t\t\tcumulativeYs: cumulativeYs,\n\t\t\t\tcumulativeYPos: scaleAll(cumulativeYs),\n\t\t\t};\n\t\t});\n\t}\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n\tgetAllYValues() {\n\t\tlet key = 'values';\n\n\t\tif(this.barOptions.stacked) {\n\t\t\tkey = 'cumulativeYs';\n\t\t\tlet cumulative = new Array(this.state.datasetLength).fill(0);\n\t\t\tthis.data.datasets.map((d, i) => {\n\t\t\t\tlet values = this.data.datasets[i].values;\n\t\t\t\td[key] = cumulative = cumulative.map((c, i) => c + values[i]);\n\t\t\t});\n\t\t}\n\n\t\tlet allValueLists = this.data.datasets.map(d => d[key]);\n\t\tif(this.data.yMarkers) {\n\t\t\tallValueLists.push(this.data.yMarkers.map(d => d.value));\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.data.yRegions.map(d => {\n\t\t\t\tallValueLists.push([d.end, d.start]);\n\t\t\t});\n\t\t}\n\n\t\treturn [].concat(...allValueLists);\n\t}\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'yAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.yAxisMode,\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tshortenNumbers: this.config.shortenYAxisNumbers\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet stacked = this.barOptions.stacked;\n\n\t\t\t\t\tlet spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n\t\t\t\t\tlet barsWidth = s.unitWidth * (1 - spaceRatio);\n\t\t\t\t\tlet barWidth = barsWidth/(stacked ? 1 : barDatasets.length);\n\n\t\t\t\t\tlet xPositions = s.xAxis.positions.map(x => x - barsWidth/2);\n\t\t\t\t\tif(!stacked) {\n\t\t\t\t\t\txPositions = xPositions.map(p => p + barWidth * index);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet labels = new Array(s.datasetLength).fill('');\n\t\t\t\t\tif(this.config.valuesOverPoints) {\n\t\t\t\t\t\tif(stacked && d.index === s.datasets.length - 1) {\n\t\t\t\t\t\t\tlabels = d.cumulativeYs;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabels = d.values;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet offsets = new Array(s.datasetLength).fill(0);\n\t\t\t\t\tif(stacked) {\n\t\t\t\t\t\toffsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: s.yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet lineConfigs = lineDatasets.map(d => {\n\t\t\tlet index = d.index;\n\t\t\treturn [\n\t\t\t\t'lineGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tsvgDefs: this.svgDefs,\n\t\t\t\t\theatline: this.lineOptions.heatline,\n\t\t\t\t\tregionFill: this.lineOptions.regionFill,\n\t\t\t\t\tspline: this.lineOptions.spline,\n\t\t\t\t\thideDots: this.lineOptions.hideDots,\n\t\t\t\t\thideLine: this.lineOptions.hideLine,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\tlet d = s.datasets[index];\n\t\t\t\t\tlet minLine = s.yAxis.positions[0] < s.yAxis.zeroLine\n\t\t\t\t\t\t? s.yAxis.positions[0] : s.yAxis.zeroLine;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xAxis.positions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\n\t\t\t\t\t\tvalues: d.values,\n\n\t\t\t\t\t\tzeroLine: minLine,\n\t\t\t\t\t\tradius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import 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.8';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","shortenNumbers","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","title","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","positions","position","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","newOptions","startPos","endPos","_this6","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxisMode","yAxisMode","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","xAxis","dataValues","intervalHeight","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","cumulative","allValueLists","barDatasets","lineDatasets","barsConfigs","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this7","setCurrentDataPoint","_this9","_this10","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import {\n getBarHeightAndYAttr,\n truncateString,\n shortenLargeNumber,\n getSplineCurvePointsStr\n} from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n return typeof expr === 'string' ? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n var element = document.createElementNS('http://www.w3.org/2000/svg', tag);\n\n for (var i in o) {\n var val = o[i];\n\n if (i === 'inside') {\n $(val).appendChild(element);\n } else if (i === 'around') {\n var ref = $(val);\n ref.parentNode.insertBefore(element, ref);\n element.appendChild(ref);\n } else if (i === 'styles') {\n if (typeof val === 'object') {\n Object.keys(val).map((prop) => {\n element.style[prop] = val[prop];\n });\n }\n } else {\n if (i === 'className') {\n i = 'class';\n }\n if (i === 'innerHTML') {\n element['textContent'] = val;\n } else {\n element.setAttribute(i, val);\n }\n }\n }\n\n return element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n return createSVG('linearGradient', {\n inside: svgDefElem,\n id: gradientId,\n x1: 0,\n x2: 0,\n y1: 0,\n y2: 1\n });\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n return createSVG('stop', {\n inside: gradElem,\n style: `stop-color: ${color}`,\n offset: offset,\n 'stop-opacity': opacity\n });\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n return createSVG('svg', {\n className: className,\n inside: parent,\n width: width,\n height: height\n });\n}\n\nexport function makeSVGDefs(svgContainer) {\n return createSVG('defs', {\n inside: svgContainer\n });\n}\n\nexport function makeSVGGroup(className, transform = '', parent = undefined) {\n let args = {\n className: className,\n transform: transform\n };\n if (parent) args.inside = parent;\n return createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className = '') {\n let g = createSVG('g', {\n className: className\n });\n elements.forEach((e) => g.appendChild(e));\n return g;\n}\n\nexport function makePath(\n pathStr,\n className = '',\n stroke = 'none',\n fill = 'none',\n strokeWidth = 2\n) {\n return createSVG('path', {\n className: className,\n d: pathStr,\n styles: {\n stroke: stroke,\n fill: fill,\n 'stroke-width': strokeWidth\n }\n });\n}\n\nexport function makeArcPathStr(\n startPosition,\n endPosition,\n center,\n radius,\n clockWise = 1,\n largeArc = 0\n) {\n let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n return `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(\n startPosition,\n endPosition,\n center,\n radius,\n clockWise = 1,\n largeArc = 0\n) {\n let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n let [arcEndX, midArc, arcEndY] = [\n center.x + endPosition.x,\n center.y * 2,\n center.y + endPosition.y\n ];\n return `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(\n startPosition,\n endPosition,\n center,\n radius,\n clockWise = 1,\n largeArc = 0\n) {\n let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n return `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(\n startPosition,\n endPosition,\n center,\n radius,\n clockWise = 1,\n largeArc = 0\n) {\n let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n let [arcEndX, midArc, arcEndY] = [\n center.x + endPosition.x,\n radius * 2 + arcStartY,\n center.y + startPosition.y\n ];\n\n return `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n let gradientId =\n 'path-fill-gradient' + '-' + color + '-' + (lighter ? 'lighter' : 'default');\n let gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n let opacities = [1, 0.6, 0.2];\n if (lighter) {\n opacities = [0.4, 0.2, 0];\n }\n\n setGradientStop(gradientDef, '0%', color, opacities[0]);\n setGradientStop(gradientDef, '50%', color, opacities[1]);\n setGradientStop(gradientDef, '100%', color, opacities[2]);\n\n return gradientId;\n}\n\nexport function percentageBar(\n x,\n y,\n width,\n height,\n depth = PERCENTAGE_BAR_DEFAULT_DEPTH,\n fill = 'none'\n) {\n let args = {\n className: 'percentage-bar',\n x: x,\n y: y,\n width: width,\n height: height,\n fill: fill,\n styles: {\n stroke: lightenDarkenColor(fill, -25),\n // Diabolically good: https://stackoverflow.com/a/9000859\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n 'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n 'stroke-width': depth\n }\n };\n\n return createSVG('rect', args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill = 'none', data = {}) {\n let args = {\n className: className,\n x: x,\n y: y,\n width: size,\n height: size,\n rx: radius,\n fill: fill\n };\n\n Object.keys(data).map((key) => {\n args[key] = data[key];\n });\n\n return createSVG('rect', args);\n}\n\nexport function legendBar(x, y, size, fill = 'none', label, truncate = false) {\n label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n let args = {\n className: 'legend-bar',\n x: 0,\n y: 0,\n width: size,\n height: '2px',\n fill: fill\n };\n let text = createSVG('text', {\n className: 'legend-dataset-text',\n x: 0,\n y: 0,\n dy: FONT_SIZE * 2 + 'px',\n 'font-size': FONT_SIZE * 1.2 + 'px',\n 'text-anchor': 'start',\n fill: FONT_FILL,\n innerHTML: label\n });\n\n let group = createSVG('g', {\n transform: `translate(${x}, ${y})`\n });\n group.appendChild(createSVG('rect', args));\n group.appendChild(text);\n\n return group;\n}\n\nexport function legendDot(x, y, size, fill = 'none', label, truncate = false) {\n label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n let args = {\n className: 'legend-dot',\n cx: 0,\n cy: 0,\n r: size,\n fill: fill\n };\n let text = createSVG('text', {\n className: 'legend-dataset-text',\n x: 0,\n y: 0,\n dx: FONT_SIZE + 'px',\n dy: FONT_SIZE / 3 + 'px',\n 'font-size': FONT_SIZE * 1.2 + 'px',\n 'text-anchor': 'start',\n fill: FONT_FILL,\n innerHTML: label\n });\n\n let group = createSVG('g', {\n transform: `translate(${x}, ${y})`\n });\n group.appendChild(createSVG('circle', args));\n group.appendChild(text);\n\n return group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n let fontSize = options.fontSize || FONT_SIZE;\n let dy = options.dy !== undefined ? options.dy : fontSize / 2;\n let fill = options.fill || FONT_FILL;\n let textAnchor = options.textAnchor || 'start';\n return createSVG('text', {\n className: className,\n x: x,\n y: y,\n dy: dy + 'px',\n 'font-size': fontSize + 'px',\n fill: fill,\n 'text-anchor': textAnchor,\n innerHTML: content\n });\n}\n\nfunction makeVertLine(x, label, y1, y2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n let l = createSVG('line', {\n className: 'line-vertical ' + options.className,\n x1: 0,\n x2: 0,\n y1: y1,\n y2: y2,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: 0,\n y: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n dy: FONT_SIZE + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'middle',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(${x}, 0)`\n });\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options = {}) {\n if (!isValidNumber(x)) x = 0;\n\n if (!options.pos) options.pos = 'bottom';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n // Draw X axis line in span/tick mode with optional label\n // \ty2(span)\n // \t\t\t\t\t\t|\n // \t\t\t\t\t\t|\n //\t\t\t\tx line\t|\n //\t\t\t\t\t\t|\n // \t\t\t\t\t \t|\n // ---------------------+-- y2(tick)\n //\t\t\t\t\t\t|\n //\t\t\t\t\t\t\ty1\n\n let y1 = height + AXIS_TICK_LENGTH;\n let y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n if (options.mode === 'tick' && options.pos === 'top') {\n // top axis ticks\n y1 = -1 * AXIS_TICK_LENGTH;\n y2 = 0;\n }\n\n return makeVertLine(x, label, y1, y2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType\n });\n}\n\nexport function yMarker(y, label, width, options = {}) {\n if (!options.labelPos) options.labelPos = 'right';\n let x =\n options.labelPos === 'left'\n ? LABEL_MARGIN\n : width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n let labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x,\n y: 0,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n innerHTML: label + ''\n });\n\n let line = makeHoriLine(y, '', 0, width, {\n stroke: options.stroke || BASE_LINE_COLOR,\n className: options.className || '',\n lineType: options.lineType\n });\n\n line.appendChild(labelSvg);\n\n return line;\n}\n\nexport function yRegion(y1, y2, width, label, options = {}) {\n // return a group\n let height = y1 - y2;\n\n let rect = createSVG('rect', {\n className: `bar mini`, // remove class\n styles: {\n fill: `rgba(228, 234, 239, 0.49)`,\n stroke: BASE_LINE_COLOR,\n 'stroke-dasharray': `${width}, ${height}`\n },\n // 'data-point-index': index,\n x: 0,\n y: 0,\n width: width,\n height: height\n });\n\n if (!options.labelPos) options.labelPos = 'right';\n let x =\n options.labelPos === 'left'\n ? LABEL_MARGIN\n : width - getStringWidth(label + '', 4.5) - LABEL_MARGIN;\n\n let labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x,\n y: 0,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n innerHTML: label + ''\n });\n\n let region = createSVG('g', {\n transform: `translate(0, ${y2})`\n });\n\n region.appendChild(rect);\n region.appendChild(labelSvg);\n\n return region;\n}\n\nexport function datasetBar(\n x,\n yTop,\n width,\n color,\n label = '',\n index = 0,\n offset = 0,\n meta = {}\n) {\n let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n y -= offset;\n\n if (height === 0) {\n height = meta.minHeight;\n y -= meta.minHeight;\n }\n\n // Preprocess numbers to avoid svg building errors\n if (!isValidNumber(x)) x = 0;\n if (!isValidNumber(y)) y = 0;\n if (!isValidNumber(height, true)) height = 0;\n if (!isValidNumber(width, true)) width = 0;\n\n let rect = createSVG('rect', {\n className: `bar mini`,\n style: `fill: ${color}`,\n 'data-point-index': index,\n x: x,\n y: y,\n width: width,\n height: height\n });\n\n label += '';\n\n if (!label && !label.length) {\n return rect;\n } else {\n rect.setAttribute('y', 0);\n rect.setAttribute('x', 0);\n let text = createSVG('text', {\n className: 'data-point-value',\n x: width / 2,\n y: 0,\n dy: (FONT_SIZE / 2) * -1 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'middle',\n innerHTML: label\n });\n\n let group = createSVG('g', {\n 'data-point-index': index,\n transform: `translate(${x}, ${y})`\n });\n group.appendChild(rect);\n group.appendChild(text);\n\n return group;\n }\n}\n\nexport function datasetDot(x, y, radius, color, label = '', index = 0) {\n let dot = createSVG('circle', {\n style: `fill: ${color}`,\n 'data-point-index': index,\n cx: x,\n cy: y,\n r: radius\n });\n\n label += '';\n\n if (!label && !label.length) {\n return dot;\n } else {\n dot.setAttribute('cy', 0);\n dot.setAttribute('cx', 0);\n\n let text = createSVG('text', {\n className: 'data-point-value',\n x: 0,\n y: 0,\n dy: (FONT_SIZE / 2) * -1 - radius + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'middle',\n innerHTML: label\n });\n\n let group = createSVG('g', {\n 'data-point-index': index,\n transform: `translate(${x}, ${y})`\n });\n group.appendChild(dot);\n group.appendChild(text);\n\n return group;\n }\n}\n\nexport function getPaths(xList, yList, color, options = {}, meta = {}) {\n let pointsList = yList.map((y, i) => xList[i] + ',' + y);\n let pointsStr = pointsList.join('L');\n\n // Spline\n if (options.spline) pointsStr = getSplineCurvePointsStr(xList, yList);\n\n let path = makePath('M' + pointsStr, 'line-graph-path', color);\n\n // HeatLine\n if (options.heatline) {\n let gradient_id = makeGradient(meta.svgDefs, color);\n path.style.stroke = `url(#${gradient_id})`;\n }\n\n let paths = {\n path: path\n };\n\n // Region\n if (options.regionFill) {\n let gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n let pathStr =\n 'M' +\n `${xList[0]},${meta.zeroLine}L` +\n pointsStr +\n `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n paths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n }\n\n return paths;\n}\n\nexport let makeOverlay = {\n bar: (unit) => {\n let transformValue;\n if (unit.nodeName !== 'rect') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let overlay = unit.cloneNode();\n overlay.style.fill = '#000000';\n overlay.style.opacity = '0.4';\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n return overlay;\n },\n\n dot: (unit) => {\n let transformValue;\n if (unit.nodeName !== 'circle') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let overlay = unit.cloneNode();\n let radius = unit.getAttribute('r');\n let fill = unit.getAttribute('fill');\n overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n overlay.setAttribute('fill', fill);\n overlay.style.opacity = '0.6';\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n return overlay;\n },\n\n heat_square: (unit) => {\n let transformValue;\n if (unit.nodeName !== 'circle') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let overlay = unit.cloneNode();\n let radius = unit.getAttribute('r');\n let fill = unit.getAttribute('fill');\n overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n overlay.setAttribute('fill', fill);\n overlay.style.opacity = '0.6';\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n return overlay;\n }\n};\n\nexport let updateOverlay = {\n bar: (unit, overlay) => {\n let transformValue;\n if (unit.nodeName !== 'rect') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let attributes = ['x', 'y', 'width', 'height'];\n Object.values(unit.attributes)\n .filter((attr) => attributes.includes(attr.name) && attr.specified)\n .map((attr) => {\n overlay.setAttribute(attr.name, attr.nodeValue);\n });\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n },\n\n dot: (unit, overlay) => {\n let transformValue;\n if (unit.nodeName !== 'circle') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let attributes = ['cx', 'cy'];\n Object.values(unit.attributes)\n .filter((attr) => attributes.includes(attr.name) && attr.specified)\n .map((attr) => {\n overlay.setAttribute(attr.name, attr.nodeValue);\n });\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n },\n\n heat_square: (unit, overlay) => {\n let transformValue;\n if (unit.nodeName !== 'circle') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let attributes = ['cx', 'cy'];\n Object.values(unit.attributes)\n .filter((attr) => attributes.includes(attr.name) && attr.specified)\n .map((attr) => {\n overlay.setAttribute(attr.name, attr.nodeValue);\n });\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n }\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { makeText, generateAxisLabel, 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 this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\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\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n return data.positions.map((position, i) => {\n return yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n });\n });\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
          \n\t\t\t\t
          `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = axisOptions.yAxisMode || 'span';\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions;\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\n const yAxisConfigObject =\n this.config.yAxisConfig.find((item) => key === item.id) || [];\n const yAxisAlignment = yAxisConfigObject\n ? yAxisConfigObject.position\n : 'right';\n\n if (this.state.yAxis.length) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n // we need to loop through original positions.\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","prop","style","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","rotation","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","find","yAxisAlignment","yPtsArray","firstArr","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file diff --git a/src/js/charts/AxisChart.js b/src/js/charts/AxisChart.js index 9c06bbd..49b7517 100644 --- a/src/js/charts/AxisChart.js +++ b/src/js/charts/AxisChart.js @@ -30,20 +30,37 @@ export default class AxisChart extends BaseChart { } configure(options) { - super.configure(options); + super.configure(options); + const { axisOptions = {} } = options; + const { xAxis, yAxis } = axisOptions || {}; - options.axisOptions = options.axisOptions || {}; - options.tooltipOptions = options.tooltipOptions || {}; + 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.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span'; - this.config.formatTooltipX = options.tooltipOptions.formatTooltipX; - this.config.formatTooltipY = options.tooltipOptions.formatTooltipY; + // this will pass an array + // lets determine if we need two yAxis based on if there is length + // to the yAxis array + if (yAxis && yAxis.length) { + this.config.yAxisConfig = yAxis.map((item) => { + return { + yAxisMode: item.yAxisMode, + id: item.id, + position: item.position, + title: item.title + }; + }); + } else { + this.config.yAxisMode = axisOptions.yAxisMode || 'span'; + } - this.config.valuesOverPoints = options.valuesOverPoints; + this.config.xIsSeries = axisOptions.xIsSeries || 0; + this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0; + + this.config.formatTooltipX = options.tooltipOptions.formatTooltipX; + this.config.formatTooltipY = options.tooltipOptions.formatTooltipY; + + this.config.valuesOverPoints = options.valuesOverPoints; } prepareData(data=this.data) { @@ -83,45 +100,106 @@ export default class AxisChart extends BaseChart { }; } - calcYAxisParameters(dataValues, withMinimum = 'false') { - const yPts = calcChartIntervals(dataValues, withMinimum); - const scaleMultiplier = this.height / getValueRange(yPts); - const intervalHeight = getIntervalSize(yPts) * scaleMultiplier; - const zeroLine = this.height - (getZeroIndex(yPts) * intervalHeight); - this.state.yAxis = { - labels: yPts, - positions: yPts.map(d => zeroLine - d * scaleMultiplier), - scaleMultiplier: scaleMultiplier, - zeroLine: zeroLine, - }; + calcYAxisParameters(dataValues, withMinimum = 'false') { + let yPts, scaleMultiplier, intervalHeight, zeroLine, positions; - // Dependent if above changes - this.calcDatasetPoints(); - this.calcYExtremes(); - this.calcYRegions(); - } + // if we have an object we have multiple yAxisParameters. + if (dataValues instanceof Array) { + yPts = calcChartIntervals(dataValues, withMinimum); + scaleMultiplier = this.height / getValueRange(yPts); + intervalHeight = getIntervalSize(yPts) * scaleMultiplier; + zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; + this.state.yAxis = { + labels: yPts, + positions: yPts.map((d) => zeroLine - d * scaleMultiplier), + scaleMultiplier: scaleMultiplier, + zeroLine: zeroLine + }; + } else { + this.state.yAxis = []; + for (let key in dataValues) { + const dataValue = dataValues[key]; + yPts = calcChartIntervals(dataValue, withMinimum); + scaleMultiplier = this.height / getValueRange(yPts); + intervalHeight = getIntervalSize(yPts) * scaleMultiplier; + zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; + positions = yPts.map((d) => zeroLine - d * scaleMultiplier); - calcDatasetPoints() { - let s = this.state; - let scaleAll = values => values.map(val => scale(val, s.yAxis)); + const yAxisConfigObject = + this.config.yAxisConfig.find((item) => key === item.id) || []; + const yAxisAlignment = yAxisConfigObject + ? yAxisConfigObject.position + : 'right'; - s.datasets = this.data.datasets.map((d, i) => { - let values = d.values; - let cumulativeYs = d.cumulativeYs || []; - return { - name: d.name && d.name.replace(/<|>|&/g, (char) => char == '&' ? '&' : char == '<' ? '<' : '>'), - index: i, - chartType: d.chartType, + if (this.state.yAxis.length) { + const yPtsArray = []; + const firstArr = this.state.yAxis[0]; + // we need to loop through original positions. + firstArr.positions.forEach((pos) => { + yPtsArray.push(Math.ceil(pos / scaleMultiplier)); + }); + yPts = yPtsArray.reverse(); + zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; + positions = firstArr.positions; + } - values: values, - yPositions: scaleAll(values), + this.state.yAxis.push({ + axisID: key || 'left-axis', + labels: yPts, + title: yAxisConfigObject.title, + pos: yAxisAlignment, + scaleMultiplier, + zeroLine, + positions + }); + } + } - cumulativeYs: cumulativeYs, - cumulativeYPos: scaleAll(cumulativeYs), - }; - }); - } + // Dependent if above changes + this.calcDatasetPoints(); + this.calcYExtremes(); + this.calcYRegions(); + } + + calcDatasetPoints() { + let s = this.state; + let scaleAll = (values, id) => { + return values.map((val) => { + let { yAxis } = s; + + if (yAxis instanceof Array) { + yAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0]; + } + + return scale(val, yAxis); + }); + }; + + s.barChartIndex = 1; + s.datasets = this.data.datasets.map((d, i) => { + let values = d.values; + let cumulativeYs = d.cumulativeYs || []; + + return { + name: + d.name && + d.name.replace(/<|>|&/g, (char) => + char == '&' ? '&' : char == '<' ? '<' : '>' + ), + index: i, + barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex, + chartType: d.chartType, + + values: values, + yPositions: scaleAll(values, d.axisID), + id: d.axisID, + + cumulativeYs: cumulativeYs, + cumulativeYPos: scaleAll(cumulativeYs, d.axisID) + }; + }); + } calcYExtremes() { let s = this.state; @@ -161,46 +239,73 @@ export default class AxisChart extends BaseChart { } } - getAllYValues() { - let key = 'values'; + getAllYValues() { + let key = 'values'; + let multiAxis = this.config.yAxisConfig ? true : false; + let allValueLists = multiAxis ? {} : []; - if(this.barOptions.stacked) { - key = 'cumulativeYs'; - let cumulative = new Array(this.state.datasetLength).fill(0); - this.data.datasets.map((d, i) => { - let values = this.data.datasets[i].values; - d[key] = cumulative = cumulative.map((c, i) => c + values[i]); - }); - } + let groupBy = (arr, property) => { + return arr.reduce((acc, cur) => { + acc[cur[property]] = [...(acc[cur[property]] || []), cur]; + return acc; + }, {}); + }; - let allValueLists = this.data.datasets.map(d => d[key]); - if(this.data.yMarkers) { - allValueLists.push(this.data.yMarkers.map(d => d.value)); - } - if(this.data.yRegions) { - this.data.yRegions.map(d => { - allValueLists.push([d.end, d.start]); - }); - } + let generateCumulative = (arr) => { + let cumulative = new Array(this.state.datasetLength).fill(0); + arr.forEach((d, i) => { + let values = arr[i].values; + d[key] = cumulative = cumulative.map((c, i) => { + return c + values[i]; + }); + }); + }; - return [].concat(...allValueLists); - } + if (this.barOptions.stacked) { + key = 'cumulativeYs'; + // we need to filter out the different yAxis ID's here. + if (multiAxis) { + const groupedDataSets = groupBy(this.data.datasets, 'axisID'); + // const dataSetsByAxis = this.data.dd + for (var axisID in groupedDataSets) { + generateCumulative(groupedDataSets[axisID]); + } + } else { + generateCumulative(this.data.datasets); + } + } + + // this is the trouble maker, we don't want to merge all + // datasets since we are trying to run two yAxis. + if (multiAxis) { + this.data.datasets.forEach((d) => { + // if the array exists already just push more data into it. + // otherwise create a new array into the object. + allValueLists[d.axisID || key] + ? allValueLists[d.axisID || key].push(...d[key]) + : (allValueLists[d.axisID || key] = [...d[key]]); + }); + } else { + allValueLists = this.data.datasets.map((d) => { + return d[key]; + }); + } + + if (this.data.yMarkers && !multiAxis) { + allValueLists.push(this.data.yMarkers.map((d) => d.value)); + } + + if (this.data.yRegions && !multiAxis) { + this.data.yRegions.map((d) => { + allValueLists.push([d.end, d.start]); + }); + } + + return multiAxis ? allValueLists : [].concat(...allValueLists); + } setupComponents() { let componentConfigs = [ - [ - 'yAxis', - { - mode: this.config.yAxisMode, - width: this.width, - shortenNumbers: this.config.shortenYAxisNumbers - // pos: 'right' - }, - function() { - return this.state.yAxis; - }.bind(this) - ], - [ 'xAxis', { @@ -229,11 +334,43 @@ export default class AxisChart extends BaseChart { ], ]; + // if we have multiple yAxisConfigs we need to update the yAxisDefault + // components to multiple yAxis components. + if (this.config.yAxisConfig && this.config.yAxisConfig.length) { + this.config.yAxisConfig.forEach((yAxis) => { + componentConfigs.push([ + 'yAxis', + { + mode: this.config.yAxisMode, + width: this.width, + shortenNumbers: this.config.shortenYAxisNumbers, + pos: yAxis.position || 'left' + }, + function () { + return this.state.yAxis; + }.bind(this) + ]); + }); + } else { + componentConfigs.push([ + 'yAxis', + { + mode: this.config.yAxisMode, + width: this.width, + shortenNumbers: this.config.shortenYAxisNumbers + }, + function () { + return this.state.yAxis; + }.bind(this) + ]); + } + let barDatasets = this.state.datasets.filter(d => d.chartType === 'bar'); let lineDatasets = this.state.datasets.filter(d => d.chartType === 'line'); let barsConfigs = barDatasets.map(d => { - let index = d.index; + let index = d.index; + let barIndex = d.barIndex || index; return [ 'barGraph' + '-' + d.index, { @@ -246,32 +383,44 @@ export default class AxisChart extends BaseChart { minHeight: this.height * MIN_BAR_PERCENT_HEIGHT, }, function() { - let s = this.state; - let d = s.datasets[index]; - let stacked = this.barOptions.stacked; + let s = this.state; + let { yAxis } = s; + let d = s.datasets[index]; + let { id = 'left-axis' } = d; + let stacked = this.barOptions.stacked; - let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO; - let barsWidth = s.unitWidth * (1 - spaceRatio); - let barWidth = barsWidth/(stacked ? 1 : barDatasets.length); + let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO; + let barsWidth = s.unitWidth * (1 - spaceRatio); + let barWidth = barsWidth / (stacked ? 1 : barDatasets.length); - let xPositions = s.xAxis.positions.map(x => x - barsWidth/2); - if(!stacked) { - xPositions = xPositions.map(p => p + barWidth * index); + // if there are multiple yAxis we need to return the yAxis with the + // proper ID. + if (yAxis instanceof Array) { + // if the person only configured one yAxis in the array return the first. + yAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0]; } - let 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; - } - } - let offsets = new Array(s.datasetLength).fill(0); - if(stacked) { - offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]); - } + let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2); + + if (!stacked) { + xPositions = xPositions.map((p) => { + return p + barWidth * barIndex - barWidth; + }); + } + + let 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; + } + } + let offsets = new Array(s.datasetLength).fill(0); + if (stacked) { + offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]); + } return { xPositions: xPositions, @@ -280,7 +429,7 @@ export default class AxisChart extends BaseChart { // values: d.values, labels: labels, - zeroLine: s.yAxis.zeroLine, + zeroLine: yAxis.zeroLine, barsWidth: barsWidth, barWidth: barWidth, }; @@ -288,41 +437,49 @@ export default class AxisChart extends BaseChart { ]; }); - let lineConfigs = lineDatasets.map(d => { - let index = d.index; - return [ - 'lineGraph' + '-' + d.index, - { - index: index, - color: this.colors[index], - svgDefs: this.svgDefs, - heatline: this.lineOptions.heatline, - regionFill: this.lineOptions.regionFill, - spline: this.lineOptions.spline, - hideDots: this.lineOptions.hideDots, - hideLine: this.lineOptions.hideLine, + let lineConfigs = lineDatasets.map((d) => { + let index = d.index; + return [ + 'lineGraph' + '-' + d.index, + { + index: index, + color: this.colors[index], + svgDefs: this.svgDefs, + heatline: this.lineOptions.heatline, + regionFill: this.lineOptions.regionFill, + spline: this.lineOptions.spline, + hideDots: this.lineOptions.hideDots, + hideLine: this.lineOptions.hideLine, - // same for all datasets - valuesOverPoints: this.config.valuesOverPoints, - }, - function() { - let s = this.state; - let d = s.datasets[index]; - let minLine = s.yAxis.positions[0] < s.yAxis.zeroLine - ? s.yAxis.positions[0] : s.yAxis.zeroLine; + // same for all datasets + valuesOverPoints: this.config.valuesOverPoints + }, + function () { + let s = this.state; + let d = s.datasets[index]; - return { - xPositions: s.xAxis.positions, - yPositions: d.yPositions, + // if we have more than one yindex lets map the values + const yAxis = s.yAxis.length + ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0] + : s.yAxis; - values: d.values, + let minLine = + yAxis.positions[0] < yAxis.zeroLine + ? yAxis.positions[0] + : yAxis.zeroLine; - zeroLine: minLine, - radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE, - }; - }.bind(this) - ]; - }); + return { + xPositions: s.xAxis.positions, + yPositions: d.yPositions, + + values: d.values, + + zeroLine: minLine, + radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE + }; + }.bind(this) + ]; + }); let markerConfigs = [ [ diff --git a/src/js/objects/ChartComponents.js b/src/js/objects/ChartComponents.js index ea1a096..cc1a3f4 100644 --- a/src/js/objects/ChartComponents.js +++ b/src/js/objects/ChartComponents.js @@ -1,5 +1,5 @@ import { makeSVGGroup } from '../utils/draw'; -import { makeText, makePath, xLine, yLine, yMarker, yRegion, datasetBar, datasetDot, percentageBar, getPaths, heatSquare } from '../utils/draw'; +import { makeText, generateAxisLabel, makePath, xLine, yLine, yMarker, yRegion, datasetBar, datasetDot, percentageBar, getPaths, heatSquare } from '../utils/draw'; import { equilizeNoOfElements } from '../utils/draw-utils'; import { translateHoriLine, translateVertLine, animateRegion, animateBar, animateDot, animatePath, animatePathStr } from '../utils/animate'; @@ -50,9 +50,13 @@ class ChartComponent { this.store = this.makeElements(data); this.layer.textContent = ''; - this.store.forEach(element => { - this.layer.appendChild(element); - }); + this.store.forEach((element) => { + element.length + ? element.forEach((el) => { + this.layer.appendChild(el); + }) + : this.layer.appendChild(element); + }); this.labels.forEach(element => { this.layer.appendChild(element); }); @@ -114,36 +118,93 @@ let componentConfigs = { if(newData) return []; } }, - yAxis: { - layerClass: 'y axis', - makeElements(data) { - return data.positions.map((position, i) => - yLine(position, data.labels[i], this.constants.width, - {mode: this.constants.mode, pos: this.constants.pos, shortenNumbers: this.constants.shortenNumbers}) - ); - }, + yAxis: { + layerClass: 'y axis', + makeElements(data) { + let elements = []; - animateElements(newData) { - let newPos = newData.positions; - let newLabels = newData.labels; - let oldPos = this.oldData.positions; - let oldLabels = this.oldData.labels; + if (data.length) { + data.forEach((item, i) => { + item.positions.map((position, i) => { + elements.push( + yLine(position, item.labels[i], this.constants.width, { + mode: this.constants.mode, + pos: item.pos || this.constants.pos, + shortenNumbers: this.constants.shortenNumbers + }) + ); + }); + // we need to make yAxis titles if they are defined + if (item.title) { + elements.push( + generateAxisLabel({ + title: item.title, + position: item.pos, + height: item.zeroLine, + width: this.constants.width + }) + ); + } + }); - [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos); - [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels); + return elements; + } - this.render({ - positions: oldPos, - labels: newLabels - }); + return data.positions.map((position, i) => { + return yLine(position, data.labels[i], this.constants.width, { + mode: this.constants.mode, + pos: this.constants.pos, + shortenNumbers: this.constants.shortenNumbers + }); + }); + }, - return this.store.map((line, i) => { - return translateHoriLine( - line, newPos[i], oldPos[i] - ); - }); - } - }, + animateElements(newData) { + const animateMultipleElements = (oldData, newData) => { + let newPos = newData.positions; + let newLabels = newData.labels; + let oldPos = oldData.positions; + let oldLabels = oldData.labels; + + [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos); + [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels); + + this.render({ + positions: oldPos, + labels: newLabels + }); + + return this.store.map((line, i) => { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + }; + + // we will need to animate both axis if we have more than one. + // so check if the oldData is an array of values. + if (this.oldData instanceof Array) { + return this.oldData.forEach((old, i) => { + animateMultipleElements(old, newData[i]); + }); + } + + let newPos = newData.positions; + let newLabels = newData.labels; + let oldPos = this.oldData.positions; + let oldLabels = this.oldData.labels; + + [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos); + [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels); + + this.render({ + positions: oldPos, + labels: newLabels + }); + + return this.store.map((line, i) => { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + } + }, xAxis: { layerClass: 'x axis', diff --git a/src/js/utils/axis-chart-utils.js b/src/js/utils/axis-chart-utils.js index 42e7dd1..ddf5075 100644 --- a/src/js/utils/axis-chart-utils.js +++ b/src/js/utils/axis-chart-utils.js @@ -61,16 +61,18 @@ export function zeroDataPrep(realData) { let datasetLength = realData.labels.length; let zeroArray = new Array(datasetLength).fill(0); - let zeroData = { - labels: realData.labels.slice(0, -1), - datasets: realData.datasets.map(d => { - return { - name: '', - values: zeroArray.slice(0, -1), - chartType: d.chartType - }; - }), - }; + let zeroData = { + labels: realData.labels.slice(0, -1), + datasets: realData.datasets.map((d) => { + const { axisID } = d; + return { + axisID, + name: '', + values: zeroArray.slice(0, -1), + chartType: d.chartType + }; + }) + }; if(realData.yMarkers) { zeroData.yMarkers = [ diff --git a/src/js/utils/draw.js b/src/js/utils/draw.js index 8466a27..6884415 100644 --- a/src/js/utils/draw.js +++ b/src/js/utils/draw.js @@ -1,4 +1,9 @@ -import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils'; +import { + getBarHeightAndYAttr, + truncateString, + shortenLargeNumber, + getSplineCurvePointsStr +} from './draw-utils'; import { getStringWidth, isValidNumber } from './helpers'; import { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants'; import { lightenDarkenColor } from './colors'; @@ -11,119 +16,143 @@ const BASE_LINE_COLOR = '#dadada'; const FONT_FILL = '#555b51'; function $(expr, con) { - return typeof expr === "string"? (con || document).querySelector(expr) : expr || null; + return typeof expr === 'string' ? (con || document).querySelector(expr) : expr || null; } export function createSVG(tag, o) { - var element = document.createElementNS("http://www.w3.org/2000/svg", tag); + var element = document.createElementNS('http://www.w3.org/2000/svg', tag); - for (var i in o) { - var val = o[i]; + 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); + 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((prop) => { + element.style[prop] = val[prop]; + }); + } + } else { + if (i === 'className') { + i = 'class'; + } + if (i === 'innerHTML') { + element['textContent'] = val; + } else { + element.setAttribute(i, val); + } + } + } - } else if (i === "styles") { - if(typeof val === "object") { - Object.keys(val).map(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; + return element; } function renderVerticalGradient(svgDefElem, gradientId) { - return createSVG('linearGradient', { - inside: svgDefElem, - id: gradientId, - x1: 0, - x2: 0, - y1: 0, - y2: 1 - }); + return createSVG('linearGradient', { + inside: svgDefElem, + id: gradientId, + x1: 0, + x2: 0, + y1: 0, + y2: 1 + }); } function setGradientStop(gradElem, offset, color, opacity) { - return createSVG('stop', { - 'inside': gradElem, - 'style': `stop-color: ${color}`, - 'offset': offset, - 'stop-opacity': opacity - }); + return createSVG('stop', { + inside: gradElem, + style: `stop-color: ${color}`, + offset: offset, + 'stop-opacity': opacity + }); } export function makeSVGContainer(parent, className, width, height) { - return createSVG('svg', { - className: className, - inside: parent, - width: width, - height: height - }); + return createSVG('svg', { + className: className, + inside: parent, + width: width, + height: height + }); } export function makeSVGDefs(svgContainer) { - return createSVG('defs', { - inside: svgContainer, - }); + return createSVG('defs', { + inside: svgContainer + }); } -export function makeSVGGroup(className, transform='', parent=undefined) { - let args = { - className: className, - transform: transform - }; - if(parent) args.inside = parent; - return createSVG('g', args); +export function makeSVGGroup(className, transform = '', parent = undefined) { + let args = { + className: className, + transform: transform + }; + if (parent) args.inside = parent; + return createSVG('g', args); } -export function wrapInSVGGroup(elements, className='') { - let g = createSVG('g', { - className: className - }); - elements.forEach(e => g.appendChild(e)); - return g; +export function wrapInSVGGroup(elements, className = '') { + let g = createSVG('g', { + className: className + }); + elements.forEach((e) => g.appendChild(e)); + return g; } -export function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) { - return createSVG('path', { - className: className, - d: pathStr, - styles: { - stroke: stroke, - fill: fill, - 'stroke-width': strokeWidth - } - }); +export function makePath( + pathStr, + className = '', + stroke = 'none', + fill = 'none', + strokeWidth = 2 +) { + return createSVG('path', { + className: className, + d: pathStr, + styles: { + stroke: stroke, + fill: fill, + 'stroke-width': strokeWidth + } + }); } -export function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){ - let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; - let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y]; - return `M${center.x} ${center.y} +export function makeArcPathStr( + startPosition, + endPosition, + center, + radius, + clockWise = 1, + largeArc = 0 +) { + let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; + let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y]; + return `M${center.x} ${center.y} L${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0} ${arcEndX} ${arcEndY} z`; } -export function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){ - let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; - let [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y]; - return `M${center.x} ${center.y} +export function makeCircleStr( + startPosition, + endPosition, + center, + radius, + clockWise = 1, + largeArc = 0 +) { + let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; + let [arcEndX, midArc, arcEndY] = [ + center.x + endPosition.x, + center.y * 2, + center.y + endPosition.y + ]; + return `M${center.x} ${center.y} L${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0} ${arcEndX} ${midArc} z @@ -132,20 +161,38 @@ export function makeCircleStr(startPosition, endPosition, center, radius, clockW ${arcEndX} ${arcEndY} z`; } -export function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){ - let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; - let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y]; +export function makeArcStrokePathStr( + startPosition, + endPosition, + center, + radius, + clockWise = 1, + largeArc = 0 +) { + let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; + let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y]; - return `M${arcStartX} ${arcStartY} + return `M${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0} ${arcEndX} ${arcEndY}`; } -export function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){ - let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; - let [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y]; +export function makeStrokeCircleStr( + startPosition, + endPosition, + center, + radius, + clockWise = 1, + largeArc = 0 +) { + let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; + let [arcEndX, midArc, arcEndY] = [ + center.x + endPosition.x, + radius * 2 + arcStartY, + center.y + startPosition.y + ]; - return `M${arcStartX} ${arcStartY} + return `M${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0} ${arcEndX} ${midArc} M${arcStartX} ${midArc} @@ -154,578 +201,628 @@ export function makeStrokeCircleStr(startPosition, endPosition, center, radius, } export function makeGradient(svgDefElem, color, lighter = false) { - let gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default'); - let gradientDef = renderVerticalGradient(svgDefElem, gradientId); - let opacities = [1, 0.6, 0.2]; - if(lighter) { - opacities = [0.4, 0.2, 0]; - } + let gradientId = + 'path-fill-gradient' + '-' + color + '-' + (lighter ? 'lighter' : 'default'); + let gradientDef = renderVerticalGradient(svgDefElem, gradientId); + let 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]); + setGradientStop(gradientDef, '0%', color, opacities[0]); + setGradientStop(gradientDef, '50%', color, opacities[1]); + setGradientStop(gradientDef, '100%', color, opacities[2]); - return gradientId; + return gradientId; } -export function percentageBar(x, y, width, height, - depth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') { +export function percentageBar( + x, + y, + width, + height, + depth = PERCENTAGE_BAR_DEFAULT_DEPTH, + fill = 'none' +) { + let args = { + className: 'percentage-bar', + x: x, + y: y, + width: width, + height: height, + fill: fill, + styles: { + stroke: lightenDarkenColor(fill, -25), + // Diabolically good: https://stackoverflow.com/a/9000859 + // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray + 'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`, + 'stroke-width': depth + } + }; - let args = { - className: 'percentage-bar', - x: x, - y: y, - width: width, - height: height, - fill: fill, - styles: { - 'stroke': lightenDarkenColor(fill, -25), - // Diabolically good: https://stackoverflow.com/a/9000859 - // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray - 'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`, - 'stroke-width': depth - }, - }; - - return createSVG("rect", args); + return createSVG('rect', args); } -export function heatSquare(className, x, y, size, radius, fill='none', data={}) { - let args = { - className: className, - x: x, - y: y, - width: size, - height: size, - rx: radius, - fill: fill - }; +export function heatSquare(className, x, y, size, radius, fill = 'none', data = {}) { + let args = { + className: className, + x: x, + y: y, + width: size, + height: size, + rx: radius, + fill: fill + }; - Object.keys(data).map(key => { - args[key] = data[key]; - }); + Object.keys(data).map((key) => { + args[key] = data[key]; + }); - return createSVG("rect", args); + return createSVG('rect', args); } -export function legendBar(x, y, size, fill='none', label, truncate=false) { - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; +export function legendBar(x, y, size, fill = 'none', label, truncate = false) { + label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - let args = { - className: 'legend-bar', - x: 0, - y: 0, - width: size, - height: '2px', - fill: fill - }; - let 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 - }); + let args = { + className: 'legend-bar', + x: 0, + y: 0, + width: size, + height: '2px', + fill: fill + }; + let 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 + }); - let group = createSVG('g', { - transform: `translate(${x}, ${y})` - }); - group.appendChild(createSVG("rect", args)); - group.appendChild(text); + let group = createSVG('g', { + transform: `translate(${x}, ${y})` + }); + group.appendChild(createSVG('rect', args)); + group.appendChild(text); - return group; + return group; } -export function legendDot(x, y, size, fill='none', label, truncate=false) { - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; +export function legendDot(x, y, size, fill = 'none', label, truncate = false) { + label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - let args = { - className: 'legend-dot', - cx: 0, - cy: 0, - r: size, - fill: fill - }; - let 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 - }); + let args = { + className: 'legend-dot', + cx: 0, + cy: 0, + r: size, + fill: fill + }; + let 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 + }); - let group = createSVG('g', { - transform: `translate(${x}, ${y})` - }); - group.appendChild(createSVG("circle", args)); - group.appendChild(text); + let group = createSVG('g', { + transform: `translate(${x}, ${y})` + }); + group.appendChild(createSVG('circle', args)); + group.appendChild(text); - return group; + return group; } export function makeText(className, x, y, content, options = {}) { - let fontSize = options.fontSize || FONT_SIZE; - let dy = options.dy !== undefined ? options.dy : (fontSize / 2); - let fill = options.fill || FONT_FILL; - let 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 - }); + let fontSize = options.fontSize || FONT_SIZE; + let dy = options.dy !== undefined ? options.dy : fontSize / 2; + let fill = options.fill || FONT_FILL; + let 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, options={}) { - if(!options.stroke) options.stroke = BASE_LINE_COLOR; - let l = createSVG('line', { - className: 'line-vertical ' + options.className, - x1: 0, - x2: 0, - y1: y1, - y2: y2, - styles: { - stroke: options.stroke - } - }); +function makeVertLine(x, label, y1, y2, options = {}) { + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + let l = createSVG('line', { + className: 'line-vertical ' + options.className, + x1: 0, + x2: 0, + y1: y1, + y2: y2, + styles: { + stroke: options.stroke + } + }); - let 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 + "" - }); + let 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 + '' + }); - let line = createSVG('g', { - transform: `translate(${ x }, 0)` - }); + let line = createSVG('g', { + transform: `translate(${x}, 0)` + }); - line.appendChild(l); - line.appendChild(text); + line.appendChild(l); + line.appendChild(text); - return line; + return line; } -function makeHoriLine(y, label, x1, x2, options={}) { - if(!options.stroke) options.stroke = BASE_LINE_COLOR; - if(!options.lineType) options.lineType = ''; - if (options.shortenNumbers) label = shortenLargeNumber(label); +function makeHoriLine(y, label, x1, x2, options = {}) { + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + if (!options.lineType) options.lineType = ''; + if (!options.alignment) options.alignment = 'left'; + if (options.shortenNumbers) label = shortenLargeNumber(label); - let className = 'line-horizontal ' + options.className + - (options.lineType === "dashed" ? "dashed": ""); + let className = + 'line-horizontal ' + + options.className + + (options.lineType === 'dashed' ? 'dashed' : ''); - let l = createSVG('line', { - className: className, - x1: x1, - x2: x2, - y1: 0, - y2: 0, - styles: { - stroke: options.stroke - } - }); + let l = createSVG('line', { + className: className, + x1: x1, + x2: x2, + y1: 0, + y2: 0, + styles: { + stroke: options.stroke + } + }); - let 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+"" - }); + let text = createSVG('text', { + x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4, + y: 0, + dy: FONT_SIZE / 2 - 2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': x1 < x2 ? 'end' : 'start', + innerHTML: label + '' + }); - let line = createSVG('g', { - transform: `translate(0, ${y})`, - 'stroke-opacity': 1 - }); + let line = createSVG('g', { + transform: `translate(0, ${y})`, + 'stroke-opacity': 1 + }); - if(text === 0 || text === '0') { - line.style.stroke = "rgba(27, 31, 35, 0.6)"; - } + if (text === 0 || text === '0') { + line.style.stroke = 'rgba(27, 31, 35, 0.6)'; + } - line.appendChild(l); - line.appendChild(text); + line.appendChild(l); + line.appendChild(text); - return line; + return line; } -export function yLine(y, label, width, options={}) { - if (!isValidNumber(y)) y = 0; +export function generateAxisLabel(options) { + if (!options.title) return; - 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 = ''; + const x = options.position === 'left' ? LABEL_MARGIN : options.width; + // - getStringWidth(options.title, 5); + const rotation = + options.position === 'right' + ? `rotate(90, ${options.width}, ${options.height / 2})` + : `rotate(270, 0, ${options.height / 2})`; - let x1 = -1 * AXIS_TICK_LENGTH; - let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; + const labelSvg = createSVG('text', { + className: 'chart-label', + x: x - getStringWidth(options.title, 5) / 2, + y: options.height / 2 - LABEL_MARGIN, + dy: FONT_SIZE / -2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': 'start', + transform: rotation, + innerHTML: options.title + '' + }); - 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 - }); + return labelSvg; } -export function xLine(x, label, height, options={}) { - if (!isValidNumber(x)) x = 0; +export function yLine(y, label, width, options = {}) { + if (!isValidNumber(y)) y = 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 = ''; + 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 = ''; - // Draw X axis line in span/tick mode with optional label - // y2(span) - // | - // | - // x line | - // | - // | - // ---------------------+-- y2(tick) - // | - // y1 + let x1 = -1 * AXIS_TICK_LENGTH; + let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; - let y1 = height + AXIS_TICK_LENGTH; - let y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height; + if (options.mode === 'tick' && options.pos === 'right') { + x1 = width + AXIS_TICK_LENGTH; + x2 = width; + } - if(options.mode === 'tick' && options.pos === 'top') { - // top axis ticks - y1 = -1 * AXIS_TICK_LENGTH; - y2 = 0; - } + let offset = options.pos === 'left' ? -1 * options.offset : options.offset; - return makeVertLine(x, label, y1, y2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType - }); + x1 += offset; + x2 += offset; + + return makeHoriLine(y, label, x1, x2, { + stroke: options.stroke, + className: options.className, + lineType: options.lineType, + alignment: options.pos, + shortenNumbers: options.shortenNumbers + }); } -export function yMarker(y, label, width, options={}) { - if(!options.labelPos) options.labelPos = 'right'; - let x = options.labelPos === 'left' ? LABEL_MARGIN - : width - getStringWidth(label, 5) - LABEL_MARGIN; +export function xLine(x, label, height, options = {}) { + if (!isValidNumber(x)) x = 0; - let 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+"" - }); + 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 = ''; - let line = makeHoriLine(y, '', 0, width, { - stroke: options.stroke || BASE_LINE_COLOR, - className: options.className || '', - lineType: options.lineType - }); + // Draw X axis line in span/tick mode with optional label + // y2(span) + // | + // | + // x line | + // | + // | + // ---------------------+-- y2(tick) + // | + // y1 - line.appendChild(labelSvg); + let y1 = height + AXIS_TICK_LENGTH; + let y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height; - return line; + 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 + }); } -export function yRegion(y1, y2, width, label, options={}) { - // return a group - let height = y1 - y2; +export function yMarker(y, label, width, options = {}) { + if (!options.labelPos) options.labelPos = 'right'; + let x = + options.labelPos === 'left' + ? LABEL_MARGIN + : width - getStringWidth(label, 5) - LABEL_MARGIN; - let rect = createSVG('rect', { - className: `bar mini`, // remove class - styles: { - fill: `rgba(228, 234, 239, 0.49)`, - stroke: BASE_LINE_COLOR, - 'stroke-dasharray': `${width}, ${height}` - }, - // 'data-point-index': index, - x: 0, - y: 0, - width: width, - height: height - }); + let 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 + '' + }); - if(!options.labelPos) options.labelPos = 'right'; - let x = options.labelPos === 'left' ? LABEL_MARGIN - : width - getStringWidth(label+"", 4.5) - LABEL_MARGIN; + let line = makeHoriLine(y, '', 0, width, { + stroke: options.stroke || BASE_LINE_COLOR, + className: options.className || '', + lineType: options.lineType + }); - let 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+"" - }); + line.appendChild(labelSvg); - let region = createSVG('g', { - transform: `translate(0, ${y2})` - }); - - region.appendChild(rect); - region.appendChild(labelSvg); - - return region; + return line; } -export function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) { - let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine); - y -= offset; +export function yRegion(y1, y2, width, label, options = {}) { + // return a group + let height = y1 - y2; - if(height === 0) { - height = meta.minHeight; - y -= meta.minHeight; - } + let rect = createSVG('rect', { + className: `bar mini`, // remove class + styles: { + fill: `rgba(228, 234, 239, 0.49)`, + stroke: BASE_LINE_COLOR, + 'stroke-dasharray': `${width}, ${height}` + }, + // 'data-point-index': index, + x: 0, + y: 0, + width: width, + height: height + }); - // 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; + if (!options.labelPos) options.labelPos = 'right'; + let x = + options.labelPos === 'left' + ? LABEL_MARGIN + : width - getStringWidth(label + '', 4.5) - LABEL_MARGIN; - let rect = createSVG('rect', { - className: `bar mini`, - style: `fill: ${color}`, - 'data-point-index': index, - x: x, - y: y, - width: width, - height: height - }); + let 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 + '' + }); - label += ""; + let region = createSVG('g', { + transform: `translate(0, ${y2})` + }); - if(!label && !label.length) { - return rect; - } else { - rect.setAttribute('y', 0); - rect.setAttribute('x', 0); - let 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 - }); + region.appendChild(rect); + region.appendChild(labelSvg); - let group = createSVG('g', { - 'data-point-index': index, - transform: `translate(${x}, ${y})` - }); - group.appendChild(rect); - group.appendChild(text); - - return group; - } + return region; } -export function datasetDot(x, y, radius, color, label='', index=0) { - let dot = createSVG('circle', { - style: `fill: ${color}`, - 'data-point-index': index, - cx: x, - cy: y, - r: radius - }); +export function datasetBar( + x, + yTop, + width, + color, + label = '', + index = 0, + offset = 0, + meta = {} +) { + let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine); + y -= offset; - label += ""; + if (height === 0) { + height = meta.minHeight; + y -= meta.minHeight; + } - if(!label && !label.length) { - return dot; - } else { - dot.setAttribute('cy', 0); - dot.setAttribute('cx', 0); + // 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; - let 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 - }); + let rect = createSVG('rect', { + className: `bar mini`, + style: `fill: ${color}`, + 'data-point-index': index, + x: x, + y: y, + width: width, + height: height + }); - let group = createSVG('g', { - 'data-point-index': index, - transform: `translate(${x}, ${y})` - }); - group.appendChild(dot); - group.appendChild(text); + label += ''; - return group; - } + if (!label && !label.length) { + return rect; + } else { + rect.setAttribute('y', 0); + rect.setAttribute('x', 0); + let 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 + }); + + let group = createSVG('g', { + 'data-point-index': index, + transform: `translate(${x}, ${y})` + }); + group.appendChild(rect); + group.appendChild(text); + + return group; + } } -export function getPaths(xList, yList, color, options={}, meta={}) { - let pointsList = yList.map((y, i) => (xList[i] + ',' + y)); - let pointsStr = pointsList.join("L"); +export function datasetDot(x, y, radius, color, label = '', index = 0) { + let dot = createSVG('circle', { + style: `fill: ${color}`, + 'data-point-index': index, + cx: x, + cy: y, + r: radius + }); - // Spline - if (options.spline) - pointsStr = getSplineCurvePointsStr(xList, yList); + label += ''; - let path = makePath("M"+pointsStr, 'line-graph-path', color); + if (!label && !label.length) { + return dot; + } else { + dot.setAttribute('cy', 0); + dot.setAttribute('cx', 0); - // HeatLine - if(options.heatline) { - let gradient_id = makeGradient(meta.svgDefs, color); - path.style.stroke = `url(#${gradient_id})`; - } + let 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 + }); - let paths = { - path: path - }; + let group = createSVG('g', { + 'data-point-index': index, + transform: `translate(${x}, ${y})` + }); + group.appendChild(dot); + group.appendChild(text); - // Region - if(options.regionFill) { - let gradient_id_region = makeGradient(meta.svgDefs, color, true); + return group; + } +} - let pathStr = "M" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`; - paths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`); - } +export function getPaths(xList, yList, color, options = {}, meta = {}) { + let pointsList = yList.map((y, i) => xList[i] + ',' + y); + let pointsStr = pointsList.join('L'); - return paths; + // Spline + if (options.spline) pointsStr = getSplineCurvePointsStr(xList, yList); + + let path = makePath('M' + pointsStr, 'line-graph-path', color); + + // HeatLine + if (options.heatline) { + let gradient_id = makeGradient(meta.svgDefs, color); + path.style.stroke = `url(#${gradient_id})`; + } + + let paths = { + path: path + }; + + // Region + if (options.regionFill) { + let gradient_id_region = makeGradient(meta.svgDefs, color, true); + + let pathStr = + 'M' + + `${xList[0]},${meta.zeroLine}L` + + pointsStr + + `L${xList.slice(-1)[0]},${meta.zeroLine}`; + paths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`); + } + + return paths; } export let makeOverlay = { - 'bar': (unit) => { - let transformValue; - if(unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let overlay = unit.cloneNode(); - overlay.style.fill = '#000000'; - overlay.style.opacity = '0.4'; + bar: (unit) => { + let transformValue; + if (unit.nodeName !== 'rect') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let overlay = unit.cloneNode(); + overlay.style.fill = '#000000'; + overlay.style.opacity = '0.4'; - if(transformValue) { - overlay.setAttribute('transform', transformValue); - } - return overlay; - }, + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + return overlay; + }, - 'dot': (unit) => { - let transformValue; - if(unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let overlay = unit.cloneNode(); - let radius = unit.getAttribute('r'); - let fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; + dot: (unit) => { + let transformValue; + if (unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let overlay = unit.cloneNode(); + let radius = unit.getAttribute('r'); + let 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; - }, + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + return overlay; + }, - 'heat_square': (unit) => { - let transformValue; - if(unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let overlay = unit.cloneNode(); - let radius = unit.getAttribute('r'); - let fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; + heat_square: (unit) => { + let transformValue; + if (unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let overlay = unit.cloneNode(); + let radius = unit.getAttribute('r'); + let 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; - } + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + return overlay; + } }; export let updateOverlay = { - 'bar': (unit, overlay) => { - let transformValue; - if(unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let attributes = ['x', 'y', 'width', 'height']; - Object.values(unit.attributes) - .filter(attr => attributes.includes(attr.name) && attr.specified) - .map(attr => { - overlay.setAttribute(attr.name, attr.nodeValue); - }); + bar: (unit, overlay) => { + let transformValue; + if (unit.nodeName !== 'rect') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let attributes = ['x', 'y', 'width', 'height']; + Object.values(unit.attributes) + .filter((attr) => attributes.includes(attr.name) && attr.specified) + .map((attr) => { + overlay.setAttribute(attr.name, attr.nodeValue); + }); - if(transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + }, - 'dot': (unit, overlay) => { - let transformValue; - if(unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let attributes = ['cx', 'cy']; - Object.values(unit.attributes) - .filter(attr => attributes.includes(attr.name) && attr.specified) - .map(attr => { - overlay.setAttribute(attr.name, attr.nodeValue); - }); + dot: (unit, overlay) => { + let transformValue; + if (unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let attributes = ['cx', 'cy']; + Object.values(unit.attributes) + .filter((attr) => attributes.includes(attr.name) && attr.specified) + .map((attr) => { + overlay.setAttribute(attr.name, attr.nodeValue); + }); - if(transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + }, - 'heat_square': (unit, overlay) => { - let transformValue; - if(unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let attributes = ['cx', 'cy']; - Object.values(unit.attributes) - .filter(attr => attributes.includes(attr.name) && attr.specified) - .map(attr => { - overlay.setAttribute(attr.name, attr.nodeValue); - }); + heat_square: (unit, overlay) => { + let transformValue; + if (unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let attributes = ['cx', 'cy']; + Object.values(unit.attributes) + .filter((attr) => attributes.includes(attr.name) && attr.specified) + .map((attr) => { + overlay.setAttribute(attr.name, attr.nodeValue); + }); - if(transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + } }; From a5a5fc051b9e8200ae705f72446c1fccaab1ae32 Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Fri, 12 Nov 2021 18:58:41 -0800 Subject: [PATCH 2/9] undoing changes to draw file. --- docs/assets/js/frappe-charts.min.js | 2 +- docs/assets/js/frappe-charts.min.js.map | 2 +- src/js/utils/draw.js | 1189 +++++++++++------------ 3 files changed, 560 insertions(+), 633 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index a5bc39e..c6365d7 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -1,2 +1,2 @@ -var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function u(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function h(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function D(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function M(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)D(a).appendChild(i);else if("around"===n){var s=D(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function T(t,e){return M("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function C(t,e,i,n){return M("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return M("svg",{className:e,inside:t,width:i,height:n})}function O(t){return M("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),M("g",n)}function S(t){return M("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*i.y,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z\n\t\tL"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*n+o,h=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+"\n\t\tM"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=T(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),C(a,"0%",e,s[0]),C(a,"50%",e,s[1]),C(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return M("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),M("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dy:2*oe+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dx:oe+"px",dy:oe/3+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||oe;return M("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le);var s=M("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=M("text",{x:0,y:i>n?i+se:i-se-oe,dy:oe+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:e+""}),o=M("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=M("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=M("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:oe/2-2+"px","font-size":oe+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=M("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||le,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=M("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:le,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=M("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:n+""}),l=M("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),u=Ut(l,2),h=u[0],c=u[1];c-=r,0===h&&(h=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(h,!0)||(h=0),f(i,!0)||(i=0);var d=M("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:h});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=M("text",{className:"data-point-value",x:i/2,y:0,dy:oe/2*-1+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),v=M("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=M("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=M("text",{className:"data-point-value",x:0,y:0,dy:oe/2*-1-i+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),l=M("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var u=H(a.svgDefs,i,!0),h="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(h,"region-fill","none","url(#"+u+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ge,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],fe)}function et(t,e,i){return Z(t,[0,i],[0,e],fe)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},fe,ge],Z(t,[0,n],[0,i],fe)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},de,ge],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],fe)]:[[t,{width:n,height:o,x:e,y:l},de,ge]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],fe)]:[[t,{cx:e,cy:i},de,ge]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},pe,ge];if(s.push(o),t.region){var l=e[0]+","+n+"L",u="L"+e.slice(-1)[0]+", "+n,h=[t.region,{d:"M"+l+r+u},pe,ge];s.push(h)}return s}function rt(t,e){return[t,{d:e},de,ge]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var u=void 0;u="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:h,to:c,begin:"0s",dur:i/1e3+"s",values:h+";"+c,keySplines:ye[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)u.setAttribute(p,d[p]);r.appendChild(u),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ut(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ht(t,e,i){if(0!==i.length){var n=ut(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ve)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/ke)}function yt(t,e){var i=Ae*we;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Pe[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new Me(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Dt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Tt(t){function e(t,e){for(var i=Mt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Mt(n,a):Mt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Mt(o,l):Mt(o)).reverse().map(function(t){return-1*t})}return s}function Ct(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return h(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ne(e,i)):Ee[t]?new Ee[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
            \n\t\t\t\t
            '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=10,le="#dadada",ue="#555b51",he={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},ce={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},de=350,pe=350,fe=de,ve=250,ge="easein",ye={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",be=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-u(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ht(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),xe=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-u(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,h=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],h+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(be),ke=7,we=1e3,Ae=86400,Pe=["January","February","March","April","May","June","July","August","September","October","November","December"],De=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Me=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,u=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(t,n){t.positions.map(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:e.constants.width}))}),i):t.positions.map(function(i,n){return G(i,t.labels[n],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})})},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var u=[];return this.store.map(function(t,e){u=u.concat(it(t,s[e],n[e],o[e]))}),u}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,u=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,u,r,o,t.fill,n);e.serializedSubDomains.push(a)}u+=s}),u=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,u=m(s,e),h=Ut(u,2);s=h[0],e=h[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var u=m(s,i),h=Ut(u,2);s=h[0],i=h[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Ce=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),u=l.left-o.left+parseInt(s.getAttribute("width"))/2,h=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(u,h,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(xe),Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?_(y,m,t.center,t.radius,a,h):E(y,m,t.center,t.radius,a,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Oe=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*ke+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+u(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+u(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*we);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],u=void 0,h=0;h2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(be),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):this.config.yAxisMode=n.yAxisMode||"span",this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return h(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0;if(t instanceof Array)n=Tt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Ct(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var l in t)!function(l){var u=t[l];n=Tt(u,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Ct(n)*s,o=n.map(function(t){return r-t*a});var h=e.config.yAxisConfig.find(function(t){return l===t.id})||[],c=h?h.position:"right";if(e.state.yAxis.length){var d=[],p=e.state.yAxis[0];p.positions.forEach(function(t){d.push(Math.ceil(t/a))}),n=d.reverse(),r=e.height-Ct(n)*s,o=p.positions}e.state.yAxis.push({axisID:l||"left-axis",labels:n,title:h.title,pos:c,scaleMultiplier:a,zeroLine:r,positions:o})}(l)}this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e,i){return e.map(function(e){var n=t.yAxis;return n instanceof Array&&(n=n.length>1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-h/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:h,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=he[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];ce[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(be),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?I(y,m,t.center,t.radius,t.clockWise,h):z(y,m,t.center,t.radius,t.clockWise,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Ee={bar:Ne,line:Ne,percentage:Ce,heatmap:Oe,pie:Le,donut:Se},_e=function t(e,i){return jt(this,t),Wt(i.type,e,i)},ze=Object.freeze({Chart:_e,PercentageChart:Ce,PieChart:Le,Heatmap:Oe,AxisChart:Ne}),Ie={};return Ie.NAME="Frappe Charts",Ie.VERSION="1.6.2",Ie=Object.assign({},Ie,ze)}(); +var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function u(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function h(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function D(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function M(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)D(a).appendChild(i);else if("around"===n){var s=D(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function T(t,e){return M("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function C(t,e,i,n){return M("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return M("svg",{className:e,inside:t,width:i,height:n})}function O(t){return M("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),M("g",n)}function S(t){return M("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*i.y,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z\n\t\tL"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*n+o,h=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+"\n\t\tM"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=T(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),C(a,"0%",e,s[0]),C(a,"50%",e,s[1]),C(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return M("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),M("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dy:2*oe+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dx:oe+"px",dy:oe/3+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||oe;return M("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le);var s=M("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=M("text",{x:0,y:i>n?i+se:i-se-oe,dy:oe+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:e+""}),o=M("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le),a.lineType||(a.lineType=""),a.shortenNumbers&&(e=x(e));var s=M("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=M("text",{x:i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;return"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i),a+=n.offset,s+=n.offset,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=M("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||le,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=M("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:le,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=M("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:n+""}),l=M("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),u=Ut(l,2),h=u[0],c=u[1];c-=r,0===h&&(h=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(h,!0)||(h=0),f(i,!0)||(i=0);var d=M("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:h});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=M("text",{className:"data-point-value",x:i/2,y:0,dy:oe/2*-1+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),v=M("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=M("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=M("text",{className:"data-point-value",x:0,y:0,dy:oe/2*-1-i+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),l=M("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var u=H(a.svgDefs,i,!0),h="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(h,"region-fill","none","url(#"+u+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ge,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],fe)}function et(t,e,i){return Z(t,[0,i],[0,e],fe)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},fe,ge],Z(t,[0,n],[0,i],fe)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},de,ge],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],fe)]:[[t,{width:n,height:o,x:e,y:l},de,ge]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],fe)]:[[t,{cx:e,cy:i},de,ge]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},pe,ge];if(s.push(o),t.region){var l=e[0]+","+n+"L",u="L"+e.slice(-1)[0]+", "+n,h=[t.region,{d:"M"+l+r+u},pe,ge];s.push(h)}return s}function rt(t,e){return[t,{d:e},de,ge]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var u=void 0;u="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:h,to:c,begin:"0s",dur:i/1e3+"s",values:h+";"+c,keySplines:ye[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)u.setAttribute(p,d[p]);r.appendChild(u),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ut(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ht(t,e,i){if(0!==i.length){var n=ut(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ve)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/ke)}function yt(t,e){var i=Ae*we;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Pe[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new Me(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Dt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Tt(t){function e(t,e){for(var i=Mt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Mt(n,a):Mt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Mt(o,l):Mt(o)).reverse().map(function(t){return-1*t})}return s}function Ct(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return h(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ne(e,i)):Ee[t]?new Ee[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
              \n\t\t\t\t
              '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=10,le="#dadada",ue="#555b51",he={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},ce={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},de=350,pe=350,fe=de,ve=250,ge="easein",ye={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",be=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-u(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ht(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),xe=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-u(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,h=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],h+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(be),ke=7,we=1e3,Ae=86400,Pe=["January","February","March","April","May","June","July","August","September","October","November","December"],De=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Me=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,u=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(t,n){t.positions.map(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:e.constants.width}))}),i):t.positions.map(function(i,n){return G(i,t.labels[n],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})})},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var u=[];return this.store.map(function(t,e){u=u.concat(it(t,s[e],n[e],o[e]))}),u}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,u=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,u,r,o,t.fill,n);e.serializedSubDomains.push(a)}u+=s}),u=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,u=m(s,e),h=Ut(u,2);s=h[0],e=h[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var u=m(s,i),h=Ut(u,2);s=h[0],i=h[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Ce=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),u=l.left-o.left+parseInt(s.getAttribute("width"))/2,h=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(u,h,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(xe),Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?_(y,m,t.center,t.radius,a,h):E(y,m,t.center,t.radius,a,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Oe=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*ke+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+u(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+u(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*we);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],u=void 0,h=0;h2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(be),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):this.config.yAxisMode=n.yAxisMode||"span",this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return h(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0;if(t instanceof Array)n=Tt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Ct(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var l in t)!function(l){var u=t[l];n=Tt(u,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Ct(n)*s,o=n.map(function(t){return r-t*a});var h=e.config.yAxisConfig.find(function(t){return l===t.id})||[],c=h?h.position:"right";if(e.state.yAxis.length){var d=[],p=e.state.yAxis[0];p.positions.forEach(function(t){d.push(Math.ceil(t/a))}),n=d.reverse(),r=e.height-Ct(n)*s,o=p.positions}e.state.yAxis.push({axisID:l||"left-axis",labels:n,title:h.title,pos:c,scaleMultiplier:a,zeroLine:r,positions:o})}(l)}this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e,i){return e.map(function(e){var n=t.yAxis;return n instanceof Array&&(n=n.length>1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-h/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:h,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=he[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];ce[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(be),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?I(y,m,t.center,t.radius,t.clockWise,h):z(y,m,t.center,t.radius,t.clockWise,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Ee={bar:Ne,line:Ne,percentage:Ce,heatmap:Oe,pie:Le,donut:Se},_e=function t(e,i){return jt(this,t),Wt(i.type,e,i)},ze=Object.freeze({Chart:_e,PercentageChart:Ce,PieChart:Le,Heatmap:Oe,AxisChart:Ne}),Ie={};return Ie.NAME="Frappe Charts",Ie.VERSION="1.6.2",Ie=Object.assign({},Ie,ze)}(); //# sourceMappingURL=frappe-charts.min.js.map diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index 52e147e..32107b1 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import {\n getBarHeightAndYAttr,\n truncateString,\n shortenLargeNumber,\n getSplineCurvePointsStr\n} from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n return typeof expr === 'string' ? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n var element = document.createElementNS('http://www.w3.org/2000/svg', tag);\n\n for (var i in o) {\n var val = o[i];\n\n if (i === 'inside') {\n $(val).appendChild(element);\n } else if (i === 'around') {\n var ref = $(val);\n ref.parentNode.insertBefore(element, ref);\n element.appendChild(ref);\n } else if (i === 'styles') {\n if (typeof val === 'object') {\n Object.keys(val).map((prop) => {\n element.style[prop] = val[prop];\n });\n }\n } else {\n if (i === 'className') {\n i = 'class';\n }\n if (i === 'innerHTML') {\n element['textContent'] = val;\n } else {\n element.setAttribute(i, val);\n }\n }\n }\n\n return element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n return createSVG('linearGradient', {\n inside: svgDefElem,\n id: gradientId,\n x1: 0,\n x2: 0,\n y1: 0,\n y2: 1\n });\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n return createSVG('stop', {\n inside: gradElem,\n style: `stop-color: ${color}`,\n offset: offset,\n 'stop-opacity': opacity\n });\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n return createSVG('svg', {\n className: className,\n inside: parent,\n width: width,\n height: height\n });\n}\n\nexport function makeSVGDefs(svgContainer) {\n return createSVG('defs', {\n inside: svgContainer\n });\n}\n\nexport function makeSVGGroup(className, transform = '', parent = undefined) {\n let args = {\n className: className,\n transform: transform\n };\n if (parent) args.inside = parent;\n return createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className = '') {\n let g = createSVG('g', {\n className: className\n });\n elements.forEach((e) => g.appendChild(e));\n return g;\n}\n\nexport function makePath(\n pathStr,\n className = '',\n stroke = 'none',\n fill = 'none',\n strokeWidth = 2\n) {\n return createSVG('path', {\n className: className,\n d: pathStr,\n styles: {\n stroke: stroke,\n fill: fill,\n 'stroke-width': strokeWidth\n }\n });\n}\n\nexport function makeArcPathStr(\n startPosition,\n endPosition,\n center,\n radius,\n clockWise = 1,\n largeArc = 0\n) {\n let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n return `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(\n startPosition,\n endPosition,\n center,\n radius,\n clockWise = 1,\n largeArc = 0\n) {\n let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n let [arcEndX, midArc, arcEndY] = [\n center.x + endPosition.x,\n center.y * 2,\n center.y + endPosition.y\n ];\n return `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(\n startPosition,\n endPosition,\n center,\n radius,\n clockWise = 1,\n largeArc = 0\n) {\n let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n return `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(\n startPosition,\n endPosition,\n center,\n radius,\n clockWise = 1,\n largeArc = 0\n) {\n let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n let [arcEndX, midArc, arcEndY] = [\n center.x + endPosition.x,\n radius * 2 + arcStartY,\n center.y + startPosition.y\n ];\n\n return `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n let gradientId =\n 'path-fill-gradient' + '-' + color + '-' + (lighter ? 'lighter' : 'default');\n let gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n let opacities = [1, 0.6, 0.2];\n if (lighter) {\n opacities = [0.4, 0.2, 0];\n }\n\n setGradientStop(gradientDef, '0%', color, opacities[0]);\n setGradientStop(gradientDef, '50%', color, opacities[1]);\n setGradientStop(gradientDef, '100%', color, opacities[2]);\n\n return gradientId;\n}\n\nexport function percentageBar(\n x,\n y,\n width,\n height,\n depth = PERCENTAGE_BAR_DEFAULT_DEPTH,\n fill = 'none'\n) {\n let args = {\n className: 'percentage-bar',\n x: x,\n y: y,\n width: width,\n height: height,\n fill: fill,\n styles: {\n stroke: lightenDarkenColor(fill, -25),\n // Diabolically good: https://stackoverflow.com/a/9000859\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n 'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n 'stroke-width': depth\n }\n };\n\n return createSVG('rect', args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill = 'none', data = {}) {\n let args = {\n className: className,\n x: x,\n y: y,\n width: size,\n height: size,\n rx: radius,\n fill: fill\n };\n\n Object.keys(data).map((key) => {\n args[key] = data[key];\n });\n\n return createSVG('rect', args);\n}\n\nexport function legendBar(x, y, size, fill = 'none', label, truncate = false) {\n label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n let args = {\n className: 'legend-bar',\n x: 0,\n y: 0,\n width: size,\n height: '2px',\n fill: fill\n };\n let text = createSVG('text', {\n className: 'legend-dataset-text',\n x: 0,\n y: 0,\n dy: FONT_SIZE * 2 + 'px',\n 'font-size': FONT_SIZE * 1.2 + 'px',\n 'text-anchor': 'start',\n fill: FONT_FILL,\n innerHTML: label\n });\n\n let group = createSVG('g', {\n transform: `translate(${x}, ${y})`\n });\n group.appendChild(createSVG('rect', args));\n group.appendChild(text);\n\n return group;\n}\n\nexport function legendDot(x, y, size, fill = 'none', label, truncate = false) {\n label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n let args = {\n className: 'legend-dot',\n cx: 0,\n cy: 0,\n r: size,\n fill: fill\n };\n let text = createSVG('text', {\n className: 'legend-dataset-text',\n x: 0,\n y: 0,\n dx: FONT_SIZE + 'px',\n dy: FONT_SIZE / 3 + 'px',\n 'font-size': FONT_SIZE * 1.2 + 'px',\n 'text-anchor': 'start',\n fill: FONT_FILL,\n innerHTML: label\n });\n\n let group = createSVG('g', {\n transform: `translate(${x}, ${y})`\n });\n group.appendChild(createSVG('circle', args));\n group.appendChild(text);\n\n return group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n let fontSize = options.fontSize || FONT_SIZE;\n let dy = options.dy !== undefined ? options.dy : fontSize / 2;\n let fill = options.fill || FONT_FILL;\n let textAnchor = options.textAnchor || 'start';\n return createSVG('text', {\n className: className,\n x: x,\n y: y,\n dy: dy + 'px',\n 'font-size': fontSize + 'px',\n fill: fill,\n 'text-anchor': textAnchor,\n innerHTML: content\n });\n}\n\nfunction makeVertLine(x, label, y1, y2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n let l = createSVG('line', {\n className: 'line-vertical ' + options.className,\n x1: 0,\n x2: 0,\n y1: y1,\n y2: y2,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: 0,\n y: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n dy: FONT_SIZE + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'middle',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(${x}, 0)`\n });\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options = {}) {\n if (!isValidNumber(x)) x = 0;\n\n if (!options.pos) options.pos = 'bottom';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n // Draw X axis line in span/tick mode with optional label\n // \ty2(span)\n // \t\t\t\t\t\t|\n // \t\t\t\t\t\t|\n //\t\t\t\tx line\t|\n //\t\t\t\t\t\t|\n // \t\t\t\t\t \t|\n // ---------------------+-- y2(tick)\n //\t\t\t\t\t\t|\n //\t\t\t\t\t\t\ty1\n\n let y1 = height + AXIS_TICK_LENGTH;\n let y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n if (options.mode === 'tick' && options.pos === 'top') {\n // top axis ticks\n y1 = -1 * AXIS_TICK_LENGTH;\n y2 = 0;\n }\n\n return makeVertLine(x, label, y1, y2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType\n });\n}\n\nexport function yMarker(y, label, width, options = {}) {\n if (!options.labelPos) options.labelPos = 'right';\n let x =\n options.labelPos === 'left'\n ? LABEL_MARGIN\n : width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n let labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x,\n y: 0,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n innerHTML: label + ''\n });\n\n let line = makeHoriLine(y, '', 0, width, {\n stroke: options.stroke || BASE_LINE_COLOR,\n className: options.className || '',\n lineType: options.lineType\n });\n\n line.appendChild(labelSvg);\n\n return line;\n}\n\nexport function yRegion(y1, y2, width, label, options = {}) {\n // return a group\n let height = y1 - y2;\n\n let rect = createSVG('rect', {\n className: `bar mini`, // remove class\n styles: {\n fill: `rgba(228, 234, 239, 0.49)`,\n stroke: BASE_LINE_COLOR,\n 'stroke-dasharray': `${width}, ${height}`\n },\n // 'data-point-index': index,\n x: 0,\n y: 0,\n width: width,\n height: height\n });\n\n if (!options.labelPos) options.labelPos = 'right';\n let x =\n options.labelPos === 'left'\n ? LABEL_MARGIN\n : width - getStringWidth(label + '', 4.5) - LABEL_MARGIN;\n\n let labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x,\n y: 0,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n innerHTML: label + ''\n });\n\n let region = createSVG('g', {\n transform: `translate(0, ${y2})`\n });\n\n region.appendChild(rect);\n region.appendChild(labelSvg);\n\n return region;\n}\n\nexport function datasetBar(\n x,\n yTop,\n width,\n color,\n label = '',\n index = 0,\n offset = 0,\n meta = {}\n) {\n let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n y -= offset;\n\n if (height === 0) {\n height = meta.minHeight;\n y -= meta.minHeight;\n }\n\n // Preprocess numbers to avoid svg building errors\n if (!isValidNumber(x)) x = 0;\n if (!isValidNumber(y)) y = 0;\n if (!isValidNumber(height, true)) height = 0;\n if (!isValidNumber(width, true)) width = 0;\n\n let rect = createSVG('rect', {\n className: `bar mini`,\n style: `fill: ${color}`,\n 'data-point-index': index,\n x: x,\n y: y,\n width: width,\n height: height\n });\n\n label += '';\n\n if (!label && !label.length) {\n return rect;\n } else {\n rect.setAttribute('y', 0);\n rect.setAttribute('x', 0);\n let text = createSVG('text', {\n className: 'data-point-value',\n x: width / 2,\n y: 0,\n dy: (FONT_SIZE / 2) * -1 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'middle',\n innerHTML: label\n });\n\n let group = createSVG('g', {\n 'data-point-index': index,\n transform: `translate(${x}, ${y})`\n });\n group.appendChild(rect);\n group.appendChild(text);\n\n return group;\n }\n}\n\nexport function datasetDot(x, y, radius, color, label = '', index = 0) {\n let dot = createSVG('circle', {\n style: `fill: ${color}`,\n 'data-point-index': index,\n cx: x,\n cy: y,\n r: radius\n });\n\n label += '';\n\n if (!label && !label.length) {\n return dot;\n } else {\n dot.setAttribute('cy', 0);\n dot.setAttribute('cx', 0);\n\n let text = createSVG('text', {\n className: 'data-point-value',\n x: 0,\n y: 0,\n dy: (FONT_SIZE / 2) * -1 - radius + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'middle',\n innerHTML: label\n });\n\n let group = createSVG('g', {\n 'data-point-index': index,\n transform: `translate(${x}, ${y})`\n });\n group.appendChild(dot);\n group.appendChild(text);\n\n return group;\n }\n}\n\nexport function getPaths(xList, yList, color, options = {}, meta = {}) {\n let pointsList = yList.map((y, i) => xList[i] + ',' + y);\n let pointsStr = pointsList.join('L');\n\n // Spline\n if (options.spline) pointsStr = getSplineCurvePointsStr(xList, yList);\n\n let path = makePath('M' + pointsStr, 'line-graph-path', color);\n\n // HeatLine\n if (options.heatline) {\n let gradient_id = makeGradient(meta.svgDefs, color);\n path.style.stroke = `url(#${gradient_id})`;\n }\n\n let paths = {\n path: path\n };\n\n // Region\n if (options.regionFill) {\n let gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n let pathStr =\n 'M' +\n `${xList[0]},${meta.zeroLine}L` +\n pointsStr +\n `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n paths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n }\n\n return paths;\n}\n\nexport let makeOverlay = {\n bar: (unit) => {\n let transformValue;\n if (unit.nodeName !== 'rect') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let overlay = unit.cloneNode();\n overlay.style.fill = '#000000';\n overlay.style.opacity = '0.4';\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n return overlay;\n },\n\n dot: (unit) => {\n let transformValue;\n if (unit.nodeName !== 'circle') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let overlay = unit.cloneNode();\n let radius = unit.getAttribute('r');\n let fill = unit.getAttribute('fill');\n overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n overlay.setAttribute('fill', fill);\n overlay.style.opacity = '0.6';\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n return overlay;\n },\n\n heat_square: (unit) => {\n let transformValue;\n if (unit.nodeName !== 'circle') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let overlay = unit.cloneNode();\n let radius = unit.getAttribute('r');\n let fill = unit.getAttribute('fill');\n overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n overlay.setAttribute('fill', fill);\n overlay.style.opacity = '0.6';\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n return overlay;\n }\n};\n\nexport let updateOverlay = {\n bar: (unit, overlay) => {\n let transformValue;\n if (unit.nodeName !== 'rect') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let attributes = ['x', 'y', 'width', 'height'];\n Object.values(unit.attributes)\n .filter((attr) => attributes.includes(attr.name) && attr.specified)\n .map((attr) => {\n overlay.setAttribute(attr.name, attr.nodeValue);\n });\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n },\n\n dot: (unit, overlay) => {\n let transformValue;\n if (unit.nodeName !== 'circle') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let attributes = ['cx', 'cy'];\n Object.values(unit.attributes)\n .filter((attr) => attributes.includes(attr.name) && attr.specified)\n .map((attr) => {\n overlay.setAttribute(attr.name, attr.nodeValue);\n });\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n },\n\n heat_square: (unit, overlay) => {\n let transformValue;\n if (unit.nodeName !== 'circle') {\n transformValue = unit.getAttribute('transform');\n unit = unit.childNodes[0];\n }\n let attributes = ['cx', 'cy'];\n Object.values(unit.attributes)\n .filter((attr) => attributes.includes(attr.name) && attr.specified)\n .map((attr) => {\n overlay.setAttribute(attr.name, attr.nodeValue);\n });\n\n if (transformValue) {\n overlay.setAttribute('transform', transformValue);\n }\n }\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { makeText, generateAxisLabel, 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 this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\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\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n return data.positions.map((position, i) => {\n return yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n });\n });\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                \n\t\t\t\t
                `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = axisOptions.yAxisMode || 'span';\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions;\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\n const yAxisConfigObject =\n this.config.yAxisConfig.find((item) => key === item.id) || [];\n const yAxisAlignment = yAxisConfigObject\n ? yAxisConfigObject.position\n : 'right';\n\n if (this.state.yAxis.length) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n // we need to loop through original positions.\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","prop","style","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","rotation","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","find","yAxisAlignment","yPtsArray","firstArr","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.lineType) options.lineType = '';\n\tif (options.shortenNumbers) label = shortenLargeNumber(label);\n\n\tlet className = 'line-horizontal ' + options.className +\n\t\t(options.lineType === \"dashed\" ? \"dashed\": \"\");\n\n\tlet l = createSVG('line', {\n\t\tclassName: className,\n\t\tx1: x1,\n\t\tx2: x2,\n\t\ty1: 0,\n\t\ty2: 0,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / 2 - 2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': x1 < x2 ? 'end' : 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(0, ${y})`,\n\t\t'stroke-opacity': 1\n\t});\n\n\tif(text === 0 || text === '0') {\n\t\tline.style.stroke = \"rgba(27, 31, 35, 0.6)\";\n\t}\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options={}) {\n\tif (!isValidNumber(y)) y = 0;\n\n\tif(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType,\n\t\tshortenNumbers: options.shortenNumbers\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { makeText, generateAxisLabel, 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 this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\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\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n return data.positions.map((position, i) => {\n return yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n });\n });\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                  \n\t\t\t\t
                  `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = axisOptions.yAxisMode || 'span';\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions;\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\n const yAxisConfigObject =\n this.config.yAxisConfig.find((item) => key === item.id) || [];\n const yAxisAlignment = yAxisConfigObject\n ? yAxisConfigObject.position\n : 'right';\n\n if (this.state.yAxis.length) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n // we need to loop through original positions.\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","shortenNumbers","generateAxisLabel","title","position","rotation","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","find","yAxisAlignment","yPtsArray","firstArr","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file diff --git a/src/js/utils/draw.js b/src/js/utils/draw.js index 6884415..f7f017b 100644 --- a/src/js/utils/draw.js +++ b/src/js/utils/draw.js @@ -1,9 +1,4 @@ -import { - getBarHeightAndYAttr, - truncateString, - shortenLargeNumber, - getSplineCurvePointsStr -} from './draw-utils'; +import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils'; import { getStringWidth, isValidNumber } from './helpers'; import { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants'; import { lightenDarkenColor } from './colors'; @@ -16,143 +11,119 @@ const BASE_LINE_COLOR = '#dadada'; const FONT_FILL = '#555b51'; function $(expr, con) { - return typeof expr === 'string' ? (con || document).querySelector(expr) : expr || null; + return typeof expr === "string"? (con || document).querySelector(expr) : expr || null; } export function createSVG(tag, o) { - var element = document.createElementNS('http://www.w3.org/2000/svg', tag); + var element = document.createElementNS("http://www.w3.org/2000/svg", tag); - for (var i in o) { - var val = o[i]; + 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((prop) => { - element.style[prop] = val[prop]; - }); - } - } else { - if (i === 'className') { - i = 'class'; - } - if (i === 'innerHTML') { - element['textContent'] = val; - } else { - element.setAttribute(i, val); - } - } - } + if (i === "inside") { + $(val).appendChild(element); + } + else if (i === "around") { + var ref = $(val); + ref.parentNode.insertBefore(element, ref); + element.appendChild(ref); - return element; + } else if (i === "styles") { + if(typeof val === "object") { + Object.keys(val).map(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 - }); + return createSVG('linearGradient', { + inside: svgDefElem, + id: gradientId, + x1: 0, + x2: 0, + y1: 0, + y2: 1 + }); } function setGradientStop(gradElem, offset, color, opacity) { - return createSVG('stop', { - inside: gradElem, - style: `stop-color: ${color}`, - offset: offset, - 'stop-opacity': opacity - }); + return createSVG('stop', { + 'inside': gradElem, + 'style': `stop-color: ${color}`, + 'offset': offset, + 'stop-opacity': opacity + }); } export function makeSVGContainer(parent, className, width, height) { - return createSVG('svg', { - className: className, - inside: parent, - width: width, - height: height - }); + return createSVG('svg', { + className: className, + inside: parent, + width: width, + height: height + }); } export function makeSVGDefs(svgContainer) { - return createSVG('defs', { - inside: svgContainer - }); + return createSVG('defs', { + inside: svgContainer, + }); } -export function makeSVGGroup(className, transform = '', parent = undefined) { - let args = { - className: className, - transform: transform - }; - if (parent) args.inside = parent; - return createSVG('g', args); +export function makeSVGGroup(className, transform='', parent=undefined) { + let args = { + className: className, + transform: transform + }; + if(parent) args.inside = parent; + return createSVG('g', args); } -export function wrapInSVGGroup(elements, className = '') { - let g = createSVG('g', { - className: className - }); - elements.forEach((e) => g.appendChild(e)); - return g; +export function wrapInSVGGroup(elements, className='') { + let g = createSVG('g', { + className: className + }); + elements.forEach(e => g.appendChild(e)); + return g; } -export function makePath( - pathStr, - className = '', - stroke = 'none', - fill = 'none', - strokeWidth = 2 -) { - return createSVG('path', { - className: className, - d: pathStr, - styles: { - stroke: stroke, - fill: fill, - 'stroke-width': strokeWidth - } - }); +export function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) { + return createSVG('path', { + className: className, + d: pathStr, + styles: { + stroke: stroke, + fill: fill, + 'stroke-width': strokeWidth + } + }); } -export function makeArcPathStr( - startPosition, - endPosition, - center, - radius, - clockWise = 1, - largeArc = 0 -) { - let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; - let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y]; - return `M${center.x} ${center.y} +export function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){ + let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; + let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y]; + return `M${center.x} ${center.y} L${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0} ${arcEndX} ${arcEndY} z`; } -export function makeCircleStr( - startPosition, - endPosition, - center, - radius, - clockWise = 1, - largeArc = 0 -) { - let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; - let [arcEndX, midArc, arcEndY] = [ - center.x + endPosition.x, - center.y * 2, - center.y + endPosition.y - ]; - return `M${center.x} ${center.y} +export function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){ + let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; + let [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y]; + return `M${center.x} ${center.y} L${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0} ${arcEndX} ${midArc} z @@ -161,38 +132,20 @@ export function makeCircleStr( ${arcEndX} ${arcEndY} z`; } -export function makeArcStrokePathStr( - startPosition, - endPosition, - center, - radius, - clockWise = 1, - largeArc = 0 -) { - let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; - let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y]; +export function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){ + let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; + let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y]; - return `M${arcStartX} ${arcStartY} + return `M${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0} ${arcEndX} ${arcEndY}`; } -export function makeStrokeCircleStr( - startPosition, - endPosition, - center, - radius, - clockWise = 1, - largeArc = 0 -) { - let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; - let [arcEndX, midArc, arcEndY] = [ - center.x + endPosition.x, - radius * 2 + arcStartY, - center.y + startPosition.y - ]; +export function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){ + let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y]; + let [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y]; - return `M${arcStartX} ${arcStartY} + return `M${arcStartX} ${arcStartY} A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0} ${arcEndX} ${midArc} M${arcStartX} ${midArc} @@ -201,221 +154,212 @@ export function makeStrokeCircleStr( } export function makeGradient(svgDefElem, color, lighter = false) { - let gradientId = - 'path-fill-gradient' + '-' + color + '-' + (lighter ? 'lighter' : 'default'); - let gradientDef = renderVerticalGradient(svgDefElem, gradientId); - let opacities = [1, 0.6, 0.2]; - if (lighter) { - opacities = [0.4, 0.2, 0]; - } + let gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default'); + let gradientDef = renderVerticalGradient(svgDefElem, gradientId); + let 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]); + setGradientStop(gradientDef, "0%", color, opacities[0]); + setGradientStop(gradientDef, "50%", color, opacities[1]); + setGradientStop(gradientDef, "100%", color, opacities[2]); - return gradientId; + return gradientId; } -export function percentageBar( - x, - y, - width, - height, - depth = PERCENTAGE_BAR_DEFAULT_DEPTH, - fill = 'none' -) { - let args = { - className: 'percentage-bar', - x: x, - y: y, - width: width, - height: height, - fill: fill, - styles: { - stroke: lightenDarkenColor(fill, -25), - // Diabolically good: https://stackoverflow.com/a/9000859 - // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray - 'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`, - 'stroke-width': depth - } - }; +export function percentageBar(x, y, width, height, + depth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') { - return createSVG('rect', args); + let args = { + className: 'percentage-bar', + x: x, + y: y, + width: width, + height: height, + fill: fill, + styles: { + 'stroke': lightenDarkenColor(fill, -25), + // Diabolically good: https://stackoverflow.com/a/9000859 + // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray + 'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`, + 'stroke-width': depth + }, + }; + + return createSVG("rect", args); } -export function heatSquare(className, x, y, size, radius, fill = 'none', data = {}) { - let args = { - className: className, - x: x, - y: y, - width: size, - height: size, - rx: radius, - fill: fill - }; +export function heatSquare(className, x, y, size, radius, fill='none', data={}) { + let args = { + className: className, + x: x, + y: y, + width: size, + height: size, + rx: radius, + fill: fill + }; - Object.keys(data).map((key) => { - args[key] = data[key]; - }); + Object.keys(data).map(key => { + args[key] = data[key]; + }); - return createSVG('rect', args); + return createSVG("rect", args); } -export function legendBar(x, y, size, fill = 'none', label, truncate = false) { - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; +export function legendBar(x, y, size, fill='none', label, truncate=false) { + label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - let args = { - className: 'legend-bar', - x: 0, - y: 0, - width: size, - height: '2px', - fill: fill - }; - let 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 - }); + let args = { + className: 'legend-bar', + x: 0, + y: 0, + width: size, + height: '2px', + fill: fill + }; + let 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 + }); - let group = createSVG('g', { - transform: `translate(${x}, ${y})` - }); - group.appendChild(createSVG('rect', args)); - group.appendChild(text); + let group = createSVG('g', { + transform: `translate(${x}, ${y})` + }); + group.appendChild(createSVG("rect", args)); + group.appendChild(text); - return group; + return group; } -export function legendDot(x, y, size, fill = 'none', label, truncate = false) { - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; +export function legendDot(x, y, size, fill='none', label, truncate=false) { + label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - let args = { - className: 'legend-dot', - cx: 0, - cy: 0, - r: size, - fill: fill - }; - let 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 - }); + let args = { + className: 'legend-dot', + cx: 0, + cy: 0, + r: size, + fill: fill + }; + let 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 + }); - let group = createSVG('g', { - transform: `translate(${x}, ${y})` - }); - group.appendChild(createSVG('circle', args)); - group.appendChild(text); + let group = createSVG('g', { + transform: `translate(${x}, ${y})` + }); + group.appendChild(createSVG("circle", args)); + group.appendChild(text); - return group; + return group; } export function makeText(className, x, y, content, options = {}) { - let fontSize = options.fontSize || FONT_SIZE; - let dy = options.dy !== undefined ? options.dy : fontSize / 2; - let fill = options.fill || FONT_FILL; - let 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 - }); + let fontSize = options.fontSize || FONT_SIZE; + let dy = options.dy !== undefined ? options.dy : (fontSize / 2); + let fill = options.fill || FONT_FILL; + let 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, options = {}) { - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - let l = createSVG('line', { - className: 'line-vertical ' + options.className, - x1: 0, - x2: 0, - y1: y1, - y2: y2, - styles: { - stroke: options.stroke - } - }); +function makeVertLine(x, label, y1, y2, options={}) { + if(!options.stroke) options.stroke = BASE_LINE_COLOR; + let l = createSVG('line', { + className: 'line-vertical ' + options.className, + x1: 0, + x2: 0, + y1: y1, + y2: y2, + styles: { + stroke: options.stroke + } + }); - let 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 + '' - }); + let 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 + "" + }); - let line = createSVG('g', { - transform: `translate(${x}, 0)` - }); + let line = createSVG('g', { + transform: `translate(${ x }, 0)` + }); - line.appendChild(l); - line.appendChild(text); + line.appendChild(l); + line.appendChild(text); - return line; + return line; } -function makeHoriLine(y, label, x1, x2, options = {}) { - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.lineType) options.lineType = ''; - if (!options.alignment) options.alignment = 'left'; - if (options.shortenNumbers) label = shortenLargeNumber(label); +function makeHoriLine(y, label, x1, x2, options={}) { + if(!options.stroke) options.stroke = BASE_LINE_COLOR; + if(!options.lineType) options.lineType = ''; + if (options.shortenNumbers) label = shortenLargeNumber(label); - let className = - 'line-horizontal ' + - options.className + - (options.lineType === 'dashed' ? 'dashed' : ''); + let className = 'line-horizontal ' + options.className + + (options.lineType === "dashed" ? "dashed": ""); - let l = createSVG('line', { - className: className, - x1: x1, - x2: x2, - y1: 0, - y2: 0, - styles: { - stroke: options.stroke - } - }); + let l = createSVG('line', { + className: className, + x1: x1, + x2: x2, + y1: 0, + y2: 0, + styles: { + stroke: options.stroke + } + }); - let text = createSVG('text', { - x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4, - y: 0, - dy: FONT_SIZE / 2 - 2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': x1 < x2 ? 'end' : 'start', - innerHTML: label + '' - }); + let 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+"" + }); - let line = createSVG('g', { - transform: `translate(0, ${y})`, - 'stroke-opacity': 1 - }); + let line = createSVG('g', { + transform: `translate(0, ${y})`, + 'stroke-opacity': 1 + }); - if (text === 0 || text === '0') { - line.style.stroke = 'rgba(27, 31, 35, 0.6)'; - } + if(text === 0 || text === '0') { + line.style.stroke = "rgba(27, 31, 35, 0.6)"; + } - line.appendChild(l); - line.appendChild(text); + line.appendChild(l); + line.appendChild(text); - return line; + return line; } export function generateAxisLabel(options) { @@ -442,387 +386,370 @@ export function generateAxisLabel(options) { return labelSvg; } -export function yLine(y, label, width, options = {}) { - if (!isValidNumber(y)) y = 0; +export function yLine(y, label, width, options={}) { + 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 = ''; + 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 = ''; - let x1 = -1 * AXIS_TICK_LENGTH; - let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; + let x1 = -1 * AXIS_TICK_LENGTH; + let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; - if (options.mode === 'tick' && options.pos === 'right') { - x1 = width + AXIS_TICK_LENGTH; - x2 = width; - } + if(options.mode === 'tick' && options.pos === 'right') { + x1 = width + AXIS_TICK_LENGTH; + x2 = width; + } - let offset = options.pos === 'left' ? -1 * options.offset : options.offset; + // let offset = options.pos === 'left' ? -1 * options.offset : options.offset; - x1 += offset; - x2 += offset; + x1 += options.offset; + x2 += options.offset; - return makeHoriLine(y, label, x1, x2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType, - alignment: options.pos, - shortenNumbers: options.shortenNumbers - }); + return makeHoriLine(y, label, x1, x2, { + stroke: options.stroke, + className: options.className, + lineType: options.lineType, + shortenNumbers: options.shortenNumbers + }); } -export function xLine(x, label, height, options = {}) { - if (!isValidNumber(x)) x = 0; +export function xLine(x, label, height, options={}) { + 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 = ''; + 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 + // Draw X axis line in span/tick mode with optional label + // y2(span) + // | + // | + // x line | + // | + // | + // ---------------------+-- y2(tick) + // | + // y1 - let y1 = height + AXIS_TICK_LENGTH; - let y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height; + let y1 = height + AXIS_TICK_LENGTH; + let 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; - } + 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 - }); + return makeVertLine(x, label, y1, y2, { + stroke: options.stroke, + className: options.className, + lineType: options.lineType + }); } -export function yMarker(y, label, width, options = {}) { - if (!options.labelPos) options.labelPos = 'right'; - let x = - options.labelPos === 'left' - ? LABEL_MARGIN - : width - getStringWidth(label, 5) - LABEL_MARGIN; +export function yMarker(y, label, width, options={}) { + if(!options.labelPos) options.labelPos = 'right'; + let x = options.labelPos === 'left' ? LABEL_MARGIN + : width - getStringWidth(label, 5) - LABEL_MARGIN; - let 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 + '' - }); + let 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+"" + }); - let line = makeHoriLine(y, '', 0, width, { - stroke: options.stroke || BASE_LINE_COLOR, - className: options.className || '', - lineType: options.lineType - }); + let line = makeHoriLine(y, '', 0, width, { + stroke: options.stroke || BASE_LINE_COLOR, + className: options.className || '', + lineType: options.lineType + }); - line.appendChild(labelSvg); + line.appendChild(labelSvg); - return line; + return line; } -export function yRegion(y1, y2, width, label, options = {}) { - // return a group - let height = y1 - y2; +export function yRegion(y1, y2, width, label, options={}) { + // return a group + let height = y1 - y2; - let rect = createSVG('rect', { - className: `bar mini`, // remove class - styles: { - fill: `rgba(228, 234, 239, 0.49)`, - stroke: BASE_LINE_COLOR, - 'stroke-dasharray': `${width}, ${height}` - }, - // 'data-point-index': index, - x: 0, - y: 0, - width: width, - height: height - }); + let rect = createSVG('rect', { + className: `bar mini`, // remove class + styles: { + fill: `rgba(228, 234, 239, 0.49)`, + stroke: BASE_LINE_COLOR, + 'stroke-dasharray': `${width}, ${height}` + }, + // 'data-point-index': index, + x: 0, + y: 0, + width: width, + height: height + }); - if (!options.labelPos) options.labelPos = 'right'; - let x = - options.labelPos === 'left' - ? LABEL_MARGIN - : width - getStringWidth(label + '', 4.5) - LABEL_MARGIN; + if(!options.labelPos) options.labelPos = 'right'; + let x = options.labelPos === 'left' ? LABEL_MARGIN + : width - getStringWidth(label+"", 4.5) - LABEL_MARGIN; - let 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 + '' - }); + let 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+"" + }); - let region = createSVG('g', { - transform: `translate(0, ${y2})` - }); + let region = createSVG('g', { + transform: `translate(0, ${y2})` + }); - region.appendChild(rect); - region.appendChild(labelSvg); + region.appendChild(rect); + region.appendChild(labelSvg); - return region; + return region; } -export function datasetBar( - x, - yTop, - width, - color, - label = '', - index = 0, - offset = 0, - meta = {} -) { - let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine); - y -= offset; +export function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) { + let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine); + y -= offset; - if (height === 0) { - height = meta.minHeight; - y -= meta.minHeight; - } + 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; + // 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; - let rect = createSVG('rect', { - className: `bar mini`, - style: `fill: ${color}`, - 'data-point-index': index, - x: x, - y: y, - width: width, - height: height - }); + let rect = createSVG('rect', { + className: `bar mini`, + style: `fill: ${color}`, + 'data-point-index': index, + x: x, + y: y, + width: width, + height: height + }); - label += ''; + label += ""; - if (!label && !label.length) { - return rect; - } else { - rect.setAttribute('y', 0); - rect.setAttribute('x', 0); - let 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 - }); + if(!label && !label.length) { + return rect; + } else { + rect.setAttribute('y', 0); + rect.setAttribute('x', 0); + let 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 + }); - let group = createSVG('g', { - 'data-point-index': index, - transform: `translate(${x}, ${y})` - }); - group.appendChild(rect); - group.appendChild(text); + let group = createSVG('g', { + 'data-point-index': index, + transform: `translate(${x}, ${y})` + }); + group.appendChild(rect); + group.appendChild(text); - return group; - } + return group; + } } -export function datasetDot(x, y, radius, color, label = '', index = 0) { - let dot = createSVG('circle', { - style: `fill: ${color}`, - 'data-point-index': index, - cx: x, - cy: y, - r: radius - }); +export function datasetDot(x, y, radius, color, label='', index=0) { + let dot = createSVG('circle', { + style: `fill: ${color}`, + 'data-point-index': index, + cx: x, + cy: y, + r: radius + }); - label += ''; + label += ""; - if (!label && !label.length) { - return dot; - } else { - dot.setAttribute('cy', 0); - dot.setAttribute('cx', 0); + if(!label && !label.length) { + return dot; + } else { + dot.setAttribute('cy', 0); + dot.setAttribute('cx', 0); - let 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 - }); + let 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 + }); - let group = createSVG('g', { - 'data-point-index': index, - transform: `translate(${x}, ${y})` - }); - group.appendChild(dot); - group.appendChild(text); + let group = createSVG('g', { + 'data-point-index': index, + transform: `translate(${x}, ${y})` + }); + group.appendChild(dot); + group.appendChild(text); - return group; - } + return group; + } } -export function getPaths(xList, yList, color, options = {}, meta = {}) { - let pointsList = yList.map((y, i) => xList[i] + ',' + y); - let pointsStr = pointsList.join('L'); +export function getPaths(xList, yList, color, options={}, meta={}) { + let pointsList = yList.map((y, i) => (xList[i] + ',' + y)); + let pointsStr = pointsList.join("L"); - // Spline - if (options.spline) pointsStr = getSplineCurvePointsStr(xList, yList); + // Spline + if (options.spline) + pointsStr = getSplineCurvePointsStr(xList, yList); - let path = makePath('M' + pointsStr, 'line-graph-path', color); + let path = makePath("M"+pointsStr, 'line-graph-path', color); - // HeatLine - if (options.heatline) { - let gradient_id = makeGradient(meta.svgDefs, color); - path.style.stroke = `url(#${gradient_id})`; - } + // HeatLine + if(options.heatline) { + let gradient_id = makeGradient(meta.svgDefs, color); + path.style.stroke = `url(#${gradient_id})`; + } - let paths = { - path: path - }; + let paths = { + path: path + }; - // Region - if (options.regionFill) { - let gradient_id_region = makeGradient(meta.svgDefs, color, true); + // Region + if(options.regionFill) { + let gradient_id_region = makeGradient(meta.svgDefs, color, true); - let pathStr = - 'M' + - `${xList[0]},${meta.zeroLine}L` + - pointsStr + - `L${xList.slice(-1)[0]},${meta.zeroLine}`; - paths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`); - } + let pathStr = "M" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`; + paths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`); + } - return paths; + return paths; } export let makeOverlay = { - bar: (unit) => { - let transformValue; - if (unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let overlay = unit.cloneNode(); - overlay.style.fill = '#000000'; - overlay.style.opacity = '0.4'; + 'bar': (unit) => { + let transformValue; + if(unit.nodeName !== 'rect') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let overlay = unit.cloneNode(); + overlay.style.fill = '#000000'; + overlay.style.opacity = '0.4'; - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - return overlay; - }, + if(transformValue) { + overlay.setAttribute('transform', transformValue); + } + return overlay; + }, - dot: (unit) => { - let transformValue; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let overlay = unit.cloneNode(); - let radius = unit.getAttribute('r'); - let fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; + 'dot': (unit) => { + let transformValue; + if(unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let overlay = unit.cloneNode(); + let radius = unit.getAttribute('r'); + let 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; - }, + if(transformValue) { + overlay.setAttribute('transform', transformValue); + } + return overlay; + }, - heat_square: (unit) => { - let transformValue; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let overlay = unit.cloneNode(); - let radius = unit.getAttribute('r'); - let fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; + 'heat_square': (unit) => { + let transformValue; + if(unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let overlay = unit.cloneNode(); + let radius = unit.getAttribute('r'); + let 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; - } + if(transformValue) { + overlay.setAttribute('transform', transformValue); + } + return overlay; + } }; export let updateOverlay = { - bar: (unit, overlay) => { - let transformValue; - if (unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let attributes = ['x', 'y', 'width', 'height']; - Object.values(unit.attributes) - .filter((attr) => attributes.includes(attr.name) && attr.specified) - .map((attr) => { - overlay.setAttribute(attr.name, attr.nodeValue); - }); + 'bar': (unit, overlay) => { + let transformValue; + if(unit.nodeName !== 'rect') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let attributes = ['x', 'y', 'width', 'height']; + Object.values(unit.attributes) + .filter(attr => attributes.includes(attr.name) && attr.specified) + .map(attr => { + overlay.setAttribute(attr.name, attr.nodeValue); + }); - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, + if(transformValue) { + overlay.setAttribute('transform', transformValue); + } + }, - dot: (unit, overlay) => { - let transformValue; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let attributes = ['cx', 'cy']; - Object.values(unit.attributes) - .filter((attr) => attributes.includes(attr.name) && attr.specified) - .map((attr) => { - overlay.setAttribute(attr.name, attr.nodeValue); - }); + 'dot': (unit, overlay) => { + let transformValue; + if(unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let attributes = ['cx', 'cy']; + Object.values(unit.attributes) + .filter(attr => attributes.includes(attr.name) && attr.specified) + .map(attr => { + overlay.setAttribute(attr.name, attr.nodeValue); + }); - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, + if(transformValue) { + overlay.setAttribute('transform', transformValue); + } + }, - heat_square: (unit, overlay) => { - let transformValue; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - let attributes = ['cx', 'cy']; - Object.values(unit.attributes) - .filter((attr) => attributes.includes(attr.name) && attr.specified) - .map((attr) => { - overlay.setAttribute(attr.name, attr.nodeValue); - }); + 'heat_square': (unit, overlay) => { + let transformValue; + if(unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + let attributes = ['cx', 'cy']; + Object.values(unit.attributes) + .filter(attr => attributes.includes(attr.name) && attr.specified) + .map(attr => { + overlay.setAttribute(attr.name, attr.nodeValue); + }); - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - } + if(transformValue) { + overlay.setAttribute('transform', transformValue); + } + }, }; From 5034c7a95496205e22b2cbe27903caa153dc365a Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Fri, 12 Nov 2021 19:02:04 -0800 Subject: [PATCH 3/9] Fixing label support. --- docs/assets/js/frappe-charts.min.js | 2 +- docs/assets/js/frappe-charts.min.js.map | 2 +- src/js/utils/draw.js | 116 ++++++++++++------------ 3 files changed, 62 insertions(+), 58 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index c6365d7..a5bc39e 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -1,2 +1,2 @@ -var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function u(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function h(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function D(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function M(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)D(a).appendChild(i);else if("around"===n){var s=D(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function T(t,e){return M("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function C(t,e,i,n){return M("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return M("svg",{className:e,inside:t,width:i,height:n})}function O(t){return M("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),M("g",n)}function S(t){return M("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*i.y,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z\n\t\tL"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*n+o,h=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+"\n\t\tM"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=T(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),C(a,"0%",e,s[0]),C(a,"50%",e,s[1]),C(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return M("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),M("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dy:2*oe+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dx:oe+"px",dy:oe/3+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||oe;return M("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le);var s=M("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=M("text",{x:0,y:i>n?i+se:i-se-oe,dy:oe+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:e+""}),o=M("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le),a.lineType||(a.lineType=""),a.shortenNumbers&&(e=x(e));var s=M("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=M("text",{x:i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;return"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i),a+=n.offset,s+=n.offset,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=M("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||le,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=M("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:le,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=M("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:n+""}),l=M("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),u=Ut(l,2),h=u[0],c=u[1];c-=r,0===h&&(h=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(h,!0)||(h=0),f(i,!0)||(i=0);var d=M("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:h});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=M("text",{className:"data-point-value",x:i/2,y:0,dy:oe/2*-1+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),v=M("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=M("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=M("text",{className:"data-point-value",x:0,y:0,dy:oe/2*-1-i+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),l=M("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var u=H(a.svgDefs,i,!0),h="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(h,"region-fill","none","url(#"+u+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ge,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],fe)}function et(t,e,i){return Z(t,[0,i],[0,e],fe)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},fe,ge],Z(t,[0,n],[0,i],fe)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},de,ge],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],fe)]:[[t,{width:n,height:o,x:e,y:l},de,ge]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],fe)]:[[t,{cx:e,cy:i},de,ge]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},pe,ge];if(s.push(o),t.region){var l=e[0]+","+n+"L",u="L"+e.slice(-1)[0]+", "+n,h=[t.region,{d:"M"+l+r+u},pe,ge];s.push(h)}return s}function rt(t,e){return[t,{d:e},de,ge]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var u=void 0;u="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:h,to:c,begin:"0s",dur:i/1e3+"s",values:h+";"+c,keySplines:ye[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)u.setAttribute(p,d[p]);r.appendChild(u),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ut(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ht(t,e,i){if(0!==i.length){var n=ut(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ve)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/ke)}function yt(t,e){var i=Ae*we;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Pe[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new Me(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Dt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Tt(t){function e(t,e){for(var i=Mt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Mt(n,a):Mt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Mt(o,l):Mt(o)).reverse().map(function(t){return-1*t})}return s}function Ct(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return h(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ne(e,i)):Ee[t]?new Ee[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                    \n\t\t\t\t
                    '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=10,le="#dadada",ue="#555b51",he={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},ce={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},de=350,pe=350,fe=de,ve=250,ge="easein",ye={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",be=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-u(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ht(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),xe=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-u(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,h=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],h+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(be),ke=7,we=1e3,Ae=86400,Pe=["January","February","March","April","May","June","July","August","September","October","November","December"],De=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Me=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,u=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(t,n){t.positions.map(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:e.constants.width}))}),i):t.positions.map(function(i,n){return G(i,t.labels[n],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})})},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var u=[];return this.store.map(function(t,e){u=u.concat(it(t,s[e],n[e],o[e]))}),u}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,u=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,u,r,o,t.fill,n);e.serializedSubDomains.push(a)}u+=s}),u=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,u=m(s,e),h=Ut(u,2);s=h[0],e=h[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var u=m(s,i),h=Ut(u,2);s=h[0],i=h[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Ce=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),u=l.left-o.left+parseInt(s.getAttribute("width"))/2,h=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(u,h,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(xe),Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?_(y,m,t.center,t.radius,a,h):E(y,m,t.center,t.radius,a,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Oe=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*ke+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+u(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+u(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*we);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],u=void 0,h=0;h2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(be),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):this.config.yAxisMode=n.yAxisMode||"span",this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return h(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0;if(t instanceof Array)n=Tt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Ct(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var l in t)!function(l){var u=t[l];n=Tt(u,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Ct(n)*s,o=n.map(function(t){return r-t*a});var h=e.config.yAxisConfig.find(function(t){return l===t.id})||[],c=h?h.position:"right";if(e.state.yAxis.length){var d=[],p=e.state.yAxis[0];p.positions.forEach(function(t){d.push(Math.ceil(t/a))}),n=d.reverse(),r=e.height-Ct(n)*s,o=p.positions}e.state.yAxis.push({axisID:l||"left-axis",labels:n,title:h.title,pos:c,scaleMultiplier:a,zeroLine:r,positions:o})}(l)}this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e,i){return e.map(function(e){var n=t.yAxis;return n instanceof Array&&(n=n.length>1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-h/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:h,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=he[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];ce[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(be),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?I(y,m,t.center,t.radius,t.clockWise,h):z(y,m,t.center,t.radius,t.clockWise,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Ee={bar:Ne,line:Ne,percentage:Ce,heatmap:Oe,pie:Le,donut:Se},_e=function t(e,i){return jt(this,t),Wt(i.type,e,i)},ze=Object.freeze({Chart:_e,PercentageChart:Ce,PieChart:Le,Heatmap:Oe,AxisChart:Ne}),Ie={};return Ie.NAME="Frappe Charts",Ie.VERSION="1.6.2",Ie=Object.assign({},Ie,ze)}(); +var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function u(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function h(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function D(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function M(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)D(a).appendChild(i);else if("around"===n){var s=D(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function T(t,e){return M("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function C(t,e,i,n){return M("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return M("svg",{className:e,inside:t,width:i,height:n})}function O(t){return M("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),M("g",n)}function S(t){return M("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*i.y,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z\n\t\tL"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*n+o,h=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+"\n\t\tM"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=T(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),C(a,"0%",e,s[0]),C(a,"50%",e,s[1]),C(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return M("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),M("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dy:2*oe+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dx:oe+"px",dy:oe/3+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||oe;return M("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le);var s=M("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=M("text",{x:0,y:i>n?i+se:i-se-oe,dy:oe+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:e+""}),o=M("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=M("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=M("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:oe/2-2+"px","font-size":oe+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=M("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||le,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=M("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:le,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=M("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:n+""}),l=M("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),u=Ut(l,2),h=u[0],c=u[1];c-=r,0===h&&(h=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(h,!0)||(h=0),f(i,!0)||(i=0);var d=M("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:h});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=M("text",{className:"data-point-value",x:i/2,y:0,dy:oe/2*-1+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),v=M("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=M("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=M("text",{className:"data-point-value",x:0,y:0,dy:oe/2*-1-i+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),l=M("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var u=H(a.svgDefs,i,!0),h="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(h,"region-fill","none","url(#"+u+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ge,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],fe)}function et(t,e,i){return Z(t,[0,i],[0,e],fe)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},fe,ge],Z(t,[0,n],[0,i],fe)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},de,ge],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],fe)]:[[t,{width:n,height:o,x:e,y:l},de,ge]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],fe)]:[[t,{cx:e,cy:i},de,ge]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},pe,ge];if(s.push(o),t.region){var l=e[0]+","+n+"L",u="L"+e.slice(-1)[0]+", "+n,h=[t.region,{d:"M"+l+r+u},pe,ge];s.push(h)}return s}function rt(t,e){return[t,{d:e},de,ge]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var u=void 0;u="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:h,to:c,begin:"0s",dur:i/1e3+"s",values:h+";"+c,keySplines:ye[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)u.setAttribute(p,d[p]);r.appendChild(u),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ut(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ht(t,e,i){if(0!==i.length){var n=ut(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ve)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/ke)}function yt(t,e){var i=Ae*we;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Pe[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new Me(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Dt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Tt(t){function e(t,e){for(var i=Mt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Mt(n,a):Mt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Mt(o,l):Mt(o)).reverse().map(function(t){return-1*t})}return s}function Ct(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return h(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ne(e,i)):Ee[t]?new Ee[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                      \n\t\t\t\t
                      '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=10,le="#dadada",ue="#555b51",he={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},ce={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},de=350,pe=350,fe=de,ve=250,ge="easein",ye={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",be=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-u(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ht(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),xe=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-u(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,h=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],h+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(be),ke=7,we=1e3,Ae=86400,Pe=["January","February","March","April","May","June","July","August","September","October","November","December"],De=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Me=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,u=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(t,n){t.positions.map(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:e.constants.width}))}),i):t.positions.map(function(i,n){return G(i,t.labels[n],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})})},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var u=[];return this.store.map(function(t,e){u=u.concat(it(t,s[e],n[e],o[e]))}),u}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,u=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,u,r,o,t.fill,n);e.serializedSubDomains.push(a)}u+=s}),u=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,u=m(s,e),h=Ut(u,2);s=h[0],e=h[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var u=m(s,i),h=Ut(u,2);s=h[0],i=h[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Ce=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),u=l.left-o.left+parseInt(s.getAttribute("width"))/2,h=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(u,h,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(xe),Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?_(y,m,t.center,t.radius,a,h):E(y,m,t.center,t.radius,a,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Oe=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*ke+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+u(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+u(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*we);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],u=void 0,h=0;h2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(be),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):this.config.yAxisMode=n.yAxisMode||"span",this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return h(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0;if(t instanceof Array)n=Tt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Ct(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var l in t)!function(l){var u=t[l];n=Tt(u,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Ct(n)*s,o=n.map(function(t){return r-t*a});var h=e.config.yAxisConfig.find(function(t){return l===t.id})||[],c=h?h.position:"right";if(e.state.yAxis.length){var d=[],p=e.state.yAxis[0];p.positions.forEach(function(t){d.push(Math.ceil(t/a))}),n=d.reverse(),r=e.height-Ct(n)*s,o=p.positions}e.state.yAxis.push({axisID:l||"left-axis",labels:n,title:h.title,pos:c,scaleMultiplier:a,zeroLine:r,positions:o})}(l)}this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e,i){return e.map(function(e){var n=t.yAxis;return n instanceof Array&&(n=n.length>1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-h/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:h,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=he[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];ce[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(be),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?I(y,m,t.center,t.radius,t.clockWise,h):z(y,m,t.center,t.radius,t.clockWise,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Ee={bar:Ne,line:Ne,percentage:Ce,heatmap:Oe,pie:Le,donut:Se},_e=function t(e,i){return jt(this,t),Wt(i.type,e,i)},ze=Object.freeze({Chart:_e,PercentageChart:Ce,PieChart:Le,Heatmap:Oe,AxisChart:Ne}),Ie={};return Ie.NAME="Frappe Charts",Ie.VERSION="1.6.2",Ie=Object.assign({},Ie,ze)}(); //# sourceMappingURL=frappe-charts.min.js.map diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index 32107b1..581538f 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.lineType) options.lineType = '';\n\tif (options.shortenNumbers) label = shortenLargeNumber(label);\n\n\tlet className = 'line-horizontal ' + options.className +\n\t\t(options.lineType === \"dashed\" ? \"dashed\": \"\");\n\n\tlet l = createSVG('line', {\n\t\tclassName: className,\n\t\tx1: x1,\n\t\tx2: x2,\n\t\ty1: 0,\n\t\ty2: 0,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / 2 - 2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': x1 < x2 ? 'end' : 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(0, ${y})`,\n\t\t'stroke-opacity': 1\n\t});\n\n\tif(text === 0 || text === '0') {\n\t\tline.style.stroke = \"rgba(27, 31, 35, 0.6)\";\n\t}\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options={}) {\n\tif (!isValidNumber(y)) y = 0;\n\n\tif(!options.pos) options.pos = 'left';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\tlet x1 = -1 * AXIS_TICK_LENGTH;\n\tlet x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n\tif(options.mode === 'tick' && options.pos === 'right') {\n\t\tx1 = width + AXIS_TICK_LENGTH;\n\t\tx2 = width;\n\t}\n\n\t// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n\tx1 += options.offset;\n\tx2 += options.offset;\n\n\treturn makeHoriLine(y, label, x1, x2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType,\n\t\tshortenNumbers: options.shortenNumbers\n\t});\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { makeText, generateAxisLabel, 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 this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\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\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n return data.positions.map((position, i) => {\n return yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n });\n });\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                        \n\t\t\t\t
                        `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = axisOptions.yAxisMode || 'span';\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions;\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\n const yAxisConfigObject =\n this.config.yAxisConfig.find((item) => key === item.id) || [];\n const yAxisAlignment = yAxisConfigObject\n ? yAxisConfigObject.position\n : 'right';\n\n if (this.state.yAxis.length) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n // we need to loop through original positions.\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","shortenNumbers","generateAxisLabel","title","position","rotation","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","find","yAxisAlignment","yPtsArray","firstArr","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { makeText, generateAxisLabel, 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 this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\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\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n return data.positions.map((position, i) => {\n return yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n });\n });\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                          \n\t\t\t\t
                          `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = axisOptions.yAxisMode || 'span';\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions;\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\n const yAxisConfigObject =\n this.config.yAxisConfig.find((item) => key === item.id) || [];\n const yAxisAlignment = yAxisConfigObject\n ? yAxisConfigObject.position\n : 'right';\n\n if (this.state.yAxis.length) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n // we need to loop through original positions.\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","rotation","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","find","yAxisAlignment","yPtsArray","firstArr","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file diff --git a/src/js/utils/draw.js b/src/js/utils/draw.js index f7f017b..7e765e5 100644 --- a/src/js/utils/draw.js +++ b/src/js/utils/draw.js @@ -319,47 +319,50 @@ function makeVertLine(x, label, y1, y2, options={}) { return line; } -function makeHoriLine(y, label, x1, x2, options={}) { - if(!options.stroke) options.stroke = BASE_LINE_COLOR; - if(!options.lineType) options.lineType = ''; - if (options.shortenNumbers) label = shortenLargeNumber(label); +function makeHoriLine(y, label, x1, x2, options = {}) { + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + if (!options.lineType) options.lineType = ''; + if (!options.alignment) options.alignment = 'left'; + if (options.shortenNumbers) label = shortenLargeNumber(label); - let className = 'line-horizontal ' + options.className + - (options.lineType === "dashed" ? "dashed": ""); + let className = + 'line-horizontal ' + + options.className + + (options.lineType === 'dashed' ? 'dashed' : ''); - let l = createSVG('line', { - className: className, - x1: x1, - x2: x2, - y1: 0, - y2: 0, - styles: { - stroke: options.stroke - } - }); + let l = createSVG('line', { + className: className, + x1: x1, + x2: x2, + y1: 0, + y2: 0, + styles: { + stroke: options.stroke + } + }); - let 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+"" - }); + let text = createSVG('text', { + x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4, + y: 0, + dy: FONT_SIZE / 2 - 2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': x1 < x2 ? 'end' : 'start', + innerHTML: label + '' + }); - let line = createSVG('g', { - transform: `translate(0, ${y})`, - 'stroke-opacity': 1 - }); + let line = createSVG('g', { + transform: `translate(0, ${y})`, + 'stroke-opacity': 1 + }); - if(text === 0 || text === '0') { - line.style.stroke = "rgba(27, 31, 35, 0.6)"; - } + if (text === 0 || text === '0') { + line.style.stroke = 'rgba(27, 31, 35, 0.6)'; + } - line.appendChild(l); - line.appendChild(text); + line.appendChild(l); + line.appendChild(text); - return line; + return line; } export function generateAxisLabel(options) { @@ -386,34 +389,35 @@ export function generateAxisLabel(options) { return labelSvg; } -export function yLine(y, label, width, options={}) { - if (!isValidNumber(y)) y = 0; +export function yLine(y, label, width, options = {}) { + 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 = ''; + 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 = ''; - let x1 = -1 * AXIS_TICK_LENGTH; - let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; + let x1 = -1 * AXIS_TICK_LENGTH; + let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; - if(options.mode === 'tick' && options.pos === 'right') { - x1 = width + AXIS_TICK_LENGTH; - x2 = width; - } + if (options.mode === 'tick' && options.pos === 'right') { + x1 = width + AXIS_TICK_LENGTH; + x2 = width; + } - // let offset = options.pos === 'left' ? -1 * options.offset : options.offset; + let offset = options.pos === 'left' ? -1 * options.offset : options.offset; - x1 += options.offset; - x2 += options.offset; + x1 += offset; + x2 += offset; - return makeHoriLine(y, label, x1, x2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType, - shortenNumbers: options.shortenNumbers - }); + return makeHoriLine(y, label, x1, x2, { + stroke: options.stroke, + className: options.className, + lineType: options.lineType, + alignment: options.pos, + shortenNumbers: options.shortenNumbers + }); } export function xLine(x, label, height, options={}) { From b4f3e77acbc29f9404eef5e805a3fa60792996dd Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Mon, 15 Nov 2021 10:28:30 -0800 Subject: [PATCH 4/9] Bug fixes and working with wrong yAxis data --- docs/assets/js/frappe-charts.min.js | 5111 ++++++++++++++++++++++- docs/assets/js/frappe-charts.min.js.map | 2 +- src/js/charts/AxisChart.js | 24 +- src/js/objects/ChartComponents.js | 281 +- 4 files changed, 5290 insertions(+), 128 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index a5bc39e..b683f4b 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -1,2 +1,5111 @@ -var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function u(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function h(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function D(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function M(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)D(a).appendChild(i);else if("around"===n){var s=D(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function T(t,e){return M("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function C(t,e,i,n){return M("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return M("svg",{className:e,inside:t,width:i,height:n})}function O(t){return M("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),M("g",n)}function S(t){return M("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*i.y,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z\n\t\tL"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,u=2*n+o,h=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+"\n\t\tM"+r+" "+u+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=T(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),C(a,"0%",e,s[0]),C(a,"50%",e,s[1]),C(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return M("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),M("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dy:2*oe+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=M("text",{className:"legend-dataset-text",x:0,y:0,dx:oe+"px",dy:oe/3+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=M("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(M("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||oe;return M("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le);var s=M("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=M("text",{x:0,y:i>n?i+se:i-se-oe,dy:oe+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:e+""}),o=M("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=M("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=M("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:oe/2-2+"px","font-size":oe+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=M("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||le,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=M("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:le,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=M("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:n+""}),l=M("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),u=Ut(l,2),h=u[0],c=u[1];c-=r,0===h&&(h=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(h,!0)||(h=0),f(i,!0)||(i=0);var d=M("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:h});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=M("text",{className:"data-point-value",x:i/2,y:0,dy:oe/2*-1+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),v=M("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=M("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=M("text",{className:"data-point-value",x:0,y:0,dy:oe/2*-1-i+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),l=M("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var u=H(a.svgDefs,i,!0),h="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(h,"region-fill","none","url(#"+u+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ge,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],fe)}function et(t,e,i){return Z(t,[0,i],[0,e],fe)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},fe,ge],Z(t,[0,n],[0,i],fe)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},de,ge],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],fe)]:[[t,{width:n,height:o,x:e,y:l},de,ge]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],fe)]:[[t,{cx:e,cy:i},de,ge]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},pe,ge];if(s.push(o),t.region){var l=e[0]+","+n+"L",u="L"+e.slice(-1)[0]+", "+n,h=[t.region,{d:"M"+l+r+u},pe,ge];s.push(h)}return s}function rt(t,e){return[t,{d:e},de,ge]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var u=void 0;u="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var h=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:h,to:c,begin:"0s",dur:i/1e3+"s",values:h+";"+c,keySplines:ye[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)u.setAttribute(p,d[p]);r.appendChild(u),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ut(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ht(t,e,i){if(0!==i.length){var n=ut(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ve)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/ke)}function yt(t,e){var i=Ae*we;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Pe[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new Me(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Dt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Tt(t){function e(t,e){for(var i=Mt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Mt(n,a):Mt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Mt(o,l):Mt(o)).reverse().map(function(t){return-1*t})}return s}function Ct(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return h(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ne(e,i)):Ee[t]?new Ee[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                            \n\t\t\t\t
                            '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=10,le="#dadada",ue="#555b51",he={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},ce={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},de=350,pe=350,fe=de,ve=250,ge="easein",ye={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",be=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-u(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ht(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),xe=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-u(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,h=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],h+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(be),ke=7,we=1e3,Ae=86400,Pe=["January","February","March","April","May","June","July","August","September","October","November","December"],De=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Me=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,u=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=u,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(t,n){t.positions.map(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:e.constants.width}))}),i):t.positions.map(function(i,n){return G(i,t.labels[n],e.constants.width,{mode:e.constants.mode,pos:e.constants.pos,shortenNumbers:e.constants.shortenNumbers})})},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var u=m(r,a),h=Ut(u,2);return r=h[0],a=h[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var u=[];return this.store.map(function(t,e){u=u.concat(it(t,s[e],n[e],o[e]))}),u}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,u=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,u,r,o,t.fill,n);e.serializedSubDomains.push(a)}u+=s}),u=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,u=m(s,e),h=Ut(u,2);s=h[0],e=h[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var u=m(s,i),h=Ut(u,2);s=h[0],i=h[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Ce=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),u=l.left-o.left+parseInt(s.getAttribute("width"))/2,h=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(u,h,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(xe),Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?_(y,m,t.center,t.radius,a,h):E(y,m,t.center,t.radius,a,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Oe=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*ke+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+u(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+u(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*we);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],u=void 0,h=0;h2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(be),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):this.config.yAxisMode=n.yAxisMode||"span",this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return h(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0;if(t instanceof Array)n=Tt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Ct(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var l in t)!function(l){var u=t[l];n=Tt(u,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Ct(n)*s,o=n.map(function(t){return r-t*a});var h=e.config.yAxisConfig.find(function(t){return l===t.id})||[],c=h?h.position:"right";if(e.state.yAxis.length){var d=[],p=e.state.yAxis[0];p.positions.forEach(function(t){d.push(Math.ceil(t/a))}),n=d.reverse(),r=e.height-Ct(n)*s,o=p.positions}e.state.yAxis.push({axisID:l||"left-axis",labels:n,title:h.title,pos:c,scaleMultiplier:a,zeroLine:r,positions:o})}(l)}this.calcDatasetPoints(),this.calcYExtremes(),this.calcYRegions()}},{key:"calcDatasetPoints",value:function(){var t=this.state,e=function(e,i){return e.map(function(e){var n=t.yAxis;return n instanceof Array&&(n=n.length>1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-h/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:h,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=he[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];ce[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(be),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,u=i/e.grandTotal*360,h=u>180?1:0,c=a?-u:u,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===u?I(y,m,t.center,t.radius,t.clockWise,h):z(y,m,t.center,t.radius,t.clockWise,h);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,u=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",h=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:u,value:h+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Ee={bar:Ne,line:Ne,percentage:Ce,heatmap:Oe,pie:Le,donut:Se},_e=function t(e,i){return jt(this,t),Wt(i.type,e,i)},ze=Object.freeze({Chart:_e,PercentageChart:Ce,PieChart:Le,Heatmap:Oe,AxisChart:Ne}),Ie={};return Ie.NAME="Frappe Charts",Ie.VERSION="1.6.2",Ie=Object.assign({},Ie,ze)}(); +var frappe = (function () { +'use strict'; + +function styleInject(css, ref) { + if ( ref === void 0 ) ref = {}; + var insertAt = ref.insertAt; + + if (!css || typeof document === 'undefined') { return; } + + var head = document.head || document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + style.type = 'text/css'; + + if (insertAt === 'top') { + if (head.firstChild) { + head.insertBefore(style, head.firstChild); + } else { + head.appendChild(style); + } + } else { + head.appendChild(style); + } + + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } +} + +var css = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:\" \";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}"; +styleInject(css); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + + + + + +var asyncGenerator = function () { + function AwaitValue(value) { + this.value = value; + } + + function AsyncGenerator(gen) { + var front, back; + + function send(key, arg) { + return new Promise(function (resolve, reject) { + var request = { + key: key, + arg: arg, + resolve: resolve, + reject: reject, + next: null + }; + + if (back) { + back = back.next = request; + } else { + front = back = request; + resume(key, arg); + } + }); + } + + function resume(key, arg) { + try { + var result = gen[key](arg); + var value = result.value; + + if (value instanceof AwaitValue) { + Promise.resolve(value.value).then(function (arg) { + resume("next", arg); + }, function (arg) { + resume("throw", arg); + }); + } else { + settle(result.done ? "return" : "normal", result.value); + } + } catch (err) { + settle("throw", err); + } + } + + function settle(type, value) { + switch (type) { + case "return": + front.resolve({ + value: value, + done: true + }); + break; + + case "throw": + front.reject(value); + break; + + default: + front.resolve({ + value: value, + done: false + }); + break; + } + + front = front.next; + + if (front) { + resume(front.key, front.arg); + } else { + back = null; + } + } + + this._invoke = send; + + if (typeof gen.return !== "function") { + this.return = undefined; + } + } + + if (typeof Symbol === "function" && Symbol.asyncIterator) { + AsyncGenerator.prototype[Symbol.asyncIterator] = function () { + return this; + }; + } + + AsyncGenerator.prototype.next = function (arg) { + return this._invoke("next", arg); + }; + + AsyncGenerator.prototype.throw = function (arg) { + return this._invoke("throw", arg); + }; + + AsyncGenerator.prototype.return = function (arg) { + return this._invoke("return", arg); + }; + + return { + wrap: function (fn) { + return function () { + return new AsyncGenerator(fn.apply(this, arguments)); + }; + }, + await: function (value) { + return new AwaitValue(value); + } + }; +}(); + + + + + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + + + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + + + + + +var slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +}(); + + + + + + + + + + + + + +var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + +function $(expr, con) { + return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null; +} + + + +$.create = function (tag, o) { + var element = document.createElement(tag); + + for (var i in o) { + var val = o[i]; + + if (i === "inside") { + $(val).appendChild(element); + } else if (i === "around") { + var ref = $(val); + ref.parentNode.insertBefore(element, ref); + element.appendChild(ref); + } else if (i === "styles") { + if ((typeof val === "undefined" ? "undefined" : _typeof(val)) === "object") { + Object.keys(val).map(function (prop) { + element.style[prop] = val[prop]; + }); + } + } else if (i in element) { + element[i] = val; + } else { + element.setAttribute(i, val); + } + } + + return element; +}; + +function getOffset(element) { + var rect = element.getBoundingClientRect(); + return { + // https://stackoverflow.com/a/7436602/6495043 + // rect.top varies with scroll, so we add whatever has been + // scrolled to it to get absolute distance from actual page top + top: rect.top + (document.documentElement.scrollTop || document.body.scrollTop), + left: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft) + }; +} + +// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent +// an element's offsetParent property will return null whenever it, or any of its parents, +// is hidden via the display style property. +function isHidden(el) { + return el.offsetParent === null; +} + +function isElementInViewport(el) { + // Although straightforward: https://stackoverflow.com/a/7557433/6495043 + var rect = el.getBoundingClientRect(); + + return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ + rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ + ; +} + +function getElementContentWidth(element) { + var styles = window.getComputedStyle(element); + var padding = parseFloat(styles.paddingLeft) + parseFloat(styles.paddingRight); + + return element.clientWidth - padding; +} + + + + + +function fire(target, type, properties) { + var evt = document.createEvent("HTMLEvents"); + + evt.initEvent(type, true, true); + + for (var j in properties) { + evt[j] = properties[j]; + } + + return target.dispatchEvent(evt); +} + +// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/ + +var BASE_MEASURES = { + margins: { + top: 10, + bottom: 10, + left: 20, + right: 20 + }, + paddings: { + top: 20, + bottom: 40, + left: 30, + right: 10 + }, + + baseHeight: 240, + titleHeight: 20, + legendHeight: 30, + + titleFontSize: 12 +}; + +function getTopOffset(m) { + return m.titleHeight + m.margins.top + m.paddings.top; +} + +function getLeftOffset(m) { + return m.margins.left + m.paddings.left; +} + +function getExtraHeight(m) { + var totalExtraHeight = m.margins.top + m.margins.bottom + m.paddings.top + m.paddings.bottom + m.titleHeight + m.legendHeight; + return totalExtraHeight; +} + +function getExtraWidth(m) { + var totalExtraWidth = m.margins.left + m.margins.right + m.paddings.left + m.paddings.right; + + return totalExtraWidth; +} + +var INIT_CHART_UPDATE_TIMEOUT = 700; +var CHART_POST_ANIMATE_TIMEOUT = 400; + +var DEFAULT_AXIS_CHART_TYPE = 'line'; +var AXIS_DATASET_CHART_TYPES = ['line', 'bar']; + +var AXIS_LEGEND_BAR_SIZE = 100; + +var BAR_CHART_SPACE_RATIO = 0.5; +var MIN_BAR_PERCENT_HEIGHT = 0.00; + +var LINE_CHART_DOT_SIZE = 4; +var DOT_OVERLAY_SIZE_INCR = 4; + +var PERCENTAGE_BAR_DEFAULT_HEIGHT = 20; +var PERCENTAGE_BAR_DEFAULT_DEPTH = 2; + +// Fixed 5-color theme, +// More colors are difficult to parse visually +var HEATMAP_DISTRIBUTION_SIZE = 5; + +var HEATMAP_SQUARE_SIZE = 10; +var HEATMAP_GUTTER_SIZE = 2; + +var DEFAULT_CHAR_WIDTH = 7; + +var TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5; + +var DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange', 'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey']; +var HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127']; + + + +var DEFAULT_COLORS = { + bar: DEFAULT_CHART_COLORS, + line: DEFAULT_CHART_COLORS, + pie: DEFAULT_CHART_COLORS, + percentage: DEFAULT_CHART_COLORS, + heatmap: HEATMAP_COLORS_GREEN, + donut: DEFAULT_CHART_COLORS +}; + +// Universal constants +var ANGLE_RATIO = Math.PI / 180; +var FULL_ANGLE = 360; + +var SvgTip = function () { + function SvgTip(_ref) { + var _ref$parent = _ref.parent, + parent = _ref$parent === undefined ? null : _ref$parent, + _ref$colors = _ref.colors, + colors = _ref$colors === undefined ? [] : _ref$colors; + classCallCheck(this, SvgTip); + + this.parent = parent; + this.colors = colors; + this.titleName = ''; + this.titleValue = ''; + this.listValues = []; + this.titleValueFirst = 0; + + this.x = 0; + this.y = 0; + + this.top = 0; + this.left = 0; + + this.setup(); + } + + createClass(SvgTip, [{ + key: 'setup', + value: function setup() { + this.makeTooltip(); + } + }, { + key: 'refresh', + value: function refresh() { + this.fill(); + this.calcPosition(); + } + }, { + key: 'makeTooltip', + value: function makeTooltip() { + var _this = this; + + this.container = $.create('div', { + inside: this.parent, + className: 'graph-svg-tip comparison', + innerHTML: '\n\t\t\t\t
                              \n\t\t\t\t
                              ' + }); + this.hideTip(); + + this.title = this.container.querySelector('.title'); + this.dataPointList = this.container.querySelector('.data-point-list'); + + this.parent.addEventListener('mouseleave', function () { + _this.hideTip(); + }); + } + }, { + key: 'fill', + value: function fill() { + var _this2 = this; + + var title = void 0; + if (this.index) { + this.container.setAttribute('data-point-index', this.index); + } + if (this.titleValueFirst) { + title = '' + this.titleValue + '' + this.titleName; + } else { + title = this.titleName + '' + this.titleValue + ''; + } + this.title.innerHTML = title; + this.dataPointList.innerHTML = ''; + + this.listValues.map(function (set$$1, i) { + var color = _this2.colors[i] || 'black'; + var value = set$$1.formatted === 0 || set$$1.formatted ? set$$1.formatted : set$$1.value; + + var li = $.create('li', { + styles: { + 'border-top': '3px solid ' + color + }, + innerHTML: '' + (value === 0 || value ? value : '') + '\n\t\t\t\t\t' + (set$$1.title ? set$$1.title : '') + }); + + _this2.dataPointList.appendChild(li); + }); + } + }, { + key: 'calcPosition', + value: function calcPosition() { + var width = this.container.offsetWidth; + + this.top = this.y - this.container.offsetHeight - TOOLTIP_POINTER_TRIANGLE_HEIGHT; + this.left = this.x - width / 2; + var maxLeft = this.parent.offsetWidth - width; + + var pointer = this.container.querySelector('.svg-pointer'); + + if (this.left < 0) { + pointer.style.left = 'calc(50% - ' + -1 * this.left + 'px)'; + this.left = 0; + } else if (this.left > maxLeft) { + var delta = this.left - maxLeft; + var pointerOffset = 'calc(50% + ' + delta + 'px)'; + pointer.style.left = pointerOffset; + + this.left = maxLeft; + } else { + pointer.style.left = '50%'; + } + } + }, { + key: 'setValues', + value: function setValues(x, y) { + var title = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var listValues = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; + var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; + + this.titleName = title.name; + this.titleValue = title.value; + this.listValues = listValues; + this.x = x; + this.y = y; + this.titleValueFirst = title.valueFirst || 0; + this.index = index; + this.refresh(); + } + }, { + key: 'hideTip', + value: function hideTip() { + this.container.style.top = '0px'; + this.container.style.left = '0px'; + this.container.style.opacity = '0'; + } + }, { + key: 'showTip', + value: function showTip() { + this.container.style.top = this.top + 'px'; + this.container.style.left = this.left + 'px'; + this.container.style.opacity = '1'; + } + }]); + return SvgTip; +}(); + +function floatTwo(d) { + return parseFloat(d.toFixed(2)); +} + +/** + * Returns whether or not two given arrays are equal. + * @param {Array} arr1 First array + * @param {Array} arr2 Second array + */ + + +/** + * Shuffles array in place. ES6 version + * @param {Array} array An array containing the items. + */ + + +/** + * Fill an array with extra points + * @param {Array} array Array + * @param {Number} count number of filler elements + * @param {Object} element element to fill with + * @param {Boolean} start fill at start? + */ +function fillArray(array, count, element) { + var start = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + if (!element) { + element = start ? array[0] : array[array.length - 1]; + } + var fillerArray = new Array(Math.abs(count)).fill(element); + array = start ? fillerArray.concat(array) : array.concat(fillerArray); + return array; +} + +/** + * Returns pixel width of string. + * @param {String} string + * @param {Number} charWidth Width of single char in pixels + */ +function getStringWidth(string, charWidth) { + return (string + "").length * charWidth; +} + + + +// https://stackoverflow.com/a/29325222 + + +function getPositionByAngle(angle, radius) { + return { + x: Math.sin(angle * ANGLE_RATIO) * radius, + y: Math.cos(angle * ANGLE_RATIO) * radius + }; +} + +/** + * Check if a number is valid for svg attributes + * @param {object} candidate Candidate to test + * @param {Boolean} nonNegative flag to treat negative number as invalid + */ +function isValidNumber(candidate) { + var nonNegative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (Number.isNaN(candidate)) return false;else if (candidate === undefined) return false;else if (!Number.isFinite(candidate)) return false;else if (nonNegative && candidate < 0) return false;else return true; +} + +/** + * Round a number to the closes precision, max max precision 4 + * @param {Number} d Any Number + */ +function round(d) { + // https://floating-point-gui.de/ + // https://www.jacklmoore.com/notes/rounding-in-javascript/ + return Number(Math.round(d + 'e4') + 'e-4'); +} + +/** + * Creates a deep clone of an object + * @param {Object} candidate Any Object + */ +function deepClone(candidate) { + var cloned = void 0, + value = void 0, + key = void 0; + + if (candidate instanceof Date) { + return new Date(candidate.getTime()); + } + + if ((typeof candidate === 'undefined' ? 'undefined' : _typeof(candidate)) !== "object" || candidate === null) { + return candidate; + } + + cloned = Array.isArray(candidate) ? [] : {}; + + for (key in candidate) { + value = candidate[key]; + + cloned[key] = deepClone(value); + } + + return cloned; +} + +function getBarHeightAndYAttr(yTop, zeroLine) { + var height = void 0, + y = void 0; + if (yTop <= zeroLine) { + height = zeroLine - yTop; + y = yTop; + } else { + height = yTop - zeroLine; + y = zeroLine; + } + + return [height, y]; +} + +function equilizeNoOfElements(array1, array2) { + var extraCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : array2.length - array1.length; + + + // Doesn't work if either has zero elements. + if (extraCount > 0) { + array1 = fillArray(array1, extraCount); + } else { + array2 = fillArray(array2, extraCount); + } + return [array1, array2]; +} + +function truncateString(txt, len) { + if (!txt) { + return; + } + if (txt.length > len) { + return txt.slice(0, len - 3) + '...'; + } else { + return txt; + } +} + +function shortenLargeNumber(label) { + var number = void 0; + if (typeof label === 'number') number = label;else if (typeof label === 'string') { + number = Number(label); + if (Number.isNaN(number)) return label; + } + + // Using absolute since log wont work for negative numbers + var p = Math.floor(Math.log10(Math.abs(number))); + if (p <= 2) return number; // Return as is for a 3 digit number of less + var l = Math.floor(p / 3); + var shortened = Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1); + + // Correct for floating point error upto 2 decimal places + return Math.round(shortened * 100) / 100 + ' ' + ['', 'K', 'M', 'B', 'T'][l]; +} + +// cubic bezier curve calculation (from example by François Romain) +function getSplineCurvePointsStr(xList, yList) { + + var points = []; + for (var i = 0; i < xList.length; i++) { + points.push([xList[i], yList[i]]); + } + + var smoothing = 0.2; + var line = function line(pointA, pointB) { + var lengthX = pointB[0] - pointA[0]; + var lengthY = pointB[1] - pointA[1]; + return { + length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)), + angle: Math.atan2(lengthY, lengthX) + }; + }; + + var controlPoint = function controlPoint(current, previous, next, reverse) { + var p = previous || current; + var n = next || current; + var o = line(p, n); + var angle = o.angle + (reverse ? Math.PI : 0); + var length = o.length * smoothing; + var x = current[0] + Math.cos(angle) * length; + var y = current[1] + Math.sin(angle) * length; + return [x, y]; + }; + + var bezierCommand = function bezierCommand(point, i, a) { + var cps = controlPoint(a[i - 1], a[i - 2], point); + var cpe = controlPoint(point, a[i - 1], a[i + 1], true); + return 'C ' + cps[0] + ',' + cps[1] + ' ' + cpe[0] + ',' + cpe[1] + ' ' + point[0] + ',' + point[1]; + }; + + var pointStr = function pointStr(points, command) { + return points.reduce(function (acc, point, i, a) { + return i === 0 ? point[0] + ',' + point[1] : acc + ' ' + command(point, i, a); + }, ''); + }; + + return pointStr(points, bezierCommand); +} + +var PRESET_COLOR_MAP = { + 'light-blue': '#7cd6fd', + 'blue': '#5e64ff', + 'violet': '#743ee2', + 'red': '#ff5858', + 'orange': '#ffa00a', + 'yellow': '#feef72', + 'green': '#28a745', + 'light-green': '#98d85b', + 'purple': '#b554ff', + 'magenta': '#ffa3ef', + 'black': '#36114C', + 'grey': '#bdd3e6', + 'light-grey': '#f0f4f7', + 'dark-grey': '#b8c2cc' +}; + +function limitColor(r) { + if (r > 255) return 255;else if (r < 0) return 0; + return r; +} + +function lightenDarkenColor(color, amt) { + var col = getColor(color); + var usePound = false; + if (col[0] == "#") { + col = col.slice(1); + usePound = true; + } + var num = parseInt(col, 16); + var r = limitColor((num >> 16) + amt); + var b = limitColor((num >> 8 & 0x00FF) + amt); + var g = limitColor((num & 0x0000FF) + amt); + return (usePound ? "#" : "") + (g | b << 8 | r << 16).toString(16); +} + +function isValidColor(string) { + // https://stackoverflow.com/a/32685393 + var HEX_RE = /(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i; + var RGB_RE = /(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i; + return HEX_RE.test(string) || RGB_RE.test(string); +} + +var getColor = function getColor(color) { + // When RGB color, convert to hexadecimal (alpha value is omitted) + if (/rgb[a]{0,1}\([\d, ]+\)/gim.test(color)) { + return (/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(color).map(function (x, i) { + return i !== 0 ? Number(x).toString(16) : '#'; + }).reduce(function (c, ch) { + return '' + c + ch; + }) + ); + } + return PRESET_COLOR_MAP[color] || color; +}; + +var AXIS_TICK_LENGTH = 6; +var LABEL_MARGIN = 4; +var LABEL_MAX_CHARS = 15; +var FONT_SIZE = 10; +var BASE_LINE_COLOR = '#dadada'; +var FONT_FILL = '#555b51'; + +function $$1(expr, con) { + return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null; +} + +function createSVG(tag, o) { + var element = document.createElementNS("http://www.w3.org/2000/svg", tag); + + for (var i in o) { + var val = o[i]; + + if (i === "inside") { + $$1(val).appendChild(element); + } else if (i === "around") { + var ref = $$1(val); + ref.parentNode.insertBefore(element, ref); + element.appendChild(ref); + } else if (i === "styles") { + if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === "object") { + Object.keys(val).map(function (prop) { + element.style[prop] = val[prop]; + }); + } + } else { + if (i === "className") { + i = "class"; + } + if (i === "innerHTML") { + element['textContent'] = val; + } else { + element.setAttribute(i, val); + } + } + } + + return element; +} + +function renderVerticalGradient(svgDefElem, gradientId) { + return createSVG('linearGradient', { + inside: svgDefElem, + id: gradientId, + x1: 0, + x2: 0, + y1: 0, + y2: 1 + }); +} + +function setGradientStop(gradElem, offset, color, opacity) { + return createSVG('stop', { + 'inside': gradElem, + 'style': 'stop-color: ' + color, + 'offset': offset, + 'stop-opacity': opacity + }); +} + +function makeSVGContainer(parent, className, width, height) { + return createSVG('svg', { + className: className, + inside: parent, + width: width, + height: height + }); +} + +function makeSVGDefs(svgContainer) { + return createSVG('defs', { + inside: svgContainer + }); +} + +function makeSVGGroup(className) { + var transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var parent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + + var args = { + className: className, + transform: transform + }; + if (parent) args.inside = parent; + return createSVG('g', args); +} + + + +function makePath(pathStr) { + var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var stroke = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'none'; + var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; + var strokeWidth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 2; + + return createSVG('path', { + className: className, + d: pathStr, + styles: { + stroke: stroke, + fill: fill, + 'stroke-width': strokeWidth + } + }); +} + +function makeArcPathStr(startPosition, endPosition, center, radius) { + var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + var arcStartX = center.x + startPosition.x, + arcStartY = center.y + startPosition.y; + var arcEndX = center.x + endPosition.x, + arcEndY = center.y + endPosition.y; + + return 'M' + center.x + ' ' + center.y + '\n\t\tL' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY + ' z'; +} + +function makeCircleStr(startPosition, endPosition, center, radius) { + var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + var arcStartX = center.x + startPosition.x, + arcStartY = center.y + startPosition.y; + var arcEndX = center.x + endPosition.x, + midArc = center.y * 2, + arcEndY = center.y + endPosition.y; + + return 'M' + center.x + ' ' + center.y + '\n\t\tL' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + midArc + ' z\n\t\tL' + arcStartX + ' ' + midArc + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY + ' z'; +} + +function makeArcStrokePathStr(startPosition, endPosition, center, radius) { + var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + var arcStartX = center.x + startPosition.x, + arcStartY = center.y + startPosition.y; + var arcEndX = center.x + endPosition.x, + arcEndY = center.y + endPosition.y; + + + return 'M' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY; +} + +function makeStrokeCircleStr(startPosition, endPosition, center, radius) { + var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; + var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + var arcStartX = center.x + startPosition.x, + arcStartY = center.y + startPosition.y; + var arcEndX = center.x + endPosition.x, + midArc = radius * 2 + arcStartY, + arcEndY = center.y + startPosition.y; + + + return 'M' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + midArc + '\n\t\tM' + arcStartX + ' ' + midArc + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY; +} + +function makeGradient(svgDefElem, color) { + var lighter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var gradientId = 'path-fill-gradient' + '-' + color + '-' + (lighter ? 'lighter' : 'default'); + var gradientDef = renderVerticalGradient(svgDefElem, gradientId); + var opacities = [1, 0.6, 0.2]; + if (lighter) { + opacities = [0.4, 0.2, 0]; + } + + setGradientStop(gradientDef, "0%", color, opacities[0]); + setGradientStop(gradientDef, "50%", color, opacities[1]); + setGradientStop(gradientDef, "100%", color, opacities[2]); + + return gradientId; +} + +function percentageBar(x, y, width, height) { + var depth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : PERCENTAGE_BAR_DEFAULT_DEPTH; + var fill = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'none'; + + + var args = { + className: 'percentage-bar', + x: x, + y: y, + width: width, + height: height, + fill: fill, + styles: { + 'stroke': lightenDarkenColor(fill, -25), + // Diabolically good: https://stackoverflow.com/a/9000859 + // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray + 'stroke-dasharray': '0, ' + (height + width) + ', ' + width + ', ' + height, + 'stroke-width': depth + } + }; + + return createSVG("rect", args); +} + +function heatSquare(className, x, y, size, radius) { + var fill = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'none'; + var data = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {}; + + var args = { + className: className, + x: x, + y: y, + width: size, + height: size, + rx: radius, + fill: fill + }; + + Object.keys(data).map(function (key) { + args[key] = data[key]; + }); + + return createSVG("rect", args); +} + +function legendBar(x, y, size) { + var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; + var label = arguments[4]; + var truncate = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; + + label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; + + var args = { + className: 'legend-bar', + x: 0, + y: 0, + width: size, + height: '2px', + fill: fill + }; + var text = createSVG('text', { + className: 'legend-dataset-text', + x: 0, + y: 0, + dy: FONT_SIZE * 2 + 'px', + 'font-size': FONT_SIZE * 1.2 + 'px', + 'text-anchor': 'start', + fill: FONT_FILL, + innerHTML: label + }); + + var group = createSVG('g', { + transform: 'translate(' + x + ', ' + y + ')' + }); + group.appendChild(createSVG("rect", args)); + group.appendChild(text); + + return group; +} + +function legendDot(x, y, size) { + var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; + var label = arguments[4]; + var truncate = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; + + label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; + + var args = { + className: 'legend-dot', + cx: 0, + cy: 0, + r: size, + fill: fill + }; + var text = createSVG('text', { + className: 'legend-dataset-text', + x: 0, + y: 0, + dx: FONT_SIZE + 'px', + dy: FONT_SIZE / 3 + 'px', + 'font-size': FONT_SIZE * 1.2 + 'px', + 'text-anchor': 'start', + fill: FONT_FILL, + innerHTML: label + }); + + var group = createSVG('g', { + transform: 'translate(' + x + ', ' + y + ')' + }); + group.appendChild(createSVG("circle", args)); + group.appendChild(text); + + return group; +} + +function makeText(className, x, y, content) { + var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + var fontSize = options.fontSize || FONT_SIZE; + var dy = options.dy !== undefined ? options.dy : fontSize / 2; + var fill = options.fill || FONT_FILL; + var textAnchor = options.textAnchor || 'start'; + return createSVG('text', { + className: className, + x: x, + y: y, + dy: dy + 'px', + 'font-size': fontSize + 'px', + fill: fill, + 'text-anchor': textAnchor, + innerHTML: content + }); +} + +function makeVertLine(x, label, y1, y2) { + var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + var l = createSVG('line', { + className: 'line-vertical ' + options.className, + x1: 0, + x2: 0, + y1: y1, + y2: y2, + styles: { + stroke: options.stroke + } + }); + + var text = createSVG('text', { + x: 0, + y: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE, + dy: FONT_SIZE + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': 'middle', + innerHTML: label + "" + }); + + var line = createSVG('g', { + transform: 'translate(' + x + ', 0)' + }); + + line.appendChild(l); + line.appendChild(text); + + return line; +} + +function makeHoriLine(y, label, x1, x2) { + var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + if (!options.lineType) options.lineType = ''; + if (!options.alignment) options.alignment = 'left'; + if (options.shortenNumbers) label = shortenLargeNumber(label); + + var className = 'line-horizontal ' + options.className + (options.lineType === 'dashed' ? 'dashed' : ''); + + var l = createSVG('line', { + className: className, + x1: x1, + x2: x2, + y1: 0, + y2: 0, + styles: { + stroke: options.stroke + } + }); + + var text = createSVG('text', { + x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4, + y: 0, + dy: FONT_SIZE / 2 - 2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': x1 < x2 ? 'end' : 'start', + innerHTML: label + '' + }); + + var line = createSVG('g', { + transform: 'translate(0, ' + y + ')', + 'stroke-opacity': 1 + }); + + if (text === 0 || text === '0') { + line.style.stroke = 'rgba(27, 31, 35, 0.6)'; + } + + line.appendChild(l); + line.appendChild(text); + + return line; +} + +function generateAxisLabel(options) { + if (!options.title) return; + + var x = options.position === 'left' ? LABEL_MARGIN : options.width; + // - getStringWidth(options.title, 5); + var rotation = options.position === 'right' ? 'rotate(90, ' + options.width + ', ' + options.height / 2 + ')' : 'rotate(270, 0, ' + options.height / 2 + ')'; + + var labelSvg = createSVG('text', { + className: 'chart-label', + x: x - getStringWidth(options.title, 5) / 2, + y: options.height / 2 - LABEL_MARGIN, + dy: FONT_SIZE / -2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': 'start', + transform: rotation, + innerHTML: options.title + '' + }); + + return labelSvg; +} + +function yLine(y, label, width) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + if (!isValidNumber(y)) y = 0; + + if (!options.pos) options.pos = 'left'; + if (!options.offset) options.offset = 0; + if (!options.mode) options.mode = 'span'; + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + if (!options.className) options.className = ''; + + var x1 = -1 * AXIS_TICK_LENGTH; + var x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; + + if (options.mode === 'tick' && options.pos === 'right') { + x1 = width + AXIS_TICK_LENGTH; + x2 = width; + } + + var offset = options.pos === 'left' ? -1 * options.offset : options.offset; + + x1 += offset; + x2 += offset; + + return makeHoriLine(y, label, x1, x2, { + stroke: options.stroke, + className: options.className, + lineType: options.lineType, + alignment: options.pos, + shortenNumbers: options.shortenNumbers + }); +} + +function xLine(x, label, height) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + if (!isValidNumber(x)) x = 0; + + if (!options.pos) options.pos = 'bottom'; + if (!options.offset) options.offset = 0; + if (!options.mode) options.mode = 'span'; + if (!options.stroke) options.stroke = BASE_LINE_COLOR; + if (!options.className) options.className = ''; + + // Draw X axis line in span/tick mode with optional label + // y2(span) + // | + // | + // x line | + // | + // | + // ---------------------+-- y2(tick) + // | + // y1 + + var y1 = height + AXIS_TICK_LENGTH; + var y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height; + + if (options.mode === 'tick' && options.pos === 'top') { + // top axis ticks + y1 = -1 * AXIS_TICK_LENGTH; + y2 = 0; + } + + return makeVertLine(x, label, y1, y2, { + stroke: options.stroke, + className: options.className, + lineType: options.lineType + }); +} + +function yMarker(y, label, width) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + if (!options.labelPos) options.labelPos = 'right'; + var x = options.labelPos === 'left' ? LABEL_MARGIN : width - getStringWidth(label, 5) - LABEL_MARGIN; + + var labelSvg = createSVG('text', { + className: 'chart-label', + x: x, + y: 0, + dy: FONT_SIZE / -2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': 'start', + innerHTML: label + "" + }); + + var line = makeHoriLine(y, '', 0, width, { + stroke: options.stroke || BASE_LINE_COLOR, + className: options.className || '', + lineType: options.lineType + }); + + line.appendChild(labelSvg); + + return line; +} + +function yRegion(y1, y2, width, label) { + var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + // return a group + var height = y1 - y2; + + var rect = createSVG('rect', { + className: 'bar mini', // remove class + styles: { + fill: 'rgba(228, 234, 239, 0.49)', + stroke: BASE_LINE_COLOR, + 'stroke-dasharray': width + ', ' + height + }, + // 'data-point-index': index, + x: 0, + y: 0, + width: width, + height: height + }); + + if (!options.labelPos) options.labelPos = 'right'; + var x = options.labelPos === 'left' ? LABEL_MARGIN : width - getStringWidth(label + "", 4.5) - LABEL_MARGIN; + + var labelSvg = createSVG('text', { + className: 'chart-label', + x: x, + y: 0, + dy: FONT_SIZE / -2 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': 'start', + innerHTML: label + "" + }); + + var region = createSVG('g', { + transform: 'translate(0, ' + y2 + ')' + }); + + region.appendChild(rect); + region.appendChild(labelSvg); + + return region; +} + +function datasetBar(x, yTop, width, color) { + var label = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; + var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + var offset = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0; + var meta = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : {}; + + var _getBarHeightAndYAttr = getBarHeightAndYAttr(yTop, meta.zeroLine), + _getBarHeightAndYAttr2 = slicedToArray(_getBarHeightAndYAttr, 2), + height = _getBarHeightAndYAttr2[0], + y = _getBarHeightAndYAttr2[1]; + + y -= offset; + + if (height === 0) { + height = meta.minHeight; + y -= meta.minHeight; + } + + // Preprocess numbers to avoid svg building errors + if (!isValidNumber(x)) x = 0; + if (!isValidNumber(y)) y = 0; + if (!isValidNumber(height, true)) height = 0; + if (!isValidNumber(width, true)) width = 0; + + var rect = createSVG('rect', { + className: 'bar mini', + style: 'fill: ' + color, + 'data-point-index': index, + x: x, + y: y, + width: width, + height: height + }); + + label += ""; + + if (!label && !label.length) { + return rect; + } else { + rect.setAttribute('y', 0); + rect.setAttribute('x', 0); + var text = createSVG('text', { + className: 'data-point-value', + x: width / 2, + y: 0, + dy: FONT_SIZE / 2 * -1 + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': 'middle', + innerHTML: label + }); + + var group = createSVG('g', { + 'data-point-index': index, + transform: 'translate(' + x + ', ' + y + ')' + }); + group.appendChild(rect); + group.appendChild(text); + + return group; + } +} + +function datasetDot(x, y, radius, color) { + var label = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; + var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + + var dot = createSVG('circle', { + style: 'fill: ' + color, + 'data-point-index': index, + cx: x, + cy: y, + r: radius + }); + + label += ""; + + if (!label && !label.length) { + return dot; + } else { + dot.setAttribute('cy', 0); + dot.setAttribute('cx', 0); + + var text = createSVG('text', { + className: 'data-point-value', + x: 0, + y: 0, + dy: FONT_SIZE / 2 * -1 - radius + 'px', + 'font-size': FONT_SIZE + 'px', + 'text-anchor': 'middle', + innerHTML: label + }); + + var group = createSVG('g', { + 'data-point-index': index, + transform: 'translate(' + x + ', ' + y + ')' + }); + group.appendChild(dot); + group.appendChild(text); + + return group; + } +} + +function getPaths(xList, yList, color) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + var meta = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; + + var pointsList = yList.map(function (y, i) { + return xList[i] + ',' + y; + }); + var pointsStr = pointsList.join("L"); + + // Spline + if (options.spline) pointsStr = getSplineCurvePointsStr(xList, yList); + + var path = makePath("M" + pointsStr, 'line-graph-path', color); + + // HeatLine + if (options.heatline) { + var gradient_id = makeGradient(meta.svgDefs, color); + path.style.stroke = 'url(#' + gradient_id + ')'; + } + + var paths = { + path: path + }; + + // Region + if (options.regionFill) { + var gradient_id_region = makeGradient(meta.svgDefs, color, true); + + var pathStr = "M" + (xList[0] + ',' + meta.zeroLine + 'L') + pointsStr + ('L' + xList.slice(-1)[0] + ',' + meta.zeroLine); + paths.region = makePath(pathStr, 'region-fill', 'none', 'url(#' + gradient_id_region + ')'); + } + + return paths; +} + +var makeOverlay = { + 'bar': function bar(unit) { + var transformValue = void 0; + if (unit.nodeName !== 'rect') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + var overlay = unit.cloneNode(); + overlay.style.fill = '#000000'; + overlay.style.opacity = '0.4'; + + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + return overlay; + }, + + 'dot': function dot(unit) { + var transformValue = void 0; + if (unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + var overlay = unit.cloneNode(); + var radius = unit.getAttribute('r'); + var fill = unit.getAttribute('fill'); + overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); + overlay.setAttribute('fill', fill); + overlay.style.opacity = '0.6'; + + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + return overlay; + }, + + 'heat_square': function heat_square(unit) { + var transformValue = void 0; + if (unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + var overlay = unit.cloneNode(); + var radius = unit.getAttribute('r'); + var fill = unit.getAttribute('fill'); + overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); + overlay.setAttribute('fill', fill); + overlay.style.opacity = '0.6'; + + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + return overlay; + } +}; + +var updateOverlay = { + 'bar': function bar(unit, overlay) { + var transformValue = void 0; + if (unit.nodeName !== 'rect') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + var attributes = ['x', 'y', 'width', 'height']; + Object.values(unit.attributes).filter(function (attr) { + return attributes.includes(attr.name) && attr.specified; + }).map(function (attr) { + overlay.setAttribute(attr.name, attr.nodeValue); + }); + + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + }, + + 'dot': function dot(unit, overlay) { + var transformValue = void 0; + if (unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + var attributes = ['cx', 'cy']; + Object.values(unit.attributes).filter(function (attr) { + return attributes.includes(attr.name) && attr.specified; + }).map(function (attr) { + overlay.setAttribute(attr.name, attr.nodeValue); + }); + + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + }, + + 'heat_square': function heat_square(unit, overlay) { + var transformValue = void 0; + if (unit.nodeName !== 'circle') { + transformValue = unit.getAttribute('transform'); + unit = unit.childNodes[0]; + } + var attributes = ['cx', 'cy']; + Object.values(unit.attributes).filter(function (attr) { + return attributes.includes(attr.name) && attr.specified; + }).map(function (attr) { + overlay.setAttribute(attr.name, attr.nodeValue); + }); + + if (transformValue) { + overlay.setAttribute('transform', transformValue); + } + } +}; + +var UNIT_ANIM_DUR = 350; +var PATH_ANIM_DUR = 350; +var MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR; +var REPLACE_ALL_NEW_DUR = 250; + +var STD_EASING = 'easein'; + +function translate(unit, oldCoord, newCoord, duration) { + var old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', '); + return [unit, { transform: newCoord.join(', ') }, duration, STD_EASING, "translate", { transform: old }]; +} + +function translateVertLine(xLine, newX, oldX) { + return translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR); +} + +function translateHoriLine(yLine, newY, oldY) { + return translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR); +} + +function animateRegion(rectGroup, newY1, newY2, oldY2) { + var newHeight = newY1 - newY2; + var rect = rectGroup.childNodes[0]; + var width = rect.getAttribute("width"); + var rectAnim = [rect, { height: newHeight, 'stroke-dasharray': width + ', ' + newHeight }, MARKER_LINE_ANIM_DUR, STD_EASING]; + + var groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR); + return [rectAnim, groupAnim]; +} + +function animateBar(bar, x, yTop, width) { + var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + var meta = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + + var _getBarHeightAndYAttr = getBarHeightAndYAttr(yTop, meta.zeroLine), + _getBarHeightAndYAttr2 = slicedToArray(_getBarHeightAndYAttr, 2), + height = _getBarHeightAndYAttr2[0], + y = _getBarHeightAndYAttr2[1]; + + y -= offset; + if (bar.nodeName !== 'rect') { + var rect = bar.childNodes[0]; + var rectAnim = [rect, { width: width, height: height }, UNIT_ANIM_DUR, STD_EASING]; + + var oldCoordStr = bar.getAttribute("transform").split("(")[1].slice(0, -1); + var groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); + return [rectAnim, groupAnim]; + } else { + return [[bar, { width: width, height: height, x: x, y: y }, UNIT_ANIM_DUR, STD_EASING]]; + } + // bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein); +} + +function animateDot(dot, x, y) { + if (dot.nodeName !== 'circle') { + var oldCoordStr = dot.getAttribute("transform").split("(")[1].slice(0, -1); + var groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); + return [groupAnim]; + } else { + return [[dot, { cx: x, cy: y }, UNIT_ANIM_DUR, STD_EASING]]; + } + // dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein); +} + +function animatePath(paths, newXList, newYList, zeroLine, spline) { + var pathComponents = []; + var pointsStr = newYList.map(function (y, i) { + return newXList[i] + ',' + y; + }).join("L"); + + if (spline) pointsStr = getSplineCurvePointsStr(newXList, newYList); + + var animPath = [paths.path, { d: "M" + pointsStr }, PATH_ANIM_DUR, STD_EASING]; + pathComponents.push(animPath); + + if (paths.region) { + var regStartPt = newXList[0] + ',' + zeroLine + 'L'; + var regEndPt = 'L' + newXList.slice(-1)[0] + ', ' + zeroLine; + + var animRegion = [paths.region, { d: "M" + regStartPt + pointsStr + regEndPt }, PATH_ANIM_DUR, STD_EASING]; + pathComponents.push(animRegion); + } + + return pathComponents; +} + +function animatePathStr(oldPath, pathStr) { + return [oldPath, { d: pathStr }, UNIT_ANIM_DUR, STD_EASING]; +} + +// Leveraging SMIL Animations + +var EASING = { + ease: "0.25 0.1 0.25 1", + linear: "0 0 1 1", + // easein: "0.42 0 1 1", + easein: "0.1 0.8 0.2 1", + easeout: "0 0 0.58 1", + easeinout: "0.42 0 0.58 1" +}; + +function animateSVGElement(element, props, dur) { + var easingType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "linear"; + var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; + var oldValues = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; + + + var animElement = element.cloneNode(true); + var newElement = element.cloneNode(true); + + for (var attributeName in props) { + var animateElement = void 0; + if (attributeName === 'transform') { + animateElement = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform"); + } else { + animateElement = document.createElementNS("http://www.w3.org/2000/svg", "animate"); + } + var currentValue = oldValues[attributeName] || element.getAttribute(attributeName); + var value = props[attributeName]; + + var animAttr = { + attributeName: attributeName, + from: currentValue, + to: value, + begin: "0s", + dur: dur / 1000 + "s", + values: currentValue + ";" + value, + keySplines: EASING[easingType], + keyTimes: "0;1", + calcMode: "spline", + fill: 'freeze' + }; + + if (type) { + animAttr["type"] = type; + } + + for (var i in animAttr) { + animateElement.setAttribute(i, animAttr[i]); + } + + animElement.appendChild(animateElement); + + if (type) { + newElement.setAttribute(attributeName, "translate(" + value + ")"); + } else { + newElement.setAttribute(attributeName, value); + } + } + + return [animElement, newElement]; +} + +function transform(element, style) { + // eslint-disable-line no-unused-vars + element.style.transform = style; + element.style.webkitTransform = style; + element.style.msTransform = style; + element.style.mozTransform = style; + element.style.oTransform = style; +} + +function animateSVG(svgContainer, elements) { + var newElements = []; + var animElements = []; + + elements.map(function (element) { + var unit = element[0]; + var parent = unit.parentNode; + + var animElement = void 0, + newElement = void 0; + + element[0] = unit; + + var _animateSVGElement = animateSVGElement.apply(undefined, toConsumableArray(element)); + + var _animateSVGElement2 = slicedToArray(_animateSVGElement, 2); + + animElement = _animateSVGElement2[0]; + newElement = _animateSVGElement2[1]; + + + newElements.push(newElement); + animElements.push([animElement, parent]); + + if (parent) { + parent.replaceChild(animElement, unit); + } + }); + + var animSvg = svgContainer.cloneNode(true); + + animElements.map(function (animElement, i) { + if (animElement[1]) { + animElement[1].replaceChild(newElements[i], animElement[0]); + elements[i][0] = newElements[i]; + } + }); + + return animSvg; +} + +function runSMILAnimation(parent, svgElement, elementsToAnimate) { + if (elementsToAnimate.length === 0) return; + + var animSvgElement = animateSVG(svgElement, elementsToAnimate); + if (svgElement.parentNode == parent) { + parent.removeChild(svgElement); + parent.appendChild(animSvgElement); + } + + // Replace the new svgElement (data has already been replaced) + setTimeout(function () { + if (animSvgElement.parentNode == parent) { + parent.removeChild(animSvgElement); + parent.appendChild(svgElement); + } + }, REPLACE_ALL_NEW_DUR); +} + +var CSSTEXT = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}"; + +function downloadFile(filename, data) { + var a = document.createElement('a'); + a.style = "display: none"; + var blob = new Blob(data, { type: "image/svg+xml; charset=utf-8" }); + var url = window.URL.createObjectURL(blob); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + setTimeout(function () { + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + }, 300); +} + +function prepareForExport(svg) { + var clone = svg.cloneNode(true); + clone.classList.add('chart-container'); + clone.setAttribute('xmlns', "http://www.w3.org/2000/svg"); + clone.setAttribute('xmlns:xlink', "http://www.w3.org/1999/xlink"); + var styleEl = $.create('style', { + 'innerHTML': CSSTEXT + }); + clone.insertBefore(styleEl, clone.firstChild); + + var container = $.create('div'); + container.appendChild(clone); + + return container.innerHTML; +} + +var BaseChart = function () { + function BaseChart(parent, options) { + classCallCheck(this, BaseChart); + + // deepclone options to avoid making changes to orignal object + options = deepClone(options); + + this.parent = typeof parent === 'string' ? document.querySelector(parent) : parent; + + if (!(this.parent instanceof HTMLElement)) { + throw new Error('No `parent` element to render on was provided.'); + } + + this.rawChartArgs = options; + + this.title = options.title || ''; + this.type = options.type || ''; + + this.realData = this.prepareData(options.data); + this.data = this.prepareFirstData(this.realData); + + this.colors = this.validateColors(options.colors, this.type); + + this.config = { + showTooltip: 1, // calculate + showLegend: 1, // calculate + isNavigable: options.isNavigable || 0, + animate: typeof options.animate !== 'undefined' ? options.animate : 1, + truncateLegends: options.truncateLegends || 1 + }; + + this.measures = JSON.parse(JSON.stringify(BASE_MEASURES)); + var m = this.measures; + this.setMeasures(options); + if (!this.title.length) { + m.titleHeight = 0; + } + if (!this.config.showLegend) m.legendHeight = 0; + this.argHeight = options.height || m.baseHeight; + + this.state = {}; + this.options = {}; + + this.initTimeout = INIT_CHART_UPDATE_TIMEOUT; + + if (this.config.isNavigable) { + this.overlays = []; + } + + this.configure(options); + } + + createClass(BaseChart, [{ + key: 'prepareData', + value: function prepareData(data) { + return data; + } + }, { + key: 'prepareFirstData', + value: function prepareFirstData(data) { + return data; + } + }, { + key: 'validateColors', + value: function validateColors(colors, type) { + var validColors = []; + colors = (colors || []).concat(DEFAULT_COLORS[type]); + colors.forEach(function (string) { + var color = getColor(string); + if (!isValidColor(color)) { + console.warn('"' + string + '" is not a valid color.'); + } else { + validColors.push(color); + } + }); + return validColors; + } + }, { + key: 'setMeasures', + value: function setMeasures() { + // Override measures, including those for title and legend + // set config for legend and title + } + }, { + key: 'configure', + value: function configure() { + var _this = this; + + var height = this.argHeight; + this.baseHeight = height; + this.height = height - getExtraHeight(this.measures); + + // Bind window events + this.boundDrawFn = function () { + return _this.draw(true); + }; + if (ResizeObserver) { + this.resizeObserver = new ResizeObserver(this.boundDrawFn); + this.resizeObserver.observe(this.parent); + } + window.addEventListener('resize', this.boundDrawFn); + window.addEventListener('orientationchange', this.boundDrawFn); + } + }, { + key: 'destroy', + value: function destroy() { + if (this.resizeObserver) this.resizeObserver.disconnect(); + window.removeEventListener('resize', this.boundDrawFn); + window.removeEventListener('orientationchange', this.boundDrawFn); + } + + // Has to be called manually + + }, { + key: 'setup', + value: function setup() { + this.makeContainer(); + this.updateWidth(); + this.makeTooltip(); + + this.draw(false, true); + } + }, { + key: 'makeContainer', + value: function makeContainer() { + // Chart needs a dedicated parent element + this.parent.innerHTML = ''; + + var args = { + inside: this.parent, + className: 'chart-container' + }; + + if (this.independentWidth) { + args.styles = { width: this.independentWidth + 'px' }; + } + + this.container = $.create('div', args); + } + }, { + key: 'makeTooltip', + value: function makeTooltip() { + this.tip = new SvgTip({ + parent: this.container, + colors: this.colors + }); + this.bindTooltip(); + } + }, { + key: 'bindTooltip', + value: function bindTooltip() {} + }, { + key: 'draw', + value: function draw() { + var _this2 = this; + + var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (onlyWidthChange && isHidden(this.parent)) { + // Don't update anything if the chart is hidden + return; + } + this.updateWidth(); + + this.calc(onlyWidthChange); + this.makeChartArea(); + this.setupComponents(); + + this.components.forEach(function (c) { + return c.setup(_this2.drawArea); + }); + // this.components.forEach(c => c.make()); + this.render(this.components, false); + + if (init) { + this.data = this.realData; + setTimeout(function () { + _this2.update(_this2.data); + }, this.initTimeout); + } + + this.renderLegend(); + + this.setupNavigation(init); + } + }, { + key: 'calc', + value: function calc() {} // builds state + + }, { + key: 'updateWidth', + value: function updateWidth() { + this.baseWidth = getElementContentWidth(this.parent); + this.width = this.baseWidth - getExtraWidth(this.measures); + } + }, { + key: 'makeChartArea', + value: function makeChartArea() { + if (this.svg) { + this.container.removeChild(this.svg); + } + var m = this.measures; + + this.svg = makeSVGContainer(this.container, 'frappe-chart chart', this.baseWidth, this.baseHeight); + this.svgDefs = makeSVGDefs(this.svg); + + if (this.title.length) { + this.titleEL = makeText('title', m.margins.left, m.margins.top, this.title, { + fontSize: m.titleFontSize, + fill: '#666666', + dy: m.titleFontSize + }); + } + + var top = getTopOffset(m); + this.drawArea = makeSVGGroup(this.type + '-chart chart-draw-area', 'translate(' + getLeftOffset(m) + ', ' + top + ')'); + + if (this.config.showLegend) { + top += this.height + m.paddings.bottom; + this.legendArea = makeSVGGroup('chart-legend', 'translate(' + getLeftOffset(m) + ', ' + top + ')'); + } + + if (this.title.length) { + this.svg.appendChild(this.titleEL); + } + this.svg.appendChild(this.drawArea); + if (this.config.showLegend) { + this.svg.appendChild(this.legendArea); + } + + this.updateTipOffset(getLeftOffset(m), getTopOffset(m)); + } + }, { + key: 'updateTipOffset', + value: function updateTipOffset(x, y) { + this.tip.offset = { + x: x, + y: y + }; + } + }, { + key: 'setupComponents', + value: function setupComponents() { + this.components = new Map(); + } + }, { + key: 'update', + value: function update(data) { + if (!data) { + console.error('No data to update.'); + } + this.data = this.prepareData(data); + this.calc(); // builds state + this.render(this.components, this.config.animate); + this.renderLegend(); + } + }, { + key: 'render', + value: function render() { + var _this3 = this; + + var components = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.components; + var animate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + if (this.config.isNavigable) { + // Remove all existing overlays + this.overlays.map(function (o) { + return o.parentNode.removeChild(o); + }); + // ref.parentNode.insertBefore(element, ref); + } + var elementsToAnimate = []; + // Can decouple to this.refreshComponents() first to save animation timeout + components.forEach(function (c) { + elementsToAnimate = elementsToAnimate.concat(c.update(animate)); + }); + if (elementsToAnimate.length > 0) { + runSMILAnimation(this.container, this.svg, elementsToAnimate); + setTimeout(function () { + components.forEach(function (c) { + return c.make(); + }); + _this3.updateNav(); + }, CHART_POST_ANIMATE_TIMEOUT); + } else { + components.forEach(function (c) { + return c.make(); + }); + this.updateNav(); + } + } + }, { + key: 'updateNav', + value: function updateNav() { + if (this.config.isNavigable) { + this.makeOverlay(); + this.bindUnits(); + } + } + }, { + key: 'renderLegend', + value: function renderLegend() {} + }, { + key: 'setupNavigation', + value: function setupNavigation() { + var _this4 = this; + + var init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + if (!this.config.isNavigable) return; + + if (init) { + this.bindOverlay(); + + this.keyActions = { + '13': this.onEnterKey.bind(this), + '37': this.onLeftArrow.bind(this), + '38': this.onUpArrow.bind(this), + '39': this.onRightArrow.bind(this), + '40': this.onDownArrow.bind(this) + }; + + document.addEventListener('keydown', function (e) { + if (isElementInViewport(_this4.container)) { + e = e || window.event; + if (_this4.keyActions[e.keyCode]) { + _this4.keyActions[e.keyCode](); + } + } + }); + } + } + }, { + key: 'makeOverlay', + value: function makeOverlay$$1() {} + }, { + key: 'updateOverlay', + value: function updateOverlay$$1() {} + }, { + key: 'bindOverlay', + value: function bindOverlay() {} + }, { + key: 'bindUnits', + value: function bindUnits() {} + }, { + key: 'onLeftArrow', + value: function onLeftArrow() {} + }, { + key: 'onRightArrow', + value: function onRightArrow() {} + }, { + key: 'onUpArrow', + value: function onUpArrow() {} + }, { + key: 'onDownArrow', + value: function onDownArrow() {} + }, { + key: 'onEnterKey', + value: function onEnterKey() {} + }, { + key: 'addDataPoint', + value: function addDataPoint() {} + }, { + key: 'removeDataPoint', + value: function removeDataPoint() {} + }, { + key: 'getDataPoint', + value: function getDataPoint() {} + }, { + key: 'setCurrentDataPoint', + value: function setCurrentDataPoint() {} + }, { + key: 'updateDataset', + value: function updateDataset() {} + }, { + key: 'export', + value: function _export() { + var chartSvg = prepareForExport(this.svg); + downloadFile(this.title || 'Chart', [chartSvg]); + } + }]); + return BaseChart; +}(); + +var AggregationChart = function (_BaseChart) { + inherits(AggregationChart, _BaseChart); + + function AggregationChart(parent, args) { + classCallCheck(this, AggregationChart); + return possibleConstructorReturn(this, (AggregationChart.__proto__ || Object.getPrototypeOf(AggregationChart)).call(this, parent, args)); + } + + createClass(AggregationChart, [{ + key: 'configure', + value: function configure(args) { + get(AggregationChart.prototype.__proto__ || Object.getPrototypeOf(AggregationChart.prototype), 'configure', this).call(this, args); + + this.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY; + this.config.maxSlices = args.maxSlices || 20; + this.config.maxLegendPoints = args.maxLegendPoints || 20; + } + }, { + key: 'calc', + value: function calc() { + var _this2 = this; + + var s = this.state; + var maxSlices = this.config.maxSlices; + s.sliceTotals = []; + + var allTotals = this.data.labels.map(function (label, i) { + var total = 0; + _this2.data.datasets.map(function (e) { + total += e.values[i]; + }); + return [total, label]; + }).filter(function (d) { + return d[0] >= 0; + }); // keep only positive results + + var totals = allTotals; + if (allTotals.length > maxSlices) { + // Prune and keep a grey area for rest as per maxSlices + allTotals.sort(function (a, b) { + return b[0] - a[0]; + }); + + totals = allTotals.slice(0, maxSlices - 1); + var remaining = allTotals.slice(maxSlices - 1); + + var sumOfRemaining = 0; + remaining.map(function (d) { + sumOfRemaining += d[0]; + }); + totals.push([sumOfRemaining, 'Rest']); + this.colors[maxSlices - 1] = 'grey'; + } + + s.labels = []; + totals.map(function (d) { + s.sliceTotals.push(round(d[0])); + s.labels.push(d[1]); + }); + + s.grandTotal = s.sliceTotals.reduce(function (a, b) { + return a + b; + }, 0); + + this.center = { + x: this.width / 2, + y: this.height / 2 + }; + } + }, { + key: 'renderLegend', + value: function renderLegend() { + var _this3 = this; + + var s = this.state; + this.legendArea.textContent = ''; + this.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints); + + var count = 0; + var y = 0; + this.legendTotals.map(function (d, i) { + var barWidth = 150; + var divisor = Math.floor((_this3.width - getExtraWidth(_this3.measures)) / barWidth); + if (_this3.legendTotals.length < divisor) { + barWidth = _this3.width / _this3.legendTotals.length; + } + if (count > divisor) { + count = 0; + y += 20; + } + var x = barWidth * count + 5; + var label = _this3.config.truncateLegends ? truncateString(s.labels[i], barWidth / 10) : s.labels[i]; + var formatted = _this3.config.formatTooltipY ? _this3.config.formatTooltipY(d) : d; + var dot = legendDot(x, y, 5, _this3.colors[i], label + ': ' + formatted, false); + _this3.legendArea.appendChild(dot); + count++; + }); + } + }]); + return AggregationChart; +}(BaseChart); + +// Playing around with dates + +var NO_OF_YEAR_MONTHS = 12; +var NO_OF_DAYS_IN_WEEK = 7; + +var NO_OF_MILLIS = 1000; +var SEC_IN_DAY = 86400; + +var MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; + + +var DAY_NAMES_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + + +// https://stackoverflow.com/a/11252167/6495043 +function treatAsUtc(date) { + var result = new Date(date); + result.setMinutes(result.getMinutes() - result.getTimezoneOffset()); + return result; +} + +function getYyyyMmDd(date) { + var dd = date.getDate(); + var mm = date.getMonth() + 1; // getMonth() is zero-based + return [date.getFullYear(), (mm > 9 ? '' : '0') + mm, (dd > 9 ? '' : '0') + dd].join('-'); +} + +function clone(date) { + return new Date(date.getTime()); +} + + + + + +// export function getMonthsBetween(startDate, endDate) {} + +function getWeeksBetween(startDate, endDate) { + var weekStartDate = setDayToSunday(startDate); + return Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK); +} + +function getDaysBetween(startDate, endDate) { + var millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS; + return (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay; +} + +function areInSameMonth(startDate, endDate) { + return startDate.getMonth() === endDate.getMonth() && startDate.getFullYear() === endDate.getFullYear(); +} + +function getMonthName(i) { + var short = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var monthName = MONTH_NAMES[i]; + return short ? monthName.slice(0, 3) : monthName; +} + +function getLastDateInMonth(month, year) { + return new Date(year, month + 1, 0); // 0: last day in previous month +} + +// mutates +function setDayToSunday(date) { + var newDate = clone(date); + var day = newDate.getDay(); + if (day !== 0) { + addDays(newDate, -1 * day); + } + return newDate; +} + +// mutates +function addDays(date, numberOfDays) { + date.setDate(date.getDate() + numberOfDays); +} + +var ChartComponent = function () { + function ChartComponent(_ref) { + var _ref$layerClass = _ref.layerClass, + layerClass = _ref$layerClass === undefined ? '' : _ref$layerClass, + _ref$layerTransform = _ref.layerTransform, + layerTransform = _ref$layerTransform === undefined ? '' : _ref$layerTransform, + constants = _ref.constants, + getData = _ref.getData, + makeElements = _ref.makeElements, + animateElements = _ref.animateElements; + classCallCheck(this, ChartComponent); + + this.layerTransform = layerTransform; + this.constants = constants; + + this.makeElements = makeElements; + this.getData = getData; + + this.animateElements = animateElements; + + this.store = []; + this.labels = []; + + this.layerClass = layerClass; + this.layerClass = typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass; + + this.refresh(); + } + + createClass(ChartComponent, [{ + key: 'refresh', + value: function refresh(data) { + this.data = data || this.getData(); + } + }, { + key: 'setup', + value: function setup(parent) { + this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent); + } + }, { + key: 'make', + value: function make() { + this.render(this.data); + this.oldData = this.data; + } + }, { + key: 'render', + value: function render(data) { + var _this = this; + + this.store = this.makeElements(data); + + this.layer.textContent = ''; + this.store.forEach(function (element) { + element.length ? element.forEach(function (el) { + _this.layer.appendChild(el); + }) : _this.layer.appendChild(element); + }); + this.labels.forEach(function (element) { + _this.layer.appendChild(element); + }); + } + }, { + key: 'update', + value: function update() { + var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + + this.refresh(); + var animateElements = []; + if (animate) { + animateElements = this.animateElements(this.data) || []; + } + return animateElements; + } + }]); + return ChartComponent; +}(); + +var componentConfigs = { + donutSlices: { + layerClass: 'donut-slices', + makeElements: function makeElements(data) { + return data.sliceStrings.map(function (s, i) { + var slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth); + slice.style.transition = 'transform .3s;'; + return slice; + }); + }, + animateElements: function animateElements(newData) { + return this.store.map(function (slice, i) { + return animatePathStr(slice, newData.sliceStrings[i]); + }); + } + }, + pieSlices: { + layerClass: 'pie-slices', + makeElements: function makeElements(data) { + return data.sliceStrings.map(function (s, i) { + var slice = makePath(s, 'pie-path', 'none', data.colors[i]); + slice.style.transition = 'transform .3s;'; + return slice; + }); + }, + animateElements: function animateElements(newData) { + return this.store.map(function (slice, i) { + return animatePathStr(slice, newData.sliceStrings[i]); + }); + } + }, + percentageBars: { + layerClass: 'percentage-bars', + makeElements: function makeElements(data) { + var _this2 = this; + + return data.xPositions.map(function (x, i) { + var y = 0; + var bar = percentageBar(x, y, data.widths[i], _this2.constants.barHeight, _this2.constants.barDepth, data.colors[i]); + return bar; + }); + }, + animateElements: function animateElements(newData) { + if (newData) return []; + } + }, + yAxis: { + layerClass: 'y axis', + makeElements: function makeElements(data) { + var _this3 = this; + + var elements = []; + // will loop through each yaxis dataset if it exists + if (data.length) { + data.forEach(function (item, i) { + item.positions.map(function (position, i) { + elements.push(yLine(position, item.labels[i], _this3.constants.width, { + mode: _this3.constants.mode, + pos: item.pos || _this3.constants.pos, + shortenNumbers: _this3.constants.shortenNumbers + })); + }); + // we need to make yAxis titles if they are defined + if (item.title) { + elements.push(generateAxisLabel({ + title: item.title, + position: item.pos, + height: item.zeroLine, + width: _this3.constants.width + })); + } + }); + + return elements; + } + + data.positions.forEach(function (position, i) { + elements.push(yLine(position, data.labels[i], _this3.constants.width, { + mode: _this3.constants.mode, + pos: data.pos || _this3.constants.pos, + shortenNumbers: _this3.constants.shortenNumbers + })); + }); + + if (data.title) { + elements.push(generateAxisLabel({ + title: data.title, + position: data.pos, + height: data.zeroLine, + width: this.constants.width + })); + } + + return elements; + }, + animateElements: function animateElements(newData) { + var _this4 = this; + + var animateMultipleElements = function animateMultipleElements(oldData, newData) { + var newPos = newData.positions; + var newLabels = newData.labels; + var oldPos = oldData.positions; + var oldLabels = oldData.labels; + + var _equilizeNoOfElements = equilizeNoOfElements(oldPos, newPos); + + var _equilizeNoOfElements2 = slicedToArray(_equilizeNoOfElements, 2); + + oldPos = _equilizeNoOfElements2[0]; + newPos = _equilizeNoOfElements2[1]; + + var _equilizeNoOfElements3 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements4 = slicedToArray(_equilizeNoOfElements3, 2); + + oldLabels = _equilizeNoOfElements4[0]; + newLabels = _equilizeNoOfElements4[1]; + + + _this4.render({ + positions: oldPos, + labels: newLabels + }); + + return _this4.store.map(function (line, i) { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + }; + + // we will need to animate both axis if we have more than one. + // so check if the oldData is an array of values. + if (this.oldData instanceof Array) { + return this.oldData.forEach(function (old, i) { + animateMultipleElements(old, newData[i]); + }); + } + + var newPos = newData.positions; + var newLabels = newData.labels; + var oldPos = this.oldData.positions; + var oldLabels = this.oldData.labels; + + var _equilizeNoOfElements5 = equilizeNoOfElements(oldPos, newPos); + + var _equilizeNoOfElements6 = slicedToArray(_equilizeNoOfElements5, 2); + + oldPos = _equilizeNoOfElements6[0]; + newPos = _equilizeNoOfElements6[1]; + + var _equilizeNoOfElements7 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements8 = slicedToArray(_equilizeNoOfElements7, 2); + + oldLabels = _equilizeNoOfElements8[0]; + newLabels = _equilizeNoOfElements8[1]; + + + this.render({ + positions: oldPos, + labels: newLabels + }); + + return this.store.map(function (line, i) { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + } + }, + + xAxis: { + layerClass: 'x axis', + makeElements: function makeElements(data) { + var _this5 = this; + + return data.positions.map(function (position, i) { + return xLine(position, data.calcLabels[i], _this5.constants.height, { mode: _this5.constants.mode, pos: _this5.constants.pos }); + }); + }, + animateElements: function animateElements(newData) { + var newPos = newData.positions; + var newLabels = newData.calcLabels; + var oldPos = this.oldData.positions; + var oldLabels = this.oldData.calcLabels; + + var _equilizeNoOfElements9 = equilizeNoOfElements(oldPos, newPos); + + var _equilizeNoOfElements10 = slicedToArray(_equilizeNoOfElements9, 2); + + oldPos = _equilizeNoOfElements10[0]; + newPos = _equilizeNoOfElements10[1]; + + var _equilizeNoOfElements11 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements12 = slicedToArray(_equilizeNoOfElements11, 2); + + oldLabels = _equilizeNoOfElements12[0]; + newLabels = _equilizeNoOfElements12[1]; + + + this.render({ + positions: oldPos, + calcLabels: newLabels + }); + + return this.store.map(function (line, i) { + return translateVertLine(line, newPos[i], oldPos[i]); + }); + } + }, + + yMarkers: { + layerClass: 'y-markers', + makeElements: function makeElements(data) { + var _this6 = this; + + return data.map(function (m) { + return yMarker(m.position, m.label, _this6.constants.width, { + labelPos: m.options.labelPos, + mode: 'span', + lineType: 'dashed' + }); + }); + }, + animateElements: function animateElements(newData) { + var _equilizeNoOfElements13 = equilizeNoOfElements(this.oldData, newData); + + var _equilizeNoOfElements14 = slicedToArray(_equilizeNoOfElements13, 2); + + this.oldData = _equilizeNoOfElements14[0]; + newData = _equilizeNoOfElements14[1]; + + + var newPos = newData.map(function (d) { + return d.position; + }); + var newLabels = newData.map(function (d) { + return d.label; + }); + var newOptions = newData.map(function (d) { + return d.options; + }); + + var oldPos = this.oldData.map(function (d) { + return d.position; + }); + + this.render(oldPos.map(function (pos, i) { + return { + position: oldPos[i], + label: newLabels[i], + options: newOptions[i] + }; + })); + + return this.store.map(function (line, i) { + return translateHoriLine(line, newPos[i], oldPos[i]); + }); + } + }, + + yRegions: { + layerClass: 'y-regions', + makeElements: function makeElements(data) { + var _this7 = this; + + return data.map(function (r) { + return yRegion(r.startPos, r.endPos, _this7.constants.width, r.label, { labelPos: r.options.labelPos }); + }); + }, + animateElements: function animateElements(newData) { + var _equilizeNoOfElements15 = equilizeNoOfElements(this.oldData, newData); + + var _equilizeNoOfElements16 = slicedToArray(_equilizeNoOfElements15, 2); + + this.oldData = _equilizeNoOfElements16[0]; + newData = _equilizeNoOfElements16[1]; + + + var newPos = newData.map(function (d) { + return d.endPos; + }); + var newLabels = newData.map(function (d) { + return d.label; + }); + var newStarts = newData.map(function (d) { + return d.startPos; + }); + var newOptions = newData.map(function (d) { + return d.options; + }); + + var oldPos = this.oldData.map(function (d) { + return d.endPos; + }); + var oldStarts = this.oldData.map(function (d) { + return d.startPos; + }); + + this.render(oldPos.map(function (pos, i) { + return { + startPos: oldStarts[i], + endPos: oldPos[i], + label: newLabels[i], + options: newOptions[i] + }; + })); + + var animateElements = []; + + this.store.map(function (rectGroup, i) { + animateElements = animateElements.concat(animateRegion(rectGroup, newStarts[i], newPos[i], oldPos[i])); + }); + + return animateElements; + } + }, + + heatDomain: { + layerClass: function layerClass() { + return 'heat-domain domain-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var _this8 = this; + + var _constants = this.constants, + index = _constants.index, + colWidth = _constants.colWidth, + rowHeight = _constants.rowHeight, + squareSize = _constants.squareSize, + radius = _constants.radius, + xTranslate = _constants.xTranslate; + + var monthNameHeight = -12; + var x = xTranslate, + y = 0; + + this.serializedSubDomains = []; + + data.cols.map(function (week, weekNo) { + if (weekNo === 1) { + _this8.labels.push(makeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(), { + fontSize: 9 + })); + } + week.map(function (day, i) { + if (day.fill) { + var _data = { + 'data-date': day.yyyyMmDd, + 'data-value': day.dataValue, + 'data-day': i + }; + var square = heatSquare('day', x, y, squareSize, radius, day.fill, _data); + _this8.serializedSubDomains.push(square); + } + y += rowHeight; + }); + y = 0; + x += colWidth; + }); + + return this.serializedSubDomains; + }, + animateElements: function animateElements(newData) { + if (newData) return []; + } + }, + + barGraph: { + layerClass: function layerClass() { + return 'dataset-units dataset-bars dataset-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var c = this.constants; + this.unitType = 'bar'; + this.units = data.yPositions.map(function (y, j) { + return datasetBar(data.xPositions[j], y, data.barWidth, c.color, data.labels[j], j, data.offsets[j], { + zeroLine: data.zeroLine, + barsWidth: data.barsWidth, + minHeight: c.minHeight + }); + }); + return this.units; + }, + animateElements: function animateElements(newData) { + var newXPos = newData.xPositions; + var newYPos = newData.yPositions; + var newOffsets = newData.offsets; + var newLabels = newData.labels; + + var oldXPos = this.oldData.xPositions; + var oldYPos = this.oldData.yPositions; + var oldOffsets = this.oldData.offsets; + var oldLabels = this.oldData.labels; + + var _equilizeNoOfElements17 = equilizeNoOfElements(oldXPos, newXPos); + + var _equilizeNoOfElements18 = slicedToArray(_equilizeNoOfElements17, 2); + + oldXPos = _equilizeNoOfElements18[0]; + newXPos = _equilizeNoOfElements18[1]; + + var _equilizeNoOfElements19 = equilizeNoOfElements(oldYPos, newYPos); + + var _equilizeNoOfElements20 = slicedToArray(_equilizeNoOfElements19, 2); + + oldYPos = _equilizeNoOfElements20[0]; + newYPos = _equilizeNoOfElements20[1]; + + var _equilizeNoOfElements21 = equilizeNoOfElements(oldOffsets, newOffsets); + + var _equilizeNoOfElements22 = slicedToArray(_equilizeNoOfElements21, 2); + + oldOffsets = _equilizeNoOfElements22[0]; + newOffsets = _equilizeNoOfElements22[1]; + + var _equilizeNoOfElements23 = equilizeNoOfElements(oldLabels, newLabels); + + var _equilizeNoOfElements24 = slicedToArray(_equilizeNoOfElements23, 2); + + oldLabels = _equilizeNoOfElements24[0]; + newLabels = _equilizeNoOfElements24[1]; + + + this.render({ + xPositions: oldXPos, + yPositions: oldYPos, + offsets: oldOffsets, + labels: newLabels, + + zeroLine: this.oldData.zeroLine, + barsWidth: this.oldData.barsWidth, + barWidth: this.oldData.barWidth + }); + + var animateElements = []; + + this.store.map(function (bar, i) { + animateElements = animateElements.concat(animateBar(bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], { zeroLine: newData.zeroLine })); + }); + + return animateElements; + } + }, + + lineGraph: { + layerClass: function layerClass() { + return 'dataset-units dataset-line dataset-' + this.constants.index; + }, + makeElements: function makeElements(data) { + var c = this.constants; + this.unitType = 'dot'; + this.paths = {}; + if (!c.hideLine) { + this.paths = getPaths(data.xPositions, data.yPositions, c.color, { + heatline: c.heatline, + regionFill: c.regionFill, + spline: c.spline + }, { + svgDefs: c.svgDefs, + zeroLine: data.zeroLine + }); + } + + this.units = []; + + if (!c.hideDots) { + this.units = data.yPositions.map(function (y, j) { + return datasetDot(data.xPositions[j], y, data.radius, c.color, c.valuesOverPoints ? data.values[j] : '', j); + }); + } + + return Object.values(this.paths).concat(this.units); + }, + animateElements: function animateElements(newData) { + var newXPos = newData.xPositions; + var newYPos = newData.yPositions; + var newValues = newData.values; + + var oldXPos = this.oldData.xPositions; + var oldYPos = this.oldData.yPositions; + var oldValues = this.oldData.values; + + var _equilizeNoOfElements25 = equilizeNoOfElements(oldXPos, newXPos); + + var _equilizeNoOfElements26 = slicedToArray(_equilizeNoOfElements25, 2); + + oldXPos = _equilizeNoOfElements26[0]; + newXPos = _equilizeNoOfElements26[1]; + + var _equilizeNoOfElements27 = equilizeNoOfElements(oldYPos, newYPos); + + var _equilizeNoOfElements28 = slicedToArray(_equilizeNoOfElements27, 2); + + oldYPos = _equilizeNoOfElements28[0]; + newYPos = _equilizeNoOfElements28[1]; + + var _equilizeNoOfElements29 = equilizeNoOfElements(oldValues, newValues); + + var _equilizeNoOfElements30 = slicedToArray(_equilizeNoOfElements29, 2); + + oldValues = _equilizeNoOfElements30[0]; + newValues = _equilizeNoOfElements30[1]; + + + this.render({ + xPositions: oldXPos, + yPositions: oldYPos, + values: newValues, + + zeroLine: this.oldData.zeroLine, + radius: this.oldData.radius + }); + + var animateElements = []; + + if (Object.keys(this.paths).length) { + animateElements = animateElements.concat(animatePath(this.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline)); + } + + if (this.units.length) { + this.units.map(function (dot, i) { + animateElements = animateElements.concat(animateDot(dot, newXPos[i], newYPos[i])); + }); + } + + return animateElements; + } + } +}; + +function getComponent(name, constants, getData) { + var keys = Object.keys(componentConfigs).filter(function (k) { + return name.includes(k); + }); + var config = componentConfigs[keys[0]]; + Object.assign(config, { + constants: constants, + getData: getData + }); + return new ChartComponent(config); +} + +var PercentageChart = function (_AggregationChart) { + inherits(PercentageChart, _AggregationChart); + + function PercentageChart(parent, args) { + classCallCheck(this, PercentageChart); + + var _this = possibleConstructorReturn(this, (PercentageChart.__proto__ || Object.getPrototypeOf(PercentageChart)).call(this, parent, args)); + + _this.type = 'percentage'; + _this.setup(); + return _this; + } + + createClass(PercentageChart, [{ + key: 'setMeasures', + value: function setMeasures(options) { + var m = this.measures; + this.barOptions = options.barOptions || {}; + + var b = this.barOptions; + b.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT; + b.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH; + + m.paddings.right = 30; + m.legendHeight = 60; + m.baseHeight = (b.height + b.depth * 0.5) * 8; + } + }, { + key: 'setupComponents', + value: function setupComponents() { + var s = this.state; + + var componentConfigs = [['percentageBars', { + barHeight: this.barOptions.height, + barDepth: this.barOptions.depth + }, function () { + return { + xPositions: s.xPositions, + widths: s.widths, + colors: this.colors + }; + }.bind(this)]]; + + this.components = new Map(componentConfigs.map(function (args) { + var component = getComponent.apply(undefined, toConsumableArray(args)); + return [args[0], component]; + })); + } + }, { + key: 'calc', + value: function calc() { + var _this2 = this; + + get(PercentageChart.prototype.__proto__ || Object.getPrototypeOf(PercentageChart.prototype), 'calc', this).call(this); + var s = this.state; + + s.xPositions = []; + s.widths = []; + + var xPos = 0; + s.sliceTotals.map(function (value) { + var width = _this2.width * value / s.grandTotal; + s.widths.push(width); + s.xPositions.push(xPos); + xPos += width; + }); + } + }, { + key: 'makeDataByIndex', + value: function makeDataByIndex() {} + }, { + key: 'bindTooltip', + value: function bindTooltip() { + var _this3 = this; + + var s = this.state; + this.container.addEventListener('mousemove', function (e) { + var bars = _this3.components.get('percentageBars').store; + var bar = e.target; + if (bars.includes(bar)) { + + var i = bars.indexOf(bar); + var gOff = getOffset(_this3.container), + pOff = getOffset(bar); + + var x = pOff.left - gOff.left + parseInt(bar.getAttribute('width')) / 2; + var y = pOff.top - gOff.top; + var title = (_this3.formattedLabels && _this3.formattedLabels.length > 0 ? _this3.formattedLabels[i] : _this3.state.labels[i]) + ': '; + var fraction = s.sliceTotals[i] / s.grandTotal; + + _this3.tip.setValues(x, y, { name: title, value: (fraction * 100).toFixed(1) + "%" }); + _this3.tip.showTip(); + } + }); + } + }]); + return PercentageChart; +}(AggregationChart); + +var PieChart = function (_AggregationChart) { + inherits(PieChart, _AggregationChart); + + function PieChart(parent, args) { + classCallCheck(this, PieChart); + + var _this = possibleConstructorReturn(this, (PieChart.__proto__ || Object.getPrototypeOf(PieChart)).call(this, parent, args)); + + _this.type = 'pie'; + _this.initTimeout = 0; + _this.init = 1; + + _this.setup(); + return _this; + } + + createClass(PieChart, [{ + key: 'configure', + value: function configure(args) { + get(PieChart.prototype.__proto__ || Object.getPrototypeOf(PieChart.prototype), 'configure', this).call(this, args); + this.mouseMove = this.mouseMove.bind(this); + this.mouseLeave = this.mouseLeave.bind(this); + + this.hoverRadio = args.hoverRadio || 0.1; + this.config.startAngle = args.startAngle || 0; + + this.clockWise = args.clockWise || false; + } + }, { + key: 'calc', + value: function calc() { + var _this2 = this; + + get(PieChart.prototype.__proto__ || Object.getPrototypeOf(PieChart.prototype), 'calc', this).call(this); + var s = this.state; + this.radius = this.height > this.width ? this.center.x : this.center.y; + + var radius = this.radius, + clockWise = this.clockWise; + + + var prevSlicesProperties = s.slicesProperties || []; + s.sliceStrings = []; + s.slicesProperties = []; + var curAngle = 180 - this.config.startAngle; + s.sliceTotals.map(function (total, i) { + var startAngle = curAngle; + var originDiffAngle = total / s.grandTotal * FULL_ANGLE; + var largeArc = originDiffAngle > 180 ? 1 : 0; + var diffAngle = clockWise ? -originDiffAngle : originDiffAngle; + var endAngle = curAngle = curAngle + diffAngle; + var startPosition = getPositionByAngle(startAngle, radius); + var endPosition = getPositionByAngle(endAngle, radius); + + var prevProperty = _this2.init && prevSlicesProperties[i]; + + var curStart = void 0, + curEnd = void 0; + if (_this2.init) { + curStart = prevProperty ? prevProperty.startPosition : startPosition; + curEnd = prevProperty ? prevProperty.endPosition : startPosition; + } else { + curStart = startPosition; + curEnd = endPosition; + } + var curPath = originDiffAngle === 360 ? makeCircleStr(curStart, curEnd, _this2.center, _this2.radius, clockWise, largeArc) : makeArcPathStr(curStart, curEnd, _this2.center, _this2.radius, clockWise, largeArc); + + s.sliceStrings.push(curPath); + s.slicesProperties.push({ + startPosition: startPosition, + endPosition: endPosition, + value: total, + total: s.grandTotal, + startAngle: startAngle, + endAngle: endAngle, + angle: diffAngle + }); + }); + this.init = 0; + } + }, { + key: 'setupComponents', + value: function setupComponents() { + var s = this.state; + + var componentConfigs = [['pieSlices', {}, function () { + return { + sliceStrings: s.sliceStrings, + colors: this.colors + }; + }.bind(this)]]; + + this.components = new Map(componentConfigs.map(function (args) { + var component = getComponent.apply(undefined, toConsumableArray(args)); + return [args[0], component]; + })); + } + }, { + key: 'calTranslateByAngle', + value: function calTranslateByAngle(property) { + var radius = this.radius, + hoverRadio = this.hoverRadio; + + var position = getPositionByAngle(property.startAngle + property.angle / 2, radius); + return 'translate3d(' + position.x * hoverRadio + 'px,' + position.y * hoverRadio + 'px,0)'; + } + }, { + key: 'hoverSlice', + value: function hoverSlice(path, i, flag, e) { + if (!path) return; + var color = this.colors[i]; + if (flag) { + transform(path, this.calTranslateByAngle(this.state.slicesProperties[i])); + path.style.fill = lightenDarkenColor(color, 50); + var g_off = getOffset(this.svg); + var x = e.pageX - g_off.left + 10; + var y = e.pageY - g_off.top - 10; + var title = (this.formatted_labels && this.formatted_labels.length > 0 ? this.formatted_labels[i] : this.state.labels[i]) + ': '; + var percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1); + this.tip.setValues(x, y, { name: title, value: percent + "%" }); + this.tip.showTip(); + } else { + transform(path, 'translate3d(0,0,0)'); + this.tip.hideTip(); + path.style.fill = color; + } + } + }, { + key: 'bindTooltip', + value: function bindTooltip() { + this.container.addEventListener('mousemove', this.mouseMove); + this.container.addEventListener('mouseleave', this.mouseLeave); + } + }, { + key: 'mouseMove', + value: function mouseMove(e) { + var target = e.target; + var slices = this.components.get('pieSlices').store; + var prevIndex = this.curActiveSliceIndex; + var prevAcitve = this.curActiveSlice; + if (slices.includes(target)) { + var i = slices.indexOf(target); + this.hoverSlice(prevAcitve, prevIndex, false); + this.curActiveSlice = target; + this.curActiveSliceIndex = i; + this.hoverSlice(target, i, true, e); + } else { + this.mouseLeave(); + } + } + }, { + key: 'mouseLeave', + value: function mouseLeave() { + this.hoverSlice(this.curActiveSlice, this.curActiveSliceIndex, false); + } + }]); + return PieChart; +}(AggregationChart); + +function normalize(x) { + // Calculates mantissa and exponent of a number + // Returns normalized number and exponent + // https://stackoverflow.com/q/9383593/6495043 + + if (x === 0) { + return [0, 0]; + } + if (isNaN(x)) { + return { mantissa: -6755399441055744, exponent: 972 }; + } + var sig = x > 0 ? 1 : -1; + if (!isFinite(x)) { + return { mantissa: sig * 4503599627370496, exponent: 972 }; + } + + x = Math.abs(x); + var exp = Math.floor(Math.log10(x)); + var man = x / Math.pow(10, exp); + + return [sig * man, exp]; +} + +function getChartRangeIntervals(max) { + var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var upperBound = Math.ceil(max); + var lowerBound = Math.floor(min); + var range = upperBound - lowerBound; + + var noOfParts = range; + var partSize = 1; + + // To avoid too many partitions + if (range > 5) { + if (range % 2 !== 0) { + upperBound++; + // Recalc range + range = upperBound - lowerBound; + } + noOfParts = range / 2; + partSize = 2; + } + + // Special case: 1 and 2 + if (range <= 2) { + noOfParts = 4; + partSize = range / noOfParts; + } + + // Special case: 0 + if (range === 0) { + noOfParts = 5; + partSize = 1; + } + + var intervals = []; + for (var i = 0; i <= noOfParts; i++) { + intervals.push(lowerBound + partSize * i); + } + return intervals; +} + +function getChartIntervals(maxValue) { + var minValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + var _normalize = normalize(maxValue), + _normalize2 = slicedToArray(_normalize, 2), + normalMaxValue = _normalize2[0], + exponent = _normalize2[1]; + + var normalMinValue = minValue ? minValue / Math.pow(10, exponent) : 0; + + // Allow only 7 significant digits + normalMaxValue = normalMaxValue.toFixed(6); + + var intervals = getChartRangeIntervals(normalMaxValue, normalMinValue); + intervals = intervals.map(function (value) { + // For negative exponents we want to divide by 10^-exponent to avoid + // floating point arithmetic bugs. For instance, in javascript + // 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6 + if (exponent < 0) { + return value / Math.pow(10, -exponent); + } + return value * Math.pow(10, exponent); + }); + return intervals; +} + +function calcChartIntervals(values) { + var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + //*** Where the magic happens *** + + // Calculates best-fit y intervals from given values + // and returns the interval array + + var maxValue = Math.max.apply(Math, toConsumableArray(values)); + var minValue = Math.min.apply(Math, toConsumableArray(values)); + + // Exponent to be used for pretty print + var exponent = 0, + intervals = []; // eslint-disable-line no-unused-vars + + function getPositiveFirstIntervals(maxValue, absMinValue) { + var intervals = getChartIntervals(maxValue); + + var intervalSize = intervals[1] - intervals[0]; + + // Then unshift the negative values + var value = 0; + for (var i = 1; value < absMinValue; i++) { + value += intervalSize; + intervals.unshift(-1 * value); + } + return intervals; + } + + // CASE I: Both non-negative + + if (maxValue >= 0 && minValue >= 0) { + exponent = normalize(maxValue)[1]; + if (!withMinimum) { + intervals = getChartIntervals(maxValue); + } else { + intervals = getChartIntervals(maxValue, minValue); + } + } + + // CASE II: Only minValue negative + + else if (maxValue > 0 && minValue < 0) { + // `withMinimum` irrelevant in this case, + // We'll be handling both sides of zero separately + // (both starting from zero) + // Because ceil() and floor() behave differently + // in those two regions + + var absMinValue = Math.abs(minValue); + + if (maxValue >= absMinValue) { + exponent = normalize(maxValue)[1]; + intervals = getPositiveFirstIntervals(maxValue, absMinValue); + } else { + // Mirror: maxValue => absMinValue, then change sign + exponent = normalize(absMinValue)[1]; + var posIntervals = getPositiveFirstIntervals(absMinValue, maxValue); + intervals = posIntervals.reverse().map(function (d) { + return d * -1; + }); + } + } + + // CASE III: Both non-positive + + else if (maxValue <= 0 && minValue <= 0) { + // Mirrored Case I: + // Work with positives, then reverse the sign and array + + var pseudoMaxValue = Math.abs(minValue); + var pseudoMinValue = Math.abs(maxValue); + + exponent = normalize(pseudoMaxValue)[1]; + if (!withMinimum) { + intervals = getChartIntervals(pseudoMaxValue); + } else { + intervals = getChartIntervals(pseudoMaxValue, pseudoMinValue); + } + + intervals = intervals.reverse().map(function (d) { + return d * -1; + }); + } + + return intervals; +} + +function getZeroIndex(yPts) { + var zeroIndex = void 0; + var interval = getIntervalSize(yPts); + if (yPts.indexOf(0) >= 0) { + // the range has a given zero + // zero-line on the chart + zeroIndex = yPts.indexOf(0); + } else if (yPts[0] > 0) { + // Minimum value is positive + // zero-line is off the chart: below + var min = yPts[0]; + zeroIndex = -1 * min / interval; + } else { + // Maximum value is negative + // zero-line is off the chart: above + var max = yPts[yPts.length - 1]; + zeroIndex = -1 * max / interval + (yPts.length - 1); + } + return zeroIndex; +} + + + +function getIntervalSize(orderedArray) { + return orderedArray[1] - orderedArray[0]; +} + +function getValueRange(orderedArray) { + return orderedArray[orderedArray.length - 1] - orderedArray[0]; +} + +function scale(val, yAxis) { + return floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier); +} + + + + + +function getClosestInArray(goal, arr) { + var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var closest = arr.reduce(function (prev, curr) { + return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev; + }, []); + + return index ? arr.indexOf(closest) : closest; +} + +function calcDistribution(values, distributionSize) { + // Assume non-negative values, + // implying distribution minimum at zero + + var dataMaxValue = Math.max.apply(Math, toConsumableArray(values)); + + var distributionStep = 1 / (distributionSize - 1); + var distribution = []; + + for (var i = 0; i < distributionSize; i++) { + var checkpoint = dataMaxValue * (distributionStep * i); + distribution.push(checkpoint); + } + + return distribution; +} + +function getMaxCheckpoint(value, distribution) { + return distribution.filter(function (d) { + return d < value; + }).length; +} + +var COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE; +var ROW_HEIGHT = COL_WIDTH; +// const DAY_INCR = 1; + +var Heatmap = function (_BaseChart) { + inherits(Heatmap, _BaseChart); + + function Heatmap(parent, options) { + classCallCheck(this, Heatmap); + + var _this = possibleConstructorReturn(this, (Heatmap.__proto__ || Object.getPrototypeOf(Heatmap)).call(this, parent, options)); + + _this.type = 'heatmap'; + + _this.countLabel = options.countLabel || ''; + + var validStarts = ['Sunday', 'Monday']; + var startSubDomain = validStarts.includes(options.startSubDomain) ? options.startSubDomain : 'Sunday'; + _this.startSubDomainIndex = validStarts.indexOf(startSubDomain); + + _this.setup(); + return _this; + } + + createClass(Heatmap, [{ + key: 'setMeasures', + value: function setMeasures(options) { + var m = this.measures; + this.discreteDomains = options.discreteDomains === 0 ? 0 : 1; + + m.paddings.top = ROW_HEIGHT * 3; + m.paddings.bottom = 0; + m.legendHeight = ROW_HEIGHT * 2; + m.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK + getExtraHeight(m); + + var d = this.data; + var spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0; + this.independentWidth = (getWeeksBetween(d.start, d.end) + spacing) * COL_WIDTH + getExtraWidth(m); + } + }, { + key: 'updateWidth', + value: function updateWidth() { + var spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0; + var noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52; + this.baseWidth = (noOfWeeks + spacing) * COL_WIDTH + getExtraWidth(this.measures); + } + }, { + key: 'prepareData', + value: function prepareData() { + var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; + + if (data.start && data.end && data.start > data.end) { + throw new Error('Start date cannot be greater than end date.'); + } + + if (!data.start) { + data.start = new Date(); + data.start.setFullYear(data.start.getFullYear() - 1); + } + if (!data.end) { + data.end = new Date(); + } + data.dataPoints = data.dataPoints || {}; + + if (parseInt(Object.keys(data.dataPoints)[0]) > 100000) { + var points = {}; + Object.keys(data.dataPoints).forEach(function (timestampSec$$1) { + var date = new Date(timestampSec$$1 * NO_OF_MILLIS); + points[getYyyyMmDd(date)] = data.dataPoints[timestampSec$$1]; + }); + data.dataPoints = points; + } + + return data; + } + }, { + key: 'calc', + value: function calc() { + var s = this.state; + + s.start = clone(this.data.start); + s.end = clone(this.data.end); + + s.firstWeekStart = clone(s.start); + s.noOfWeeks = getWeeksBetween(s.start, s.end); + s.distribution = calcDistribution(Object.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE); + + s.domainConfigs = this.getDomains(); + } + }, { + key: 'setupComponents', + value: function setupComponents() { + var _this2 = this; + + var s = this.state; + var lessCol = this.discreteDomains ? 0 : 1; + + var componentConfigs = s.domainConfigs.map(function (config, i) { + return ['heatDomain', { + index: config.index, + colWidth: COL_WIDTH, + rowHeight: ROW_HEIGHT, + squareSize: HEATMAP_SQUARE_SIZE, + radius: _this2.rawChartArgs.radius || 0, + xTranslate: s.domainConfigs.filter(function (config, j) { + return j < i; + }).map(function (config) { + return config.cols.length - lessCol; + }).reduce(function (a, b) { + return a + b; + }, 0) * COL_WIDTH + }, function () { + return s.domainConfigs[i]; + }.bind(_this2)]; + }); + + this.components = new Map(componentConfigs.map(function (args, i) { + var component = getComponent.apply(undefined, toConsumableArray(args)); + return [args[0] + '-' + i, component]; + })); + + var y = 0; + DAY_NAMES_SHORT.forEach(function (dayName, i) { + if ([1, 3, 5].includes(i)) { + var dayText = makeText('subdomain-name', -COL_WIDTH / 2, y, dayName, { + fontSize: HEATMAP_SQUARE_SIZE, + dy: 8, + textAnchor: 'end' + }); + _this2.drawArea.appendChild(dayText); + } + y += ROW_HEIGHT; + }); + } + }, { + key: 'update', + value: function update(data) { + if (!data) { + console.error('No data to update.'); + } + + this.data = this.prepareData(data); + this.draw(); + this.bindTooltip(); + } + }, { + key: 'bindTooltip', + value: function bindTooltip() { + var _this3 = this; + + this.container.addEventListener('mousemove', function (e) { + _this3.components.forEach(function (comp) { + var daySquares = comp.store; + var daySquare = e.target; + if (daySquares.includes(daySquare)) { + + var count = daySquare.getAttribute('data-value'); + var dateParts = daySquare.getAttribute('data-date').split('-'); + + var month = getMonthName(parseInt(dateParts[1]) - 1, true); + + var gOff = _this3.container.getBoundingClientRect(), + pOff = daySquare.getBoundingClientRect(); + + var width = parseInt(e.target.getAttribute('width')); + var x = pOff.left - gOff.left + width / 2; + var y = pOff.top - gOff.top; + var value = count + ' ' + _this3.countLabel; + var name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2]; + + _this3.tip.setValues(x, y, { name: name, value: value, valueFirst: 1 }, []); + _this3.tip.showTip(); + } + }); + }); + } + }, { + key: 'renderLegend', + value: function renderLegend() { + var _this4 = this; + + this.legendArea.textContent = ''; + var x = 0; + var y = ROW_HEIGHT; + var radius = this.rawChartArgs.radius || 0; + + var lessText = makeText('subdomain-name', x, y, 'Less', { + fontSize: HEATMAP_SQUARE_SIZE + 1, + dy: 9 + }); + x = COL_WIDTH * 2 + COL_WIDTH / 2; + this.legendArea.appendChild(lessText); + + this.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map(function (color, i) { + var square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i, y, HEATMAP_SQUARE_SIZE, radius, color); + _this4.legendArea.appendChild(square); + }); + + var moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH / 4; + var moreText = makeText('subdomain-name', moreTextX, y, 'More', { + fontSize: HEATMAP_SQUARE_SIZE + 1, + dy: 9 + }); + this.legendArea.appendChild(moreText); + } + }, { + key: 'getDomains', + value: function getDomains() { + var s = this.state; + var _ref = [s.start.getMonth(), s.start.getFullYear()], + startMonth = _ref[0], + startYear = _ref[1]; + var _ref2 = [s.end.getMonth(), s.end.getFullYear()], + endMonth = _ref2[0], + endYear = _ref2[1]; + + + var noOfMonths = endMonth - startMonth + 1 + (endYear - startYear) * 12; + + var domainConfigs = []; + + var startOfMonth = clone(s.start); + for (var i = 0; i < noOfMonths; i++) { + var endDate = s.end; + if (!areInSameMonth(startOfMonth, s.end)) { + var _ref3 = [startOfMonth.getMonth(), startOfMonth.getFullYear()], + month = _ref3[0], + year = _ref3[1]; + + endDate = getLastDateInMonth(month, year); + } + domainConfigs.push(this.getDomainConfig(startOfMonth, endDate)); + + addDays(endDate, 1); + startOfMonth = endDate; + } + + return domainConfigs; + } + }, { + key: 'getDomainConfig', + value: function getDomainConfig(startDate) { + var endDate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var _ref4 = [startDate.getMonth(), startDate.getFullYear()], + month = _ref4[0], + year = _ref4[1]; + + var startOfWeek = setDayToSunday(startDate); // TODO: Monday as well + endDate = clone(endDate) || getLastDateInMonth(month, year); + + var domainConfig = { + index: month, + cols: [] + }; + + addDays(endDate, 1); + var noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate); + + var cols = [], + col = void 0; + for (var i = 0; i < noOfMonthWeeks; i++) { + col = this.getCol(startOfWeek, month); + cols.push(col); + + startOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd); + addDays(startOfWeek, 1); + } + + if (col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) { + addDays(startOfWeek, 1); + cols.push(this.getCol(startOfWeek, month, true)); + } + + domainConfig.cols = cols; + + return domainConfig; + } + }, { + key: 'getCol', + value: function getCol(startDate, month) { + var empty = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var s = this.state; + + // startDate is the start of week + var currentDate = clone(startDate); + var col = []; + + for (var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) { + var config = {}; + + // Non-generic adjustment for entire heatmap, needs state + var currentDateWithinData = currentDate >= s.start && currentDate <= s.end; + + if (empty || currentDate.getMonth() !== month || !currentDateWithinData) { + config.yyyyMmDd = getYyyyMmDd(currentDate); + } else { + config = this.getSubDomainConfig(currentDate); + } + col.push(config); + } + + return col; + } + }, { + key: 'getSubDomainConfig', + value: function getSubDomainConfig(date) { + var yyyyMmDd = getYyyyMmDd(date); + var dataValue = this.data.dataPoints[yyyyMmDd]; + var config = { + yyyyMmDd: yyyyMmDd, + dataValue: dataValue || 0, + fill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)] + }; + return config; + } + }]); + return Heatmap; +}(BaseChart); + +function dataPrep(data, type) { + data.labels = data.labels || []; + + var datasetLength = data.labels.length; + + // Datasets + var datasets = data.datasets; + var zeroArray = new Array(datasetLength).fill(0); + if (!datasets) { + // default + datasets = [{ + values: zeroArray + }]; + } + + datasets.map(function (d) { + // Set values + if (!d.values) { + d.values = zeroArray; + } else { + // Check for non values + var vals = d.values; + vals = vals.map(function (val) { + return !isNaN(val) ? val : 0; + }); + + // Trim or extend + if (vals.length > datasetLength) { + vals = vals.slice(0, datasetLength); + } else { + vals = fillArray(vals, datasetLength - vals.length, 0); + } + d.values = vals; + } + + // Set type + if (!d.chartType) { + if (!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE; + d.chartType = type; + } + }); + + // Markers + + // Regions + // data.yRegions = data.yRegions || []; + if (data.yRegions) { + data.yRegions.map(function (d) { + if (d.end < d.start) { + var _ref = [d.end, d.start]; + d.start = _ref[0]; + d.end = _ref[1]; + } + }); + } + + return data; +} + +function zeroDataPrep(realData) { + var datasetLength = realData.labels.length; + var zeroArray = new Array(datasetLength).fill(0); + + var zeroData = { + labels: realData.labels.slice(0, -1), + datasets: realData.datasets.map(function (d) { + var axisID = d.axisID; + + return { + axisID: axisID, + name: '', + values: zeroArray.slice(0, -1), + chartType: d.chartType + }; + }) + }; + + if (realData.yMarkers) { + zeroData.yMarkers = [{ + value: 0, + label: '' + }]; + } + + if (realData.yRegions) { + zeroData.yRegions = [{ + start: 0, + end: 0, + label: '' + }]; + } + + return zeroData; +} + +function getShortenedLabels(chartWidth) { + var labels = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var isSeries = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; + + var allowedSpace = chartWidth / labels.length; + if (allowedSpace <= 0) allowedSpace = 1; + var allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH; + + var seriesMultiple = void 0; + if (isSeries) { + // Find the maximum label length for spacing calculations + var maxLabelLength = Math.max.apply(Math, toConsumableArray(labels.map(function (label) { + return label.length; + }))); + seriesMultiple = Math.ceil(maxLabelLength / allowedLetters); + } + + var calcLabels = labels.map(function (label, i) { + label += ""; + if (label.length > allowedLetters) { + + if (!isSeries) { + if (allowedLetters - 3 > 0) { + label = label.slice(0, allowedLetters - 3) + " ..."; + } else { + label = label.slice(0, allowedLetters) + '..'; + } + } else { + if (i % seriesMultiple !== 0) { + label = ""; + } + } + } + return label; + }); + + return calcLabels; +} + +var AxisChart = function (_BaseChart) { + inherits(AxisChart, _BaseChart); + + function AxisChart(parent, args) { + classCallCheck(this, AxisChart); + + var _this = possibleConstructorReturn(this, (AxisChart.__proto__ || Object.getPrototypeOf(AxisChart)).call(this, parent, args)); + + _this.barOptions = args.barOptions || {}; + _this.lineOptions = args.lineOptions || {}; + + _this.type = args.type || 'line'; + _this.init = 1; + + _this.setup(); + return _this; + } + + createClass(AxisChart, [{ + key: 'setMeasures', + value: function setMeasures() { + if (this.data.datasets.length <= 1) { + this.config.showLegend = 0; + this.measures.paddings.bottom = 30; + } + } + }, { + key: 'configure', + value: function configure(options) { + get(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'configure', this).call(this, options); + var _options$axisOptions = options.axisOptions, + axisOptions = _options$axisOptions === undefined ? {} : _options$axisOptions; + + var _ref = axisOptions || {}, + xAxis = _ref.xAxis, + yAxis = _ref.yAxis; + + options.tooltipOptions = options.tooltipOptions || {}; + + this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span'; + + // this will pass an array + // lets determine if we need two yAxis based on if there is length + // to the yAxis array + if (yAxis && yAxis.length) { + this.config.yAxisConfig = yAxis.map(function (item) { + return { + yAxisMode: item.yAxisMode, + id: item.id, + position: item.position, + title: item.title + }; + }); + } else { + this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span'; + + // if we have yAxis config settings lets populate a yAxis config array. + if (yAxis.id && yAxis.position) { + this.config.yAxisConfig = [yAxis]; + } + } + + this.config.xIsSeries = axisOptions.xIsSeries || 0; + this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0; + + this.config.formatTooltipX = options.tooltipOptions.formatTooltipX; + this.config.formatTooltipY = options.tooltipOptions.formatTooltipY; + + this.config.valuesOverPoints = options.valuesOverPoints; + } + }, { + key: 'prepareData', + value: function prepareData() { + var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; + + return dataPrep(data, this.type); + } + }, { + key: 'prepareFirstData', + value: function prepareFirstData() { + var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; + + return zeroDataPrep(data); + } + }, { + key: 'calc', + value: function calc() { + var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + + this.calcXPositions(); + if (!onlyWidthChange) { + this.calcYAxisParameters(this.getAllYValues(), this.type === 'line'); + } + this.makeDataByIndex(); + } + }, { + key: 'calcXPositions', + value: function calcXPositions() { + var s = this.state; + var labels = this.data.labels; + s.datasetLength = labels.length; + + s.unitWidth = this.width / s.datasetLength; + // Default, as per bar, and mixed. Only line will be a special case + s.xOffset = s.unitWidth / 2; + + // // For a pure Line Chart + // s.unitWidth = this.width/(s.datasetLength - 1); + // s.xOffset = 0; + + s.xAxis = { + labels: labels, + positions: labels.map(function (d, i) { + return floatTwo(s.xOffset + i * s.unitWidth); + }) + }; + } + }, { + key: 'calcYAxisParameters', + value: function calcYAxisParameters(dataValues) { + var _this2 = this; + + var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'false'; + + var yPts = void 0, + scaleMultiplier = void 0, + intervalHeight = void 0, + zeroLine = void 0, + positions = void 0, + yAxisConfigObject = void 0, + yAxisAlignment = void 0; + yAxisConfigObject = this.config.yAxisMode || {}; + yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; + + // if we have an object we have multiple yAxisParameters. + if (dataValues instanceof Array) { + yPts = calcChartIntervals(dataValues, withMinimum); + scaleMultiplier = this.height / getValueRange(yPts); + intervalHeight = getIntervalSize(yPts) * scaleMultiplier; + zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; + + this.state.yAxis = { + labels: yPts, + positions: yPts.map(function (d) { + return zeroLine - d * scaleMultiplier; + }), + title: yAxisConfigObject.title || null, + pos: yAxisAlignment, + scaleMultiplier: scaleMultiplier, + zeroLine: zeroLine + }; + } else { + this.state.yAxis = []; + + var _loop = function _loop(key) { + var dataValue = dataValues[key]; + yAxisConfigObject = _this2.config.yAxisConfig.find(function (item) { + return key === item.id; + }) || []; + yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; + yPts = calcChartIntervals(dataValue, withMinimum); + scaleMultiplier = _this2.height / getValueRange(yPts); + intervalHeight = getIntervalSize(yPts) * scaleMultiplier; + zeroLine = _this2.height - getZeroIndex(yPts) * intervalHeight; + positions = yPts.map(function (d) { + return zeroLine - d * scaleMultiplier; + }); + + if (_this2.state.yAxis.length > 1) { + var yPtsArray = []; + var firstArr = _this2.state.yAxis[0]; + // we need to loop through original positions. + firstArr.positions.forEach(function (pos) { + yPtsArray.push(Math.ceil(pos / scaleMultiplier)); + }); + yPts = yPtsArray.reverse(); + zeroLine = _this2.height - getZeroIndex(yPts) * intervalHeight; + positions = firstArr.positions; + } + + _this2.state.yAxis.push({ + axisID: key || 'left-axis', + labels: yPts, + title: yAxisConfigObject.title, + pos: yAxisAlignment, + scaleMultiplier: scaleMultiplier, + zeroLine: zeroLine, + positions: positions + }); + }; + + for (var key in dataValues) { + _loop(key); + } + } + + // Dependent if above changes + this.calcDatasetPoints(); + this.calcYExtremes(); + this.calcYRegions(); + } + }, { + key: 'calcDatasetPoints', + value: function calcDatasetPoints() { + var s = this.state; + var scaleAll = function scaleAll(values, id) { + return values.map(function (val) { + var yAxis = s.yAxis; + + + if (yAxis instanceof Array) { + yAxis = yAxis.length > 1 ? yAxis.find(function (axis) { + return id === axis.axisID; + }) : s.yAxis[0]; + } + + return scale(val, yAxis); + }); + }; + + s.barChartIndex = 1; + s.datasets = this.data.datasets.map(function (d, i) { + var values = d.values; + var cumulativeYs = d.cumulativeYs || []; + + return { + name: d.name && d.name.replace(/<|>|&/g, function (char) { + return char == '&' ? '&' : char == '<' ? '<' : '>'; + }), + index: i, + barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex, + chartType: d.chartType, + + values: values, + yPositions: scaleAll(values, d.axisID), + id: d.axisID, + + cumulativeYs: cumulativeYs, + cumulativeYPos: scaleAll(cumulativeYs, d.axisID) + }; + }); + } + }, { + key: 'calcYExtremes', + value: function calcYExtremes() { + var s = this.state; + if (this.barOptions.stacked) { + s.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos; + return; + } + s.yExtremes = new Array(s.datasetLength).fill(9999); + s.datasets.map(function (d) { + d.yPositions.map(function (pos, j) { + if (pos < s.yExtremes[j]) { + s.yExtremes[j] = pos; + } + }); + }); + } + }, { + key: 'calcYRegions', + value: function calcYRegions() { + var s = this.state; + if (this.data.yMarkers) { + this.state.yMarkers = this.data.yMarkers.map(function (d) { + d.position = scale(d.value, s.yAxis); + if (!d.options) d.options = {}; + // if(!d.label.includes(':')) { + // d.label += ': ' + d.value; + // } + return d; + }); + } + if (this.data.yRegions) { + this.state.yRegions = this.data.yRegions.map(function (d) { + d.startPos = scale(d.start, s.yAxis); + d.endPos = scale(d.end, s.yAxis); + if (!d.options) d.options = {}; + return d; + }); + } + } + }, { + key: 'getAllYValues', + value: function getAllYValues() { + var _this3 = this, + _ref2; + + var key = 'values'; + var multiAxis = this.config.yAxisConfig ? true : false; + var allValueLists = multiAxis ? {} : []; + + var groupBy = function groupBy(arr, property) { + return arr.reduce(function (acc, cur) { + acc[cur[property]] = [].concat(toConsumableArray(acc[cur[property]] || []), [cur]); + return acc; + }, {}); + }; + + var generateCumulative = function generateCumulative(arr) { + var cumulative = new Array(_this3.state.datasetLength).fill(0); + arr.forEach(function (d, i) { + var values = arr[i].values; + d[key] = cumulative = cumulative.map(function (c, i) { + return c + values[i]; + }); + }); + }; + + if (this.barOptions.stacked) { + key = 'cumulativeYs'; + // we need to filter out the different yAxis ID's here. + if (multiAxis) { + var groupedDataSets = groupBy(this.data.datasets, 'axisID'); + // const dataSetsByAxis = this.data.dd + for (var axisID in groupedDataSets) { + generateCumulative(groupedDataSets[axisID]); + } + } else { + generateCumulative(this.data.datasets); + } + } + + // this is the trouble maker, we don't want to merge all + // datasets since we are trying to run two yAxis. + if (multiAxis) { + this.data.datasets.forEach(function (d) { + var _allValueLists; + + // if the array exists already just push more data into it. + // otherwise create a new array into the object. + allValueLists[d.axisID || key] ? (_allValueLists = allValueLists[d.axisID || key]).push.apply(_allValueLists, toConsumableArray(d[key])) : allValueLists[d.axisID || key] = [].concat(toConsumableArray(d[key])); + }); + } else { + allValueLists = this.data.datasets.map(function (d) { + return d[key]; + }); + } + + if (this.data.yMarkers && !multiAxis) { + allValueLists.push(this.data.yMarkers.map(function (d) { + return d.value; + })); + } + + if (this.data.yRegions && !multiAxis) { + this.data.yRegions.map(function (d) { + allValueLists.push([d.end, d.start]); + }); + } + + return multiAxis ? allValueLists : (_ref2 = []).concat.apply(_ref2, toConsumableArray(allValueLists)); + } + }, { + key: 'setupComponents', + value: function setupComponents() { + var _this4 = this; + + var componentConfigs = [['xAxis', { + mode: this.config.xAxisMode, + height: this.height + // pos: 'right' + }, function () { + var s = this.state; + s.xAxis.calcLabels = getShortenedLabels(this.width, s.xAxis.labels, this.config.xIsSeries); + + return s.xAxis; + }.bind(this)], ['yRegions', { + width: this.width, + pos: 'right' + }, function () { + return this.state.yRegions; + }.bind(this)]]; + + // if we have multiple yAxisConfigs we need to update the yAxisDefault + // components to multiple yAxis components. + if (this.config.yAxisConfig && this.config.yAxisConfig.length) { + this.config.yAxisConfig.forEach(function (yAxis) { + componentConfigs.push(['yAxis', { + mode: _this4.config.yAxisMode, + width: _this4.width, + shortenNumbers: _this4.config.shortenYAxisNumbers, + pos: yAxis.position || 'left' + }, function () { + return this.state.yAxis; + }.bind(_this4)]); + }); + } else { + componentConfigs.push(['yAxis', { + mode: this.config.yAxisMode, + width: this.width, + shortenNumbers: this.config.shortenYAxisNumbers + }, function () { + return this.state.yAxis; + }.bind(this)]); + } + + var barDatasets = this.state.datasets.filter(function (d) { + return d.chartType === 'bar'; + }); + var lineDatasets = this.state.datasets.filter(function (d) { + return d.chartType === 'line'; + }); + + var barsConfigs = barDatasets.map(function (d) { + var index = d.index; + var barIndex = d.barIndex || index; + return ['barGraph' + '-' + d.index, { + index: index, + color: _this4.colors[index], + stacked: _this4.barOptions.stacked, + + // same for all datasets + valuesOverPoints: _this4.config.valuesOverPoints, + minHeight: _this4.height * MIN_BAR_PERCENT_HEIGHT + }, function () { + var s = this.state; + var yAxis = s.yAxis; + + var d = s.datasets[index]; + var _d$id = d.id, + id = _d$id === undefined ? 'left-axis' : _d$id; + + var stacked = this.barOptions.stacked; + + var spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO; + var barsWidth = s.unitWidth * (1 - spaceRatio); + var barWidth = barsWidth / (stacked ? 1 : barDatasets.length); + + // if there are multiple yAxis we need to return the yAxis with the + // proper ID. + if (yAxis instanceof Array) { + // if the person only configured one yAxis in the array return the first. + yAxis = yAxis.length > 1 ? yAxis.find(function (axis) { + return id === axis.axisID; + }) : s.yAxis[0]; + } + + var xPositions = s.xAxis.positions.map(function (x) { + return x - barsWidth / 2; + }); + + if (!stacked) { + xPositions = xPositions.map(function (p) { + return p + barWidth * barIndex - barWidth; + }); + } + + var labels = new Array(s.datasetLength).fill(''); + if (this.config.valuesOverPoints) { + if (stacked && d.index === s.datasets.length - 1) { + labels = d.cumulativeYs; + } else { + labels = d.values; + } + } + var offsets = new Array(s.datasetLength).fill(0); + if (stacked) { + offsets = d.yPositions.map(function (y, j) { + return y - d.cumulativeYPos[j]; + }); + } + + return { + xPositions: xPositions, + yPositions: d.yPositions, + offsets: offsets, + // values: d.values, + labels: labels, + + zeroLine: yAxis.zeroLine, + barsWidth: barsWidth, + barWidth: barWidth + }; + }.bind(_this4)]; + }); + + var lineConfigs = lineDatasets.map(function (d) { + var index = d.index; + return ['lineGraph' + '-' + d.index, { + index: index, + color: _this4.colors[index], + svgDefs: _this4.svgDefs, + heatline: _this4.lineOptions.heatline, + regionFill: _this4.lineOptions.regionFill, + spline: _this4.lineOptions.spline, + hideDots: _this4.lineOptions.hideDots, + hideLine: _this4.lineOptions.hideLine, + + // same for all datasets + valuesOverPoints: _this4.config.valuesOverPoints + }, function () { + var s = this.state; + var d = s.datasets[index]; + + // if we have more than one yindex lets map the values + var yAxis = s.yAxis.length ? s.yAxis.find(function (axis) { + return d.id === axis.axisID; + }) || s.yAxis[0] : s.yAxis; + + var minLine = yAxis.positions[0] < yAxis.zeroLine ? yAxis.positions[0] : yAxis.zeroLine; + + return { + xPositions: s.xAxis.positions, + yPositions: d.yPositions, + + values: d.values, + + zeroLine: minLine, + radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE + }; + }.bind(_this4)]; + }); + + var markerConfigs = [['yMarkers', { + width: this.width, + pos: 'right' + }, function () { + return this.state.yMarkers; + }.bind(this)]]; + + componentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs); + + var optionals = ['yMarkers', 'yRegions']; + this.dataUnitComponents = []; + + this.components = new Map(componentConfigs.filter(function (args) { + return !optionals.includes(args[0]) || _this4.state[args[0]]; + }).map(function (args) { + var component = getComponent.apply(undefined, toConsumableArray(args)); + if (args[0].includes('lineGraph') || args[0].includes('barGraph')) { + _this4.dataUnitComponents.push(component); + } + return [args[0], component]; + })); + } + }, { + key: 'makeDataByIndex', + value: function makeDataByIndex() { + var _this5 = this; + + this.dataByIndex = {}; + + var s = this.state; + var formatX = this.config.formatTooltipX; + var formatY = this.config.formatTooltipY; + var titles = s.xAxis.labels; + + titles.map(function (label, index) { + var values = _this5.state.datasets.map(function (set$$1, i) { + var value = set$$1.values[index]; + return { + title: set$$1.name, + value: value, + yPos: set$$1.yPositions[index], + color: _this5.colors[i], + formatted: formatY ? formatY(value) : value + }; + }); + + _this5.dataByIndex[index] = { + label: label, + formattedLabel: formatX ? formatX(label) : label, + xPos: s.xAxis.positions[index], + values: values, + yExtreme: s.yExtremes[index] + }; + }); + } + }, { + key: 'bindTooltip', + value: function bindTooltip() { + var _this6 = this; + + // NOTE: could be in tooltip itself, as it is a given functionality for its parent + this.container.addEventListener('mousemove', function (e) { + var m = _this6.measures; + var o = getOffset(_this6.container); + var relX = e.pageX - o.left - getLeftOffset(m); + var relY = e.pageY - o.top; + + if (relY < _this6.height + getTopOffset(m) && relY > getTopOffset(m)) { + _this6.mapTooltipXPosition(relX); + } else { + _this6.tip.hideTip(); + } + }); + } + }, { + key: 'mapTooltipXPosition', + value: function mapTooltipXPosition(relX) { + var s = this.state; + if (!s.yExtremes) return; + + var index = getClosestInArray(relX, s.xAxis.positions, true); + if (index >= 0) { + var dbi = this.dataByIndex[index]; + + this.tip.setValues(dbi.xPos + this.tip.offset.x, dbi.yExtreme + this.tip.offset.y, { name: dbi.formattedLabel, value: '' }, dbi.values, index); + + this.tip.showTip(); + } + } + }, { + key: 'renderLegend', + value: function renderLegend() { + var _this7 = this; + + var s = this.data; + if (s.datasets.length > 1) { + this.legendArea.textContent = ''; + s.datasets.map(function (d, i) { + var barWidth = AXIS_LEGEND_BAR_SIZE; + // let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right; + // let multiplier = s.datasets.length - i; + var rect = legendBar( + // rightEndPoint - multiplier * barWidth, // To right align + barWidth * i, '0', barWidth, _this7.colors[i], d.name, _this7.config.truncateLegends); + _this7.legendArea.appendChild(rect); + }); + } + } + + // Overlay + + }, { + key: 'makeOverlay', + value: function makeOverlay$$1() { + var _this8 = this; + + if (this.init) { + this.init = 0; + return; + } + if (this.overlayGuides) { + this.overlayGuides.forEach(function (g) { + var o = g.overlay; + o.parentNode.removeChild(o); + }); + } + + this.overlayGuides = this.dataUnitComponents.map(function (c) { + return { + type: c.unitType, + overlay: undefined, + units: c.units + }; + }); + + if (this.state.currentIndex === undefined) { + this.state.currentIndex = this.state.datasetLength - 1; + } + + // Render overlays + this.overlayGuides.map(function (d) { + var currentUnit = d.units[_this8.state.currentIndex]; + + d.overlay = makeOverlay[d.type](currentUnit); + _this8.drawArea.appendChild(d.overlay); + }); + } + }, { + key: 'updateOverlayGuides', + value: function updateOverlayGuides() { + if (this.overlayGuides) { + this.overlayGuides.forEach(function (g) { + var o = g.overlay; + o.parentNode.removeChild(o); + }); + } + } + }, { + key: 'bindOverlay', + value: function bindOverlay() { + var _this9 = this; + + this.parent.addEventListener('data-select', function () { + _this9.updateOverlay(); + }); + } + }, { + key: 'bindUnits', + value: function bindUnits() { + var _this10 = this; + + this.dataUnitComponents.map(function (c) { + c.units.map(function (unit) { + unit.addEventListener('click', function () { + var index = unit.getAttribute('data-point-index'); + _this10.setCurrentDataPoint(index); + }); + }); + }); + + // Note: Doesn't work as tooltip is absolutely positioned + this.tip.container.addEventListener('click', function () { + var index = _this10.tip.container.getAttribute('data-point-index'); + _this10.setCurrentDataPoint(index); + }); + } + }, { + key: 'updateOverlay', + value: function updateOverlay$$1() { + var _this11 = this; + + this.overlayGuides.map(function (d) { + var currentUnit = d.units[_this11.state.currentIndex]; + updateOverlay[d.type](currentUnit, d.overlay); + }); + } + }, { + key: 'onLeftArrow', + value: function onLeftArrow() { + this.setCurrentDataPoint(this.state.currentIndex - 1); + } + }, { + key: 'onRightArrow', + value: function onRightArrow() { + this.setCurrentDataPoint(this.state.currentIndex + 1); + } + }, { + key: 'getDataPoint', + value: function getDataPoint() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentIndex; + + var s = this.state; + var data_point = { + index: index, + label: s.xAxis.labels[index], + values: s.datasets.map(function (d) { + return d.values[index]; + }) + }; + return data_point; + } + }, { + key: 'setCurrentDataPoint', + value: function setCurrentDataPoint(index) { + var s = this.state; + index = parseInt(index); + if (index < 0) index = 0; + if (index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1; + if (index === s.currentIndex) return; + s.currentIndex = index; + fire(this.parent, "data-select", this.getDataPoint()); + } + + // API + + }, { + key: 'addDataPoint', + value: function addDataPoint(label, datasetValues) { + var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.state.datasetLength; + + get(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'addDataPoint', this).call(this, label, datasetValues, index); + this.data.labels.splice(index, 0, label); + this.data.datasets.map(function (d, i) { + d.values.splice(index, 0, datasetValues[i]); + }); + this.update(this.data); + } + }, { + key: 'removeDataPoint', + value: function removeDataPoint() { + var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.datasetLength - 1; + + if (this.data.labels.length <= 1) { + return; + } + get(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'removeDataPoint', this).call(this, index); + this.data.labels.splice(index, 1); + this.data.datasets.map(function (d) { + d.values.splice(index, 1); + }); + this.update(this.data); + } + }, { + key: 'updateDataset', + value: function updateDataset(datasetValues) { + var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + this.data.datasets[index].values = datasetValues; + this.update(this.data); + } + // addDataset(dataset, index) {} + // removeDataset(index = 0) {} + + }, { + key: 'updateDatasets', + value: function updateDatasets(datasets) { + this.data.datasets.map(function (d, i) { + if (datasets[i]) { + d.values = datasets[i]; + } + }); + this.update(this.data); + } + + // updateDataPoint(dataPoint, index = 0) {} + // addDataPoint(dataPoint, index = 0) {} + // removeDataPoint(index = 0) {} + + }]); + return AxisChart; +}(BaseChart); + +var DonutChart = function (_AggregationChart) { + inherits(DonutChart, _AggregationChart); + + function DonutChart(parent, args) { + classCallCheck(this, DonutChart); + + var _this = possibleConstructorReturn(this, (DonutChart.__proto__ || Object.getPrototypeOf(DonutChart)).call(this, parent, args)); + + _this.type = 'donut'; + _this.initTimeout = 0; + _this.init = 1; + + _this.setup(); + return _this; + } + + createClass(DonutChart, [{ + key: 'configure', + value: function configure(args) { + get(DonutChart.prototype.__proto__ || Object.getPrototypeOf(DonutChart.prototype), 'configure', this).call(this, args); + this.mouseMove = this.mouseMove.bind(this); + this.mouseLeave = this.mouseLeave.bind(this); + + this.hoverRadio = args.hoverRadio || 0.1; + this.config.startAngle = args.startAngle || 0; + + this.clockWise = args.clockWise || false; + this.strokeWidth = args.strokeWidth || 30; + } + }, { + key: 'calc', + value: function calc() { + var _this2 = this; + + get(DonutChart.prototype.__proto__ || Object.getPrototypeOf(DonutChart.prototype), 'calc', this).call(this); + var s = this.state; + this.radius = this.height > this.width ? this.center.x - this.strokeWidth / 2 : this.center.y - this.strokeWidth / 2; + + var radius = this.radius, + clockWise = this.clockWise; + + + var prevSlicesProperties = s.slicesProperties || []; + s.sliceStrings = []; + s.slicesProperties = []; + var curAngle = 180 - this.config.startAngle; + + s.sliceTotals.map(function (total, i) { + var startAngle = curAngle; + var originDiffAngle = total / s.grandTotal * FULL_ANGLE; + var largeArc = originDiffAngle > 180 ? 1 : 0; + var diffAngle = clockWise ? -originDiffAngle : originDiffAngle; + var endAngle = curAngle = curAngle + diffAngle; + var startPosition = getPositionByAngle(startAngle, radius); + var endPosition = getPositionByAngle(endAngle, radius); + + var prevProperty = _this2.init && prevSlicesProperties[i]; + + var curStart = void 0, + curEnd = void 0; + if (_this2.init) { + curStart = prevProperty ? prevProperty.startPosition : startPosition; + curEnd = prevProperty ? prevProperty.endPosition : startPosition; + } else { + curStart = startPosition; + curEnd = endPosition; + } + var curPath = originDiffAngle === 360 ? makeStrokeCircleStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise, largeArc) : makeArcStrokePathStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise, largeArc); + + s.sliceStrings.push(curPath); + s.slicesProperties.push({ + startPosition: startPosition, + endPosition: endPosition, + value: total, + total: s.grandTotal, + startAngle: startAngle, + endAngle: endAngle, + angle: diffAngle + }); + }); + this.init = 0; + } + }, { + key: 'setupComponents', + value: function setupComponents() { + var s = this.state; + + var componentConfigs = [['donutSlices', {}, function () { + return { + sliceStrings: s.sliceStrings, + colors: this.colors, + strokeWidth: this.strokeWidth + }; + }.bind(this)]]; + + this.components = new Map(componentConfigs.map(function (args) { + var component = getComponent.apply(undefined, toConsumableArray(args)); + return [args[0], component]; + })); + } + }, { + key: 'calTranslateByAngle', + value: function calTranslateByAngle(property) { + var radius = this.radius, + hoverRadio = this.hoverRadio; + + var position = getPositionByAngle(property.startAngle + property.angle / 2, radius); + return 'translate3d(' + position.x * hoverRadio + 'px,' + position.y * hoverRadio + 'px,0)'; + } + }, { + key: 'hoverSlice', + value: function hoverSlice(path, i, flag, e) { + if (!path) return; + var color = this.colors[i]; + if (flag) { + transform(path, this.calTranslateByAngle(this.state.slicesProperties[i])); + path.style.stroke = lightenDarkenColor(color, 50); + var g_off = getOffset(this.svg); + var x = e.pageX - g_off.left + 10; + var y = e.pageY - g_off.top - 10; + var title = (this.formatted_labels && this.formatted_labels.length > 0 ? this.formatted_labels[i] : this.state.labels[i]) + ': '; + var percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1); + this.tip.setValues(x, y, { name: title, value: percent + "%" }); + this.tip.showTip(); + } else { + transform(path, 'translate3d(0,0,0)'); + this.tip.hideTip(); + path.style.stroke = color; + } + } + }, { + key: 'bindTooltip', + value: function bindTooltip() { + this.container.addEventListener('mousemove', this.mouseMove); + this.container.addEventListener('mouseleave', this.mouseLeave); + } + }, { + key: 'mouseMove', + value: function mouseMove(e) { + var target = e.target; + var slices = this.components.get('donutSlices').store; + var prevIndex = this.curActiveSliceIndex; + var prevAcitve = this.curActiveSlice; + if (slices.includes(target)) { + var i = slices.indexOf(target); + this.hoverSlice(prevAcitve, prevIndex, false); + this.curActiveSlice = target; + this.curActiveSliceIndex = i; + this.hoverSlice(target, i, true, e); + } else { + this.mouseLeave(); + } + } + }, { + key: 'mouseLeave', + value: function mouseLeave() { + this.hoverSlice(this.curActiveSlice, this.curActiveSliceIndex, false); + } + }]); + return DonutChart; +}(AggregationChart); + +var chartTypes = { + bar: AxisChart, + line: AxisChart, + // multiaxis: MultiAxisChart, + percentage: PercentageChart, + heatmap: Heatmap, + pie: PieChart, + donut: DonutChart +}; + +function getChartByType() { + var chartType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'line'; + var parent = arguments[1]; + var options = arguments[2]; + + if (chartType === 'axis-mixed') { + options.type = 'line'; + return new AxisChart(parent, options); + } + + if (!chartTypes[chartType]) { + console.error("Undefined chart type: " + chartType); + return; + } + + return new chartTypes[chartType](parent, options); +} + +var Chart = function Chart(parent, options) { + classCallCheck(this, Chart); + + return getChartByType(options.type, parent, options); +}; + + + +var Charts = Object.freeze({ + Chart: Chart, + PercentageChart: PercentageChart, + PieChart: PieChart, + Heatmap: Heatmap, + AxisChart: AxisChart +}); + +var frappe = {}; + +frappe.NAME = 'Frappe Charts'; +frappe.VERSION = '1.6.2'; + +frappe = Object.assign({}, frappe, Charts); + +var frappe$1 = frappe; + +return frappe$1; + +}()); //# sourceMappingURL=frappe-charts.min.js.map diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index 581538f..1a7def7 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport { makeText, generateAxisLabel, 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 this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\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\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n return data.positions.map((position, i) => {\n return yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n });\n });\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(m =>\n\t\t\t\tyMarker(m.position, m.label, this.constants.width,\n\t\t\t\t\t{labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\tlineGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'dot';\n\t\t\tthis.paths = {};\n\t\t\tif(!c.hideLine) {\n\t\t\t\tthis.paths = getPaths(\n\t\t\t\t\tdata.xPositions,\n\t\t\t\t\tdata.yPositions,\n\t\t\t\t\tc.color,\n\t\t\t\t\t{\n\t\t\t\t\t\theatline: c.heatline,\n\t\t\t\t\t\tregionFill: c.regionFill,\n\t\t\t\t\t\tspline: c.spline\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsvgDefs: c.svgDefs,\n\t\t\t\t\t\tzeroLine: data.zeroLine\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.units = [];\n\t\t\tif(!c.hideDots) {\n\t\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\t\treturn datasetDot(\n\t\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\t\ty,\n\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\tc.color,\n\t\t\t\t\t\t(c.valuesOverPoints ? data.values[j] : ''),\n\t\t\t\t\t\tj\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Object.values(this.paths).concat(this.units);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newValues = newData.values;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldValues = this.oldData.values;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\tvalues: newValues,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tradius: this.oldData.radius,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tif(Object.keys(this.paths).length) {\n\t\t\t\tanimateElements = animateElements.concat(animatePath(\n\t\t\t\t\tthis.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline));\n\t\t\t}\n\n\t\t\tif(this.units.length) {\n\t\t\t\tthis.units.map((dot, i) => {\n\t\t\t\t\tanimateElements = animateElements.concat(animateDot(\n\t\t\t\t\t\tdot, newXPos[i], newYPos[i]));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn animateElements;\n\t\t}\n\t}\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                \n\t\t\t\t
                                `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = axisOptions.yAxisMode || 'span';\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions;\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\n const yAxisConfigObject =\n this.config.yAxisConfig.find((item) => key === item.id) || [];\n const yAxisAlignment = yAxisConfigObject\n ? yAxisConfigObject.position\n : 'right';\n\n if (this.state.yAxis.length) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n // we need to loop through original positions.\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","rotation","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","find","yAxisAlignment","yPtsArray","firstArr","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"yDACwB,gBAATA,IAAoBC,GAAOC,UAAUC,cAAcH,GAAQA,GAAQ,KA4ClF,QAAgBI,GAAUC,MACrBC,GAAOD,EAAQE,mCAKbD,EAAKE,KAAON,SAASO,gBAAgBC,WAAaR,SAASS,KAAKD,gBAC/DJ,EAAKM,MAAQV,SAASO,gBAAgBI,YAAcX,SAASS,KAAKE,aAO1E,QAAgBC,GAASC,SACI,QAApBA,EAAGC,aAGZ,QAAgBC,GAAoBF,MAE/BT,GAAOS,EAAGR,8BAGbD,GAAKE,KAAO,GACNF,EAAKM,MAAQ,GACbN,EAAKY,SAAWC,OAAOC,aAAelB,SAASO,gBAAgBY,iBAC1DC,QAAUH,OAAOI,YAAcrB,SAASO,gBAAgBe,aAIrE,QAAgBC,GAAuBpB,MAClCqB,GAASP,OAAOQ,iBAAiBtB,GACjCuB,EAAUC,WAAWH,EAAOI,aAC/BD,WAAWH,EAAOK,oBAEZ1B,GAAQmB,YAAcI,EA2B9B,QAAgBI,GAAKC,EAAQC,EAAMC,MAC9BC,GAAMlC,SAASmC,YAAY,gBAE3BC,UAAUJ,GAAM,GAAM,OAErB,GAAIK,KAAKJ,KACTI,GAAKJ,EAAWI,SAGdN,GAAOO,cAAcJ,GC7E7B,QAAgBK,GAAaC,SACrBA,GAAEC,YAAcD,EAAEE,QAAQpC,IAAMkC,EAAEG,SAASrC,IAGnD,QAAgBsC,GAAcJ,SACtBA,GAAEE,QAAQhC,KAAO8B,EAAEG,SAASjC,KAGpC,QAAgBmC,GAAeL,SACPA,GAAEE,QAAQpC,IAAMkC,EAAEE,QAAQ1B,OAC9CwB,EAAEG,SAASrC,IAAMkC,EAAEG,SAAS3B,OAC5BwB,EAAEC,YAAcD,EAAEM,aAItB,QAAgBC,GAAcP,SACPA,GAAEE,QAAQhC,KAAO8B,EAAEE,QAAQtB,MAC9CoB,EAAEG,SAASjC,KAAO8B,EAAEG,SAASvB,MClD1B,QAAS4B,GAASC,SACjBtB,YAAWsB,EAAEC,QAAQ,IAyC7B,QAAgBC,GAAUC,EAAOC,EAAOlD,MAASmD,0DAC5CnD,OACOmD,EAAQF,EAAM,GAAKA,EAAMA,EAAMG,OAAS,OAE/CC,GAAc,GAAIC,OAAMC,KAAKC,IAAIN,IAAQO,KAAKzD,YAC1CmD,EAAQE,EAAYK,OAAOT,GAASA,EAAMS,OAAOL,GAS1D,QAAgBM,GAAeC,EAAQC,UAC9BD,EAAO,IAAIR,OAASS,EAyB7B,QAAgBC,GAAmBC,EAAOC,YAErCT,KAAKU,IAAIF,EAAQG,IAAeF,IAChCT,KAAKY,IAAIJ,EAAQG,IAAeF,GASrC,QAAgBI,GAAcC,MAAWC,kEACpCC,OAAOC,MAAMH,SACMI,KAAdJ,MACCE,OAAOG,SAASL,MACjBC,GAAeD,EAAY,KAQrC,QAAgBM,GAAM7B,SAGdyB,QAAOhB,KAAKoB,MAAM7B,EAAI,MAAQ,OAOrC,QAAgB8B,GAAUP,MACtBQ,UAAQC,SAAOC,YAEfV,YAAqBW,YAChB,IAAIA,MAAKX,EAAUY,cAGH,qBAAdZ,iBAAAA,KAAwC,OAAdA,QAC5BA,KAGAf,MAAM4B,QAAQb,aAElBU,IAAOV,KACFA,EAAUU,KAEXA,GAAOH,EAAUE,SAGnBD,GC3ID,QAASM,GAAqBC,EAAMC,MACtCC,UAAQC,eACRH,IAAQC,KACFA,EAAWD,IAChBA,MAEKA,EAAOC,IACZA,IAGGC,EAAQC,GAGjB,QAAgBC,GAAqBC,EAAQC,MAC5CC,0DAAaD,EAAOtC,OAASqC,EAAOrC,aAGjCuC,GAAa,IACN3C,EAAUyC,EAAQE,KAElB3C,EAAU0C,EAAQC,IAEpBF,EAAQC,GAGjB,QAAgBE,GAAeC,EAAKC,MAC9BD,QAGDA,GAAIzC,OAAS0C,EACTD,EAAIE,MAAM,EAAGD,EAAI,GAAK,MAEtBD,EAIT,QAAgBG,GAAmBC,MAC9BC,aACiB,gBAAVD,GAAoBC,EAASD,MACnC,IAAqB,gBAAVA,OACN1B,OAAO0B,GACZ1B,OAAOC,MAAM0B,IAAS,MAAOD,MAI9BE,GAAI5C,KAAK6C,MAAM7C,KAAK8C,MAAM9C,KAAKC,IAAI0C,QACnCC,GAAK,EAAG,MAAOD,MACfI,GAAI/C,KAAK6C,MAAMD,EAAI,GACnBI,EAAahD,KAAKiD,IAAI,GAAIL,EAAQ,EAAJG,KAAWJ,EAAS3C,KAAKiD,IAAI,GAAIL,IAAIpD,QAAQ,SAGxEQ,MAAKoB,MAAgB,IAAV4B,GAAe,IAAM,KAAO,GAAI,IAAK,IAAK,IAAK,KAAKD,GAIvE,QAAgBG,GAAwBC,EAAOC,OAG1C,GADAC,MACIC,EAAE,EAAEA,EAAEH,EAAMtD,OAAOyD,MACnBC,MAAMJ,EAAMG,GAAIF,EAAME,QAI1BE,GAAO,SAACC,EAAQC,MACfC,GAAUD,EAAO,GAAKD,EAAO,GAC7BG,EAAUF,EAAO,GAAKD,EAAO,iBAExBzD,KAAK6D,KAAK7D,KAAKiD,IAAIU,EAAS,GAAK3D,KAAKiD,IAAIW,EAAS,UACpD5D,KAAK8D,MAAMF,EAASD,KAIzBI,EAAe,SAACC,EAASC,EAAUC,EAAMC,MAGxCC,GAAIZ,EAFAS,GAAYD,EACZE,GAAQF,GAEZxD,EAAQ4D,EAAE5D,OAAS2D,EAAUnE,KAAKqE,GAAK,GACvCxE,EAfW,GAeFuE,EAAEvE,cACPmE,EAAQ,GAAKhE,KAAKY,IAAIJ,GAASX,EAC/BmE,EAAQ,GAAKhE,KAAKU,IAAIF,GAASX,UAUzB,UAACwD,EAAQiB,SAChBjB,GAAOkB,OAAO,SAACC,EAAKC,EAAOnB,EAAGoB,SAAY,KAANpB,EACrCmB,EAAM,OAAMA,EAAM,GAClBD,MAAOF,EAAQG,EAAOnB,EAAGoB,IAAM,KAGtBrB,EAZI,SAACoB,EAAOnB,EAAGoB,MAC1BC,GAAMZ,EAAaW,EAAEpB,EAAI,GAAIoB,EAAEpB,EAAI,GAAImB,GACvCG,EAAMb,EAAaU,EAAOC,EAAEpB,EAAI,GAAIoB,EAAEpB,EAAI,IAAI,cACtCqB,EAAI,OAAMA,EAAI,OAAMC,EAAI,OAAMA,EAAI,OAAMH,EAAM,OAAMA,EAAM,KCvExE,QAASI,GAAWC,SACfA,GAAI,IAAY,IACXA,EAAI,EAAU,EAChBA,EAGR,QAAgBC,GAAmBC,EAAOC,MACrCC,GAAMC,GAASH,GACfI,GAAW,CACD,MAAVF,EAAI,OACDA,EAAI1C,MAAM,MACL,MAER6C,GAAMC,SAASJ,EAAI,IACnBJ,EAAID,GAAYQ,GAAO,IAAMJ,GAC7BM,EAAIV,GAAaQ,GAAO,EAAK,KAAUJ,GACvCO,EAAIX,GAAkB,IAANQ,GAAkBJ,UAC9BG,EAAS,IAAI,KAAOI,EAAKD,GAAK,EAAMT,GAAK,IAAKW,SAAS,IAGhE,QAAgBC,GAAarF,MAGxBsF,GAAS,mHADA,uCAECC,KAAKvF,IAAWsF,EAAOC,KAAKvF,GC7B3C,QAASwF,GAAEzJ,EAAMC,SACO,gBAATD,IAAoBC,GAAOC,UAAUC,cAAcH,GAAQA,GAAQ,KAGlF,QAAgB0J,GAAUC,EAAK3B,MAC1B3H,GAAUH,SAAS0J,gBAAgB,6BAA8BD,OAEhE,GAAIzC,KAAKc,GAAG,IACZ6B,GAAM7B,EAAEd,MAEF,WAANA,IACD2C,GAAKC,YAAYzJ,OAEf,IAAU,WAAN6G,EAAgB,IACpB6C,GAAMN,EAAEI,KACRG,WAAWC,aAAa5J,EAAS0J,KAC7BD,YAAYC,OAEJ,WAAN7C,EACQ,qBAAR2C,iBAAAA,YACFK,KAAKL,GAAKM,IAAI,cACZC,MAAMC,GAAQR,EAAIQ,MAInB,cAANnD,MAAyB,SACnB,cAANA,IACF,YAAyB2C,IAEjBS,aAAapD,EAAG2C,UAKpBxJ,GAGR,QAASkK,GAAuBC,EAAYC,SACpCf,GAAU,yBACRc,KACJC,KACA,KACA,KACA,KACA,IAIN,QAASC,GAAgBC,EAAUC,EAAQhC,EAAOiC,SAC1CnB,GAAU,eACNiB,uBACc/B,SACdgC,iBACMC,IAIlB,QAAgBC,GAAiBC,EAAQC,EAAWC,EAAOtF,SACnD+D,GAAU,iBACLsB,SACHD,QACDE,SACCtF,IAIV,QAAgBuF,GAAYC,SACpBzB,GAAU,eACRyB,IAIV,QAAgBC,GAAaJ,MAAWK,0DAAU,GAAIN,6DAAOjG,GACxDwG,aACQN,YACAK,SAETN,KAAQO,EAAKC,OAASR,GAClBrB,EAAU,IAAK4B,GAWvB,QAAgBE,GAASC,SACjB/B,GAAU,yEAD0B,KAGvC+B,wEAHkD,mEAAa,6EAAoB,KAYxF,QAAgBC,GAAeC,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EAC3FC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAAqBN,EAAOI,EAAIL,EAAYK,EAAnCG,EAAsCP,EAAOjG,EAAIgG,EAAYhG,YAChEiG,EAAOI,MAAKJ,EAAOjG,YAC1BoG,MAAaE,aACZ7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,OAGf,QAAgBC,GAAcV,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EAC1FC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAA6BN,EAAOI,EAAIL,EAAYK,EAA3CK,EAAyD,EAAXT,EAAOjG,EAA7CwG,EAAoDP,EAAOjG,EAAIgG,EAAYhG,YACtFiG,EAAOI,MAAKJ,EAAOjG,YAC1BoG,MAAaE,aACZ7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWG,cACVN,MAAaM,aACZjI,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,OAGf,QAAgBG,GAAqBZ,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EACjGC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAAqBN,EAAOI,EAAIL,EAAYK,EAAnCG,EAAsCP,EAAOjG,EAAIgG,EAAYhG,YAEhEoG,MAAaE,aACnB7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,EAGf,QAAgBI,GAAoBb,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EAChGC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAA6BN,EAAOI,EAAIL,EAAYK,EAA3CK,EAAuD,EAATjI,EAAa6H,EAAnDE,EAA8DP,EAAOjG,EAAI+F,EAAc/F,YAElGoG,MAAaE,aACnB7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWG,YACVN,MAAaM,aACZjI,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,EAGf,QAAgBK,GAAajC,EAAY5B,MAAO8D,2DAC3CjC,EAAY,sBAA6B7B,EAAQ,KAAM8D,EAAU,UAAY,WAC7EC,EAAcpC,EAAuBC,EAAYC,GACjDmC,GAAa,EAAG,GAAK,UACtBF,QACW,GAAK,GAAK,MAGRC,EAAa,KAAM/D,EAAOgE,EAAU,MACpCD,EAAa,MAAO/D,EAAOgE,EAAU,MACrCD,EAAa,OAAQ/D,EAAOgE,EAAU,IAE/CnC,EAGR,QAAgBoC,GAAcZ,EAAGrG,EAAGqF,EAAOtF,MAC1CmH,0DAAMC,GAA8BjJ,yDAAK,aAkBlC4F,GAAU,kBAfL,mBACRuC,IACArG,QACIqF,SACCtF,OACF7B,iBAEK6E,EAAmB7E,GAAO,8BAGV6B,EAASsF,QAAUA,OAAUtF,iBACvCmH,KAOnB,QAAgBE,GAAWhC,EAAWiB,EAAGrG,EAAGqH,EAAM5I,MAAQP,0DAAK,OAAQoJ,4DAClE5B,aACQN,IACRiB,IACArG,QACIqH,SACCA,KACJ5I,OACEP,iBAGAoG,KAAKgD,GAAM/C,IAAI,cAChB/E,GAAO8H,EAAK9H,KAGXsE,EAAU,OAAQ4B,GAG1B,QAAgB6B,GAAUlB,EAAGrG,EAAGqH,MAAMnJ,0DAAK,OAAQwC,yEAC/BL,EAAeK,EAAO8G,IAAmB9G,KAExDgF,cACQ,eACR,IACA,QACI2B,SACC,WACFnJ,GAEHuJ,EAAO3D,EAAU,kBACT,wBACR,IACA,KACc,EAAZ4D,GAAiB,iBACI,IAAZA,GAAmB,mBAClB,aACTC,aACKjH,IAGRkH,EAAQ9D,EAAU,4BACGuC,OAAMrG,iBAEzBkE,YAAYJ,EAAU,OAAQ4B,MAC9BxB,YAAYuD,GAEXG,EAGR,QAAgBC,GAAUxB,EAAGrG,EAAGqH,MAAMnJ,0DAAK,OAAQwC,yEAC/BL,EAAeK,EAAO8G,IAAmB9G,KAExDgF,cACQ,gBACP,KACA,IACD2B,OACGnJ,GAEHuJ,EAAO3D,EAAU,kBACT,wBACR,IACA,KACE4D,GAAa,QACbA,GAAU,EAAK,iBACM,IAAZA,GAAmB,mBAClB,aACTC,aACKjH,IAGRkH,EAAQ9D,EAAU,4BACGuC,OAAMrG,iBAEzBkE,YAAYJ,EAAU,SAAU4B,MAChCxB,YAAYuD,GAEXG,EAGR,QAAgBE,GAAS1C,EAAWiB,EAAGrG,EAAG+H,MAASC,6DAC9CC,EAAWD,EAAQC,UAAYP,SAI5B5D,GAAU,kBACLsB,IACRiB,IACArG,UANoBd,KAAf8I,EAAQE,GAAmBF,EAAQE,GAAMD,EAAW,GAOnD,iBACIA,EAAW,UAPdD,EAAQ9J,MAAQyJ,iBACVK,EAAQG,YAAc,kBAS3BJ,IAIb,QAASK,GAAa/B,EAAG3F,EAAO2H,EAAIC,MAAIN,4DACnCA,GAAQO,SAAQP,EAAQO,OAASC,OACjCzH,GAAI+C,EAAU,kBACN,iBAAmBkE,EAAQ5C,aAClC,KACA,KACAiD,KACAC,iBAEKN,EAAQO,UAIdd,EAAO3D,EAAU,UACjB,IACAuE,EAAKC,EAAKD,EAAKI,GAAeJ,EAAKI,GAAef,MACjDA,GAAY,iBACHA,GAAY,mBACV,mBACJhH,EAAQ,KAGhBc,EAAOsC,EAAU,4BACKuC,oBAGrBnC,YAAYnD,KACZmD,YAAYuD,GAEVjG,EAGR,QAASkH,GAAa1I,EAAGU,EAAOiI,EAAIC,MAAIZ,4DAC/BA,GAAQO,SAAQP,EAAQO,OAASC,IACjCR,EAAQa,WAAUb,EAAQa,SAAW,IACrCb,EAAQc,YAAWd,EAAQc,UAAY,QACxCd,EAAQe,iBAAgBrI,EAAQD,EAAmBC,OAOnDK,GAAI+C,EAAU,kBAJd,mBACAkE,EAAQ5C,WACc,WAArB4C,EAAQa,SAAwB,SAAW,OAIxCF,KACAC,KACA,KACA,iBAEQZ,EAAQO,UAIpBd,EAAO3D,EAAU,UACQ,SAAtBkE,EAAQc,UAAuBH,EAAKF,GAAeG,EAAoB,EAAfH,KACxD,KACCf,GAAY,EAAI,EAAI,iBACXA,GAAY,mBACViB,EAAKC,EAAK,MAAQ,kBACtBlI,EAAQ,KAGnBc,EAAOsC,EAAU,+BACU9D,uBACT,UAGT,KAATyH,GAAuB,MAATA,MACTjD,MAAM+D,OAAS,2BAGnBrE,YAAYnD,KACZmD,YAAYuD,GAEVjG,EAGX,QAAgBwH,GAAkBhB,MACzBA,EAAQiB,UAEP5C,GAAyB,SAArB2B,EAAQkB,SAAsBT,GAAeT,EAAQ3C,MAEzD8D,EACmB,UAArBnB,EAAQkB,uBACYlB,EAAQ3C,WAAU2C,EAAQjI,OAAS,wBAC/BiI,EAAQjI,OAAS,YAE5B+D,GAAU,kBACZ,gBACRuC,EAAIjI,EAAe4J,EAAQiB,MAAO,GAAK,IACvCjB,EAAQjI,OAAS,EAAI0I,MACpBf,IAAa,EAAI,iBACRA,GAAY,mBACV,kBACJyB,YACAnB,EAAQiB,MAAQ,MAMnC,QAAgBG,GAAMpJ,EAAGU,EAAO2E,MAAO2C,4DAC9BnJ,GAAcmB,KAAIA,EAAI,GAEtBgI,EAAQqB,MAAKrB,EAAQqB,IAAM,QAC3BrB,EAAQhD,SAAQgD,EAAQhD,OAAS,GACjCgD,EAAQsB,OAAMtB,EAAQsB,KAAO,QAC7BtB,EAAQO,SAAQP,EAAQO,OAASC,IACjCR,EAAQ5C,YAAW4C,EAAQ5C,UAAY,OAExCuD,IAAM,EAAIY,GACVX,EAAsB,SAAjBZ,EAAQsB,KAAkBjE,EAAQkE,GAAmB,CAEzC,UAAjBvB,EAAQsB,MAAmC,UAAhBtB,EAAQqB,QAC9BhE,EAAQkE,KACRlE,MAGLL,GAAyB,SAAhBgD,EAAQqB,KAAkB,EAAIrB,EAAQhD,OAASgD,EAAQhD,iBAE9DA,KACAA,EAEC0D,EAAa1I,EAAGU,EAAOiI,EAAIC,UACtBZ,EAAQO,iBACLP,EAAQ5C,mBACT4C,EAAQa,mBACPb,EAAQqB,mBACHrB,EAAQe,iBAIhC,QAAgBS,GAAMnD,EAAG3F,EAAOX,MAAQiI,4DAClCnJ,GAAcwH,KAAIA,EAAI,GAEvB2B,EAAQqB,MAAKrB,EAAQqB,IAAM,UAC3BrB,EAAQhD,SAAQgD,EAAQhD,OAAS,GACjCgD,EAAQsB,OAAMtB,EAAQsB,KAAO,QAC7BtB,EAAQO,SAAQP,EAAQO,OAASC,IACjCR,EAAQ5C,YAAW4C,EAAQ5C,UAAY,OAavCiD,GAAKtI,EAASwJ,GACdjB,EAAsB,SAAjBN,EAAQsB,MAAmB,EAAIC,GAAmBxJ,QAEvC,SAAjBiI,EAAQsB,MAAmC,QAAhBtB,EAAQqB,SAE/B,EAAIE,KACL,GAGCnB,EAAa/B,EAAG3F,EAAO2H,EAAIC,UACzBN,EAAQO,iBACLP,EAAQ5C,mBACT4C,EAAQa,WAIpB,QAAgBY,GAAQzJ,EAAGU,EAAO2E,MAAO2C,4DACpCA,GAAQ0B,WAAU1B,EAAQ0B,SAAW,YAIrCC,GAAW7F,EAAU,kBACb,gBAJiB,SAArBkE,EAAQ0B,SAAsBjB,GACnCpD,EAAQjH,EAAesC,EAAO,GAAK+H,KAKlC,KACEf,IAAa,EAAK,iBACVA,GAAY,mBACV,kBACJhH,EAAM,KAGdc,EAAOkH,EAAa1I,EAAG,GAAI,EAAGqF,UACzB2C,EAAQO,QAAUC,aACfR,EAAQ5C,WAAa,YACtB4C,EAAQa,oBAGd3E,YAAYyF,GAEVnI,EAGR,QAAgBoI,GAAQvB,EAAIC,EAAIjD,EAAO3E,MAAOsH,6DAEzCjI,EAASsI,EAAKC,EAEd5N,EAAOoJ,EAAU,6EAIX0E,sBACenD,OAAUtF,KAG/B,IACA,QACIsF,SACCtF,GAGLiI,GAAQ0B,WAAU1B,EAAQ0B,SAAW,YAIrCC,GAAW7F,EAAU,kBACb,gBAJiB,SAArBkE,EAAQ0B,SAAsBjB,GACnCpD,EAAQjH,EAAesC,EAAM,GAAI,KAAO+H,KAKvC,KACEf,IAAa,EAAK,iBACVA,GAAY,mBACV,kBACJhH,EAAM,KAGdmJ,EAAS/F,EAAU,+BACKwE,iBAGrBpE,YAAYxJ,KACZwJ,YAAYyF,GAEZE,EAGR,QAAgBC,GAAWzD,EAAGxG,EAAMwF,EAAOrC,MAAOtC,0DAAM,GAAIqJ,yDAAM,EAAG/E,yDAAO,EAAGgF,8DAC5DpK,EAAqBC,EAAMmK,EAAKlK,oBAA7CC,OAAQC,UACRgF,EAES,IAAXjF,MACOiK,EAAKC,aACTD,EAAKC,WAINpL,EAAcwH,KAAIA,EAAI,GACtBxH,EAAcmB,KAAIA,EAAI,GACtBnB,EAAckB,GAAQ,KAAOA,EAAS,GACtClB,EAAcwG,GAAO,KAAOA,EAAQ,MAErC3K,GAAOoJ,EAAU,4CAEJd,qBACI+G,IACjB1D,IACArG,QACIqF,SACCtF,WAGA,KAEKW,EAAM7C,OAEb,GACD6G,aAAa,IAAK,KAClBA,aAAa,IAAK,MACnB+C,GAAO3D,EAAU,kBACT,qBACRuB,EAAM,IACN,KACEqC,GAAY,GAAK,EAAK,iBACdA,GAAY,mBACV,mBACJhH,IAGRkH,EAAQ9D,EAAU,wBACDiG,yBACI1D,OAAMrG,iBAEzBkE,YAAYxJ,KACZwJ,YAAYuD,GAEXG,QArBAlN,GAyBT,QAAgBwP,GAAW7D,EAAGrG,EAAGvB,EAAQuE,MAAOtC,0DAAM,GAAIqJ,yDAAM,EAC3DI,EAAMrG,EAAU,yBACHd,qBACI+G,KAChB1D,KACArG,IACDvB,WAGK,KAEKiC,EAAM7C,OAEb,GACF6G,aAAa,KAAM,KACnBA,aAAa,KAAM,MAEnB+C,GAAO3D,EAAU,kBACT,qBACR,IACA,KACE4D,GAAY,GAAK,EAAIjJ,EAAU,iBACvBiJ,GAAY,mBACV,mBACJhH,IAGRkH,EAAQ9D,EAAU,wBACDiG,yBACI1D,OAAMrG,iBAEzBkE,YAAYiG,KACZjG,YAAYuD,GAEXG,QAtBAuC,GA0BT,QAAgBC,GAASjJ,EAAOC,EAAO4B,MAAOgF,6DAAYgC,4DAErDK,EADajJ,EAAMmD,IAAI,SAACvE,EAAGsB,SAAOH,GAAMG,GAAK,IAAMtB,IAC5BsK,KAAK,IAG5BtC,GAAQuC,SACXF,EAAYnJ,EAAwBC,EAAOC,OAExCoJ,GAAO5E,EAAS,IAAIyE,EAAW,kBAAmBrH,MAGnDgF,EAAQyC,SAAU,IAChBC,GAAc7D,EAAamD,EAAKW,QAAS3H,KACxCwB,MAAM+D,eAAiBmC,SAGzBE,SACGJ,MAIJxC,EAAQ6C,WAAY,IAClBC,GAAqBjE,EAAamD,EAAKW,QAAS3H,GAAO,GAEvD6C,EAAU,IAAS1E,EAAM,OAAM6I,EAAKlK,aAAcuK,MAAgBlJ,EAAMX,OAAO,GAAG,OAAMwJ,EAAKlK,WAC3F+J,OAASjE,EAASC,gBAAwB,eAAgBiF,aAG1DF,GC5nBR,QAAgBG,GAAUC,EAAMC,EAAUC,EAAUC,MAC/CC,GAA0B,gBAAbH,GAAwBA,EAAWA,EAASX,KAAK,aAEjEU,GACCvF,UAAWyF,EAASZ,KAAK,OAC1Ba,EACAE,GACA,aACC5F,UAAW2F,IAId,QAAgBE,IAAkB9B,EAAO+B,EAAMC,SACvCT,GAAUvB,GAAQgC,EAAM,IAAKD,EAAM,GAAIE,IAG/C,QAAgBC,IAAkBtC,EAAOuC,EAAMC,SACvCb,GAAU3B,GAAQ,EAAGwC,IAAQ,EAAGD,GAAOF,IAG/C,QAAgBI,IAAcC,EAAWC,EAAOC,EAAOC,MAClDC,GAAYH,EAAQC,EACpBtR,EAAOoR,EAAUK,WAAW,WAG/BzR,GACEqF,OAAQmM,EAAWE,mBAHV1R,EAAK2R,aAAa,cAGyBH,GACtDT,GACAJ,IAGeN,EAAUe,GAAY,EAAGG,IAAS,EAAGD,GAAQP,KAI9D,QAAgBa,IAAWC,EAAKlG,EAAGxG,EAAMwF,MAAOL,0DAAO,IACpCpF,EAAqBC,8DAAWC,oBAA7CC,OAAQC,iBACRgF,EACe,SAAjBuH,EAAIC,WACKD,EAAIJ,WAAW,IAGxB9G,MAAOA,EAAOtF,OAAQA,GACvB0M,GACApB,IAIeN,EAAUwB,EADRA,EAAIF,aAAa,aAAaK,MAAM,KAAK,GAAGlM,MAAM,GAAI,IAC3B6F,EAAGrG,GAAIyL,OAG3Cc,GAAMlH,MAAOA,EAAOtF,OAAQA,EAAQsG,EAAGA,EAAGrG,EAAGA,GAAIyM,GAAepB,KAK3E,QAAgBsB,IAAWxC,EAAK9D,EAAGrG,SACd,WAAjBmK,EAAIqC,UAEUzB,EAAUZ,EADRA,EAAIkC,aAAa,aAAaK,MAAM,KAAK,GAAGlM,MAAM,GAAI,IAC3B6F,EAAGrG,GAAIyL,OAG3CtB,GAAMyC,GAAIvG,EAAGwG,GAAI7M,GAAIyM,GAAepB,KAK/C,QAAgByB,IAAYlC,EAAOmC,EAAUC,EAAUlN,EAAUyK,MAC5D0C,MACA5C,EAAY2C,EAASzI,IAAI,SAACvE,EAAGsB,SAAOyL,GAASzL,GAAK,IAAMtB,IAAIsK,KAAK,IAEjEC,KACHF,EAAYnJ,EAAwB6L,EAAUC,OAEzCE,IAAYtC,EAAMJ,MAAOjN,EAAE,IAAM8M,GAAY8C,GAAe9B,SACnD9J,KAAK2L,GAEjBtC,EAAMf,OAAQ,IACZuD,GAAgBL,EAAS,OAAMjN,MAC/BuN,MAAeN,EAASvM,OAAO,GAAG,QAAOV,EAEvCwN,GACL1C,EAAMf,QACLtM,EAAE,IAAM6P,EAAa/C,EAAYgD,GAClCF,GACA9B,MAEc9J,KAAK+L,SAGdL,GAGR,QAAgBM,IAAeC,EAAS3H,UAC/B2H,GAAUjQ,EAAGsI,GAAU4G,GAAepB,IC1F/C,QAASoC,IAAkBhT,EAASiT,EAAOC,MAAKC,0DAAW,SAAUtR,6DAAK4C,GAAW2O,4DAEhFC,EAAcrT,EAAQsT,WAAU,GAChCC,EAAavT,EAAQsT,WAAU,OAE/B,GAAIE,KAAiBP,GAAO,IAC3BQ,YACiB,cAAlBD,EACe3T,SAAS0J,gBAAgB,6BAA8B,oBAEvD1J,SAAS0J,gBAAgB,6BAA8B,cAErEmK,GAAeN,EAAUI,IAAkBxT,EAAQ4R,aAAa4B,GAChE1O,EAAQmO,EAAMO,GAEdG,iBACYH,OACTE,KACF5O,QACG,SACFoO,EAAI,IAAO,WACRQ,EAAe,IAAM5O,aACjB8O,GAAOT,YACT,eACA,cACJ,SAGJtR,OACF,KAAmBA,OAGf,GAAIgF,KAAK8M,KACE1J,aAAapD,EAAG8M,EAAS9M,MAG7B4C,YAAYgK,GAErB5R,IACSoI,aAAauJ,eAA4B1O,SAEzCmF,aAAauJ,EAAe1O,UAIjCuO,EAAaE,GAGtB,QAAgBvI,IAAUhL,EAAS+J,KAC1BA,MAAMiB,UAAYjB,IAClBA,MAAM8J,gBAAkB9J,IACxBA,MAAM+J,YAAc/J,IACpBA,MAAMgK,aAAehK,IACrBA,MAAMiK,WAAajK,EAG5B,QAASkK,IAAWnJ,EAAcoJ,MAC7BC,MACAC,OAEKtK,IAAI,eACRyG,GAAOvQ,EAAQ,GACf0K,EAAS6F,EAAK5G,WAEd0J,SAAaE,WAET,GAAKhD,QACeyC,mBAAqBhT,8BAErC8G,KAAKyM,KACJzM,MAAMuM,EAAa3I,IAE5BA,KACI2J,aAAahB,EAAa9C,QAI/B+D,GAAUxJ,EAAawI,WAAU,YAExBxJ,IAAI,SAACuJ,EAAaxM,GAC1BwM,EAAY,OACH,GAAGgB,aAAaF,EAAYtN,GAAIwM,EAAY,MAC/CxM,GAAG,GAAKsN,EAAYtN,MAIxByN,EAGR,QAAgBC,IAAiB7J,EAAQ8J,EAAYC,MACpB,IAA7BA,EAAkBrR,WAEjBsR,GAAiBT,GAAWO,EAAYC,EACzCD,GAAW7K,YAAce,MACpBiK,YAAYH,KACZ/K,YAAYiL,eAKT,WACPA,EAAe/K,YAAce,MACxBiK,YAAYD,KACZjL,YAAY+K,KAElBI,KCnHG,QAASC,IAAaC,EAAUjI,MAClC5E,GAAIpI,SAASkV,cAAc,OAC7BhL,MAAQ,mBACNiL,GAAO,GAAIC,MAAKpI,GAAOhL,KAAM,iCAC7BqT,EAAMpU,OAAOqU,IAAIC,gBAAgBJ,KACnCK,KAAOH,IACPI,SAAWR,WACJxU,KAAKmJ,YAAYxB,KACxBsN,mBACS,oBACDjV,KAAKqU,YAAY1M,UACnBkN,IAAIK,gBAAgBN,IACzB,KAGJ,QAAgBO,IAAiBC,MAC5BC,GAAQD,EAAIpC,WAAU,KACpBsC,UAAUC,IAAI,qBACd5L,aAAa,QAAS,gCACtBA,aAAa,cAAe,mCAC9B6L,GAAU1M,EAAE2M,OAAO,mBACTC,OAERpM,aAAakM,EAASH,EAAMM,eAE9BC,GAAY9M,EAAE2M,OAAO,gBACftM,YAAYkM,GAEfO,EAAUC,UCblB,QAASC,IAAWC,MACfC,GAAS,GAAItR,MAAKqR,YACfE,WAAWD,EAAOE,aAAeF,EAAOG,qBACxCH,EAGR,QAAgBI,IAAYL,MACvBM,GAAKN,EAAKO,UACVC,EAAKR,EAAKS,WAAa,SAE1BT,EAAKU,eACJF,EAAG,EAAI,GAAK,KAAOA,GACnBF,EAAG,EAAI,GAAK,KAAOA,GACnB9G,KAAK,KAGR,QAAgB8F,IAAMU,SACd,IAAIrR,MAAKqR,EAAKpR,WAiBtB,QAAgB+R,IAAgBC,EAAWC,MACtCC,GAAgBC,GAAeH,SAC5B1T,MAAK8T,KAAKC,GAAeH,EAAeD,GAAWK,IAG3D,QAAgBD,IAAeL,EAAWC,MACrCM,GAAqBC,GAAaC,UAC9BtB,GAAWc,GAAWd,GAAWa,IAAcO,EAGxD,QAAgBG,IAAeV,EAAWC,SAClCD,GAAUH,aAAeI,EAAQJ,YACpCG,EAAUF,gBAAkBG,EAAQH,cAGzC,QAAgBa,IAAa/Q,MAAGgR,2DAC3BC,EAAYC,GAAYlR,SACrBgR,GAAQC,EAAU/R,MAAM,EAAG,GAAK+R,EAGxC,QAAgBE,IAAoBC,EAAOC,SACnC,IAAIlT,MAAKkT,EAAMD,EAAQ,EAAG,GAIlC,QAAgBb,IAAef,MAC1B8B,GAAUxC,GAAMU,GACd+B,EAAMD,EAAQE,eACT,KAARD,MACMD,GAAW,EAAKC,GAElBD,EAIR,QAAgBG,IAAQjC,EAAMkC,KACxBC,QAAQnC,EAAKO,UAAY2B,GC0Z/B,QAAgBE,IAAaC,EAAMC,EAAWC,MACzC/O,GAAOgP,OAAOhP,KAAKiP,IAAkBC,OAAO,kBAAKL,GAAKM,SAASC,KAC/DC,EAASJ,GAAiBjP,EAAK,kBAC5BsP,OAAOD,aACFP,UACFC,IAEH,GAAIQ,IAAeF,GCvf3B,QAASG,IAAUzN,MAKX,IAAJA,SACM,EAAG,MAETpH,MAAMoH,UACA0N,UAAW,iBAAkBC,SAAU,QAE5CC,GAAM5N,EAAI,EAAI,GAAK,MACnBlH,SAASkH,UACJ0N,SAAgB,iBAANE,EAAwBD,SAAU,OAGjDhW,KAAKC,IAAIoI,MACT6N,GAAMlW,KAAK6C,MAAM7C,KAAK8C,MAAMuF,WAGxB4N,GAFE5N,EAAErI,KAAKiD,IAAI,GAAIiT,IAENA,GAGpB,QAASC,IAAuBC,MAAKC,0DAAI,EACpCC,EAAatW,KAAK8T,KAAKsC,GACvBG,EAAavW,KAAK6C,MAAMwT,GACxBG,EAAQF,EAAaC,EAErBE,EAAYD,EACZE,EAAW,CAGZF,GAAQ,IACPA,EAAQ,GAAM,UAGKD,KAEVC,EAAM,IACP,GAITA,GAAS,MAEAA,KADC,IAKA,IAAVA,MACU,IACD,OAIR,GADAG,MACIrT,EAAI,EAAGA,GAAKmT,EAAWnT,MACpBC,KAAKgT,EAAaG,EAAWpT,SAEjCqT,GAGR,QAASC,IAAkBC,MAAUC,0DAAS,IACZhB,GAAUe,aAAtCE,OAAgBf,OACjBgB,EAAiBF,EAAWA,EAAS9W,KAAKiD,IAAI,GAAI+S,GAAW,EAK7DW,EAAYR,KAFCY,EAAevX,QAAQ,GAEewX,YAC3CL,EAAUpQ,IAAI,kBAIrByP,GAAW,EACPzU,EAAQvB,KAAKiD,IAAI,IAAK+S,GAEvBzU,EAAQvB,KAAKiD,IAAI,GAAI+S,KAK9B,QAAgBiB,IAAmBC,WAYzBC,GAA0BN,EAAUO,OAOxC,GANAT,GAAYC,GAAkBC,GAE9BQ,EAAeV,EAAU,GAAKA,EAAU,GAGxCpV,EAAQ,EACJ+B,EAAI,EAAG/B,EAAQ6V,EAAa9T,OAC1B+T,IACCC,SAAU,EAAK/V,SAEnBoV,MAvBkCY,2DAMtCV,EAAW7W,KAAKoW,kBAAOc,IACvBJ,EAAW9W,KAAKqW,kBAAOa,IAGTP,QAkBfE,GAAY,GAAKC,GAAY,EACpBhB,GAAUe,GAAU,KAC3BU,EAGSX,GAAkBC,EAAUC,GAF5BF,GAAkBC,OAQ3B,IAAGA,EAAW,GAAKC,EAAW,EAAG,IAOjCM,GAAcpX,KAAKC,IAAI6W,EAExBD,IAAYO,GACHtB,GAAUe,GAAU,KACnBM,EAA0BN,EAAUO,KAGrCtB,GAAUsB,GAAa,KACfD,EAA0BC,EAAaP,GACjC1S,UAAUoC,IAAI,mBAAW,EAANhH,SAOzC,IAAGsX,GAAY,GAAKC,GAAY,EAAG,IAInCU,GAAiBxX,KAAKC,IAAI6W,GAC1BW,EAAiBzX,KAAKC,IAAI4W,EAEnBf,IAAU0B,GAAgB,QACjCD,EAGSX,GAAkBY,EAAgBC,GAFlCb,GAAkBY,IAKTrT,UAAUoC,IAAI,mBAAW,EAANhH,UAGnCoX,GAGR,QAAgBe,IAAaC,MAExBC,GAAWC,GAAgBF,SAC5BA,GAAKG,QAAQ,IAAM,EAGTH,EAAKG,QAAQ,GAChBH,EAAK,GAAK,GAIL,EADJA,EAAK,GACUC,GAKX,EADJD,EAAKA,EAAK9X,OAAS,GACJ+X,GAAYD,EAAK9X,OAAS,GAiBrD,QAAgBgY,IAAgBE,SACxBA,GAAa,GAAKA,EAAa,GAGvC,QAAgBC,IAAcD,SACtBA,GAAaA,EAAalY,OAAO,GAAKkY,EAAa,GAG3D,QAAgBE,IAAMhS,EAAKiS,SACnB5Y,GAAS4Y,EAAMpW,SAAWmE,EAAMiS,EAAMC,iBAY9C,QAAgBC,IAAkBC,EAAMC,MAAKvM,2DACxCwM,EAAUD,EAAI/T,OAAO,SAASiU,EAAMC,SAC/BzY,MAAKC,IAAIwY,EAAOJ,GAAQrY,KAAKC,IAAIuY,EAAOH,GAAQI,EAAOD,aAGzDzM,GAAQuM,EAAIR,QAAQS,GAAWA,EAGvC,QAAgBG,IAAiBxB,EAAQyB,OASpC,GALAC,GAAe5Y,KAAKoW,kBAAOc,IAE3B2B,EAAmB,GAAKF,EAAmB,GAC3CG,KAEIxV,EAAI,EAAGA,EAAIqV,EAAkBrV,IAAK,IACrCyV,GAAaH,GAAgBC,EAAmBvV,KACvCC,KAAKwV,SAGZD,GAGR,QAAgBE,IAAiBzX,EAAOuX,SAChCA,GAAatD,OAAO,kBAAKjW,GAAIgC,IAAO1B,OClPrC,QAASoZ,IAAS3P,EAAMhL,KACzB4a,OAAS5P,EAAK4P,cAEfC,GAAgB7P,EAAK4P,OAAOrZ,OAG5BuZ,EAAW9P,EAAK8P,SAChBC,EAAY,GAAItZ,OAAMoZ,GAAejZ,KAAK,SAC1CkZ,gBAGMC,OAID9S,IAAI,eAERhH,EAAE2X,OAEC,IAEFoC,GAAO/Z,EAAE2X,YACNoC,EAAK/S,IAAI,kBAAStF,OAAMgF,GAAa,EAANA,KAG9BpG,OAASsZ,EACTG,EAAK9W,MAAM,EAAG2W,GAEd1Z,EAAU6Z,EAAMH,EAAgBG,EAAKzZ,OAAQ,KAEnDqX,OAASoC,SAZTpC,OAASmC,CAgBR9Z,GAAEga,YACDC,GAAyB/D,SAASnX,KACpCib,UAAYjb,KASbgL,EAAKmQ,YACFA,SAASlT,IAAI,eACdhH,EAAEma,IAAMna,EAAEK,MAAO,QACCL,EAAEma,IAAKna,EAAEK,SAA1BA,aAAS8Z,YAKRpQ,EAGR,QAAgBqQ,IAAaC,MACxBT,GAAgBS,EAASV,OAAOrZ,OAChCwZ,EAAY,GAAItZ,OAAMoZ,GAAejZ,KAAK,GAEvC2Z,UACQD,EAASV,OAAO1W,MAAM,GAAI,YACxBoX,EAASR,SAAS7S,IAAI,SAAChH,iBACVA,EAAXua,YAGE,UACET,EAAU7W,MAAM,GAAI,aACjBjD,EAAEga,oBAKzBK,GAASG,aACFA,iBAEA,QACA,MAKPH,EAASH,aACFA,iBAEA,MACF,QACE,MAKHI,EAGR,QAAgBG,IAAmBC,MAAYf,6DAAWgB,6DACrDC,EAAeF,EAAaf,EAAOrZ,MACpCsa,IAAgB,IAAGA,EAAe,MACjCC,GAAiBD,EAAeE,GAEhCC,YACDJ,EAAU,IAERK,GAAiBva,KAAKoW,kBAAO8C,EAAO3S,IAAI,kBAAS7D,GAAM7C,aAC1CG,KAAK8T,KAAKyG,EAAeH,SAG1BlB,GAAO3S,IAAI,SAAC7D,EAAOY,aAC1B,IACAzD,OAASua,IAEbF,EAOA5W,EAAIgX,GAAmB,MACjB,MAPNF,EAAe,EAAI,EACb1X,EAAMF,MAAM,EAAG4X,EAAe,GAAK,OAEnC1X,EAAMF,MAAM,EAAG4X,GAAkB,MAQrC1X,IC3GT,QAAS8X,SAAejB,0DAAY,OAAQpS,eAAQ6C,qBACjC,eAAduP,KACKjb,KAAO,OACR,GAAImc,IAAUtT,EAAQ6C,IAGzB0Q,GAAWnB,GAKT,GAAImB,IAAWnB,GAAWpS,EAAQ6C,gBAJhC2Q,MAAM,yBAA2BpB,IC1B3C,SAAqBqB,EAAKzU,OACX,KAARA,IAAiBA,KACtB,IAAI0U,GAAW1U,EAAI0U,QAEnB,IAAKD,GAA2B,mBAAbte,UAAnB,CAEA,GAAIwe,GAAOxe,SAASwe,MAAQxe,SAASye,qBAAqB,QAAQ,GAC9DvU,EAAQlK,SAASkV,cAAc,QACnChL,GAAMlI,KAAO,WAEI,QAAbuc,GACEC,EAAKpI,WACPoI,EAAKzU,aAAaG,EAAOsU,EAAKpI,YAKhCoI,EAAK5U,YAAYM,GAGfA,EAAMwU,WACRxU,EAAMwU,WAAWC,QAAUL,EAE3BpU,EAAMN,YAAY5J,SAAS4e,eAAeN,46IdT9C/U,GAAE2M,OAAS,SAACzM,EAAK3B,MACZ3H,GAAUH,SAASkV,cAAczL,OAEhC,GAAIzC,KAAKc,GAAG,IACZ6B,GAAM7B,EAAEd,MAEF,WAANA,IACD2C,GAAKC,YAAYzJ,OAEf,IAAU,WAAN6G,EAAgB,IACpB6C,GAAMN,EAAEI,KACRG,WAAWC,aAAa5J,EAAS0J,KAC7BD,YAAYC,OAEJ,WAAN7C,EACQ,qBAAR2C,iBAAAA,YACFK,KAAKL,GAAKM,IAAI,cACZC,MAAMC,GAAQR,EAAIQ,KAGlBnD,IAAK7G,KACP6G,GAAK2C,IAGLS,aAAapD,EAAG2C,SAInBxJ,GCxBD,IAAM0e,kBAEN,UACG,QACF,SACC,kBAGF,UACG,QACF,SACC,eAGI,gBACC,gBACC,iBAEC,IAyBHC,GAA4B,IAI5B5B,IAA4B,OAAQ,OAWpCrQ,GAA+B,EAS/BkR,GAAqB,EAI5BgB,IAAwB,aAAc,OAAQ,SAAU,MAAO,SACpE,SAAU,QAAS,cAAe,SAAU,UAAW,aAAc,aAKzDC,QACPD,QACCA,OACDA,cACOA,YARiB,UAAW,UAAW,UAAW,UAAW,iBAUlEA,IAIK1a,GAAcX,KAAKqE,GAAK,IctGhBkX,oCAEnBpU,OAAAA,aAAS,WACTqU,OAAAA,kCAEKrU,OAASA,OACTqU,OAASA,OACTC,UAAY,QACZC,WAAa,QACbC,mBACAC,gBAAkB,OAElBvT,EAAI,OACJrG,EAAI,OAEJpF,IAAM,OACNI,KAAO,OAEP6e,wDAIAC,qDAIA5b,YACA6b,qEAIApJ,UAAY9M,EAAE2M,OAAO,cACjBwJ,KAAK7U,iBACF,8JAKP8U,eAEAhR,MAAQ+Q,KAAKrJ,UAAUpW,cAAc,eACrC2f,cAAgBF,KAAKrJ,UAAUpW,cAAc,yBAE7C4K,OAAOgV,iBAAiB,aAAc,aACrCF,sDAKFhR,QACD+Q,MAAKjQ,YACF4G,UAAUjM,aAAa,mBAAoBsV,KAAKjQ,SAEnDiQ,KAAKJ,2BACYI,KAAKN,uBAAsBM,KAAKP,UAExCO,KAAKP,qBAAoBO,KAAKN,4BAErCzQ,MAAM2H,UAAY3H,OAClBiR,cAActJ,UAAY,QAE1B+I,WAAWpV,IAAI,SAAC6V,EAAK9Y,MACnB0B,GAAQqX,EAAKb,OAAOlY,IAAM,QAC5B/B,EAA0B,IAAlB6a,EAAIE,WAAmBF,EAAIE,UAAYF,EAAIE,UAAYF,EAAI7a,MAEnEgb,EAAK1W,EAAE2M,OAAO,wCAEWxN,iDAE6B,IAAVzD,GAAeA,EAAQA,EAAQ,6BAC3E6a,EAAInR,MAAQmR,EAAInR,MAAQ,QAGvBiR,cAAchW,YAAYqW,+CAK5BlV,GAAQ2U,KAAKrJ,UAAU6J,iBAEtB5f,IAAMof,KAAKha,EAAIga,KAAKrJ,UAAU8J,adIU,OcFxCzf,KAAOgf,KAAK3T,EAAIhB,EAAM,KACvBqV,GAAUV,KAAK7U,OAAOqV,YAAcnV,EAEpCsV,EAAUX,KAAKrJ,UAAUpW,cAAc,mBAExCyf,KAAKhf,KAAO,IACNwJ,MAAMxJ,oBAAsB,EAAIgf,KAAKhf,gBACxCA,KAAO,MACN,IAAGgf,KAAKhf,KAAO0f,EAAS,IAE1BE,kBADQZ,KAAKhf,KAAO0f,WAEhBlW,MAAMxJ,KAAO4f,OAEhB5f,KAAO0f,SAEJlW,MAAMxJ,6CAINqL,EAAGrG,MAAGiJ,6DAAY0Q,4DAAiB5P,0DAAS,OAChD0P,UAAYxQ,EAAMkK,UAClBuG,WAAazQ,EAAM1J,WACnBoa,WAAaA,OACbtT,EAAIA,OACJrG,EAAIA,OACJ4Z,gBAAkB3Q,EAAM4R,YAAc,OACtC9Q,MAAQA,OACR+Q,iDAIAnK,UAAUnM,MAAM5J,IAAM,WACtB+V,UAAUnM,MAAMxJ,KAAO,WACvB2V,UAAUnM,MAAMS,QAAU,2CAI1B0L,UAAUnM,MAAM5J,IAAMof,KAAKpf,IAAM,UACjC+V,UAAUnM,MAAMxJ,KAAOgf,KAAKhf,KAAO,UACnC2V,UAAUnM,MAAMS,QAAU,aX5H3B8V,iBACS,eACN,iBACE,cACH,iBACG,iBACA,gBACD,wBACM,iBACL,kBACC,gBACF,eACD,uBACM,sBACD,WA8BD5X,GAAW,SAACH,SAEpB,4BAA6BY,KAAKZ,iCACEgY,KAAKhY,GAC1CuB,IAAI,SAAC8B,EAAG/E,SAAa,KAANA,EAAUtC,OAAOqH,GAAG5C,SAAS,IAAM,MAClDlB,OAAO,SAAC0Y,EAAGC,YAAUD,EAAIC,IAErBH,GAAiB/X,IAAUA,GC9CtBuG,GAAmB,EAC1Bd,GAAe,EACfjB,GAAkB,GACXE,GAAY,GACnBc,GAAkB,UAClBb,GAAY,UA8nBPwT,QACH,SAACnQ,MACHoQ,SACiB,UAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkP,GAAUrQ,EAAK+C,qBACXvJ,MAAMtG,KAAO,YACbsG,MAAMS,QAAU,MAErBmW,KACM1W,aAAa,YAAa0W,GAE5BC,OAGD,SAACrQ,MACHoQ,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkP,GAAUrQ,EAAK+C,YACftP,EAASuM,EAAKqB,aAAa,KAC3BnO,EAAO8M,EAAKqB,aAAa,iBACrB3H,aAAa,IAAKpB,SAAS7E,GJzlBA,KI0lB3BiG,aAAa,OAAQxG,KACrBsG,MAAMS,QAAU,MAErBmW,KACM1W,aAAa,YAAa0W,GAE5BC,eAGO,SAACrQ,MACXoQ,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkP,GAAUrQ,EAAK+C,YACftP,EAASuM,EAAKqB,aAAa,KAC3BnO,EAAO8M,EAAKqB,aAAa,iBACrB3H,aAAa,IAAKpB,SAAS7E,GJ5mBA,KI6mB3BiG,aAAa,OAAQxG,KACrBsG,MAAMS,QAAU,MAErBmW,KACM1W,aAAa,YAAa0W,GAE5BC,IAIEC,QACH,SAACtQ,EAAMqQ,MACTD,SACiB,UAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoP,IAAc,IAAK,IAAK,QAAS,iBAC9BrG,OAAOlK,EAAKuQ,YACjB/H,OAAO,kBAAQ+H,GAAW9H,SAAS+H,EAAKrI,OAASqI,EAAKC,YACtDlX,IAAI,cACIG,aAAa8W,EAAKrI,KAAMqI,EAAKE,aAGpCN,KACM1W,aAAa,YAAa0W,QAI7B,SAACpQ,EAAMqQ,MACTD,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoP,IAAc,KAAM,aACjBrG,OAAOlK,EAAKuQ,YACjB/H,OAAO,kBAAQ+H,GAAW9H,SAAS+H,EAAKrI,OAASqI,EAAKC,YACtDlX,IAAI,cACIG,aAAa8W,EAAKrI,KAAMqI,EAAKE,aAGpCN,KACM1W,aAAa,YAAa0W,gBAIrB,SAACpQ,EAAMqQ,MACjBD,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoP,IAAc,KAAM,aACjBrG,OAAOlK,EAAKuQ,YACjB/H,OAAO,kBAAQ+H,GAAW9H,SAAS+H,EAAKrI,OAASqI,EAAKC,YACtDlX,IAAI,cACIG,aAAa8W,EAAKrI,KAAMqI,EAAKE,aAGpCN,KACM1W,aAAa,YAAa0W,KCjvBxB3O,GAAgB,IAChBU,GAAgB,IAChB1B,GAAuBgB,GACvB4C,GAAsB,IAEtBhE,GAAa,SCHpBgD,SACC,yBACE,iBAEA,wBACC,uBACE,iBSVCoC,GAAU,0sDCUFkL,yBACRxW,EAAQ6C,mBAET3I,EAAU2I,QAEf7C,OAA2B,gBAAXA,GAClB7K,SAASC,cAAc4K,GACvBA,IAEG6U,KAAK7U,iBAAkByW,mBACtB,IAAIC,OAAM,uDAGZC,aAAe9T,OAEfiB,MAAQjB,EAAQiB,OAAS,QACzB3M,KAAO0L,EAAQ1L,MAAQ,QAEvBsb,SAAWoC,KAAK+B,YAAY/T,EAAQV,WACpCA,KAAO0S,KAAKgC,iBAAiBhC,KAAKpC,eAElC4B,OAASQ,KAAKiC,eAAejU,EAAQwR,OAAQQ,KAAK1d,WAElDqX,oBACS,aACD,cACC3L,EAAQkU,aAAe,cACC,KAApBlU,EAAQmU,QAA2BnU,EAAQmU,QAAU,kBACrDnU,EAAQoU,iBAAmB,QAGxCC,SAAWC,KAAKC,MAAMD,KAAKE,UAAUrD,QACtCrc,GAAIkd,KAAKqC,cACRI,YAAYzU,GACbgS,KAAK/Q,MAAMpL,WAAYd,YAAc,GACrCid,KAAKrG,OAAO+I,aAAY5f,EAAEM,aAAe,QACxCuf,UAAY3U,EAAQjI,QAAUjD,EAAE8f,gBAEhCC,cACA7U,gBAEA8U,YAAc1D,GAEhBY,KAAKrG,OAAOuI,mBACTa,kBAGDC,UAAUhV,kDAGJV,SACJA,4CAGSA,SACTA,0CAGOkS,EAAQld,MAChB2gB,gBACIzD,OAAcrb,OAAOmb,GAAehd,KACvC4gB,QAAQ,SAAC7e,MACT2E,GAAQG,GAAS9E,EACnBqF,GAAaV,KAGJzB,KAAKyB,WAFTma,KAAK,IAAM9e,EAAS,6BAKvB4e,wFASHld,EAASia,KAAK2C,eACbC,WAAa7c,OACbA,OAASA,EAAS5C,EAAe6c,KAAKqC,eAGtCe,YAAc,iBAAMC,GAAKC,MAAK,IAC/BC,sBACEC,eAAiB,GAAID,gBAAevD,KAAKoD,kBACzCI,eAAeC,QAAQzD,KAAK7U,gBAE3BgV,iBAAiB,SAAUH,KAAKoD,oBAChCjD,iBAAiB,oBAAqBH,KAAKoD,+CAI9CpD,KAAKwD,gBAAgBxD,KAAKwD,eAAeE,oBACtCC,oBAAoB,SAAU3D,KAAKoD,oBACnCO,oBAAoB,oBAAqB3D,KAAKoD,kDAKhDQ,qBACAC,mBACA/D,mBAEAwD,MAAK,GAAO,gDAKZnY,OAAOyL,UAAY,MAEpBlL,WACKsU,KAAK7U,iBACF,kBAGT6U,MAAK8D,qBACFhiB,QAAWuJ,MAAO2U,KAAK8D,iBAAmB,YAG3CnN,UAAY9M,EAAE2M,OAAO,MAAO9K,8CAI5BqY,IAAM,GAAIxE,YACNS,KAAKrJ,iBACLqJ,KAAKR,cAETwE,+FAKDC,0DAAuBC,yDACvBD,IAAmB/iB,EAAS8e,KAAK7U,eAIhC0Y,mBAEAM,KAAKF,QACLG,qBACAC,uBAEAC,WAAWpB,QAAQ,kBAAKjC,GAAEpB,MAAMQ,EAAKkE,iBAErCC,OAAOxE,KAAKsE,YAAY,GAE1BJ,SACG5W,KAAO0S,KAAKpC,oBACN,aAAY6G,OAAOpE,EAAK/S,OAAS0S,KAAK8C,mBAG7C4B,oBAEAC,gBAAgBT,+EAMhBU,UAAY/iB,EAAuBme,KAAK7U,aACxCE,MAAQ2U,KAAK4E,UAAYvhB,EAAc2c,KAAKqC,kDAI9CrC,KAAK7J,UACFQ,UAAUvB,YAAY4K,KAAK7J,QAE7BrT,GAAIkd,KAAKqC,cAERlM,IAAMjL,EACV8U,KAAKrJ,UACL,qBACAqJ,KAAK4E,UACL5E,KAAK4C,iBAEDjS,QAAUrF,EAAY0U,KAAK7J,KAE7B6J,KAAK/Q,MAAMpL,cACRghB,QAAU/W,EACd,QACAhL,EAAEE,QAAQhC,KACV8B,EAAEE,QAAQpC,IACVof,KAAK/Q,gBAEMnM,EAAEgiB,mBACN,aACFhiB,EAAEgiB,oBAKLlkB,GAAMiC,EAAaC,QAClByhB,SAAW/Y,EACfwU,KAAK1d,KAAO,sCACCY,EAAcJ,QAAOlC,OAGhCof,KAAKrG,OAAO+I,gBACP1C,KAAKja,OAASjD,EAAEG,SAAS3B,YAC3ByjB,WAAavZ,EACjB,4BACatI,EAAcJ,QAAOlC,QAIjCof,KAAK/Q,MAAMpL,aAAesS,IAAIjM,YAAY8V,KAAK6E,cAC7C1O,IAAIjM,YAAY8V,KAAKuE,UACvBvE,KAAKrG,OAAO+I,iBAAmBvM,IAAIjM,YAAY8V,KAAK+E,iBAElDC,gBAAgB9hB,EAAcJ,GAAID,EAAaC,4CAGrCuJ,EAAGrG,QACb+d,IAAI/Y,UACLqB,IACArG,kDAIoBse,WAAa,GAAIW,oCAEnC3X,GACFA,WACKqR,MAAM,2BAEVrR,KAAO0S,KAAK+B,YAAYzU,QACxB6W,YACAK,OAAOxE,KAAKsE,WAAYtE,KAAKrG,OAAOwI,cACpCuC,2DAGCJ,yDAAWtE,KAAKsE,WAAYnC,4DAC/BnC,MAAKrG,OAAOuI,kBAETa,SAASxY,IAAI,kBAAKnC,GAAEgC,WAAWgL,YAAYhN,QAG7C8M,QAEOgO,QAAQ,cACEhO,EAAkB/Q,OAAO8c,EAAEwD,OAAOtC,MAEpDjN,EAAkBrR,OAAS,MACZmc,KAAKrJ,UAAWqJ,KAAK7J,IAAKjB,cAChC,aACCgO,QAAQ,kBAAKjC,GAAEiE,WACrBC,ahBpMiC,SgBuM5BjC,QAAQ,kBAAKjC,GAAEiE,cACrBC,iDAKHnF,KAAKrG,OAAOuI,mBACTf,mBACAiE,0GAMSlB,yDACXlE,MAAKrG,OAAOuI,aAEbgC,SACGmB,mBAEAC,eACEtF,KAAKuF,WAAWC,KAAKxF,SACrBA,KAAKyF,YAAYD,KAAKxF,SACtBA,KAAK0F,UAAUF,KAAKxF,SACpBA,KAAK2F,aAAaH,KAAKxF,SACvBA,KAAK4F,YAAYJ,KAAKxF,gBAGpBG,iBAAiB,UAAW,SAAC0F,GAClCxkB,EAAoBykB,EAAKnP,eACvBkP,GAAKtkB,OAAOwkB,MACbD,EAAKR,WAAWO,EAAEG,YACfV,WAAWO,EAAEG,mmBA2BlBC,GAAW/P,GAAiB8J,KAAK7J,QACxB6J,KAAK/Q,OAAS,SAAUgX,aC3TlBC,0BACR/a,EAAQO,+EACbP,EAAQO,yDAGLA,4FACOA,QAEXiO,OAAOwM,gBAAkBza,EAAK0a,oBAAsBD,oBACpDxM,OAAO0M,UAAY3a,EAAK2a,WAAa,QACrC1M,OAAO2M,gBAAkB5a,EAAK4a,iBAAmB,6CAIlDC,EAAIvG,KAAK6C,MACTwD,EAAYrG,KAAKrG,OAAO0M,YAC1BG,kBAEEC,GAAYzG,KAAK1S,KAAK4P,OAAO3S,IAAI,SAAC7D,EAAOY,MACxCof,GAAQ,WACPpZ,KAAK8P,SAAS7S,IAAI,eACbsb,EAAE3K,OAAO5T,MAEXof,EAAOhgB,KACb8S,OAAO,kBAAcjW,GAAE,IAAM,IAE5BojB,EAASF,KACVA,EAAU5iB,OAASwiB,EAAW,GAEtBO,KAAK,SAACle,EAAGa,SAAeA,GAAE,GAAKb,EAAE,OAElC+d,EAAUjgB,MAAM,EAAG6f,EAAU,MAGlCQ,GAAiB,CAFLJ,GAAUjgB,MAAM6f,EAAU,GAGhC9b,IAAI,eAAwBhH,EAAE,OACjCgE,MAAMsf,EAAgB,cACxBrH,OAAO6G,EAAU,GAAK,SAG1BnJ,YACK3S,IAAI,cACRic,YAAYjf,KAAKnC,EAAM7B,EAAE,OACzB2Z,OAAO3V,KAAKhE,EAAE,QAGfujB,WAAaP,EAAEC,YAAYje,OAAO,SAACG,EAAGa,SAAMb,GAAIa,GAAG,QAEhD0C,UACD+T,KAAK3U,MAAQ,IACb2U,KAAKja,OAAS,qDAKdwgB,EAAIvG,KAAK6C,WACRkC,WAAWgC,YAAc,QACzBC,aAAeT,EAAEC,YAAYhgB,MAAM,EAAGwZ,KAAKrG,OAAO2M,oBAEnD3iB,GAAQ,EACRqC,EAAI,OACHghB,aAAazc,IAAI,SAAChH,EAAG+D,MACrB2f,GAAW,IACXC,EAAUljB,KAAK6C,OACjBsgB,EAAK9b,MAAQhI,EAAc8jB,EAAK9E,WAAW4E,EAEzCE,GAAKH,aAAanjB,OAASqjB,MACnBC,EAAK9b,MAAM8b,EAAKH,aAAanjB,QAEtCF,EAAQujB,MACF,KACH,OAEF7a,GAAI4a,EAAWtjB,EAAQ,EACvB+C,EAAQygB,EAAKxN,OAAOyI,gBAAkB/b,EAAekgB,EAAErJ,OAAO5V,GAAI2f,EAAS,IAAMV,EAAErJ,OAAO5V,GAC1FgZ,EAAY6G,EAAKxN,OAAOwM,eAAiBgB,EAAKxN,OAAOwM,eAAe5iB,GAAKA,EACzE4M,EAAMtC,EACTxB,EACArG,EACA,EACAmhB,EAAK3H,OAAOlY,GACTZ,OAAU4Z,GACb,KAEIyE,WAAW7a,YAAYiG,gBApFewR,ITHjC3J,GAAqB,EAErBG,GAAe,IACfD,GAAa,MAEbM,IAAe,UAAW,WAAY,QAAS,QAAS,MACpE,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAIlD4O,IAAmB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OCNpEvN,oCAEJwN,WAAAA,aAAa,SACbC,eAAAA,aAAiB,KACjBlO,IAAAA,UAEAC,IAAAA,QACAkO,IAAAA,aACAC,IAAAA,gCAEKF,eAAiBA,OACjBlO,UAAYA,OAEZmO,aAAeA,OACflO,QAAUA,OAEVmO,gBAAkBA,OAElBC,cACAvK,eAEAmK,WAAaA,OACbA,WAAyC,kBAArBrH,MAAKqH,WAC3BrH,KAAKqH,aAAerH,KAAKqH,gBAEvBvG,qDAGExT,QACFA,KAAOA,GAAQ0S,KAAK3G,wCAGpBlO,QACAuc,MAAQlc,EAAawU,KAAKqH,WAAYrH,KAAKsH,eAAgBnc,uCAI3DqZ,OAAOxE,KAAK1S,WACZqa,QAAU3H,KAAK1S,oCAGdA,mBACDma,MAAQzH,KAAKuH,aAAaja,QAE1Boa,MAAMX,YAAc,QACdU,MAAMvE,QAAQ,SAACziB,KACRoD,OACFpD,EAAQyiB,QAAQ,SAAC/hB,KACRumB,MAAMxd,YAAY/I,KAE3BkiB,EAAKqE,MAAMxd,YAAYzJ,UAElCyc,OAAOgG,QAAQ,cACdwE,MAAMxd,YAAYzJ,yCAIlB0hB,mEACDrB,aACD0G,YACDrF,OACgBnC,KAAKwH,gBAAgBxH,KAAK1S,WAEtCka,WAILjO,4BAEU,qCACCjM,SACLA,GAAKsa,aAAard,IAAI,SAACgc,EAAGjf,MAC5Bd,GAAQoF,EAAS2a,EAAG,aAAcjZ,EAAKkS,OAAOlY,GAAI,OAAQgG,EAAKua,sBAC7Drd,MAAMsd,WAAa,iBAClBthB,8BAIOuhB,SACR/H,MAAKyH,MAAMld,IAAI,SAAC/D,EAAOc,SAAMiM,IAAe/M,EAAOuhB,EAAQH,aAAatgB,8BAIpE,mCACCgG,SACLA,GAAKsa,aAAard,IAAI,SAACgc,EAAGjf,MAC5Bd,GAAQoF,EAAS2a,EAAG,WAAY,OAAQjZ,EAAKkS,OAAOlY,aAClDkD,MAAMsd,WAAa,iBAClBthB,8BAIOuhB,SACR/H,MAAKyH,MAAMld,IAAI,SAAC/D,EAAOc,SAC7BiM,IAAe/M,EAAOuhB,EAAQH,aAAatgB,mCAKjC,wCACCgG,oBACLA,GAAK0a,WAAWzd,IAAI,SAAC8B,EAAG/E,SAEpB2F,GAAcZ,EADhB,EACsBiB,EAAK2a,OAAO3gB,GACzC+Y,EAAKjH,UAAU8O,UAAW7H,EAAKjH,UAAU+O,SAAU7a,EAAKkS,OAAOlY,gCAKlDygB,MACZA,EAAS,6BAIK,+BACCza,cACLqH,WAEArH,GAAKzJ,UACAqf,QAAQ,SAACkF,EAAM9gB,KACX+gB,UAAU9d,IAAI,SAAC2E,EAAU5H,KACjBC,KACL6H,EAAMF,EAAUkZ,EAAKlL,OAAO5V,GAAI6f,EAAK/N,UAAU/N,YACrC8b,EAAK/N,UAAU9J,SAChB8Y,EAAK/Y,KAAO8X,EAAK/N,UAAU/J,mBAChB8X,EAAK/N,UAAUrK,oBAKvCqZ,EAAKnZ,SACI1H,KACLyH,SACWoZ,EAAKnZ,eACFmZ,EAAK/Y,WACP+Y,EAAKtiB,eACNqhB,EAAK/N,UAAU/N,WAM/BsJ,GAGJrH,EAAK+a,UAAU9d,IAAI,SAAC2E,EAAU5H,SAC1B8H,GAAMF,EAAU5B,EAAK4P,OAAO5V,GAAI6f,EAAK/N,UAAU/N,YAC5C8b,EAAK/N,UAAU9J,SAChB6X,EAAK/N,UAAU/J,mBACJ8X,EAAK/N,UAAUrK,6CAK3BgZ,cACNO,EAA0B,SAACX,EAASI,MAClCQ,GAASR,EAAQM,UACjBG,EAAYT,EAAQ7K,OACpBuL,EAASd,EAAQU,UACjBK,EAAYf,EAAQzK,SAELjX,EAAqBwiB,EAAQF,iCACvBtiB,EAAqByiB,EAAWF,oCAEpDhE,kBACUiE,SACHD,IAGL1C,EAAK2B,MAAMld,IAAI,SAAC/C,EAAMF,SAClBoK,IAAkBlK,EAAM+gB,EAAOjhB,GAAImhB,EAAOnhB,UAMrD0Y,KAAK2H,kBAAmB5jB,aACjBic,MAAK2H,QAAQzE,QAAQ,SAAC9R,EAAK9J,KACN8J,EAAK2W,EAAQzgB,SAIzCihB,GAASR,EAAQM,UACjBG,EAAYT,EAAQ7K,OACpBuL,EAASzI,KAAK2H,QAAQU,UACtBK,EAAY1I,KAAK2H,QAAQzK,SAEVjX,EAAqBwiB,EAAQF,iCACvBtiB,EAAqByiB,EAAWF,uCAEpDhE,kBACUiE,SACHD,IAGLxI,KAAKyH,MAAMld,IAAI,SAAC/C,EAAMF,SAClBoK,IAAkBlK,EAAM+gB,EAAOjhB,GAAImhB,EAAOnhB,0BAMnD,+BACCgG,oBACLA,GAAK+a,UAAU9d,IAAI,SAAC2E,EAAU5H,SACpCkI,GAAMN,EAAU5B,EAAKqb,WAAWrhB,GAAIshB,EAAKxP,UAAUrT,QACjDuJ,KAAMsZ,EAAKxP,UAAU9J,KAAMD,IAAKuZ,EAAKxP,UAAU/J,kCAInC0Y,MACXQ,GAASR,EAAQM,UACjBG,EAAYT,EAAQY,WACpBF,EAASzI,KAAK2H,QAAQU,UACtBK,EAAY1I,KAAK2H,QAAQgB,aAEV1iB,EAAqBwiB,EAAQF,iCACvBtiB,EAAqByiB,EAAWF,uCAEpDhE,kBACOiE,aACCD,IAGNxI,KAAKyH,MAAMld,IAAI,SAAC/C,EAAMF,SACrBgK,IACN9J,EAAM+gB,EAAOjhB,GAAImhB,EAAOnhB,6BAOf,kCACCgG,oBACLA,GAAK/C,IAAI,kBACfkF,GAAQ3M,EAAEoM,SAAUpM,EAAE4D,MAAOmiB,EAAKzP,UAAU/N,OAC1CqE,SAAU5M,EAAEkL,QAAQ0B,SAAUJ,KAAM,OAAQT,SAAU,uCAG1CkZ,SACW9hB,EAAqB+Z,KAAK2H,QAASI,kBAAvDJ,gBAEFY,YAAiBhe,IAAI,kBAAKhH,GAAE2L,WAC5BsZ,EAAYT,EAAQxd,IAAI,kBAAKhH,GAAEmD,QAC/BoiB,EAAaf,EAAQxd,IAAI,kBAAKhH,GAAEyK,UAEhCya,EAASzI,KAAK2H,QAAQpd,IAAI,kBAAKhH,GAAE2L,uBAEhCsV,OAAOiE,EAAOle,IAAI,SAAC8E,EAAK/H,mBAEjBmhB,EAAOnhB,SACVkhB,EAAUlhB,WACRwhB,EAAWxhB,OAIf0Y,KAAKyH,MAAMld,IAAI,SAAC/C,EAAMF,SACrBoK,IACNlK,EAAM+gB,EAAOjhB,GAAImhB,EAAOnhB,6BAOf,kCACCgG,oBACLA,GAAK/C,IAAI,kBACfqF,GAAQ9G,EAAEigB,SAAUjgB,EAAEkgB,OAAQC,EAAK7P,UAAU/N,MAC5CvC,EAAEpC,OAAQgJ,SAAU5G,EAAEkF,QAAQ0B,uCAGjBqY,SACW9hB,EAAqB+Z,KAAK2H,QAASI,kBAAvDJ,gBAEFY,YAAiBhe,IAAI,kBAAKhH,GAAEylB,SAC5BR,EAAYT,EAAQxd,IAAI,kBAAKhH,GAAEmD,QAC/BwiB,EAAYnB,EAAQxd,IAAI,kBAAKhH,GAAEwlB,WAC/BD,EAAaf,EAAQxd,IAAI,kBAAKhH,GAAEyK,UAEhCya,EAASzI,KAAK2H,QAAQpd,IAAI,kBAAKhH,GAAEylB,SACjCG,EAAYnJ,KAAK2H,QAAQpd,IAAI,kBAAKhH,GAAEwlB,gBAEnCvE,OAAOiE,EAAOle,IAAI,SAAC8E,EAAK/H,mBAEjB6hB,EAAU7hB,UACZmhB,EAAOnhB,SACRkhB,EAAUlhB,WACRwhB,EAAWxhB,UAIlBkgB,kBAECC,MAAMld,IAAI,SAACuH,EAAWxK,KACRkgB,EAAgBrjB,OAAO0N,GACxCC,EAAWoX,EAAU5hB,GAAIihB,EAAOjhB,GAAImhB,EAAOnhB,OAItCkgB,2BAKI,iBAAoB,sBAAwBxH,KAAK5G,UAAUrJ,6BAC1DzC,gBACuD0S,KAAK5G,UAAnErJ,IAAAA,MAAOqZ,IAAAA,SAAUC,IAAAA,UAAWC,IAAAA,WAAY7kB,IAAAA,OAEzC4H,IAFiDkd,WAEjCvjB,EAAI,cAEnBwjB,0BAEAC,KAAKlf,IAAI,SAACmf,EAAMC,GACN,IAAXA,KACGzM,OAAO3V,KACXuG,EAAS,cAAezB,GARL,GAQyBgM,GAAatI,GAAO,GAAM6Z,wBAE1D,OAKTrf,IAAI,SAACsO,EAAKvR,MACXuR,EAAI3U,KAAM,IACRoJ,gBACUuL,EAAIgR,sBACHhR,EAAIiR,qBACNxiB,GAETyiB,EAAS3c,EAAW,MAAOf,EAAGrG,EAAGsjB,EAAY7kB,EAAQoU,EAAI3U,KAAMoJ,KAC9Dkc,qBAAqBjiB,KAAKwiB,MAE3BV,MAEF,KACCD,IAGCpJ,KAAKwJ,+CAGGzB,MACZA,EAAS,gCAKD,iBAAoB,sCAAwC/H,KAAK5G,UAAUrJ,6BAC1EzC,MACR2T,GAAIjB,KAAK5G,sBACR4Q,SAAW,WACXC,MAAQ3c,EAAK4c,WAAW3f,IAAI,SAACvE,EAAGrD,SAC7BmN,GACNxC,EAAK0a,WAAWrlB,GAChBqD,EACAsH,EAAK2Z,SACLhG,EAAEjY,MACFsE,EAAK4P,OAAOva,GACZA,EACA2K,EAAK6c,QAAQxnB,aAEF2K,EAAKxH,mBACJwH,EAAK8c,oBACLnJ,EAAEhR,cAIT+P,KAAKiK,gCAEGlC,MACXsC,GAAUtC,EAAQC,WAClBsC,EAAUvC,EAAQmC,WAClBK,EAAaxC,EAAQoC,QACrB3B,EAAYT,EAAQ7K,OAEpBsN,EAAUxK,KAAK2H,QAAQK,WACvByC,EAAUzK,KAAK2H,QAAQuC,WACvBQ,EAAa1K,KAAK2H,QAAQwC,QAC1BzB,EAAY1I,KAAK2H,QAAQzK,SAERjX,EAAqBukB,EAASH,iCAC9BpkB,EAAqBwkB,EAASH,iCACxBrkB,EAAqBykB,EAAYH,iCACnCtkB,EAAqByiB,EAAWF,gCAEpDhE,mBACQgG,aACAC,UACHC,SACDlC,WAEExI,KAAK2H,QAAQ7hB,mBACZka,KAAK2H,QAAQyC,mBACdpK,KAAK2H,QAAQV,cAGpBO,kBAECC,MAAMld,IAAI,SAACgI,EAAKjL,KACFkgB,EAAgBrjB,OAAOmO,GACxCC,EAAK8X,EAAQ/iB,GAAIgjB,EAAQhjB,GAAIygB,EAAQd,SAAUsD,EAAWjjB,IACzDxB,SAAUiiB,EAAQjiB,cAId0hB,0BAKI,iBAAoB,sCAAwCxH,KAAK5G,UAAUrJ,6BAC1EzC,MACR2T,GAAIjB,KAAK5G,sBACR4Q,SAAW,WACXpZ,SACDqQ,EAAE0J,gBACA/Z,MAAQR,EACZ9C,EAAK0a,WACL1a,EAAK4c,WACLjJ,EAAEjY,gBAESiY,EAAExQ,oBACAwQ,EAAEpQ,kBACNoQ,EAAE1Q,iBAGD0Q,EAAEtQ,iBACDrD,EAAKxH,iBAKbmkB,SACDhJ,EAAE2J,gBACAX,MAAQ3c,EAAK4c,WAAW3f,IAAI,SAACvE,EAAGrD,SAC7BuN,GACN5C,EAAK0a,WAAWrlB,GAChBqD,EACAsH,EAAK7I,OACLwc,EAAEjY,MACDiY,EAAE4J,iBAAmBvd,EAAK4N,OAAOvY,GAAK,GACvCA,MAKI2W,OAAO4B,OAAO8E,KAAKpP,OAAOzM,OAAO6b,KAAKiK,iCAE9BlC,MACXsC,GAAUtC,EAAQC,WAClBsC,EAAUvC,EAAQmC,WAClBY,EAAY/C,EAAQ7M,OAEpBsP,EAAUxK,KAAK2H,QAAQK,WACvByC,EAAUzK,KAAK2H,QAAQuC,WACvBrW,EAAYmM,KAAK2H,QAAQzM,SAERjV,EAAqBukB,EAASH,iCAC9BpkB,EAAqBwkB,EAASH,iCAC1BrkB,EAAqB4N,EAAWiX,gCAEpDtG,mBACQgG,aACAC,SACJK,WAEE9K,KAAK2H,QAAQ7hB,gBACfka,KAAK2H,QAAQljB,YAGlB+iB,YAEDlO,QAAOhP,KAAK0V,KAAKpP,OAAO/M,WACR2jB,EAAgBrjB,OAAO2O,GACxCkN,KAAKpP,MAAOyZ,EAASC,EAASvC,EAAQjiB,SAAUka,KAAK5G,UAAU7I,UAG9DyP,KAAKiK,MAAMpmB,aACRomB,MAAM1f,IAAI,SAAC4F,EAAK7I,KACFkgB,EAAgBrjB,OAAOwO,GACxCxC,EAAKka,EAAQ/iB,GAAIgjB,EAAQhjB,OAIrBkgB,KSxeWuD,0BACR5f,EAAQO,8EACbP,EAAQO,aACTpJ,KAAO,eACPud,iEAGM7R,MACPlL,GAAIkd,KAAKqC,cACR2I,WAAahd,EAAQgd,kBAEtBzhB,GAAIyW,KAAKgL,aACXjlB,OAASwD,EAAExD,QlB0D8B,KkBzDzCmH,MAAQ3D,EAAE2D,OAASC,KAEnBlK,SAASvB,MAAQ,KACjB0B,aAAe,KACfwf,WAA0C,GAA5BrZ,EAAExD,OAAmB,GAAVwD,EAAE2D,oDAIzBqZ,GAAIvG,KAAK6C,MAETtJ,IAEF,4BAEYyG,KAAKgL,WAAWjlB,gBACjBia,KAAKgL,WAAW9d,OAE3B,6BAEcqZ,EAAEyB,kBACNzB,EAAE0B,cACFjI,KAAKR,SAEbgG,KAAKxF,aAIJsE,WAAa,GAAIW,KAAI1L,EACxBhP,IAAI,eACA0gB,GAAY/R,mBAAgBxN,WACxBA,EAAK,GAAIuf,wIAMf1E,GAAIvG,KAAK6C,QAEXmF,gBACAC,aAEEiD,GAAO,IACT1E,YAAYjc,IAAI,SAAChF,MACd8F,GAAQgV,EAAKhV,MAAQ9F,EAAQghB,EAAEO,aACjCmB,OAAO1gB,KAAK8D,KACZ2c,WAAWzgB,KAAK2jB,MACV7f,gGAOLkb,EAAIvG,KAAK6C,WACRlM,UAAUwJ,iBAAiB,YAAa,SAAC0F,MACzCsF,GAAOhE,EAAK7C,WAAW8G,IAAI,kBAAkB3D,MAC7ClV,EAAMsT,EAAExjB,UACT8oB,EAAK1R,SAASlH,GAAM,IAElBjL,GAAI6jB,EAAKrP,QAAQvJ,GACjB8Y,EAAO7qB,EAAU2mB,EAAKxQ,WAAY2U,EAAO9qB,EAAU+R,GAEnDlG,EAAIif,EAAKtqB,KAAOqqB,EAAKrqB,KAAOsI,SAASiJ,EAAIF,aAAa,UAAU,EAChErM,EAAIslB,EAAK1qB,IAAMyqB,EAAKzqB,IACpBqO,GAASkY,EAAKoE,iBAAmBpE,EAAKoE,gBAAgB1nB,OAAO,EAC9DsjB,EAAKoE,gBAAgBjkB,GAAK6f,EAAKtE,MAAM3F,OAAO5V,IAAM,KACjDkkB,EAAWjF,EAAEC,YAAYlf,GAAGif,EAAEO,aAE7B/C,IAAI0H,UAAUpf,EAAGrG,GAAImT,KAAMlK,EAAO1J,OAAiB,IAATimB,GAAchoB,QAAQ,GAAK,QACrEugB,IAAI2H,oBAlFgCxF,ICIxByF,0BACRxgB,EAAQO,8EACbP,EAAQO,aACTpJ,KAAO,QACPwgB,YAAc,IACdoB,KAAO,IAEPrE,+DAGInU,4FACOA,QACXkgB,UAAY5L,KAAK4L,UAAUpG,KAAKxF,WAChC6L,WAAa7L,KAAK6L,WAAWrG,KAAKxF,WAElC8L,WAAapgB,EAAKogB,YAAc,QAChCnS,OAAOoS,WAAargB,EAAKqgB,YAAc,OAEvC7f,UAAYR,EAAKQ,YAAa,oIAK/Bqa,GAAIvG,KAAK6C,WACRpe,OAAUub,KAAKja,OAASia,KAAK3U,MAAQ2U,KAAK/T,OAAOI,EAAI2T,KAAK/T,OAAOjG,KAE9DvB,GAAsBub,KAAtBvb,OAAQyH,EAAc8T,KAAd9T,UAEV8f,EAAuBzF,EAAE0F,uBAC7BrE,kBACAqE,uBACEC,GAAW,IAAMlM,KAAKrG,OAAOoS,aAC/BvF,YAAYjc,IAAI,SAACmc,EAAOpf,MACnBykB,GAAaG,EACbC,EAAmBzF,EAAQH,EAAEO,WnB+DZ,ImB9DjB3a,EAAWggB,EAAkB,IAAM,EAAG,EACtCC,EAAYlgB,GAAaigB,EAAkBA,EAC3CE,EAAWH,GAAsBE,EACjCrgB,EAAgBxH,EAAmBwnB,EAAYtnB,GAC/CuH,EAAczH,EAAmB8nB,EAAU5nB,GAE3C6nB,EAAejM,EAAK6D,MAAQ8H,EAAqB1kB,GAEnDilB,SAASC,QACVnM,GAAK6D,QACIoI,EAAeA,EAAavgB,cAAgBA,IAC9CugB,EAAeA,EAAatgB,YAAcD,MAExCA,IACFC,MAEJygB,GACe,MAApBN,EACG1f,EAAc8f,EAAUC,EAAQnM,EAAKpU,OAAQoU,EAAK5b,OAAQyH,EAAWC,GACrEL,EAAeygB,EAAUC,EAAQnM,EAAKpU,OAAQoU,EAAK5b,OAAQyH,EAAWC,KAExEyb,aAAargB,KAAKklB,KAClBR,iBAAiB1kB,0CAGXmf,QACAH,EAAEO,yCAGFsF,WAIJlI,KAAO,+CAIRqC,GAAIvG,KAAK6C,MAETtJ,IAEF,eAEA,+BAEgBgN,EAAEqB,oBACR5H,KAAKR,SAEbgG,KAAKxF,aAIJsE,WAAa,GAAIW,KAAI1L,EACxBhP,IAAI,eACA0gB,GAAY/R,mBAAgBxN,WACxBA,EAAK,GAAIuf,kDAIAyB,MACbjoB,GAAqBub,KAArBvb,OAAOqnB,EAAc9L,KAAd8L,WACP5c,EAAW3K,EAAmBmoB,EAASX,WAAYW,EAASloB,MAAQ,EAAGC,wBACtDyK,EAAS7C,EAAKyf,QAAiB5c,EAASlJ,EAAK8lB,6CAG1Dtb,EAAKlJ,EAAEqlB,EAAK9G,MAClBrV,MACExH,GAAQgX,KAAKR,OAAOlY,MACvBqlB,EAAM,IACEnc,EAAMwP,KAAK4M,oBAAoB5M,KAAK6C,MAAMoJ,iBAAiB3kB,OAChEkD,MAAMtG,KAAO6E,EAAmBC,EAAO,OACxC6jB,GAAQrsB,EAAUwf,KAAK7J,KACvB9J,EAAIwZ,EAAEiH,MAAQD,EAAM7rB,KAAO,GAC3BgF,EAAI6f,EAAEkH,MAAQF,EAAMjsB,IAAM,GAC1BqO,GAAS+Q,KAAKgN,kBAAoBhN,KAAKgN,iBAAiBnpB,OAAS,EAClEmc,KAAKgN,iBAAiB1lB,GAAK0Y,KAAK6C,MAAM3F,OAAO5V,IAAM,KAClD2lB,GAAuC,IAA5BjN,KAAK6C,MAAM2D,YAAYlf,GAAW0Y,KAAK6C,MAAMiE,YAAYtjB,QAAQ,QAC3EugB,IAAI0H,UAAUpf,EAAGrG,GAAImT,KAAMlK,EAAO1J,MAAO0nB,EAAU,WACnDlJ,IAAI2H,kBAEClb,EAAK,2BACVuT,IAAI9D,YACJzV,MAAMtG,KAAO8E,8CAKd2N,UAAUwJ,iBAAiB,YAAaH,KAAK4L,gBAC7CjV,UAAUwJ,iBAAiB,aAAcH,KAAK6L,8CAG1ChG,MACHxjB,GAASwjB,EAAExjB,OACb6qB,EAASlN,KAAKsE,WAAW8G,IAAI,aAAa3D,MAC1C0F,EAAYnN,KAAKoN,oBACjBC,EAAarN,KAAKsN,kBACnBJ,EAAOzT,SAASpX,GAAS,IACvBiF,GAAI4lB,EAAOpR,QAAQzZ,QAClBkrB,WAAWF,EAAYF,GAAU,QACjCG,eAAiBjrB,OACjB+qB,oBAAsB9lB,OACtBimB,WAAWlrB,EAAQiF,GAAG,EAAMue,aAE5BgG,uDAKD0B,WAAWvN,KAAKsN,eAAetN,KAAKoN,qBAAoB,UA/IzBlH,ICIjBsH,0BACRriB,EAAQ6C,8EACb7C,EAAQ6C,MACT1L,KAAO,YAEPmrB,WAAazf,EAAQyf,YAAc,MAEpCC,IAAe,SAAU,UACzBC,EAAiBD,EAAYjU,SAASzL,EAAQ2f,gBAC/C3f,EAAQ2f,eAAiB,kBACvBC,oBAAsBF,EAAY5R,QAAQ6R,KAE1C9N,iEAGM7R,MACPlL,GAAIkd,KAAKqC,cACRwL,gBAA8C,IAA5B7f,EAAQ6f,gBAAwB,EAAI,IAEzD5qB,SAASrC,IAAMktB,KACf7qB,SAAS3B,OAAS,IAClB8B,aAAe0qB,KACflL,WA1BcmL,GA0BY/V,GACzB7U,EAAeL,MAEdS,GAAIyc,KAAK1S,KACT0gB,EAAUhO,KAAK6N,gBZrCY,GYqC0B,OACpD/J,iBA/BWiK,IA+BStW,GAAgBlU,EAAEK,MAAOL,EAAEma,KACjDsQ,GAAuB3qB,EAAcP,4CAIpCkrB,GAAUhO,KAAK6N,gBZ3CY,GY2C0B,EACrDI,EAAYjO,KAAK6C,MAAMoL,UAAYjO,KAAK6C,MAAMoL,UAAY,QACzDrJ,UAtCWmJ,IAsCEE,EAAYD,GAC3B3qB,EAAc2c,KAAKqC,mDAGX/U,0DAAK0S,KAAK1S,QAClBA,EAAK1J,OAAS0J,EAAKoQ,KAAOpQ,EAAK1J,MAAQ0J,EAAKoQ,SACxC,IAAImE,OAAM,kDAGbvU,EAAK1J,UACHA,MAAQ,GAAI6B,QACZ7B,MAAMsqB,YAAa5gB,EAAK1J,MAAM4T,cAAgB,IAEhDlK,EAAKoQ,QAAYA,IAAM,GAAIjY,SAC1B0oB,WAAa7gB,EAAK6gB,eAEpB7kB,SAASgQ,OAAOhP,KAAKgD,EAAK6gB,YAAY,IAAM,IAAQ,IAClD9mB,aACGiD,KAAKgD,EAAK6gB,YAAYjL,QAAQ,eAChCpM,GAAO,GAAIrR,MAAK2oB,EAAejW,MAC5BhB,GAAYL,IAASxJ,EAAK6gB,WAAWC,OAExCD,WAAa9mB,QAGZiG,qCAIHiZ,GAAIvG,KAAK6C,QAEXjf,MAAQwS,GAAM4J,KAAK1S,KAAK1J,SACxB8Z,IAAMtH,GAAM4J,KAAK1S,KAAKoQ,OAEtB2Q,eAAiBjY,GAAMmQ,EAAE3iB,SACzBqqB,UAAYxW,GAAgB8O,EAAE3iB,MAAO2iB,EAAE7I,OACvCZ,aAAeJ,GAChBpD,OAAO4B,OAAO8E,KAAK1S,KAAK6gB,YpBJc,KoBMrCG,cAAgBtO,KAAKuO,kEAInBhI,EAAIvG,KAAK6C,MACT2L,EAAUxO,KAAK6N,gBAAkB,EAAI,EAErCtU,EAAmBgN,EAAE+H,cAAc/jB,IAAI,SAACoP,EAAQrS,UACnD,oBAEQqS,EAAO5J,eAvFAge,aAAAA,cpByEiB,UoBkBvB1N,EAAKyB,aAAard,QAAU,aA3FtBspB,GA4FFxH,EAAE+H,cACZ9U,OAAO,SAACG,EAAQhX,SAAMA,GAAI2E,IAC1BiD,IAAI,kBAAUoP,GAAO8P,KAAK5lB,OAAS2qB,IACnCjmB,OAAO,SAACG,EAAGa,SAAMb,GAAIa,GAAG,IAG3B,iBACQgd,GAAE+H,cAAchnB,IACtBke,KAAKnF,WAIHiE,WAAa,GAAIW,KAAI1L,EACxBhP,IAAI,SAACmB,EAAMpE,MACP2jB,GAAY/R,mBAAgBxN,WACxBA,EAAK,GAAK,IAAMpE,EAAG2jB,SAIzBjlB,GAAI,KACQkd,QAAQ,SAACuL,EAASnnB,OAC7B,EAAG,EAAG,GAAGmS,SAASnS,GAAI,IACrBonB,GAAU5gB,EAAS,kBAAkB,EAAc9H,EAAGyoB,YpBzC3B,MoB4CzB,aACQ,UAGTlK,SAASra,YAAYwkB,MAzHZX,oCA+HVzgB,GACFA,WACKqR,MAAM,2BAGVrR,KAAO0S,KAAK+B,YAAYzU,QACxBgW,YACAU,oEAIArN,UAAUwJ,iBAAiB,YAAa,SAAC0F,KACxCvB,WAAWpB,QAAQ,eACnByL,GAAaC,EAAKnH,MAClBoH,EAAYhJ,EAAExjB,UACfssB,EAAWlV,SAASoV,GAAY,IAE9BlrB,GAAQkrB,EAAUxc,aAAa,cAC/Byc,EAAYD,EAAUxc,aAAa,aAAaK,MAAM,KAEtDgG,EAAQL,GAAa/O,SAASwlB,EAAU,IAAI,GAAG,GAE/CzD,EAAOlE,EAAKxQ,UAAUhW,wBAAyB2qB,EAAOuD,EAAUluB,wBAEhE0K,EAAQ/B,SAASuc,EAAExjB,OAAOgQ,aAAa,UACvChG,EAAIif,EAAKtqB,KAAOqqB,EAAKrqB,KAAOqK,EAAM,EAClCrF,EAAIslB,EAAK1qB,IAAMyqB,EAAKzqB,IACpB2E,EAAQ5B,EAAQ,IAAMwjB,EAAKsG,WAC3BtU,EAAO,OAAST,EAAQ,IAAMoW,EAAU,GAAK,KAAOA,EAAU,KAE7D/K,IAAI0H,UAAUpf,EAAGrG,GAAImT,KAAMA,EAAM5T,MAAOA,EAAOsb,WAAY,SAC3DkD,IAAI2H,sEAOP3G,WAAWgC,YAAc,MAC1B1a,GAAI,EAEJ5H,EAASub,KAAK8B,aAAard,QAAU,EAErCsqB,EAAWjhB,EAAS,iBAAkBzB,EA1K1B0hB,GA0KgC,iBAEpCA,MACN,MAGDiB,QACAjK,WAAW7a,YAAY6kB,QAEvBvP,OAAOhZ,MAAM,EpB5GqB,GoB4GS+D,IAAI,SAACvB,EAAO1B,MACrDyiB,GAAS3c,EAAW,sBAAuBf,EAAI,GAAkB/E,EApLxDymB,GpByEiB,GoB4GPtpB,EAAQuE,KAC5B+b,WAAW7a,YAAY6f,QAIzBkF,GAAWnhB,EAAS,iBADRzB,EAAI6iB,GAA8CF,EAzLlDjB,GA0LwC,iBAE5CA,MACN,SAGDhJ,WAAW7a,YAAY+kB,4CAaxB,GATA1I,GAAIvG,KAAK6C,SACoB0D,EAAE3iB,MAAM2T,WAAYgP,EAAE3iB,MAAM4T,eAAtD2X,OAAYC,UACU7I,EAAE7I,IAAInG,WAAYgP,EAAE7I,IAAIlG,eAE/C6X,OAAyBF,EAAa,EAA6B,SAAbC,GAExDd,KAEAgB,EAAelZ,GAAMmQ,EAAE3iB,OACnB0D,EAAI,EAAGA,EAAI+nB,EAAY/nB,IAAK,IAC/BqQ,GAAU4O,EAAE7I,QACZtF,GAAekX,EAAc/I,EAAE7I,KAAM,QACnB4R,EAAa/X,WAAY+X,EAAa9X,iBACjDiB,gBAEGlR,KAAKyY,KAAKuP,gBAAgBD,EAAc3X,OAE9CA,EAAS,KACFA,QAGT2W,2CAGQ5W,MAAWC,0DAAQ,MACbD,EAAUH,WAAYG,EAAUF,eAAhDkB,OAAOC,OACR6W,EAAc3X,GAAeH,GAG7B+X,SACI/W,gBAHEtC,GAAMuB,IAAYc,GAAmBC,EAAOC,GAOrC,OAIb,GAHA+W,GAAiBjY,GAAgB+X,EAAa7X,GAE9C8R,KAAWvgB,SACP5B,EAAI,EAAGA,EAAIooB,EAAgBpoB,MAC5B0Y,KAAK2P,OAAOH,EAAa9W,KAC1BnR,KAAK2B,QAEI,GAAIzD,MAAKyD,EAAI8O,GAAqB,GAAG6R,UAC9B,cAGuB3kB,KAA1CgE,EAAI8O,GAAqB,GAAG8R,eACtB0F,EAAa,KAChBjoB,KAAKyY,KAAK2P,OAAOH,EAAa9W,GAAO,OAG9B+Q,KAAOA,EAEbgG,iCAGD/X,EAAWgB,OAOb,GAPoBkX,2DACpBrJ,EAAIvG,KAAK6C,MAGTgN,EAAczZ,GAAMsB,GACpBxO,KAEI5B,EAAI,EAAGA,EAAI0Q,GAAoB1Q,IAAKyR,GAAQ8W,EAAa,GAAI,IAChElW,MAGAmW,EAAwBD,GAAetJ,EAAE3iB,OAASisB,GAAetJ,EAAE7I,GAEpEkS,IAASC,EAAYtY,aAAemB,IAAUoX,IACzCjG,SAAW1S,GAAY0Y,KAErB7P,KAAK+P,mBAAmBF,KAE9BtoB,KAAKoS,SAGHzQ,8CAGW4N,MACd+S,GAAW1S,GAAYL,GACvBgT,EAAY9J,KAAK1S,KAAK6gB,WAAWtE,mBAE1BA,YACCC,GAAa,OAClB9J,KAAKR,OAAOxC,GAAiB8M,EAAW9J,KAAK6C,MAAM/F,uBAtRvB6E,ICFhBlD,0BACRtT,EAAQO,8EACbP,EAAQO,aAETsf,WAAatf,EAAKsf,iBAClBgF,YAActkB,EAAKskB,kBAEnB1tB,KAAOoJ,EAAKpJ,MAAQ,SACpB4hB,KAAO,IAEPrE,mEAIFG,KAAK1S,KAAK8P,SAASvZ,QAAU,SAC1B8V,OAAO+I,WAAa,OACpBL,SAASpf,SAAS3B,OAAS,sCAIxB0M,4FACaA,SACaA,EAArBiiB,YAAAA,oBACiBA,MAAjBC,IAAAA,MAAOhU,IAAAA,QAEPkK,eAAiBpY,EAAQoY,wBAE5BzM,OAAOwW,UAAYD,EAAQA,EAAMC,UAAYF,EAAYE,WAAa,OAKvEjU,GAASA,EAAMrY,YACV8V,OAAOyW,YAAclU,EAAM3R,IAAI,SAAC6d,oBAElBA,EAAKiI,aACZjI,EAAKkI,YACClI,EAAKlZ,eACRkZ,EAAKnZ,cAIf0K,OAAO0W,UAAYJ,EAAYI,WAAa,YAGhD1W,OAAO4W,UAAYN,EAAYM,WAAa,OAC5C5W,OAAO6W,oBAAsBP,EAAYO,qBAAuB,OAEhE7W,OAAO8W,eAAiBziB,EAAQoY,eAAeqK,oBAC/C9W,OAAOwM,eAAiBnY,EAAQoY,eAAeD,oBAE/CxM,OAAOkR,iBAAmB7c,EAAQ6c,6DAItC5N,2DADS+C,KAAK1S,KACC0S,KAAK1d,uDAIpBqb,2DADcqC,KAAK1S,wCAItB2W,gEACCyM,iBACDzM,QACE0M,oBAAoB3Q,KAAK4Q,gBAA+B,SAAd5Q,KAAK1d,WAEhDuuB,8DAIDtK,GAAIvG,KAAK6C,MACT3F,EAAS8C,KAAK1S,KAAK4P,SACrBC,cAAgBD,EAAOrZ,SAEvBitB,UAAY9Q,KAAK3U,MAAOkb,EAAEpJ,gBAE1B4T,QAAUxK,EAAEuK,UAAU,IAMtBZ,cACOhT,YACGA,EAAO3S,IAAI,SAAChH,EAAG+D,SACzBhE,GAASijB,EAAEwK,QAAUzpB,EAAIif,EAAEuK,0DAMPE,cAAYzV,yDAAc,QACtCI,SAAMQ,SAAiB8U,SAAgBnrB,SAAUuiB,YAGjD2I,YAAsBjtB,SACfkX,GAAmB+V,EAAYzV,KACpByE,KAAKja,OAASiW,GAAcL,KAC7BE,GAAgBF,GAAQQ,IAC9B6D,KAAKja,OAAS2V,GAAaC,GAAQsV,OACzCpO,MAAM3G,cACCP,YACGA,EAAKpR,IAAI,SAAChH,SAAMuC,GAAWvC,EAAI4Y,oBACzBA,WACPrW,OAEX,MACE+c,MAAM3G,aACN,GAAI1W,KAAOwrB,aAAPxrB,MACCskB,GAAYkH,EAAWxrB,KACtByV,GAAmB6O,EAAWvO,KACnB8E,EAAKta,OAASiW,GAAcL,KAC7BE,GAAgBF,GAAQQ,IAC9BkE,EAAKta,OAAS2V,GAAaC,GAAQsV,IAClCtV,EAAKpR,IAAI,SAAChH,SAAMuC,GAAWvC,EAAI4Y,OAErC+U,GACF7Q,EAAK1G,OAAOyW,YAAYe,KAAK,SAAC/I,SAAS5iB,KAAQ4iB,EAAKkI,SAClDc,EAAiBF,EACjBA,EAAkBhiB,SAClB,WAEFmR,EAAKwC,MAAM3G,MAAMrY,OAAQ,IACnBwtB,MACAC,EAAWjR,EAAKwC,MAAM3G,MAAM,KAEzBmM,UAAUnF,QAAQ,SAAC7T,KACd9H,KAAKvD,KAAK8T,KAAKzI,EAAM8M,QAE5BkV,EAAUlpB,YACNkY,EAAKta,OAAS2V,GAAaC,GAAQsV,IAClCK,EAASjJ,YAGpBxF,MAAM3G,MAAM3U,aACL/B,GAAO,mBACPmW,QACDuV,EAAkBjiB,UACpBmiB,8CA9BJ5rB,QAuCR+rB,yBACAC,qBACAC,8DAIDlL,GAAIvG,KAAK6C,MACT6O,EAAW,SAACxW,EAAQoV,SACbpV,GAAO3Q,IAAI,SAACN,MACTiS,GAAUqK,EAAVrK,YAEFA,aAAiBnY,WACxBmY,EAAMrY,OAAS,EAAIqY,EAAMiV,KAAK,SAACQ,SAASrB,KAAOqB,EAAK7T,SAAUyI,EAAErK,MAAM,IAG5DD,GAAMhS,EAAKiS,QAIxB0V,cAAgB,IAChBxU,SAAW4C,KAAK1S,KAAK8P,SAAS7S,IAAI,SAAChH,EAAG+D,MAChC4T,GAAS3X,EAAE2X,OACX2W,EAAetuB,EAAEsuB,6BAIbtuB,EAAE4V,MACF5V,EAAE4V,KAAK2Y,QAAQ,SAAU,SAACC,SACd,KAARA,EAAc,QAAkB,KAARA,EAAc,OAAS,eAEhDzqB,WACmB,QAAhB/D,EAAEga,UAAsBgJ,EAAEqL,gBAAkBrL,EAAEqL,wBAC7CruB,EAAEga,iBAELrC,aACIwW,EAASxW,EAAQ3X,EAAEua,WAC3Bva,EAAEua,oBAEQ+T,iBACEH,EAASG,EAActuB,EAAEua,sDAMnDyI,GAAIvG,KAAK6C,SACV7C,KAAKgL,WAAWgH,sBAChBC,UAAY1L,EAAEnJ,SAASmJ,EAAEnJ,SAASvZ,OAAS,GAAGquB,kBAG/CD,UAAY,GAAIluB,OAAMwiB,EAAEpJ,eAAejZ,KAAK,QAC5CkZ,SAAS7S,IAAI,cACZ2f,WAAW3f,IAAI,SAAC8E,EAAK1M,GACnB0M,EAAMkX,EAAE0L,UAAUtvB,OAClBsvB,UAAUtvB,GAAK0M,iDAOhBkX,GAAIvG,KAAK6C,KACV7C,MAAK1S,KAAKyQ,gBACP8E,MAAM9E,SAAWiC,KAAK1S,KAAKyQ,SAASxT,IAAI,qBAC1C2E,SAAW+M,GAAM1Y,EAAEgC,MAAOghB,EAAErK,OAC1B3Y,EAAEyK,UAASzK,EAAEyK,YAIVzK,KAGNyc,KAAK1S,KAAKmQ,gBACPoF,MAAMpF,SAAWuC,KAAK1S,KAAKmQ,SAASlT,IAAI,qBAC1Cwe,SAAW9M,GAAM1Y,EAAEK,MAAO2iB,EAAErK,SAC5B8M,OAAS/M,GAAM1Y,EAAEma,IAAK6I,EAAErK,OACtB3Y,EAAEyK,UAASzK,EAAEyK,YACVzK,0DAMCiC,EAAM,SACN2sB,IAAYnS,KAAKrG,OAAOyW,YACxBgC,EAAgBD,QAShBE,EAAqB,SAAC/V,MAClBgW,GAAa,GAAIvuB,OAAMojB,EAAKtE,MAAM1F,eAAejZ,KAAK,KACtDgf,QAAQ,SAAC3f,EAAG+D,MACR4T,GAASoB,EAAIhV,GAAG4T,SAClB1V,GAAO8sB,EAAaA,EAAW/nB,IAAI,SAAC0W,EAAG3Z,SAC9B2Z,GAAI/F,EAAO5T,WAK1B0Y,KAAKgL,WAAWgH,aACV,eAEFG,EAAW,IACLI,GArBA,SAACjW,EAAKoQ,SACTpQ,GAAI/T,OAAO,SAACC,EAAKgqB,YAChBA,EAAI9F,iBAAkBlkB,EAAIgqB,EAAI9F,UAAmB8F,IAC9ChqB,QAkByBwX,KAAK1S,KAAK8P,SAAU,cAE/C,GAAIU,KAAUyU,KACIA,EAAgBzU,WAGpBkC,KAAK1S,KAAK8P,gBAMjC+U,QACK7kB,KAAK8P,SAAS8F,QAAQ,SAAC3f,WAGVA,EAAEua,QAAUtY,QACNjC,EAAEua,QAAUtY,IAAK+B,gBAAQhE,EAAEiC,KACxC4sB,EAAc7uB,EAAEua,QAAUtY,gBAAWjC,EAAEiC,SAGlCwa,KAAK1S,KAAK8P,SAAS7S,IAAI,SAAChH,SAC7BA,GAAEiC,KAIbwa,KAAK1S,KAAKyQ,WAAaoU,KACT5qB,KAAKyY,KAAK1S,KAAKyQ,SAASxT,IAAI,SAAChH,SAAMA,GAAEgC,SAGnDya,KAAK1S,KAAKmQ,WAAa0U,QAClB7kB,KAAKmQ,SAASlT,IAAI,SAAChH,KACNgE,MAAMhE,EAAEma,IAAKna,EAAEK,UAI9BuuB,EAAYC,SAAmBjuB,kBAAUiuB,yDAIlD7Y,IAEF,cAEOyG,KAAKrG,OAAOwW,iBACVnQ,KAAKja,QAGd,cACKwgB,GAAIvG,KAAK6C,eACXqN,MAAMvH,WAAa3K,GAAmBgC,KAAK3U,MAC5Ckb,EAAE2J,MAAMhT,OAAQ8C,KAAKrG,OAAO4W,WAEtBhK,EAAE2J,OACR1K,KAAKxF,QAIP,kBAEQA,KAAK3U,UACP,SAEN,iBACQ2U,MAAK6C,MAAMpF,UACjB+H,KAAKxF,OAMCA,MAAKrG,OAAOyW,aAAepQ,KAAKrG,OAAOyW,YAAYvsB,YAC9C8V,OAAOyW,YAAYlN,QAAQ,SAAChH,KACZ3U,MACb,cAEUue,EAAKnM,OAAO0W,gBACXvK,EAAKza,qBACIya,EAAKnM,OAAO6W,wBACvBtU,EAAMhN,UAAY,QAE3B,iBACW8Q,MAAK6C,MAAM3G,OACpBsJ,KAAKM,SAIEve,MACb,cAEUyY,KAAKrG,OAAO0W,gBACXrQ,KAAK3U,qBACI2U,KAAKrG,OAAO6W,qBAEhC,iBACWxQ,MAAK6C,MAAM3G,OACpBsJ,KAAKxF,WAIjByS,GAAczS,KAAK6C,MAAMzF,SAAS5D,OAAO,kBAAqB,QAAhBjW,EAAEga,YAChDmV,EAAe1S,KAAK6C,MAAMzF,SAAS5D,OAAO,kBAAqB,SAAhBjW,EAAEga,YAEjDoV,EAAcF,EAAYloB,IAAI,eACpBwF,GAAQxM,EAAEwM,MACV6iB,EAAWrvB,EAAEqvB,UAAY7iB,SAErC,YAAmBxM,EAAEwM,aAEbA,QACA+V,EAAKtG,OAAOzP,WACV+V,EAAKkF,WAAWgH,yBAGPlM,EAAKnM,OAAOkR,2BrBvTG,EqBwTtB/E,EAAK/f,QAEjB,cACoBwgB,GAAIvG,KAAK6C,MACP3G,EAAUqK,EAAVrK,MACF3Y,EAAIgjB,EAAEnJ,SAASrN,KACQxM,EAArB+sB,GAAAA,aAAK,cACP0B,EAAUhS,KAAKgL,WAAWgH,QAE1Ba,EAAa7S,KAAKgL,WAAW6H,YrBlUhB,GqBmUbzI,EAAY7D,EAAEuK,WAAa,EAAI+B,GAC/B5L,EAAWmD,GAAa4H,EAAU,EAAIS,EAAY5uB,OAIjEqY,aAAiBnY,WAEZmY,EAAMrY,OAAS,EAAIqY,EAAMiV,KAAK,SAACQ,SAASrB,KAAOqB,EAAK7T,SAAUyI,EAAErK,MAAM,OAI5D8L,GAAazB,EAAE2J,MAAM7H,UAAU9d,IAAI,SAAC8B,SAAMA,GAAI+d,EAAY,GAEzD4H,OACYhK,EAAWzd,IAAI,SAAC3D,SAClBA,GAAIqgB,EAAW2L,EAAW3L,QAIrC/J,GAAS,GAAInZ,OAAMwiB,EAAEpJ,eAAejZ,KAAK,GACzC8b,MAAKrG,OAAOkR,qBACRmH,GAAWzuB,EAAEwM,QAAUwW,EAAEnJ,SAASvZ,OAAS,EAClCN,EAAEsuB,aAEFtuB,EAAE2X,WAGfiP,GAAU,GAAIpmB,OAAMwiB,EAAEpJ,eAAejZ,KAAK,SAC1C8tB,OACUzuB,EAAE2mB,WAAW3f,IAAI,SAACvE,EAAGrD,SAAMqD,GAAIzC,EAAE2uB,eAAevvB,kBAIhEqlB,aACAzkB,EAAE2mB,mBACLC,SAEDjN,WAEEhB,EAAMpW,mBACLskB,WACDnD,IAEVzB,KAAKM,MAICgN,EAAcJ,EAAanoB,IAAI,SAAChH,MAC5BwM,GAAQxM,EAAEwM,aAEV,aAAoBxM,EAAEwM,aAEXA,QACA+V,EAAKtG,OAAOzP,WACV+V,EAAKnV,iBACJmV,EAAKkK,YAAYvf,oBACfqV,EAAKkK,YAAYnf,kBACrBiV,EAAKkK,YAAYzf,gBACfuV,EAAKkK,YAAYpF,kBACjB9E,EAAKkK,YAAYrF,0BAGT7E,EAAKnM,OAAOkR,kBAElC,cACQtE,GAAIvG,KAAK6C,MACTtf,EAAIgjB,EAAEnJ,SAASrN,GAGbmM,EAAQqK,EAAErK,MAAMrY,OAChB0iB,EAAErK,MAAMiV,KAAK,SAACQ,SAASpuB,GAAE+sB,KAAOqB,EAAK7T,UAAWyI,EAAErK,MAAM,GACxDqK,EAAErK,MAEJ6W,EACA7W,EAAMmM,UAAU,GAAKnM,EAAMpW,SACrBoW,EAAMmM,UAAU,GAChBnM,EAAMpW,2BAGAygB,EAAE2J,MAAM7H,qBACR9kB,EAAE2mB,kBAEN3mB,EAAE2X,gBAEA6X,SACF/S,KAAKgQ,YAAYgD,SrBrZd,IqBuZjBxN,KAAKM,MAIjBmN,IAEF,kBAEQjT,KAAK3U,UACP,SAEN,iBACQ2U,MAAK6C,MAAM9E,UACjByH,KAAKxF,UAIUzG,EAAiBpV,OAAOwuB,EAAaG,EAAaG,MAEjEC,IAAa,WAAY,iBACxBC,2BAEA7O,WAAa,GAAIW,KAAI1L,EACxBC,OAAO,mBAAS0Z,EAAUzZ,SAAS/N,EAAK,KAAOoa,EAAKjD,MAAMnX,EAAK,MAC/DnB,IAAI,eACA0gB,GAAY/R,mBAAgBxN,WAC7BA,EAAK,GAAG+N,SAAS,cAAgB/N,EAAK,GAAG+N,SAAS,gBAC/C0Z,mBAAmB5rB,KAAK0jB,IAEtBvf,EAAK,GAAIuf,gEAKdmI,kBAED7M,GAAIvG,KAAK6C,MACTwQ,EAAUrT,KAAKrG,OAAO8W,eACtB6C,EAAUtT,KAAKrG,OAAOwM,cACbI,GAAE2J,MAAMhT,OAEd3S,IAAI,SAAC7D,EAAOqJ,MACdmL,GAAS0N,EAAK/F,MAAMzF,SAAS7S,IAAI,SAAC6V,EAAK9Y,MACtC/B,GAAQ6a,EAAIlF,OAAOnL,gBAEfqQ,EAAIjH,WACJ5T,OACD6a,EAAI8J,WAAWna,SACd6Y,EAAKpJ,OAAOlY,aACRgsB,EAAUA,EAAQ/tB,GAASA,OAInC6tB,YAAYrjB,UACTrJ,iBACS2sB,EAAUA,EAAQ3sB,GAASA,OACrC6f,EAAE2J,MAAM7H,UAAUtY,UAChBmL,WACEqL,EAAE0L,UAAUliB,4DAOnB4G,UAAUwJ,iBAAiB,YAAa,SAAC0F,MACzC/iB,GAAI+lB,EAAKxG,SACTja,EAAI5H,EAAUqoB,EAAKlS,WACnB4c,EAAO1N,EAAEiH,MAAQ1kB,EAAEpH,KAAOkC,EAAcJ,GACxC0wB,EAAO3N,EAAEkH,MAAQ3kB,EAAExH,GAEpB4yB,GAAO3K,EAAK9iB,OAASlD,EAAaC,IACjC0wB,EAAQ3wB,EAAaC,KACnB2wB,oBAAoBF,KAEpBxP,IAAI9D,wDAKQsT,MACfhN,GAAIvG,KAAK6C,SACT0D,EAAE0L,cAEFliB,GAAQqM,GAAkBmX,EAAMhN,EAAE2J,MAAM7H,WAAW,MACnDtY,GAAS,EAAG,IACX2jB,GAAM1T,KAAKoT,YAAYrjB,QAEtBgU,IAAI0H,UACRiI,EAAIxI,KAAOlL,KAAK+D,IAAI/Y,OAAOqB,EAC3BqnB,EAAIC,SAAW3T,KAAK+D,IAAI/Y,OAAOhF,GAC9BmT,KAAMua,EAAIE,eAAgBruB,MAAO,IAClCmuB,EAAIxY,OACJnL,QAGIgU,IAAI2H,8DAKNnF,EAAIvG,KAAK1S,IACViZ,GAAEnJ,SAASvZ,OAAS,SACjBkhB,WAAWgC,YAAc,KAC5B3J,SAAS7S,IAAI,SAAChH,EAAG+D,MAId5G,GAAO6M,ErBxgBqB,IqB0gBpBjG,EACX,IrB3gB+B,IqB6gB/B2hB,EAAKzJ,OAAOlY,GACZ/D,EAAE4V,KACF8P,EAAKtP,OAAOyI,mBACR2C,WAAW7a,YAAYxJ,0DAS3Bsf,KAAKkE,sBACFA,KAAO,EAGVlE,MAAK6T,oBACFA,cAAc3Q,QAAQ,eACtB9a,GAAIoB,EAAE6X,UACRjX,WAAWgL,YAAYhN,UAItByrB,cAAgB7T,KAAKmT,mBAAmB5oB,IAAI,wBAEzC0W,EAAE+I,qBACC9kB,SACF+b,EAAEgJ,aAIoB/kB,KAA5B8a,KAAK6C,MAAMiR,oBACRjR,MAAMiR,aAAe9T,KAAK6C,MAAM1F,cAAgB,QAIjD0W,cAActpB,IAAI,eAClBwpB,GAAcxwB,EAAE0mB,MAAM+J,EAAKnR,MAAMiR,gBAEnCzS,QAAUF,GAAY5d,EAAEjB,MAAMyxB,KAC3BxP,SAASra,YAAY3G,EAAE8d,yDAK1BrB,KAAK6T,oBACFA,cAAc3Q,QAAQ,eACtB9a,GAAIoB,EAAE6X,UACRjX,WAAWgL,YAAYhN,2DAMtB+C,OAAOgV,iBAAiB,cAAe,aACtCmB,sEAKD6R,mBAAmB5oB,IAAI,cACzB0f,MAAM1f,IAAI,cACN4V,iBAAiB,QAAS,cAC1BpQ,GAAQiB,EAAKqB,aAAa,sBACzB4hB,oBAAoBlkB,cAMvBgU,IAAIpN,UAAUwJ,iBAAiB,QAAS,cACxCpQ,GAAQmkB,EAAKnQ,IAAIpN,UAAUtE,aAAa,sBACvC4hB,oBAAoBlkB,6DAKrB8jB,cAActpB,IAAI,eAClBwpB,GAAcxwB,EAAE0mB,MAAMkK,EAAKtR,MAAMiR,iBACvBvwB,EAAEjB,MAAMyxB,EAAaxwB,EAAE8d,sDAKjC4S,oBAAoBjU,KAAK6C,MAAMiR,aAAe,+CAI9CG,oBAAoBjU,KAAK6C,MAAMiR,aAAe,6CAGvC/jB,0DAAMiQ,KAAK6C,MAAMiR,aACzBvN,EAAIvG,KAAK6C,mBAEL9S,QACAwW,EAAE2J,MAAMhT,OAAOnN,UACdwW,EAAEnJ,SAAS7S,IAAI,kBAAKhH,GAAE2X,OAAOnL,kDAKnBA,MACfwW,GAAIvG,KAAK6C,SACLvZ,SAASyG,IACN,IAAGA,EAAQ,GACnBA,GAASwW,EAAE2J,MAAMhT,OAAOrZ,SAAQkM,EAAQwW,EAAE2J,MAAMhT,OAAOrZ,OAAS,GAChEkM,IAAUwW,EAAEuN,iBACbA,aAAe/jB,IACZiQ,KAAK7U,OAAQ,cAAe6U,KAAKoU,sDAM1B1tB,EAAO2tB,MAAetkB,0DAAMiQ,KAAK6C,MAAM1F,0GAChCzW,EAAO2tB,EAAetkB,QACpCzC,KAAK4P,OAAOoX,OAAOvkB,EAAO,EAAGrJ,QAC7B4G,KAAK8P,SAAS7S,IAAI,SAAChH,EAAG+D,KACxB4T,OAAOoZ,OAAOvkB,EAAO,EAAGskB,EAAc/sB,WAEpCmd,OAAOzE,KAAK1S,mDAGFyC,0DAAQiQ,KAAK6C,MAAM1F,cAAc,CAC5C6C,MAAK1S,KAAK4P,OAAOrZ,QAAU,mGAGTkM,QACjBzC,KAAK4P,OAAOoX,OAAOvkB,EAAO,QAC1BzC,KAAK8P,SAAS7S,IAAI,cACpB2Q,OAAOoZ,OAAOvkB,EAAO,UAEnB0U,OAAOzE,KAAK1S,6CAGJ+mB,MAAetkB,0DAAM,OAC7BzC,KAAK8P,SAASrN,GAAOmL,OAASmZ,OAC9B5P,OAAOzE,KAAK1S,6CAKH8P,QACT9P,KAAK8P,SAAS7S,IAAI,SAAChH,EAAG+D,GACvB8V,EAAS9V,OACT4T,OAASkC,EAAS9V,WAGjBmd,OAAOzE,KAAK1S,aAztBoBqU,ICFlB4S,0BACRppB,EAAQO,8EACbP,EAAQO,aACTpJ,KAAO,UACPwgB,YAAc,IACdoB,KAAO,IAEPrE,+DAGInU,4FACOA,QACXkgB,UAAY5L,KAAK4L,UAAUpG,KAAKxF,WAChC6L,WAAa7L,KAAK6L,WAAWrG,KAAKxF,WAElC8L,WAAapgB,EAAKogB,YAAc,QAChCnS,OAAOoS,WAAargB,EAAKqgB,YAAc,OAEvC7f,UAAYR,EAAKQ,YAAa,OAC9B2b,YAAcnc,EAAKmc,aAAe,qIAKnCtB,GAAIvG,KAAK6C,WACRpe,OACJub,KAAKja,OAASia,KAAK3U,MAChB2U,KAAK/T,OAAOI,EAAI2T,KAAK6H,YAAc,EACnC7H,KAAK/T,OAAOjG,EAAIga,KAAK6H,YAAc,KAE/BpjB,GAAsBub,KAAtBvb,OAAQyH,EAAc8T,KAAd9T,UAEV8f,EAAuBzF,EAAE0F,uBAC7BrE,kBACAqE,uBACEC,GAAW,IAAMlM,KAAKrG,OAAOoS,aAE/BvF,YAAYjc,IAAI,SAACmc,EAAOpf,MACnBykB,GAAaG,EACbC,EAAmBzF,EAAQH,EAAEO,WtB0DZ,IsBzDjB3a,EAAWggB,EAAkB,IAAM,EAAG,EACtCC,EAAYlgB,GAAaigB,EAAkBA,EAC3CE,EAAWH,GAAsBE,EACjCrgB,EAAgBxH,EAAmBwnB,EAAYtnB,GAC/CuH,EAAczH,EAAmB8nB,EAAU5nB,GAE3C6nB,EAAejM,EAAK6D,MAAQ8H,EAAqB1kB,GAEnDilB,SAASC,QACVnM,GAAK6D,QACIoI,EAAeA,EAAavgB,cAAgBA,IAC9CugB,EAAeA,EAAatgB,YAAcD,MAExCA,IACFC,MAEJygB,GACe,MAApBN,EACGvf,EAAoB2f,EAAUC,EAAQnM,EAAKpU,OAAQoU,EAAK5b,OAAQ4b,EAAKnU,UAAWC,GAChFQ,EAAqB4f,EAAUC,EAAQnM,EAAKpU,OAAQoU,EAAK5b,OAAQ4b,EAAKnU,UAAWC,KAEnFyb,aAAargB,KAAKklB,KAClBR,iBAAiB1kB,0CAGXmf,QACAH,EAAEO,yCAGFsF,WAIJlI,KAAO,+CAIRqC,GAAIvG,KAAK6C,MAETtJ,IAEF,iBAEA,+BAEgBgN,EAAEqB,oBACR5H,KAAKR,mBACAQ,KAAK6H,cAElBrC,KAAKxF,aAIJsE,WAAa,GAAIW,KAAI1L,EACxBhP,IAAI,eACA0gB,GAAY/R,mBAAgBxN,WACxBA,EAAK,GAAIuf,kDAIAyB,MACZjoB,GAAuBub,KAAvBvb,OAAQqnB,EAAe9L,KAAf8L,WACT5c,EAAW3K,EAAmBmoB,EAASX,WAAYW,EAASloB,MAAQ,EAAGC,wBACtDyK,EAAS7C,EAAKyf,QAAiB5c,EAASlJ,EAAK8lB,6CAG1Dtb,EAAKlJ,EAAEqlB,EAAK9G,MAClBrV,MACExH,GAAQgX,KAAKR,OAAOlY,MACvBqlB,EAAM,IACEnc,EAAMwP,KAAK4M,oBAAoB5M,KAAK6C,MAAMoJ,iBAAiB3kB,OAChEkD,MAAM+D,OAASxF,EAAmBC,EAAO,OAC1C6jB,GAAQrsB,EAAUwf,KAAK7J,KACvB9J,EAAIwZ,EAAEiH,MAAQD,EAAM7rB,KAAO,GAC3BgF,EAAI6f,EAAEkH,MAAQF,EAAMjsB,IAAM,GAC1BqO,GAAS+Q,KAAKgN,kBAAoBhN,KAAKgN,iBAAiBnpB,OAAS,EAClEmc,KAAKgN,iBAAiB1lB,GAAK0Y,KAAK6C,MAAM3F,OAAO5V,IAAM,KAClD2lB,GAAuC,IAA5BjN,KAAK6C,MAAM2D,YAAYlf,GAAW0Y,KAAK6C,MAAMiE,YAAYtjB,QAAQ,QAC3EugB,IAAI0H,UAAUpf,EAAGrG,GAAImT,KAAMlK,EAAO1J,MAAO0nB,EAAU,WACnDlJ,IAAI2H,kBAEClb,EAAK,2BACVuT,IAAI9D,YACJzV,MAAM+D,OAASvF,8CAKhB2N,UAAUwJ,iBAAiB,YAAaH,KAAK4L,gBAC7CjV,UAAUwJ,iBAAiB,aAAcH,KAAK6L,8CAG1ChG,MACHxjB,GAASwjB,EAAExjB,OACb6qB,EAASlN,KAAKsE,WAAW8G,IAAI,eAAe3D,MAC5C0F,EAAYnN,KAAKoN,oBACjBC,EAAarN,KAAKsN,kBACnBJ,EAAOzT,SAASpX,GAAS,IACvBiF,GAAI4lB,EAAOpR,QAAQzZ,QAClBkrB,WAAWF,EAAYF,GAAU,QACjCG,eAAiBjrB,OACjB+qB,oBAAsB9lB,OACtBimB,WAAWlrB,EAAQiF,GAAG,EAAMue,aAE5BgG,uDAKD0B,WAAWvN,KAAKsN,eAAetN,KAAKoN,qBAAoB,UArJvBlH,IVAlCxH,QACAD,QACCA,cAEMsM,WACHyC,OACJ7B,SACE4I,IAiBFC,GACL,WAAYrpB,EAAQ6C,qBACZwQ,GAAexQ,EAAQ1L,KAAM6I,EAAQ6C,wFWjC1CymB,YAEJA,IAAOC,KAAU,gBACjBD,GAAOE,QAAU,QAEjBF,GAAiBnb,OAAOM,UAAY6a,GAAQG"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/objects/SvgTip.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/css/chartsCss.js","../../../src/js/utils/export.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/utils/intervals.js","../../../src/js/charts/Heatmap.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/chart.js","../../../src/js/index.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                  \n\t\t\t\t
                                  `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment;\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n // we need to loop through original positions.\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["$","expr","con","document","querySelector","create","tag","o","element","createElement","i","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","getOffset","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","BASE_MEASURES","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","totalExtraHeight","legendHeight","getExtraWidth","totalExtraWidth","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","DEFAULT_AXIS_CHART_TYPE","AXIS_DATASET_CHART_TYPES","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","DOT_OVERLAY_SIZE_INCR","PERCENTAGE_BAR_DEFAULT_HEIGHT","PERCENTAGE_BAR_DEFAULT_DEPTH","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","HEATMAP_GUTTER_SIZE","DEFAULT_CHAR_WIDTH","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","HEATMAP_COLORS_GREEN","DEFAULT_COLORS","ANGLE_RATIO","Math","PI","FULL_ANGLE","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","hideTip","title","dataPointList","addEventListener","index","innerHTML","set","color","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","push","smoothing","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","n","bezierCommand","point","a","cps","cpe","pointStr","command","reduce","acc","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","HEX_RE","RGB_RE","test","exec","c","ch","AXIS_TICK_LENGTH","LABEL_MARGIN","LABEL_MAX_CHARS","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","makeSVGContainer","className","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","stroke","strokeWidth","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","heatSquare","size","data","legendBar","truncate","text","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","position","rotation","labelSvg","yLine","pos","mode","xLine","yMarker","labelPos","yRegion","region","datasetBar","meta","minHeight","datasetDot","dot","getPaths","pointsList","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","updateOverlay","attributes","values","filter","includes","attr","specified","nodeValue","UNIT_ANIM_DUR","PATH_ANIM_DUR","MARKER_LINE_ANIM_DUR","REPLACE_ALL_NEW_DUR","STD_EASING","translate","oldCoord","newCoord","duration","old","translateVertLine","newX","oldX","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","rectAnim","groupAnim","animateBar","bar","oldCoordStr","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","EASING","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","CSSTEXT","downloadFile","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","firstChild","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","error","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","millisecondsPerDay","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","sliceStrings","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","newOptions","startPos","endPos","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","monthNameHeight","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","Object","newValues","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","man","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","COL_WIDTH","ROW_HEIGHT","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","moreTextX","moreText","startMonth","startYear","endMonth","endYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","yRegions","zeroDataPrep","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","seriesMultiple","maxLabelLength","AxisChart","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","find","yPtsArray","firstArr","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","groupBy","cur","generateCumulative","cumulative","groupedDataSets","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","titles","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","setCurrentDataPoint","data_point","getDataPoint","datasetValues","splice","DonutChart","chartTypes","getChartByType","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file diff --git a/src/js/charts/AxisChart.js b/src/js/charts/AxisChart.js index 49b7517..4a1c325 100644 --- a/src/js/charts/AxisChart.js +++ b/src/js/charts/AxisChart.js @@ -51,7 +51,12 @@ export default class AxisChart extends BaseChart { }; }); } else { - this.config.yAxisMode = axisOptions.yAxisMode || 'span'; + this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span'; + + // if we have yAxis config settings lets populate a yAxis config array. + if (yAxis.id && yAxis.position) { + this.config.yAxisConfig = [yAxis] + } } this.config.xIsSeries = axisOptions.xIsSeries || 0; @@ -102,7 +107,9 @@ export default class AxisChart extends BaseChart { calcYAxisParameters(dataValues, withMinimum = 'false') { - let yPts, scaleMultiplier, intervalHeight, zeroLine, positions; + let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment; + yAxisConfigObject = this.config.yAxisMode || {}; + yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; // if we have an object we have multiple yAxisParameters. if (dataValues instanceof Array) { @@ -110,9 +117,12 @@ export default class AxisChart extends BaseChart { scaleMultiplier = this.height / getValueRange(yPts); intervalHeight = getIntervalSize(yPts) * scaleMultiplier; zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; + this.state.yAxis = { labels: yPts, positions: yPts.map((d) => zeroLine - d * scaleMultiplier), + title: yAxisConfigObject.title || null, + pos: yAxisAlignment, scaleMultiplier: scaleMultiplier, zeroLine: zeroLine }; @@ -120,19 +130,15 @@ export default class AxisChart extends BaseChart { this.state.yAxis = []; for (let key in dataValues) { const dataValue = dataValues[key]; + yAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || []; + yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; yPts = calcChartIntervals(dataValue, withMinimum); scaleMultiplier = this.height / getValueRange(yPts); intervalHeight = getIntervalSize(yPts) * scaleMultiplier; zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; positions = yPts.map((d) => zeroLine - d * scaleMultiplier); - const yAxisConfigObject = - this.config.yAxisConfig.find((item) => key === item.id) || []; - const yAxisAlignment = yAxisConfigObject - ? yAxisConfigObject.position - : 'right'; - - if (this.state.yAxis.length) { + if (this.state.yAxis.length > 1) { const yPtsArray = []; const firstArr = this.state.yAxis[0]; // we need to loop through original positions. diff --git a/src/js/objects/ChartComponents.js b/src/js/objects/ChartComponents.js index cc1a3f4..61fb7e2 100644 --- a/src/js/objects/ChartComponents.js +++ b/src/js/objects/ChartComponents.js @@ -1,55 +1,75 @@ import { makeSVGGroup } from '../utils/draw'; -import { makeText, generateAxisLabel, makePath, xLine, yLine, yMarker, yRegion, datasetBar, datasetDot, percentageBar, getPaths, heatSquare } from '../utils/draw'; +import { + makeText, + makePath, + xLine, + yLine, + generateAxisLabel, + yMarker, + yRegion, + datasetBar, + datasetDot, + percentageBar, + getPaths, + heatSquare +} from '../utils/draw'; import { equilizeNoOfElements } from '../utils/draw-utils'; -import { translateHoriLine, translateVertLine, animateRegion, animateBar, - animateDot, animatePath, animatePathStr } from '../utils/animate'; +import { + translateHoriLine, + translateVertLine, + animateRegion, + animateBar, + animateDot, + animatePath, + animatePathStr +} from '../utils/animate'; import { getMonthName } from '../utils/date-utils'; class ChartComponent { - constructor({ - layerClass = '', - layerTransform = '', - constants, + constructor({ + layerClass = '', + layerTransform = '', + constants, - getData, - makeElements, - animateElements - }) { - this.layerTransform = layerTransform; - this.constants = constants; + getData, + makeElements, + animateElements + }) { + this.layerTransform = layerTransform; + this.constants = constants; - this.makeElements = makeElements; - this.getData = getData; + this.makeElements = makeElements; + this.getData = getData; - this.animateElements = animateElements; + this.animateElements = animateElements; - this.store = []; - this.labels = []; + this.store = []; + this.labels = []; - this.layerClass = layerClass; - this.layerClass = typeof(this.layerClass) === 'function' - ? this.layerClass() : this.layerClass; + this.layerClass = layerClass; + this.layerClass = + typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass; - this.refresh(); - } + this.refresh(); + } - refresh(data) { - this.data = data || this.getData(); - } + refresh(data) { + this.data = data || this.getData(); + } - setup(parent) { - this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent); - } + setup(parent) { + this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent); + } - make() { - this.render(this.data); - this.oldData = this.data; - } + make() { + this.render(this.data); + this.oldData = this.data; + } - render(data) { - this.store = this.makeElements(data); + render(data) { + this.store = this.makeElements(data); - this.layer.textContent = ''; + this.layer.textContent = ''; this.store.forEach((element) => { element.length ? element.forEach((el) => { @@ -57,12 +77,12 @@ class ChartComponent { }) : this.layer.appendChild(element); }); - this.labels.forEach(element => { - this.layer.appendChild(element); - }); - } + this.labels.forEach((element) => { + this.layer.appendChild(element); + }); + } - update(animate = true) { + update(animate = true) { this.refresh(); let animateElements = []; if(animate) { @@ -122,7 +142,7 @@ let componentConfigs = { layerClass: 'y axis', makeElements(data) { let elements = []; - + // will loop through each yaxis dataset if it exists if (data.length) { data.forEach((item, i) => { item.positions.map((position, i) => { @@ -150,13 +170,26 @@ let componentConfigs = { return elements; } - return data.positions.map((position, i) => { - return yLine(position, data.labels[i], this.constants.width, { + data.positions.forEach((position, i) => { + elements.push(yLine(position, data.labels[i], this.constants.width, { mode: this.constants.mode, - pos: this.constants.pos, + pos: data.pos || this.constants.pos, shortenNumbers: this.constants.shortenNumbers - }); + })); }); + + if (data.title) { + elements.push( + generateAxisLabel({ + title: data.title, + position: data.pos, + height: data.zeroLine, + width: this.constants.width + }) + ); + } + + return elements; }, animateElements(newData) { @@ -240,9 +273,12 @@ let componentConfigs = { yMarkers: { layerClass: 'y-markers', makeElements(data) { - return data.map(m => - yMarker(m.position, m.label, this.constants.width, - {labelPos: m.options.labelPos, mode: 'span', lineType: 'dashed'}) + return data.map((m) => + yMarker(m.position, m.label, this.constants.width, { + labelPos: m.options.labelPos, + mode: 'span', + lineType: 'dashed' + }) ); }, animateElements(newData) { @@ -416,84 +452,95 @@ let componentConfigs = { } }, - lineGraph: { - layerClass: function() { return 'dataset-units dataset-line dataset-' + this.constants.index; }, - makeElements(data) { - let 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 - } - ); - } + lineGraph: { + layerClass: function () { + return 'dataset-units dataset-line dataset-' + this.constants.index; + }, + makeElements(data) { + let 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((y, j) => { - return datasetDot( - data.xPositions[j], - y, - data.radius, - c.color, - (c.valuesOverPoints ? data.values[j] : ''), - j - ); - }); - } + this.units = []; - return Object.values(this.paths).concat(this.units); - }, - animateElements(newData) { - let newXPos = newData.xPositions; - let newYPos = newData.yPositions; - let newValues = newData.values; + if (!c.hideDots) { + this.units = data.yPositions.map((y, j) => { + return datasetDot( + data.xPositions[j], + y, + data.radius, + c.color, + c.valuesOverPoints ? data.values[j] : '', + j + ); + }); + } - let oldXPos = this.oldData.xPositions; - let oldYPos = this.oldData.yPositions; - let oldValues = this.oldData.values; + return Object.values(this.paths).concat(this.units); + }, + animateElements(newData) { + let newXPos = newData.xPositions; + let newYPos = newData.yPositions; + let newValues = newData.values; - [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos); - [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos); - [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues); + let oldXPos = this.oldData.xPositions; + let oldYPos = this.oldData.yPositions; + let oldValues = this.oldData.values; - this.render({ - xPositions: oldXPos, - yPositions: oldYPos, - values: newValues, + [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos); + [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos); + [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues); - zeroLine: this.oldData.zeroLine, - radius: this.oldData.radius, - }); + this.render({ + xPositions: oldXPos, + yPositions: oldYPos, + values: newValues, - let animateElements = []; + zeroLine: this.oldData.zeroLine, + radius: this.oldData.radius + }); - if(Object.keys(this.paths).length) { - animateElements = animateElements.concat(animatePath( - this.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline)); - } + let animateElements = []; - if(this.units.length) { - this.units.map((dot, i) => { - animateElements = animateElements.concat(animateDot( - dot, newXPos[i], newYPos[i])); - }); - } + if (Object.keys(this.paths).length) { + animateElements = animateElements.concat( + animatePath( + this.paths, + newXPos, + newYPos, + newData.zeroLine, + this.constants.spline + ) + ); + } - return animateElements; - } - } + if (this.units.length) { + this.units.map((dot, i) => { + animateElements = animateElements.concat( + animateDot(dot, newXPos[i], newYPos[i]) + ); + }); + } + + return animateElements; + } + } }; export function getComponent(name, constants, getData) { From c8727014c6969c46b2b7d9296b5d0aa73cc3c97e Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Mon, 15 Nov 2021 14:34:21 -0800 Subject: [PATCH 5/9] Fixes issue if yAxis returns different lengths --- docs/assets/js/frappe-charts.min.js | 36 ++++++++++++++++++++++-- docs/assets/js/frappe-charts.min.js.map | 2 +- src/js/charts/AxisChart.js | 37 +++++++++++++++++++++++-- 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index b683f4b..4cc02f8 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -4141,7 +4141,7 @@ var AxisChart = function (_BaseChart) { this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span'; // if we have yAxis config settings lets populate a yAxis config array. - if (yAxis.id && yAxis.position) { + if (yAxis && yAxis.id && yAxis.position) { this.config.yAxisConfig = [yAxis]; } } @@ -4214,7 +4214,9 @@ var AxisChart = function (_BaseChart) { zeroLine = void 0, positions = void 0, yAxisConfigObject = void 0, - yAxisAlignment = void 0; + yAxisAlignment = void 0, + yKeys = void 0; + yKeys = []; yAxisConfigObject = this.config.yAxisMode || {}; yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; @@ -4251,11 +4253,17 @@ var AxisChart = function (_BaseChart) { positions = yPts.map(function (d) { return zeroLine - d * scaleMultiplier; }); + yKeys.push(key); if (_this2.state.yAxis.length > 1) { var yPtsArray = []; var firstArr = _this2.state.yAxis[0]; + + // we need to calculate the scaleMultiplier. + + // now that we have an accurate scaleMultiplier we can // we need to loop through original positions. + scaleMultiplier = _this2.height / getValueRange(yPts); firstArr.positions.forEach(function (pos) { yPtsArray.push(Math.ceil(pos / scaleMultiplier)); }); @@ -4278,6 +4286,30 @@ var AxisChart = function (_BaseChart) { for (var key in dataValues) { _loop(key); } + + // the labels are not aligned in length between the two yAxis objects, + // we need to run some new calculations. + if (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) { + var newYptsArr = []; + // find the shorter array + var shortest = this.state.yAxis.reduce(function (p, c) { + return p.length > c.labels.length ? c : p; + }, { length: Infinity }); + // return the longest + var longest = this.state.yAxis.reduce(function (p, c) { + return p.length < c.labels.length ? p : c; + }, { length: Infinity }); + + // we now need to populate the shortest obj with the new scale multiplier + // with the positions of the longest obj. + longest.positions.forEach(function (pos) { + // calculate a new yPts + newYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier)); + }); + + shortest.labels = newYptsArr.reverse(); + shortest.positions = longest.positions; + } } // Dependent if above changes diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index 1a7def7..c2b2051 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/objects/SvgTip.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/css/chartsCss.js","../../../src/js/utils/export.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/utils/intervals.js","../../../src/js/charts/Heatmap.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/chart.js","../../../src/js/index.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                    \n\t\t\t\t
                                    `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment;\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n // we need to loop through original positions.\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["$","expr","con","document","querySelector","create","tag","o","element","createElement","i","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","getOffset","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","BASE_MEASURES","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","totalExtraHeight","legendHeight","getExtraWidth","totalExtraWidth","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","DEFAULT_AXIS_CHART_TYPE","AXIS_DATASET_CHART_TYPES","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","DOT_OVERLAY_SIZE_INCR","PERCENTAGE_BAR_DEFAULT_HEIGHT","PERCENTAGE_BAR_DEFAULT_DEPTH","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","HEATMAP_GUTTER_SIZE","DEFAULT_CHAR_WIDTH","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","HEATMAP_COLORS_GREEN","DEFAULT_COLORS","ANGLE_RATIO","Math","PI","FULL_ANGLE","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","hideTip","title","dataPointList","addEventListener","index","innerHTML","set","color","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","push","smoothing","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","n","bezierCommand","point","a","cps","cpe","pointStr","command","reduce","acc","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","HEX_RE","RGB_RE","test","exec","c","ch","AXIS_TICK_LENGTH","LABEL_MARGIN","LABEL_MAX_CHARS","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","makeSVGContainer","className","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","stroke","strokeWidth","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","heatSquare","size","data","legendBar","truncate","text","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","position","rotation","labelSvg","yLine","pos","mode","xLine","yMarker","labelPos","yRegion","region","datasetBar","meta","minHeight","datasetDot","dot","getPaths","pointsList","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","updateOverlay","attributes","values","filter","includes","attr","specified","nodeValue","UNIT_ANIM_DUR","PATH_ANIM_DUR","MARKER_LINE_ANIM_DUR","REPLACE_ALL_NEW_DUR","STD_EASING","translate","oldCoord","newCoord","duration","old","translateVertLine","newX","oldX","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","rectAnim","groupAnim","animateBar","bar","oldCoordStr","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","EASING","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","CSSTEXT","downloadFile","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","firstChild","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","error","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","millisecondsPerDay","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","sliceStrings","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","newOptions","startPos","endPos","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","monthNameHeight","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","Object","newValues","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","man","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","COL_WIDTH","ROW_HEIGHT","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","moreTextX","moreText","startMonth","startYear","endMonth","endYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","yRegions","zeroDataPrep","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","seriesMultiple","maxLabelLength","AxisChart","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","find","yPtsArray","firstArr","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","groupBy","cur","generateCumulative","cumulative","groupedDataSets","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","titles","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","setCurrentDataPoint","data_point","getDataPoint","datasetValues","splice","DonutChart","chartTypes","getChartByType","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/objects/SvgTip.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/css/chartsCss.js","../../../src/js/utils/export.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/utils/intervals.js","../../../src/js/charts/Heatmap.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/chart.js","../../../src/js/index.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                      \n\t\t\t\t
                                      `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["$","expr","con","document","querySelector","create","tag","o","element","createElement","i","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","getOffset","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","BASE_MEASURES","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","totalExtraHeight","legendHeight","getExtraWidth","totalExtraWidth","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","DEFAULT_AXIS_CHART_TYPE","AXIS_DATASET_CHART_TYPES","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","DOT_OVERLAY_SIZE_INCR","PERCENTAGE_BAR_DEFAULT_HEIGHT","PERCENTAGE_BAR_DEFAULT_DEPTH","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","HEATMAP_GUTTER_SIZE","DEFAULT_CHAR_WIDTH","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","HEATMAP_COLORS_GREEN","DEFAULT_COLORS","ANGLE_RATIO","Math","PI","FULL_ANGLE","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","hideTip","title","dataPointList","addEventListener","index","innerHTML","set","color","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","push","smoothing","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","n","bezierCommand","point","a","cps","cpe","pointStr","command","reduce","acc","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","HEX_RE","RGB_RE","test","exec","c","ch","AXIS_TICK_LENGTH","LABEL_MARGIN","LABEL_MAX_CHARS","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","makeSVGContainer","className","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","stroke","strokeWidth","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","heatSquare","size","data","legendBar","truncate","text","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","position","rotation","labelSvg","yLine","pos","mode","xLine","yMarker","labelPos","yRegion","region","datasetBar","meta","minHeight","datasetDot","dot","getPaths","pointsList","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","updateOverlay","attributes","values","filter","includes","attr","specified","nodeValue","UNIT_ANIM_DUR","PATH_ANIM_DUR","MARKER_LINE_ANIM_DUR","REPLACE_ALL_NEW_DUR","STD_EASING","translate","oldCoord","newCoord","duration","old","translateVertLine","newX","oldX","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","rectAnim","groupAnim","animateBar","bar","oldCoordStr","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","EASING","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","CSSTEXT","downloadFile","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","firstChild","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","error","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","millisecondsPerDay","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","sliceStrings","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","newOptions","startPos","endPos","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","monthNameHeight","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","Object","newValues","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","man","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","COL_WIDTH","ROW_HEIGHT","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","moreTextX","moreText","startMonth","startYear","endMonth","endYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","yRegions","zeroDataPrep","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","seriesMultiple","maxLabelLength","AxisChart","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","groupBy","cur","generateCumulative","cumulative","groupedDataSets","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","titles","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","setCurrentDataPoint","data_point","getDataPoint","datasetValues","splice","DonutChart","chartTypes","getChartByType","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file diff --git a/src/js/charts/AxisChart.js b/src/js/charts/AxisChart.js index 4a1c325..1effd78 100644 --- a/src/js/charts/AxisChart.js +++ b/src/js/charts/AxisChart.js @@ -54,7 +54,7 @@ export default class AxisChart extends BaseChart { this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span'; // if we have yAxis config settings lets populate a yAxis config array. - if (yAxis.id && yAxis.position) { + if (yAxis && yAxis.id && yAxis.position) { this.config.yAxisConfig = [yAxis] } } @@ -107,7 +107,8 @@ export default class AxisChart extends BaseChart { calcYAxisParameters(dataValues, withMinimum = 'false') { - let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment; + let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys; + yKeys = []; yAxisConfigObject = this.config.yAxisMode || {}; yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; @@ -137,11 +138,17 @@ export default class AxisChart extends BaseChart { intervalHeight = getIntervalSize(yPts) * scaleMultiplier; zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; positions = yPts.map((d) => zeroLine - d * scaleMultiplier); + yKeys.push(key); if (this.state.yAxis.length > 1) { const yPtsArray = []; const firstArr = this.state.yAxis[0]; + + // we need to calculate the scaleMultiplier. + + // now that we have an accurate scaleMultiplier we can // we need to loop through original positions. + scaleMultiplier = this.height / getValueRange(yPts); firstArr.positions.forEach((pos) => { yPtsArray.push(Math.ceil(pos / scaleMultiplier)); }); @@ -160,6 +167,32 @@ export default class AxisChart extends BaseChart { positions }); } + + // the labels are not aligned in length between the two yAxis objects, + // we need to run some new calculations. + if (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) { + const newYptsArr = []; + // find the shorter array + const shortest = this.state.yAxis.reduce((p,c) => { + return p.length > c.labels.length ? c : p; + }, + { length: Infinity }); + // return the longest + const longest = this.state.yAxis.reduce((p,c) => { + return p.length < c.labels.length ? p : c; + }, + { length: Infinity }); + + // we now need to populate the shortest obj with the new scale multiplier + // with the positions of the longest obj. + longest.positions.forEach((pos) => { + // calculate a new yPts + newYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier)); + }); + + shortest.labels = newYptsArr.reverse(); + shortest.positions = longest.positions; + } } // Dependent if above changes From ec86f7c39fdf5ddbe468d5f8fd97838a39517548 Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Mon, 15 Nov 2021 14:46:31 -0800 Subject: [PATCH 6/9] uglyfying --- docs/assets/js/frappe-charts.min.js | 5143 +---------------------- docs/assets/js/frappe-charts.min.js.map | 2 +- 2 files changed, 2 insertions(+), 5143 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index 4cc02f8..011925f 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -1,5143 +1,2 @@ -var frappe = (function () { -'use strict'; - -function styleInject(css, ref) { - if ( ref === void 0 ) ref = {}; - var insertAt = ref.insertAt; - - if (!css || typeof document === 'undefined') { return; } - - var head = document.head || document.getElementsByTagName('head')[0]; - var style = document.createElement('style'); - style.type = 'text/css'; - - if (insertAt === 'top') { - if (head.firstChild) { - head.insertBefore(style, head.firstChild); - } else { - head.appendChild(style); - } - } else { - head.appendChild(style); - } - - if (style.styleSheet) { - style.styleSheet.cssText = css; - } else { - style.appendChild(document.createTextNode(css)); - } -} - -var css = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:\" \";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}"; -styleInject(css); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - -var asyncGenerator = function () { - function AwaitValue(value) { - this.value = value; - } - - function AsyncGenerator(gen) { - var front, back; - - function send(key, arg) { - return new Promise(function (resolve, reject) { - var request = { - key: key, - arg: arg, - resolve: resolve, - reject: reject, - next: null - }; - - if (back) { - back = back.next = request; - } else { - front = back = request; - resume(key, arg); - } - }); - } - - function resume(key, arg) { - try { - var result = gen[key](arg); - var value = result.value; - - if (value instanceof AwaitValue) { - Promise.resolve(value.value).then(function (arg) { - resume("next", arg); - }, function (arg) { - resume("throw", arg); - }); - } else { - settle(result.done ? "return" : "normal", result.value); - } - } catch (err) { - settle("throw", err); - } - } - - function settle(type, value) { - switch (type) { - case "return": - front.resolve({ - value: value, - done: true - }); - break; - - case "throw": - front.reject(value); - break; - - default: - front.resolve({ - value: value, - done: false - }); - break; - } - - front = front.next; - - if (front) { - resume(front.key, front.arg); - } else { - back = null; - } - } - - this._invoke = send; - - if (typeof gen.return !== "function") { - this.return = undefined; - } - } - - if (typeof Symbol === "function" && Symbol.asyncIterator) { - AsyncGenerator.prototype[Symbol.asyncIterator] = function () { - return this; - }; - } - - AsyncGenerator.prototype.next = function (arg) { - return this._invoke("next", arg); - }; - - AsyncGenerator.prototype.throw = function (arg) { - return this._invoke("throw", arg); - }; - - AsyncGenerator.prototype.return = function (arg) { - return this._invoke("return", arg); - }; - - return { - wrap: function (fn) { - return function () { - return new AsyncGenerator(fn.apply(this, arguments)); - }; - }, - await: function (value) { - return new AwaitValue(value); - } - }; -}(); - - - - - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - -var get = function get(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } -}; - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - - - - - - - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - - - - - -var slicedToArray = function () { - function sliceIterator(arr, i) { - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if (Symbol.iterator in Object(arr)) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; -}(); - - - - - - - - - - - - - -var toConsumableArray = function (arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - - return arr2; - } else { - return Array.from(arr); - } -}; - -function $(expr, con) { - return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null; -} - - - -$.create = function (tag, o) { - var element = document.createElement(tag); - - for (var i in o) { - var val = o[i]; - - if (i === "inside") { - $(val).appendChild(element); - } else if (i === "around") { - var ref = $(val); - ref.parentNode.insertBefore(element, ref); - element.appendChild(ref); - } else if (i === "styles") { - if ((typeof val === "undefined" ? "undefined" : _typeof(val)) === "object") { - Object.keys(val).map(function (prop) { - element.style[prop] = val[prop]; - }); - } - } else if (i in element) { - element[i] = val; - } else { - element.setAttribute(i, val); - } - } - - return element; -}; - -function getOffset(element) { - var rect = element.getBoundingClientRect(); - return { - // https://stackoverflow.com/a/7436602/6495043 - // rect.top varies with scroll, so we add whatever has been - // scrolled to it to get absolute distance from actual page top - top: rect.top + (document.documentElement.scrollTop || document.body.scrollTop), - left: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft) - }; -} - -// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent -// an element's offsetParent property will return null whenever it, or any of its parents, -// is hidden via the display style property. -function isHidden(el) { - return el.offsetParent === null; -} - -function isElementInViewport(el) { - // Although straightforward: https://stackoverflow.com/a/7557433/6495043 - var rect = el.getBoundingClientRect(); - - return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ - rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ - ; -} - -function getElementContentWidth(element) { - var styles = window.getComputedStyle(element); - var padding = parseFloat(styles.paddingLeft) + parseFloat(styles.paddingRight); - - return element.clientWidth - padding; -} - - - - - -function fire(target, type, properties) { - var evt = document.createEvent("HTMLEvents"); - - evt.initEvent(type, true, true); - - for (var j in properties) { - evt[j] = properties[j]; - } - - return target.dispatchEvent(evt); -} - -// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/ - -var BASE_MEASURES = { - margins: { - top: 10, - bottom: 10, - left: 20, - right: 20 - }, - paddings: { - top: 20, - bottom: 40, - left: 30, - right: 10 - }, - - baseHeight: 240, - titleHeight: 20, - legendHeight: 30, - - titleFontSize: 12 -}; - -function getTopOffset(m) { - return m.titleHeight + m.margins.top + m.paddings.top; -} - -function getLeftOffset(m) { - return m.margins.left + m.paddings.left; -} - -function getExtraHeight(m) { - var totalExtraHeight = m.margins.top + m.margins.bottom + m.paddings.top + m.paddings.bottom + m.titleHeight + m.legendHeight; - return totalExtraHeight; -} - -function getExtraWidth(m) { - var totalExtraWidth = m.margins.left + m.margins.right + m.paddings.left + m.paddings.right; - - return totalExtraWidth; -} - -var INIT_CHART_UPDATE_TIMEOUT = 700; -var CHART_POST_ANIMATE_TIMEOUT = 400; - -var DEFAULT_AXIS_CHART_TYPE = 'line'; -var AXIS_DATASET_CHART_TYPES = ['line', 'bar']; - -var AXIS_LEGEND_BAR_SIZE = 100; - -var BAR_CHART_SPACE_RATIO = 0.5; -var MIN_BAR_PERCENT_HEIGHT = 0.00; - -var LINE_CHART_DOT_SIZE = 4; -var DOT_OVERLAY_SIZE_INCR = 4; - -var PERCENTAGE_BAR_DEFAULT_HEIGHT = 20; -var PERCENTAGE_BAR_DEFAULT_DEPTH = 2; - -// Fixed 5-color theme, -// More colors are difficult to parse visually -var HEATMAP_DISTRIBUTION_SIZE = 5; - -var HEATMAP_SQUARE_SIZE = 10; -var HEATMAP_GUTTER_SIZE = 2; - -var DEFAULT_CHAR_WIDTH = 7; - -var TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5; - -var DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange', 'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey']; -var HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127']; - - - -var DEFAULT_COLORS = { - bar: DEFAULT_CHART_COLORS, - line: DEFAULT_CHART_COLORS, - pie: DEFAULT_CHART_COLORS, - percentage: DEFAULT_CHART_COLORS, - heatmap: HEATMAP_COLORS_GREEN, - donut: DEFAULT_CHART_COLORS -}; - -// Universal constants -var ANGLE_RATIO = Math.PI / 180; -var FULL_ANGLE = 360; - -var SvgTip = function () { - function SvgTip(_ref) { - var _ref$parent = _ref.parent, - parent = _ref$parent === undefined ? null : _ref$parent, - _ref$colors = _ref.colors, - colors = _ref$colors === undefined ? [] : _ref$colors; - classCallCheck(this, SvgTip); - - this.parent = parent; - this.colors = colors; - this.titleName = ''; - this.titleValue = ''; - this.listValues = []; - this.titleValueFirst = 0; - - this.x = 0; - this.y = 0; - - this.top = 0; - this.left = 0; - - this.setup(); - } - - createClass(SvgTip, [{ - key: 'setup', - value: function setup() { - this.makeTooltip(); - } - }, { - key: 'refresh', - value: function refresh() { - this.fill(); - this.calcPosition(); - } - }, { - key: 'makeTooltip', - value: function makeTooltip() { - var _this = this; - - this.container = $.create('div', { - inside: this.parent, - className: 'graph-svg-tip comparison', - innerHTML: '\n\t\t\t\t
                                        \n\t\t\t\t
                                        ' - }); - this.hideTip(); - - this.title = this.container.querySelector('.title'); - this.dataPointList = this.container.querySelector('.data-point-list'); - - this.parent.addEventListener('mouseleave', function () { - _this.hideTip(); - }); - } - }, { - key: 'fill', - value: function fill() { - var _this2 = this; - - var title = void 0; - if (this.index) { - this.container.setAttribute('data-point-index', this.index); - } - if (this.titleValueFirst) { - title = '' + this.titleValue + '' + this.titleName; - } else { - title = this.titleName + '' + this.titleValue + ''; - } - this.title.innerHTML = title; - this.dataPointList.innerHTML = ''; - - this.listValues.map(function (set$$1, i) { - var color = _this2.colors[i] || 'black'; - var value = set$$1.formatted === 0 || set$$1.formatted ? set$$1.formatted : set$$1.value; - - var li = $.create('li', { - styles: { - 'border-top': '3px solid ' + color - }, - innerHTML: '' + (value === 0 || value ? value : '') + '\n\t\t\t\t\t' + (set$$1.title ? set$$1.title : '') - }); - - _this2.dataPointList.appendChild(li); - }); - } - }, { - key: 'calcPosition', - value: function calcPosition() { - var width = this.container.offsetWidth; - - this.top = this.y - this.container.offsetHeight - TOOLTIP_POINTER_TRIANGLE_HEIGHT; - this.left = this.x - width / 2; - var maxLeft = this.parent.offsetWidth - width; - - var pointer = this.container.querySelector('.svg-pointer'); - - if (this.left < 0) { - pointer.style.left = 'calc(50% - ' + -1 * this.left + 'px)'; - this.left = 0; - } else if (this.left > maxLeft) { - var delta = this.left - maxLeft; - var pointerOffset = 'calc(50% + ' + delta + 'px)'; - pointer.style.left = pointerOffset; - - this.left = maxLeft; - } else { - pointer.style.left = '50%'; - } - } - }, { - key: 'setValues', - value: function setValues(x, y) { - var title = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var listValues = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; - var index = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : -1; - - this.titleName = title.name; - this.titleValue = title.value; - this.listValues = listValues; - this.x = x; - this.y = y; - this.titleValueFirst = title.valueFirst || 0; - this.index = index; - this.refresh(); - } - }, { - key: 'hideTip', - value: function hideTip() { - this.container.style.top = '0px'; - this.container.style.left = '0px'; - this.container.style.opacity = '0'; - } - }, { - key: 'showTip', - value: function showTip() { - this.container.style.top = this.top + 'px'; - this.container.style.left = this.left + 'px'; - this.container.style.opacity = '1'; - } - }]); - return SvgTip; -}(); - -function floatTwo(d) { - return parseFloat(d.toFixed(2)); -} - -/** - * Returns whether or not two given arrays are equal. - * @param {Array} arr1 First array - * @param {Array} arr2 Second array - */ - - -/** - * Shuffles array in place. ES6 version - * @param {Array} array An array containing the items. - */ - - -/** - * Fill an array with extra points - * @param {Array} array Array - * @param {Number} count number of filler elements - * @param {Object} element element to fill with - * @param {Boolean} start fill at start? - */ -function fillArray(array, count, element) { - var start = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - - if (!element) { - element = start ? array[0] : array[array.length - 1]; - } - var fillerArray = new Array(Math.abs(count)).fill(element); - array = start ? fillerArray.concat(array) : array.concat(fillerArray); - return array; -} - -/** - * Returns pixel width of string. - * @param {String} string - * @param {Number} charWidth Width of single char in pixels - */ -function getStringWidth(string, charWidth) { - return (string + "").length * charWidth; -} - - - -// https://stackoverflow.com/a/29325222 - - -function getPositionByAngle(angle, radius) { - return { - x: Math.sin(angle * ANGLE_RATIO) * radius, - y: Math.cos(angle * ANGLE_RATIO) * radius - }; -} - -/** - * Check if a number is valid for svg attributes - * @param {object} candidate Candidate to test - * @param {Boolean} nonNegative flag to treat negative number as invalid - */ -function isValidNumber(candidate) { - var nonNegative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (Number.isNaN(candidate)) return false;else if (candidate === undefined) return false;else if (!Number.isFinite(candidate)) return false;else if (nonNegative && candidate < 0) return false;else return true; -} - -/** - * Round a number to the closes precision, max max precision 4 - * @param {Number} d Any Number - */ -function round(d) { - // https://floating-point-gui.de/ - // https://www.jacklmoore.com/notes/rounding-in-javascript/ - return Number(Math.round(d + 'e4') + 'e-4'); -} - -/** - * Creates a deep clone of an object - * @param {Object} candidate Any Object - */ -function deepClone(candidate) { - var cloned = void 0, - value = void 0, - key = void 0; - - if (candidate instanceof Date) { - return new Date(candidate.getTime()); - } - - if ((typeof candidate === 'undefined' ? 'undefined' : _typeof(candidate)) !== "object" || candidate === null) { - return candidate; - } - - cloned = Array.isArray(candidate) ? [] : {}; - - for (key in candidate) { - value = candidate[key]; - - cloned[key] = deepClone(value); - } - - return cloned; -} - -function getBarHeightAndYAttr(yTop, zeroLine) { - var height = void 0, - y = void 0; - if (yTop <= zeroLine) { - height = zeroLine - yTop; - y = yTop; - } else { - height = yTop - zeroLine; - y = zeroLine; - } - - return [height, y]; -} - -function equilizeNoOfElements(array1, array2) { - var extraCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : array2.length - array1.length; - - - // Doesn't work if either has zero elements. - if (extraCount > 0) { - array1 = fillArray(array1, extraCount); - } else { - array2 = fillArray(array2, extraCount); - } - return [array1, array2]; -} - -function truncateString(txt, len) { - if (!txt) { - return; - } - if (txt.length > len) { - return txt.slice(0, len - 3) + '...'; - } else { - return txt; - } -} - -function shortenLargeNumber(label) { - var number = void 0; - if (typeof label === 'number') number = label;else if (typeof label === 'string') { - number = Number(label); - if (Number.isNaN(number)) return label; - } - - // Using absolute since log wont work for negative numbers - var p = Math.floor(Math.log10(Math.abs(number))); - if (p <= 2) return number; // Return as is for a 3 digit number of less - var l = Math.floor(p / 3); - var shortened = Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1); - - // Correct for floating point error upto 2 decimal places - return Math.round(shortened * 100) / 100 + ' ' + ['', 'K', 'M', 'B', 'T'][l]; -} - -// cubic bezier curve calculation (from example by François Romain) -function getSplineCurvePointsStr(xList, yList) { - - var points = []; - for (var i = 0; i < xList.length; i++) { - points.push([xList[i], yList[i]]); - } - - var smoothing = 0.2; - var line = function line(pointA, pointB) { - var lengthX = pointB[0] - pointA[0]; - var lengthY = pointB[1] - pointA[1]; - return { - length: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)), - angle: Math.atan2(lengthY, lengthX) - }; - }; - - var controlPoint = function controlPoint(current, previous, next, reverse) { - var p = previous || current; - var n = next || current; - var o = line(p, n); - var angle = o.angle + (reverse ? Math.PI : 0); - var length = o.length * smoothing; - var x = current[0] + Math.cos(angle) * length; - var y = current[1] + Math.sin(angle) * length; - return [x, y]; - }; - - var bezierCommand = function bezierCommand(point, i, a) { - var cps = controlPoint(a[i - 1], a[i - 2], point); - var cpe = controlPoint(point, a[i - 1], a[i + 1], true); - return 'C ' + cps[0] + ',' + cps[1] + ' ' + cpe[0] + ',' + cpe[1] + ' ' + point[0] + ',' + point[1]; - }; - - var pointStr = function pointStr(points, command) { - return points.reduce(function (acc, point, i, a) { - return i === 0 ? point[0] + ',' + point[1] : acc + ' ' + command(point, i, a); - }, ''); - }; - - return pointStr(points, bezierCommand); -} - -var PRESET_COLOR_MAP = { - 'light-blue': '#7cd6fd', - 'blue': '#5e64ff', - 'violet': '#743ee2', - 'red': '#ff5858', - 'orange': '#ffa00a', - 'yellow': '#feef72', - 'green': '#28a745', - 'light-green': '#98d85b', - 'purple': '#b554ff', - 'magenta': '#ffa3ef', - 'black': '#36114C', - 'grey': '#bdd3e6', - 'light-grey': '#f0f4f7', - 'dark-grey': '#b8c2cc' -}; - -function limitColor(r) { - if (r > 255) return 255;else if (r < 0) return 0; - return r; -} - -function lightenDarkenColor(color, amt) { - var col = getColor(color); - var usePound = false; - if (col[0] == "#") { - col = col.slice(1); - usePound = true; - } - var num = parseInt(col, 16); - var r = limitColor((num >> 16) + amt); - var b = limitColor((num >> 8 & 0x00FF) + amt); - var g = limitColor((num & 0x0000FF) + amt); - return (usePound ? "#" : "") + (g | b << 8 | r << 16).toString(16); -} - -function isValidColor(string) { - // https://stackoverflow.com/a/32685393 - var HEX_RE = /(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i; - var RGB_RE = /(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i; - return HEX_RE.test(string) || RGB_RE.test(string); -} - -var getColor = function getColor(color) { - // When RGB color, convert to hexadecimal (alpha value is omitted) - if (/rgb[a]{0,1}\([\d, ]+\)/gim.test(color)) { - return (/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(color).map(function (x, i) { - return i !== 0 ? Number(x).toString(16) : '#'; - }).reduce(function (c, ch) { - return '' + c + ch; - }) - ); - } - return PRESET_COLOR_MAP[color] || color; -}; - -var AXIS_TICK_LENGTH = 6; -var LABEL_MARGIN = 4; -var LABEL_MAX_CHARS = 15; -var FONT_SIZE = 10; -var BASE_LINE_COLOR = '#dadada'; -var FONT_FILL = '#555b51'; - -function $$1(expr, con) { - return typeof expr === "string" ? (con || document).querySelector(expr) : expr || null; -} - -function createSVG(tag, o) { - var element = document.createElementNS("http://www.w3.org/2000/svg", tag); - - for (var i in o) { - var val = o[i]; - - if (i === "inside") { - $$1(val).appendChild(element); - } else if (i === "around") { - var ref = $$1(val); - ref.parentNode.insertBefore(element, ref); - element.appendChild(ref); - } else if (i === "styles") { - if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === "object") { - Object.keys(val).map(function (prop) { - element.style[prop] = val[prop]; - }); - } - } else { - if (i === "className") { - i = "class"; - } - if (i === "innerHTML") { - element['textContent'] = val; - } else { - element.setAttribute(i, val); - } - } - } - - return element; -} - -function renderVerticalGradient(svgDefElem, gradientId) { - return createSVG('linearGradient', { - inside: svgDefElem, - id: gradientId, - x1: 0, - x2: 0, - y1: 0, - y2: 1 - }); -} - -function setGradientStop(gradElem, offset, color, opacity) { - return createSVG('stop', { - 'inside': gradElem, - 'style': 'stop-color: ' + color, - 'offset': offset, - 'stop-opacity': opacity - }); -} - -function makeSVGContainer(parent, className, width, height) { - return createSVG('svg', { - className: className, - inside: parent, - width: width, - height: height - }); -} - -function makeSVGDefs(svgContainer) { - return createSVG('defs', { - inside: svgContainer - }); -} - -function makeSVGGroup(className) { - var transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var parent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - - var args = { - className: className, - transform: transform - }; - if (parent) args.inside = parent; - return createSVG('g', args); -} - - - -function makePath(pathStr) { - var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var stroke = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'none'; - var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; - var strokeWidth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 2; - - return createSVG('path', { - className: className, - d: pathStr, - styles: { - stroke: stroke, - fill: fill, - 'stroke-width': strokeWidth - } - }); -} - -function makeArcPathStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - arcEndY = center.y + endPosition.y; - - return 'M' + center.x + ' ' + center.y + '\n\t\tL' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY + ' z'; -} - -function makeCircleStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - midArc = center.y * 2, - arcEndY = center.y + endPosition.y; - - return 'M' + center.x + ' ' + center.y + '\n\t\tL' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + midArc + ' z\n\t\tL' + arcStartX + ' ' + midArc + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY + ' z'; -} - -function makeArcStrokePathStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - arcEndY = center.y + endPosition.y; - - - return 'M' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY; -} - -function makeStrokeCircleStr(startPosition, endPosition, center, radius) { - var clockWise = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1; - var largeArc = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var arcStartX = center.x + startPosition.x, - arcStartY = center.y + startPosition.y; - var arcEndX = center.x + endPosition.x, - midArc = radius * 2 + arcStartY, - arcEndY = center.y + startPosition.y; - - - return 'M' + arcStartX + ' ' + arcStartY + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + midArc + '\n\t\tM' + arcStartX + ' ' + midArc + '\n\t\tA ' + radius + ' ' + radius + ' 0 ' + largeArc + ' ' + (clockWise ? 1 : 0) + '\n\t\t' + arcEndX + ' ' + arcEndY; -} - -function makeGradient(svgDefElem, color) { - var lighter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var gradientId = 'path-fill-gradient' + '-' + color + '-' + (lighter ? 'lighter' : 'default'); - var gradientDef = renderVerticalGradient(svgDefElem, gradientId); - var opacities = [1, 0.6, 0.2]; - if (lighter) { - opacities = [0.4, 0.2, 0]; - } - - setGradientStop(gradientDef, "0%", color, opacities[0]); - setGradientStop(gradientDef, "50%", color, opacities[1]); - setGradientStop(gradientDef, "100%", color, opacities[2]); - - return gradientId; -} - -function percentageBar(x, y, width, height) { - var depth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : PERCENTAGE_BAR_DEFAULT_DEPTH; - var fill = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'none'; - - - var args = { - className: 'percentage-bar', - x: x, - y: y, - width: width, - height: height, - fill: fill, - styles: { - 'stroke': lightenDarkenColor(fill, -25), - // Diabolically good: https://stackoverflow.com/a/9000859 - // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray - 'stroke-dasharray': '0, ' + (height + width) + ', ' + width + ', ' + height, - 'stroke-width': depth - } - }; - - return createSVG("rect", args); -} - -function heatSquare(className, x, y, size, radius) { - var fill = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'none'; - var data = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : {}; - - var args = { - className: className, - x: x, - y: y, - width: size, - height: size, - rx: radius, - fill: fill - }; - - Object.keys(data).map(function (key) { - args[key] = data[key]; - }); - - return createSVG("rect", args); -} - -function legendBar(x, y, size) { - var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; - var label = arguments[4]; - var truncate = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; - - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - - var args = { - className: 'legend-bar', - x: 0, - y: 0, - width: size, - height: '2px', - fill: fill - }; - var text = createSVG('text', { - className: 'legend-dataset-text', - x: 0, - y: 0, - dy: FONT_SIZE * 2 + 'px', - 'font-size': FONT_SIZE * 1.2 + 'px', - 'text-anchor': 'start', - fill: FONT_FILL, - innerHTML: label - }); - - var group = createSVG('g', { - transform: 'translate(' + x + ', ' + y + ')' - }); - group.appendChild(createSVG("rect", args)); - group.appendChild(text); - - return group; -} - -function legendDot(x, y, size) { - var fill = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'none'; - var label = arguments[4]; - var truncate = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; - - label = truncate ? truncateString(label, LABEL_MAX_CHARS) : label; - - var args = { - className: 'legend-dot', - cx: 0, - cy: 0, - r: size, - fill: fill - }; - var text = createSVG('text', { - className: 'legend-dataset-text', - x: 0, - y: 0, - dx: FONT_SIZE + 'px', - dy: FONT_SIZE / 3 + 'px', - 'font-size': FONT_SIZE * 1.2 + 'px', - 'text-anchor': 'start', - fill: FONT_FILL, - innerHTML: label - }); - - var group = createSVG('g', { - transform: 'translate(' + x + ', ' + y + ')' - }); - group.appendChild(createSVG("circle", args)); - group.appendChild(text); - - return group; -} - -function makeText(className, x, y, content) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - var fontSize = options.fontSize || FONT_SIZE; - var dy = options.dy !== undefined ? options.dy : fontSize / 2; - var fill = options.fill || FONT_FILL; - var textAnchor = options.textAnchor || 'start'; - return createSVG('text', { - className: className, - x: x, - y: y, - dy: dy + 'px', - 'font-size': fontSize + 'px', - fill: fill, - 'text-anchor': textAnchor, - innerHTML: content - }); -} - -function makeVertLine(x, label, y1, y2) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - var l = createSVG('line', { - className: 'line-vertical ' + options.className, - x1: 0, - x2: 0, - y1: y1, - y2: y2, - styles: { - stroke: options.stroke - } - }); - - var text = createSVG('text', { - x: 0, - y: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE, - dy: FONT_SIZE + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'middle', - innerHTML: label + "" - }); - - var line = createSVG('g', { - transform: 'translate(' + x + ', 0)' - }); - - line.appendChild(l); - line.appendChild(text); - - return line; -} - -function makeHoriLine(y, label, x1, x2) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.lineType) options.lineType = ''; - if (!options.alignment) options.alignment = 'left'; - if (options.shortenNumbers) label = shortenLargeNumber(label); - - var className = 'line-horizontal ' + options.className + (options.lineType === 'dashed' ? 'dashed' : ''); - - var l = createSVG('line', { - className: className, - x1: x1, - x2: x2, - y1: 0, - y2: 0, - styles: { - stroke: options.stroke - } - }); - - var text = createSVG('text', { - x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4, - y: 0, - dy: FONT_SIZE / 2 - 2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': x1 < x2 ? 'end' : 'start', - innerHTML: label + '' - }); - - var line = createSVG('g', { - transform: 'translate(0, ' + y + ')', - 'stroke-opacity': 1 - }); - - if (text === 0 || text === '0') { - line.style.stroke = 'rgba(27, 31, 35, 0.6)'; - } - - line.appendChild(l); - line.appendChild(text); - - return line; -} - -function generateAxisLabel(options) { - if (!options.title) return; - - var x = options.position === 'left' ? LABEL_MARGIN : options.width; - // - getStringWidth(options.title, 5); - var rotation = options.position === 'right' ? 'rotate(90, ' + options.width + ', ' + options.height / 2 + ')' : 'rotate(270, 0, ' + options.height / 2 + ')'; - - var labelSvg = createSVG('text', { - className: 'chart-label', - x: x - getStringWidth(options.title, 5) / 2, - y: options.height / 2 - LABEL_MARGIN, - dy: FONT_SIZE / -2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'start', - transform: rotation, - innerHTML: options.title + '' - }); - - return labelSvg; -} - -function yLine(y, label, width) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - if (!isValidNumber(y)) y = 0; - - if (!options.pos) options.pos = 'left'; - if (!options.offset) options.offset = 0; - if (!options.mode) options.mode = 'span'; - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.className) options.className = ''; - - var x1 = -1 * AXIS_TICK_LENGTH; - var x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0; - - if (options.mode === 'tick' && options.pos === 'right') { - x1 = width + AXIS_TICK_LENGTH; - x2 = width; - } - - var offset = options.pos === 'left' ? -1 * options.offset : options.offset; - - x1 += offset; - x2 += offset; - - return makeHoriLine(y, label, x1, x2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType, - alignment: options.pos, - shortenNumbers: options.shortenNumbers - }); -} - -function xLine(x, label, height) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - if (!isValidNumber(x)) x = 0; - - if (!options.pos) options.pos = 'bottom'; - if (!options.offset) options.offset = 0; - if (!options.mode) options.mode = 'span'; - if (!options.stroke) options.stroke = BASE_LINE_COLOR; - if (!options.className) options.className = ''; - - // Draw X axis line in span/tick mode with optional label - // y2(span) - // | - // | - // x line | - // | - // | - // ---------------------+-- y2(tick) - // | - // y1 - - var y1 = height + AXIS_TICK_LENGTH; - var y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height; - - if (options.mode === 'tick' && options.pos === 'top') { - // top axis ticks - y1 = -1 * AXIS_TICK_LENGTH; - y2 = 0; - } - - return makeVertLine(x, label, y1, y2, { - stroke: options.stroke, - className: options.className, - lineType: options.lineType - }); -} - -function yMarker(y, label, width) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - - if (!options.labelPos) options.labelPos = 'right'; - var x = options.labelPos === 'left' ? LABEL_MARGIN : width - getStringWidth(label, 5) - LABEL_MARGIN; - - var labelSvg = createSVG('text', { - className: 'chart-label', - x: x, - y: 0, - dy: FONT_SIZE / -2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'start', - innerHTML: label + "" - }); - - var line = makeHoriLine(y, '', 0, width, { - stroke: options.stroke || BASE_LINE_COLOR, - className: options.className || '', - lineType: options.lineType - }); - - line.appendChild(labelSvg); - - return line; -} - -function yRegion(y1, y2, width, label) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - // return a group - var height = y1 - y2; - - var rect = createSVG('rect', { - className: 'bar mini', // remove class - styles: { - fill: 'rgba(228, 234, 239, 0.49)', - stroke: BASE_LINE_COLOR, - 'stroke-dasharray': width + ', ' + height - }, - // 'data-point-index': index, - x: 0, - y: 0, - width: width, - height: height - }); - - if (!options.labelPos) options.labelPos = 'right'; - var x = options.labelPos === 'left' ? LABEL_MARGIN : width - getStringWidth(label + "", 4.5) - LABEL_MARGIN; - - var labelSvg = createSVG('text', { - className: 'chart-label', - x: x, - y: 0, - dy: FONT_SIZE / -2 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'start', - innerHTML: label + "" - }); - - var region = createSVG('g', { - transform: 'translate(0, ' + y2 + ')' - }); - - region.appendChild(rect); - region.appendChild(labelSvg); - - return region; -} - -function datasetBar(x, yTop, width, color) { - var label = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; - var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - var offset = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0; - var meta = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : {}; - - var _getBarHeightAndYAttr = getBarHeightAndYAttr(yTop, meta.zeroLine), - _getBarHeightAndYAttr2 = slicedToArray(_getBarHeightAndYAttr, 2), - height = _getBarHeightAndYAttr2[0], - y = _getBarHeightAndYAttr2[1]; - - y -= offset; - - if (height === 0) { - height = meta.minHeight; - y -= meta.minHeight; - } - - // Preprocess numbers to avoid svg building errors - if (!isValidNumber(x)) x = 0; - if (!isValidNumber(y)) y = 0; - if (!isValidNumber(height, true)) height = 0; - if (!isValidNumber(width, true)) width = 0; - - var rect = createSVG('rect', { - className: 'bar mini', - style: 'fill: ' + color, - 'data-point-index': index, - x: x, - y: y, - width: width, - height: height - }); - - label += ""; - - if (!label && !label.length) { - return rect; - } else { - rect.setAttribute('y', 0); - rect.setAttribute('x', 0); - var text = createSVG('text', { - className: 'data-point-value', - x: width / 2, - y: 0, - dy: FONT_SIZE / 2 * -1 + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'middle', - innerHTML: label - }); - - var group = createSVG('g', { - 'data-point-index': index, - transform: 'translate(' + x + ', ' + y + ')' - }); - group.appendChild(rect); - group.appendChild(text); - - return group; - } -} - -function datasetDot(x, y, radius, color) { - var label = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : ''; - var index = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - - var dot = createSVG('circle', { - style: 'fill: ' + color, - 'data-point-index': index, - cx: x, - cy: y, - r: radius - }); - - label += ""; - - if (!label && !label.length) { - return dot; - } else { - dot.setAttribute('cy', 0); - dot.setAttribute('cx', 0); - - var text = createSVG('text', { - className: 'data-point-value', - x: 0, - y: 0, - dy: FONT_SIZE / 2 * -1 - radius + 'px', - 'font-size': FONT_SIZE + 'px', - 'text-anchor': 'middle', - innerHTML: label - }); - - var group = createSVG('g', { - 'data-point-index': index, - transform: 'translate(' + x + ', ' + y + ')' - }); - group.appendChild(dot); - group.appendChild(text); - - return group; - } -} - -function getPaths(xList, yList, color) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; - var meta = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - var pointsList = yList.map(function (y, i) { - return xList[i] + ',' + y; - }); - var pointsStr = pointsList.join("L"); - - // Spline - if (options.spline) pointsStr = getSplineCurvePointsStr(xList, yList); - - var path = makePath("M" + pointsStr, 'line-graph-path', color); - - // HeatLine - if (options.heatline) { - var gradient_id = makeGradient(meta.svgDefs, color); - path.style.stroke = 'url(#' + gradient_id + ')'; - } - - var paths = { - path: path - }; - - // Region - if (options.regionFill) { - var gradient_id_region = makeGradient(meta.svgDefs, color, true); - - var pathStr = "M" + (xList[0] + ',' + meta.zeroLine + 'L') + pointsStr + ('L' + xList.slice(-1)[0] + ',' + meta.zeroLine); - paths.region = makePath(pathStr, 'region-fill', 'none', 'url(#' + gradient_id_region + ')'); - } - - return paths; -} - -var makeOverlay = { - 'bar': function bar(unit) { - var transformValue = void 0; - if (unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var overlay = unit.cloneNode(); - overlay.style.fill = '#000000'; - overlay.style.opacity = '0.4'; - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - return overlay; - }, - - 'dot': function dot(unit) { - var transformValue = void 0; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var overlay = unit.cloneNode(); - var radius = unit.getAttribute('r'); - var fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - return overlay; - }, - - 'heat_square': function heat_square(unit) { - var transformValue = void 0; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var overlay = unit.cloneNode(); - var radius = unit.getAttribute('r'); - var fill = unit.getAttribute('fill'); - overlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR); - overlay.setAttribute('fill', fill); - overlay.style.opacity = '0.6'; - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - return overlay; - } -}; - -var updateOverlay = { - 'bar': function bar(unit, overlay) { - var transformValue = void 0; - if (unit.nodeName !== 'rect') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var attributes = ['x', 'y', 'width', 'height']; - Object.values(unit.attributes).filter(function (attr) { - return attributes.includes(attr.name) && attr.specified; - }).map(function (attr) { - overlay.setAttribute(attr.name, attr.nodeValue); - }); - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, - - 'dot': function dot(unit, overlay) { - var transformValue = void 0; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var attributes = ['cx', 'cy']; - Object.values(unit.attributes).filter(function (attr) { - return attributes.includes(attr.name) && attr.specified; - }).map(function (attr) { - overlay.setAttribute(attr.name, attr.nodeValue); - }); - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - }, - - 'heat_square': function heat_square(unit, overlay) { - var transformValue = void 0; - if (unit.nodeName !== 'circle') { - transformValue = unit.getAttribute('transform'); - unit = unit.childNodes[0]; - } - var attributes = ['cx', 'cy']; - Object.values(unit.attributes).filter(function (attr) { - return attributes.includes(attr.name) && attr.specified; - }).map(function (attr) { - overlay.setAttribute(attr.name, attr.nodeValue); - }); - - if (transformValue) { - overlay.setAttribute('transform', transformValue); - } - } -}; - -var UNIT_ANIM_DUR = 350; -var PATH_ANIM_DUR = 350; -var MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR; -var REPLACE_ALL_NEW_DUR = 250; - -var STD_EASING = 'easein'; - -function translate(unit, oldCoord, newCoord, duration) { - var old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', '); - return [unit, { transform: newCoord.join(', ') }, duration, STD_EASING, "translate", { transform: old }]; -} - -function translateVertLine(xLine, newX, oldX) { - return translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR); -} - -function translateHoriLine(yLine, newY, oldY) { - return translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR); -} - -function animateRegion(rectGroup, newY1, newY2, oldY2) { - var newHeight = newY1 - newY2; - var rect = rectGroup.childNodes[0]; - var width = rect.getAttribute("width"); - var rectAnim = [rect, { height: newHeight, 'stroke-dasharray': width + ', ' + newHeight }, MARKER_LINE_ANIM_DUR, STD_EASING]; - - var groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR); - return [rectAnim, groupAnim]; -} - -function animateBar(bar, x, yTop, width) { - var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; - var meta = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; - - var _getBarHeightAndYAttr = getBarHeightAndYAttr(yTop, meta.zeroLine), - _getBarHeightAndYAttr2 = slicedToArray(_getBarHeightAndYAttr, 2), - height = _getBarHeightAndYAttr2[0], - y = _getBarHeightAndYAttr2[1]; - - y -= offset; - if (bar.nodeName !== 'rect') { - var rect = bar.childNodes[0]; - var rectAnim = [rect, { width: width, height: height }, UNIT_ANIM_DUR, STD_EASING]; - - var oldCoordStr = bar.getAttribute("transform").split("(")[1].slice(0, -1); - var groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); - return [rectAnim, groupAnim]; - } else { - return [[bar, { width: width, height: height, x: x, y: y }, UNIT_ANIM_DUR, STD_EASING]]; - } - // bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein); -} - -function animateDot(dot, x, y) { - if (dot.nodeName !== 'circle') { - var oldCoordStr = dot.getAttribute("transform").split("(")[1].slice(0, -1); - var groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR); - return [groupAnim]; - } else { - return [[dot, { cx: x, cy: y }, UNIT_ANIM_DUR, STD_EASING]]; - } - // dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein); -} - -function animatePath(paths, newXList, newYList, zeroLine, spline) { - var pathComponents = []; - var pointsStr = newYList.map(function (y, i) { - return newXList[i] + ',' + y; - }).join("L"); - - if (spline) pointsStr = getSplineCurvePointsStr(newXList, newYList); - - var animPath = [paths.path, { d: "M" + pointsStr }, PATH_ANIM_DUR, STD_EASING]; - pathComponents.push(animPath); - - if (paths.region) { - var regStartPt = newXList[0] + ',' + zeroLine + 'L'; - var regEndPt = 'L' + newXList.slice(-1)[0] + ', ' + zeroLine; - - var animRegion = [paths.region, { d: "M" + regStartPt + pointsStr + regEndPt }, PATH_ANIM_DUR, STD_EASING]; - pathComponents.push(animRegion); - } - - return pathComponents; -} - -function animatePathStr(oldPath, pathStr) { - return [oldPath, { d: pathStr }, UNIT_ANIM_DUR, STD_EASING]; -} - -// Leveraging SMIL Animations - -var EASING = { - ease: "0.25 0.1 0.25 1", - linear: "0 0 1 1", - // easein: "0.42 0 1 1", - easein: "0.1 0.8 0.2 1", - easeout: "0 0 0.58 1", - easeinout: "0.42 0 0.58 1" -}; - -function animateSVGElement(element, props, dur) { - var easingType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "linear"; - var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined; - var oldValues = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; - - - var animElement = element.cloneNode(true); - var newElement = element.cloneNode(true); - - for (var attributeName in props) { - var animateElement = void 0; - if (attributeName === 'transform') { - animateElement = document.createElementNS("http://www.w3.org/2000/svg", "animateTransform"); - } else { - animateElement = document.createElementNS("http://www.w3.org/2000/svg", "animate"); - } - var currentValue = oldValues[attributeName] || element.getAttribute(attributeName); - var value = props[attributeName]; - - var animAttr = { - attributeName: attributeName, - from: currentValue, - to: value, - begin: "0s", - dur: dur / 1000 + "s", - values: currentValue + ";" + value, - keySplines: EASING[easingType], - keyTimes: "0;1", - calcMode: "spline", - fill: 'freeze' - }; - - if (type) { - animAttr["type"] = type; - } - - for (var i in animAttr) { - animateElement.setAttribute(i, animAttr[i]); - } - - animElement.appendChild(animateElement); - - if (type) { - newElement.setAttribute(attributeName, "translate(" + value + ")"); - } else { - newElement.setAttribute(attributeName, value); - } - } - - return [animElement, newElement]; -} - -function transform(element, style) { - // eslint-disable-line no-unused-vars - element.style.transform = style; - element.style.webkitTransform = style; - element.style.msTransform = style; - element.style.mozTransform = style; - element.style.oTransform = style; -} - -function animateSVG(svgContainer, elements) { - var newElements = []; - var animElements = []; - - elements.map(function (element) { - var unit = element[0]; - var parent = unit.parentNode; - - var animElement = void 0, - newElement = void 0; - - element[0] = unit; - - var _animateSVGElement = animateSVGElement.apply(undefined, toConsumableArray(element)); - - var _animateSVGElement2 = slicedToArray(_animateSVGElement, 2); - - animElement = _animateSVGElement2[0]; - newElement = _animateSVGElement2[1]; - - - newElements.push(newElement); - animElements.push([animElement, parent]); - - if (parent) { - parent.replaceChild(animElement, unit); - } - }); - - var animSvg = svgContainer.cloneNode(true); - - animElements.map(function (animElement, i) { - if (animElement[1]) { - animElement[1].replaceChild(newElements[i], animElement[0]); - elements[i][0] = newElements[i]; - } - }); - - return animSvg; -} - -function runSMILAnimation(parent, svgElement, elementsToAnimate) { - if (elementsToAnimate.length === 0) return; - - var animSvgElement = animateSVG(svgElement, elementsToAnimate); - if (svgElement.parentNode == parent) { - parent.removeChild(svgElement); - parent.appendChild(animSvgElement); - } - - // Replace the new svgElement (data has already been replaced) - setTimeout(function () { - if (animSvgElement.parentNode == parent) { - parent.removeChild(animSvgElement); - parent.appendChild(svgElement); - } - }, REPLACE_ALL_NEW_DUR); -} - -var CSSTEXT = ".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}"; - -function downloadFile(filename, data) { - var a = document.createElement('a'); - a.style = "display: none"; - var blob = new Blob(data, { type: "image/svg+xml; charset=utf-8" }); - var url = window.URL.createObjectURL(blob); - a.href = url; - a.download = filename; - document.body.appendChild(a); - a.click(); - setTimeout(function () { - document.body.removeChild(a); - window.URL.revokeObjectURL(url); - }, 300); -} - -function prepareForExport(svg) { - var clone = svg.cloneNode(true); - clone.classList.add('chart-container'); - clone.setAttribute('xmlns', "http://www.w3.org/2000/svg"); - clone.setAttribute('xmlns:xlink', "http://www.w3.org/1999/xlink"); - var styleEl = $.create('style', { - 'innerHTML': CSSTEXT - }); - clone.insertBefore(styleEl, clone.firstChild); - - var container = $.create('div'); - container.appendChild(clone); - - return container.innerHTML; -} - -var BaseChart = function () { - function BaseChart(parent, options) { - classCallCheck(this, BaseChart); - - // deepclone options to avoid making changes to orignal object - options = deepClone(options); - - this.parent = typeof parent === 'string' ? document.querySelector(parent) : parent; - - if (!(this.parent instanceof HTMLElement)) { - throw new Error('No `parent` element to render on was provided.'); - } - - this.rawChartArgs = options; - - this.title = options.title || ''; - this.type = options.type || ''; - - this.realData = this.prepareData(options.data); - this.data = this.prepareFirstData(this.realData); - - this.colors = this.validateColors(options.colors, this.type); - - this.config = { - showTooltip: 1, // calculate - showLegend: 1, // calculate - isNavigable: options.isNavigable || 0, - animate: typeof options.animate !== 'undefined' ? options.animate : 1, - truncateLegends: options.truncateLegends || 1 - }; - - this.measures = JSON.parse(JSON.stringify(BASE_MEASURES)); - var m = this.measures; - this.setMeasures(options); - if (!this.title.length) { - m.titleHeight = 0; - } - if (!this.config.showLegend) m.legendHeight = 0; - this.argHeight = options.height || m.baseHeight; - - this.state = {}; - this.options = {}; - - this.initTimeout = INIT_CHART_UPDATE_TIMEOUT; - - if (this.config.isNavigable) { - this.overlays = []; - } - - this.configure(options); - } - - createClass(BaseChart, [{ - key: 'prepareData', - value: function prepareData(data) { - return data; - } - }, { - key: 'prepareFirstData', - value: function prepareFirstData(data) { - return data; - } - }, { - key: 'validateColors', - value: function validateColors(colors, type) { - var validColors = []; - colors = (colors || []).concat(DEFAULT_COLORS[type]); - colors.forEach(function (string) { - var color = getColor(string); - if (!isValidColor(color)) { - console.warn('"' + string + '" is not a valid color.'); - } else { - validColors.push(color); - } - }); - return validColors; - } - }, { - key: 'setMeasures', - value: function setMeasures() { - // Override measures, including those for title and legend - // set config for legend and title - } - }, { - key: 'configure', - value: function configure() { - var _this = this; - - var height = this.argHeight; - this.baseHeight = height; - this.height = height - getExtraHeight(this.measures); - - // Bind window events - this.boundDrawFn = function () { - return _this.draw(true); - }; - if (ResizeObserver) { - this.resizeObserver = new ResizeObserver(this.boundDrawFn); - this.resizeObserver.observe(this.parent); - } - window.addEventListener('resize', this.boundDrawFn); - window.addEventListener('orientationchange', this.boundDrawFn); - } - }, { - key: 'destroy', - value: function destroy() { - if (this.resizeObserver) this.resizeObserver.disconnect(); - window.removeEventListener('resize', this.boundDrawFn); - window.removeEventListener('orientationchange', this.boundDrawFn); - } - - // Has to be called manually - - }, { - key: 'setup', - value: function setup() { - this.makeContainer(); - this.updateWidth(); - this.makeTooltip(); - - this.draw(false, true); - } - }, { - key: 'makeContainer', - value: function makeContainer() { - // Chart needs a dedicated parent element - this.parent.innerHTML = ''; - - var args = { - inside: this.parent, - className: 'chart-container' - }; - - if (this.independentWidth) { - args.styles = { width: this.independentWidth + 'px' }; - } - - this.container = $.create('div', args); - } - }, { - key: 'makeTooltip', - value: function makeTooltip() { - this.tip = new SvgTip({ - parent: this.container, - colors: this.colors - }); - this.bindTooltip(); - } - }, { - key: 'bindTooltip', - value: function bindTooltip() {} - }, { - key: 'draw', - value: function draw() { - var _this2 = this; - - var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (onlyWidthChange && isHidden(this.parent)) { - // Don't update anything if the chart is hidden - return; - } - this.updateWidth(); - - this.calc(onlyWidthChange); - this.makeChartArea(); - this.setupComponents(); - - this.components.forEach(function (c) { - return c.setup(_this2.drawArea); - }); - // this.components.forEach(c => c.make()); - this.render(this.components, false); - - if (init) { - this.data = this.realData; - setTimeout(function () { - _this2.update(_this2.data); - }, this.initTimeout); - } - - this.renderLegend(); - - this.setupNavigation(init); - } - }, { - key: 'calc', - value: function calc() {} // builds state - - }, { - key: 'updateWidth', - value: function updateWidth() { - this.baseWidth = getElementContentWidth(this.parent); - this.width = this.baseWidth - getExtraWidth(this.measures); - } - }, { - key: 'makeChartArea', - value: function makeChartArea() { - if (this.svg) { - this.container.removeChild(this.svg); - } - var m = this.measures; - - this.svg = makeSVGContainer(this.container, 'frappe-chart chart', this.baseWidth, this.baseHeight); - this.svgDefs = makeSVGDefs(this.svg); - - if (this.title.length) { - this.titleEL = makeText('title', m.margins.left, m.margins.top, this.title, { - fontSize: m.titleFontSize, - fill: '#666666', - dy: m.titleFontSize - }); - } - - var top = getTopOffset(m); - this.drawArea = makeSVGGroup(this.type + '-chart chart-draw-area', 'translate(' + getLeftOffset(m) + ', ' + top + ')'); - - if (this.config.showLegend) { - top += this.height + m.paddings.bottom; - this.legendArea = makeSVGGroup('chart-legend', 'translate(' + getLeftOffset(m) + ', ' + top + ')'); - } - - if (this.title.length) { - this.svg.appendChild(this.titleEL); - } - this.svg.appendChild(this.drawArea); - if (this.config.showLegend) { - this.svg.appendChild(this.legendArea); - } - - this.updateTipOffset(getLeftOffset(m), getTopOffset(m)); - } - }, { - key: 'updateTipOffset', - value: function updateTipOffset(x, y) { - this.tip.offset = { - x: x, - y: y - }; - } - }, { - key: 'setupComponents', - value: function setupComponents() { - this.components = new Map(); - } - }, { - key: 'update', - value: function update(data) { - if (!data) { - console.error('No data to update.'); - } - this.data = this.prepareData(data); - this.calc(); // builds state - this.render(this.components, this.config.animate); - this.renderLegend(); - } - }, { - key: 'render', - value: function render() { - var _this3 = this; - - var components = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.components; - var animate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - - if (this.config.isNavigable) { - // Remove all existing overlays - this.overlays.map(function (o) { - return o.parentNode.removeChild(o); - }); - // ref.parentNode.insertBefore(element, ref); - } - var elementsToAnimate = []; - // Can decouple to this.refreshComponents() first to save animation timeout - components.forEach(function (c) { - elementsToAnimate = elementsToAnimate.concat(c.update(animate)); - }); - if (elementsToAnimate.length > 0) { - runSMILAnimation(this.container, this.svg, elementsToAnimate); - setTimeout(function () { - components.forEach(function (c) { - return c.make(); - }); - _this3.updateNav(); - }, CHART_POST_ANIMATE_TIMEOUT); - } else { - components.forEach(function (c) { - return c.make(); - }); - this.updateNav(); - } - } - }, { - key: 'updateNav', - value: function updateNav() { - if (this.config.isNavigable) { - this.makeOverlay(); - this.bindUnits(); - } - } - }, { - key: 'renderLegend', - value: function renderLegend() {} - }, { - key: 'setupNavigation', - value: function setupNavigation() { - var _this4 = this; - - var init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - if (!this.config.isNavigable) return; - - if (init) { - this.bindOverlay(); - - this.keyActions = { - '13': this.onEnterKey.bind(this), - '37': this.onLeftArrow.bind(this), - '38': this.onUpArrow.bind(this), - '39': this.onRightArrow.bind(this), - '40': this.onDownArrow.bind(this) - }; - - document.addEventListener('keydown', function (e) { - if (isElementInViewport(_this4.container)) { - e = e || window.event; - if (_this4.keyActions[e.keyCode]) { - _this4.keyActions[e.keyCode](); - } - } - }); - } - } - }, { - key: 'makeOverlay', - value: function makeOverlay$$1() {} - }, { - key: 'updateOverlay', - value: function updateOverlay$$1() {} - }, { - key: 'bindOverlay', - value: function bindOverlay() {} - }, { - key: 'bindUnits', - value: function bindUnits() {} - }, { - key: 'onLeftArrow', - value: function onLeftArrow() {} - }, { - key: 'onRightArrow', - value: function onRightArrow() {} - }, { - key: 'onUpArrow', - value: function onUpArrow() {} - }, { - key: 'onDownArrow', - value: function onDownArrow() {} - }, { - key: 'onEnterKey', - value: function onEnterKey() {} - }, { - key: 'addDataPoint', - value: function addDataPoint() {} - }, { - key: 'removeDataPoint', - value: function removeDataPoint() {} - }, { - key: 'getDataPoint', - value: function getDataPoint() {} - }, { - key: 'setCurrentDataPoint', - value: function setCurrentDataPoint() {} - }, { - key: 'updateDataset', - value: function updateDataset() {} - }, { - key: 'export', - value: function _export() { - var chartSvg = prepareForExport(this.svg); - downloadFile(this.title || 'Chart', [chartSvg]); - } - }]); - return BaseChart; -}(); - -var AggregationChart = function (_BaseChart) { - inherits(AggregationChart, _BaseChart); - - function AggregationChart(parent, args) { - classCallCheck(this, AggregationChart); - return possibleConstructorReturn(this, (AggregationChart.__proto__ || Object.getPrototypeOf(AggregationChart)).call(this, parent, args)); - } - - createClass(AggregationChart, [{ - key: 'configure', - value: function configure(args) { - get(AggregationChart.prototype.__proto__ || Object.getPrototypeOf(AggregationChart.prototype), 'configure', this).call(this, args); - - this.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY; - this.config.maxSlices = args.maxSlices || 20; - this.config.maxLegendPoints = args.maxLegendPoints || 20; - } - }, { - key: 'calc', - value: function calc() { - var _this2 = this; - - var s = this.state; - var maxSlices = this.config.maxSlices; - s.sliceTotals = []; - - var allTotals = this.data.labels.map(function (label, i) { - var total = 0; - _this2.data.datasets.map(function (e) { - total += e.values[i]; - }); - return [total, label]; - }).filter(function (d) { - return d[0] >= 0; - }); // keep only positive results - - var totals = allTotals; - if (allTotals.length > maxSlices) { - // Prune and keep a grey area for rest as per maxSlices - allTotals.sort(function (a, b) { - return b[0] - a[0]; - }); - - totals = allTotals.slice(0, maxSlices - 1); - var remaining = allTotals.slice(maxSlices - 1); - - var sumOfRemaining = 0; - remaining.map(function (d) { - sumOfRemaining += d[0]; - }); - totals.push([sumOfRemaining, 'Rest']); - this.colors[maxSlices - 1] = 'grey'; - } - - s.labels = []; - totals.map(function (d) { - s.sliceTotals.push(round(d[0])); - s.labels.push(d[1]); - }); - - s.grandTotal = s.sliceTotals.reduce(function (a, b) { - return a + b; - }, 0); - - this.center = { - x: this.width / 2, - y: this.height / 2 - }; - } - }, { - key: 'renderLegend', - value: function renderLegend() { - var _this3 = this; - - var s = this.state; - this.legendArea.textContent = ''; - this.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints); - - var count = 0; - var y = 0; - this.legendTotals.map(function (d, i) { - var barWidth = 150; - var divisor = Math.floor((_this3.width - getExtraWidth(_this3.measures)) / barWidth); - if (_this3.legendTotals.length < divisor) { - barWidth = _this3.width / _this3.legendTotals.length; - } - if (count > divisor) { - count = 0; - y += 20; - } - var x = barWidth * count + 5; - var label = _this3.config.truncateLegends ? truncateString(s.labels[i], barWidth / 10) : s.labels[i]; - var formatted = _this3.config.formatTooltipY ? _this3.config.formatTooltipY(d) : d; - var dot = legendDot(x, y, 5, _this3.colors[i], label + ': ' + formatted, false); - _this3.legendArea.appendChild(dot); - count++; - }); - } - }]); - return AggregationChart; -}(BaseChart); - -// Playing around with dates - -var NO_OF_YEAR_MONTHS = 12; -var NO_OF_DAYS_IN_WEEK = 7; - -var NO_OF_MILLIS = 1000; -var SEC_IN_DAY = 86400; - -var MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; - - -var DAY_NAMES_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; - - -// https://stackoverflow.com/a/11252167/6495043 -function treatAsUtc(date) { - var result = new Date(date); - result.setMinutes(result.getMinutes() - result.getTimezoneOffset()); - return result; -} - -function getYyyyMmDd(date) { - var dd = date.getDate(); - var mm = date.getMonth() + 1; // getMonth() is zero-based - return [date.getFullYear(), (mm > 9 ? '' : '0') + mm, (dd > 9 ? '' : '0') + dd].join('-'); -} - -function clone(date) { - return new Date(date.getTime()); -} - - - - - -// export function getMonthsBetween(startDate, endDate) {} - -function getWeeksBetween(startDate, endDate) { - var weekStartDate = setDayToSunday(startDate); - return Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK); -} - -function getDaysBetween(startDate, endDate) { - var millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS; - return (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay; -} - -function areInSameMonth(startDate, endDate) { - return startDate.getMonth() === endDate.getMonth() && startDate.getFullYear() === endDate.getFullYear(); -} - -function getMonthName(i) { - var short = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - var monthName = MONTH_NAMES[i]; - return short ? monthName.slice(0, 3) : monthName; -} - -function getLastDateInMonth(month, year) { - return new Date(year, month + 1, 0); // 0: last day in previous month -} - -// mutates -function setDayToSunday(date) { - var newDate = clone(date); - var day = newDate.getDay(); - if (day !== 0) { - addDays(newDate, -1 * day); - } - return newDate; -} - -// mutates -function addDays(date, numberOfDays) { - date.setDate(date.getDate() + numberOfDays); -} - -var ChartComponent = function () { - function ChartComponent(_ref) { - var _ref$layerClass = _ref.layerClass, - layerClass = _ref$layerClass === undefined ? '' : _ref$layerClass, - _ref$layerTransform = _ref.layerTransform, - layerTransform = _ref$layerTransform === undefined ? '' : _ref$layerTransform, - constants = _ref.constants, - getData = _ref.getData, - makeElements = _ref.makeElements, - animateElements = _ref.animateElements; - classCallCheck(this, ChartComponent); - - this.layerTransform = layerTransform; - this.constants = constants; - - this.makeElements = makeElements; - this.getData = getData; - - this.animateElements = animateElements; - - this.store = []; - this.labels = []; - - this.layerClass = layerClass; - this.layerClass = typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass; - - this.refresh(); - } - - createClass(ChartComponent, [{ - key: 'refresh', - value: function refresh(data) { - this.data = data || this.getData(); - } - }, { - key: 'setup', - value: function setup(parent) { - this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent); - } - }, { - key: 'make', - value: function make() { - this.render(this.data); - this.oldData = this.data; - } - }, { - key: 'render', - value: function render(data) { - var _this = this; - - this.store = this.makeElements(data); - - this.layer.textContent = ''; - this.store.forEach(function (element) { - element.length ? element.forEach(function (el) { - _this.layer.appendChild(el); - }) : _this.layer.appendChild(element); - }); - this.labels.forEach(function (element) { - _this.layer.appendChild(element); - }); - } - }, { - key: 'update', - value: function update() { - var animate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - this.refresh(); - var animateElements = []; - if (animate) { - animateElements = this.animateElements(this.data) || []; - } - return animateElements; - } - }]); - return ChartComponent; -}(); - -var componentConfigs = { - donutSlices: { - layerClass: 'donut-slices', - makeElements: function makeElements(data) { - return data.sliceStrings.map(function (s, i) { - var slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth); - slice.style.transition = 'transform .3s;'; - return slice; - }); - }, - animateElements: function animateElements(newData) { - return this.store.map(function (slice, i) { - return animatePathStr(slice, newData.sliceStrings[i]); - }); - } - }, - pieSlices: { - layerClass: 'pie-slices', - makeElements: function makeElements(data) { - return data.sliceStrings.map(function (s, i) { - var slice = makePath(s, 'pie-path', 'none', data.colors[i]); - slice.style.transition = 'transform .3s;'; - return slice; - }); - }, - animateElements: function animateElements(newData) { - return this.store.map(function (slice, i) { - return animatePathStr(slice, newData.sliceStrings[i]); - }); - } - }, - percentageBars: { - layerClass: 'percentage-bars', - makeElements: function makeElements(data) { - var _this2 = this; - - return data.xPositions.map(function (x, i) { - var y = 0; - var bar = percentageBar(x, y, data.widths[i], _this2.constants.barHeight, _this2.constants.barDepth, data.colors[i]); - return bar; - }); - }, - animateElements: function animateElements(newData) { - if (newData) return []; - } - }, - yAxis: { - layerClass: 'y axis', - makeElements: function makeElements(data) { - var _this3 = this; - - var elements = []; - // will loop through each yaxis dataset if it exists - if (data.length) { - data.forEach(function (item, i) { - item.positions.map(function (position, i) { - elements.push(yLine(position, item.labels[i], _this3.constants.width, { - mode: _this3.constants.mode, - pos: item.pos || _this3.constants.pos, - shortenNumbers: _this3.constants.shortenNumbers - })); - }); - // we need to make yAxis titles if they are defined - if (item.title) { - elements.push(generateAxisLabel({ - title: item.title, - position: item.pos, - height: item.zeroLine, - width: _this3.constants.width - })); - } - }); - - return elements; - } - - data.positions.forEach(function (position, i) { - elements.push(yLine(position, data.labels[i], _this3.constants.width, { - mode: _this3.constants.mode, - pos: data.pos || _this3.constants.pos, - shortenNumbers: _this3.constants.shortenNumbers - })); - }); - - if (data.title) { - elements.push(generateAxisLabel({ - title: data.title, - position: data.pos, - height: data.zeroLine, - width: this.constants.width - })); - } - - return elements; - }, - animateElements: function animateElements(newData) { - var _this4 = this; - - var animateMultipleElements = function animateMultipleElements(oldData, newData) { - var newPos = newData.positions; - var newLabels = newData.labels; - var oldPos = oldData.positions; - var oldLabels = oldData.labels; - - var _equilizeNoOfElements = equilizeNoOfElements(oldPos, newPos); - - var _equilizeNoOfElements2 = slicedToArray(_equilizeNoOfElements, 2); - - oldPos = _equilizeNoOfElements2[0]; - newPos = _equilizeNoOfElements2[1]; - - var _equilizeNoOfElements3 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements4 = slicedToArray(_equilizeNoOfElements3, 2); - - oldLabels = _equilizeNoOfElements4[0]; - newLabels = _equilizeNoOfElements4[1]; - - - _this4.render({ - positions: oldPos, - labels: newLabels - }); - - return _this4.store.map(function (line, i) { - return translateHoriLine(line, newPos[i], oldPos[i]); - }); - }; - - // we will need to animate both axis if we have more than one. - // so check if the oldData is an array of values. - if (this.oldData instanceof Array) { - return this.oldData.forEach(function (old, i) { - animateMultipleElements(old, newData[i]); - }); - } - - var newPos = newData.positions; - var newLabels = newData.labels; - var oldPos = this.oldData.positions; - var oldLabels = this.oldData.labels; - - var _equilizeNoOfElements5 = equilizeNoOfElements(oldPos, newPos); - - var _equilizeNoOfElements6 = slicedToArray(_equilizeNoOfElements5, 2); - - oldPos = _equilizeNoOfElements6[0]; - newPos = _equilizeNoOfElements6[1]; - - var _equilizeNoOfElements7 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements8 = slicedToArray(_equilizeNoOfElements7, 2); - - oldLabels = _equilizeNoOfElements8[0]; - newLabels = _equilizeNoOfElements8[1]; - - - this.render({ - positions: oldPos, - labels: newLabels - }); - - return this.store.map(function (line, i) { - return translateHoriLine(line, newPos[i], oldPos[i]); - }); - } - }, - - xAxis: { - layerClass: 'x axis', - makeElements: function makeElements(data) { - var _this5 = this; - - return data.positions.map(function (position, i) { - return xLine(position, data.calcLabels[i], _this5.constants.height, { mode: _this5.constants.mode, pos: _this5.constants.pos }); - }); - }, - animateElements: function animateElements(newData) { - var newPos = newData.positions; - var newLabels = newData.calcLabels; - var oldPos = this.oldData.positions; - var oldLabels = this.oldData.calcLabels; - - var _equilizeNoOfElements9 = equilizeNoOfElements(oldPos, newPos); - - var _equilizeNoOfElements10 = slicedToArray(_equilizeNoOfElements9, 2); - - oldPos = _equilizeNoOfElements10[0]; - newPos = _equilizeNoOfElements10[1]; - - var _equilizeNoOfElements11 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements12 = slicedToArray(_equilizeNoOfElements11, 2); - - oldLabels = _equilizeNoOfElements12[0]; - newLabels = _equilizeNoOfElements12[1]; - - - this.render({ - positions: oldPos, - calcLabels: newLabels - }); - - return this.store.map(function (line, i) { - return translateVertLine(line, newPos[i], oldPos[i]); - }); - } - }, - - yMarkers: { - layerClass: 'y-markers', - makeElements: function makeElements(data) { - var _this6 = this; - - return data.map(function (m) { - return yMarker(m.position, m.label, _this6.constants.width, { - labelPos: m.options.labelPos, - mode: 'span', - lineType: 'dashed' - }); - }); - }, - animateElements: function animateElements(newData) { - var _equilizeNoOfElements13 = equilizeNoOfElements(this.oldData, newData); - - var _equilizeNoOfElements14 = slicedToArray(_equilizeNoOfElements13, 2); - - this.oldData = _equilizeNoOfElements14[0]; - newData = _equilizeNoOfElements14[1]; - - - var newPos = newData.map(function (d) { - return d.position; - }); - var newLabels = newData.map(function (d) { - return d.label; - }); - var newOptions = newData.map(function (d) { - return d.options; - }); - - var oldPos = this.oldData.map(function (d) { - return d.position; - }); - - this.render(oldPos.map(function (pos, i) { - return { - position: oldPos[i], - label: newLabels[i], - options: newOptions[i] - }; - })); - - return this.store.map(function (line, i) { - return translateHoriLine(line, newPos[i], oldPos[i]); - }); - } - }, - - yRegions: { - layerClass: 'y-regions', - makeElements: function makeElements(data) { - var _this7 = this; - - return data.map(function (r) { - return yRegion(r.startPos, r.endPos, _this7.constants.width, r.label, { labelPos: r.options.labelPos }); - }); - }, - animateElements: function animateElements(newData) { - var _equilizeNoOfElements15 = equilizeNoOfElements(this.oldData, newData); - - var _equilizeNoOfElements16 = slicedToArray(_equilizeNoOfElements15, 2); - - this.oldData = _equilizeNoOfElements16[0]; - newData = _equilizeNoOfElements16[1]; - - - var newPos = newData.map(function (d) { - return d.endPos; - }); - var newLabels = newData.map(function (d) { - return d.label; - }); - var newStarts = newData.map(function (d) { - return d.startPos; - }); - var newOptions = newData.map(function (d) { - return d.options; - }); - - var oldPos = this.oldData.map(function (d) { - return d.endPos; - }); - var oldStarts = this.oldData.map(function (d) { - return d.startPos; - }); - - this.render(oldPos.map(function (pos, i) { - return { - startPos: oldStarts[i], - endPos: oldPos[i], - label: newLabels[i], - options: newOptions[i] - }; - })); - - var animateElements = []; - - this.store.map(function (rectGroup, i) { - animateElements = animateElements.concat(animateRegion(rectGroup, newStarts[i], newPos[i], oldPos[i])); - }); - - return animateElements; - } - }, - - heatDomain: { - layerClass: function layerClass() { - return 'heat-domain domain-' + this.constants.index; - }, - makeElements: function makeElements(data) { - var _this8 = this; - - var _constants = this.constants, - index = _constants.index, - colWidth = _constants.colWidth, - rowHeight = _constants.rowHeight, - squareSize = _constants.squareSize, - radius = _constants.radius, - xTranslate = _constants.xTranslate; - - var monthNameHeight = -12; - var x = xTranslate, - y = 0; - - this.serializedSubDomains = []; - - data.cols.map(function (week, weekNo) { - if (weekNo === 1) { - _this8.labels.push(makeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(), { - fontSize: 9 - })); - } - week.map(function (day, i) { - if (day.fill) { - var _data = { - 'data-date': day.yyyyMmDd, - 'data-value': day.dataValue, - 'data-day': i - }; - var square = heatSquare('day', x, y, squareSize, radius, day.fill, _data); - _this8.serializedSubDomains.push(square); - } - y += rowHeight; - }); - y = 0; - x += colWidth; - }); - - return this.serializedSubDomains; - }, - animateElements: function animateElements(newData) { - if (newData) return []; - } - }, - - barGraph: { - layerClass: function layerClass() { - return 'dataset-units dataset-bars dataset-' + this.constants.index; - }, - makeElements: function makeElements(data) { - var c = this.constants; - this.unitType = 'bar'; - this.units = data.yPositions.map(function (y, j) { - return datasetBar(data.xPositions[j], y, data.barWidth, c.color, data.labels[j], j, data.offsets[j], { - zeroLine: data.zeroLine, - barsWidth: data.barsWidth, - minHeight: c.minHeight - }); - }); - return this.units; - }, - animateElements: function animateElements(newData) { - var newXPos = newData.xPositions; - var newYPos = newData.yPositions; - var newOffsets = newData.offsets; - var newLabels = newData.labels; - - var oldXPos = this.oldData.xPositions; - var oldYPos = this.oldData.yPositions; - var oldOffsets = this.oldData.offsets; - var oldLabels = this.oldData.labels; - - var _equilizeNoOfElements17 = equilizeNoOfElements(oldXPos, newXPos); - - var _equilizeNoOfElements18 = slicedToArray(_equilizeNoOfElements17, 2); - - oldXPos = _equilizeNoOfElements18[0]; - newXPos = _equilizeNoOfElements18[1]; - - var _equilizeNoOfElements19 = equilizeNoOfElements(oldYPos, newYPos); - - var _equilizeNoOfElements20 = slicedToArray(_equilizeNoOfElements19, 2); - - oldYPos = _equilizeNoOfElements20[0]; - newYPos = _equilizeNoOfElements20[1]; - - var _equilizeNoOfElements21 = equilizeNoOfElements(oldOffsets, newOffsets); - - var _equilizeNoOfElements22 = slicedToArray(_equilizeNoOfElements21, 2); - - oldOffsets = _equilizeNoOfElements22[0]; - newOffsets = _equilizeNoOfElements22[1]; - - var _equilizeNoOfElements23 = equilizeNoOfElements(oldLabels, newLabels); - - var _equilizeNoOfElements24 = slicedToArray(_equilizeNoOfElements23, 2); - - oldLabels = _equilizeNoOfElements24[0]; - newLabels = _equilizeNoOfElements24[1]; - - - this.render({ - xPositions: oldXPos, - yPositions: oldYPos, - offsets: oldOffsets, - labels: newLabels, - - zeroLine: this.oldData.zeroLine, - barsWidth: this.oldData.barsWidth, - barWidth: this.oldData.barWidth - }); - - var animateElements = []; - - this.store.map(function (bar, i) { - animateElements = animateElements.concat(animateBar(bar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i], { zeroLine: newData.zeroLine })); - }); - - return animateElements; - } - }, - - lineGraph: { - layerClass: function layerClass() { - return 'dataset-units dataset-line dataset-' + this.constants.index; - }, - makeElements: function makeElements(data) { - var c = this.constants; - this.unitType = 'dot'; - this.paths = {}; - if (!c.hideLine) { - this.paths = getPaths(data.xPositions, data.yPositions, c.color, { - heatline: c.heatline, - regionFill: c.regionFill, - spline: c.spline - }, { - svgDefs: c.svgDefs, - zeroLine: data.zeroLine - }); - } - - this.units = []; - - if (!c.hideDots) { - this.units = data.yPositions.map(function (y, j) { - return datasetDot(data.xPositions[j], y, data.radius, c.color, c.valuesOverPoints ? data.values[j] : '', j); - }); - } - - return Object.values(this.paths).concat(this.units); - }, - animateElements: function animateElements(newData) { - var newXPos = newData.xPositions; - var newYPos = newData.yPositions; - var newValues = newData.values; - - var oldXPos = this.oldData.xPositions; - var oldYPos = this.oldData.yPositions; - var oldValues = this.oldData.values; - - var _equilizeNoOfElements25 = equilizeNoOfElements(oldXPos, newXPos); - - var _equilizeNoOfElements26 = slicedToArray(_equilizeNoOfElements25, 2); - - oldXPos = _equilizeNoOfElements26[0]; - newXPos = _equilizeNoOfElements26[1]; - - var _equilizeNoOfElements27 = equilizeNoOfElements(oldYPos, newYPos); - - var _equilizeNoOfElements28 = slicedToArray(_equilizeNoOfElements27, 2); - - oldYPos = _equilizeNoOfElements28[0]; - newYPos = _equilizeNoOfElements28[1]; - - var _equilizeNoOfElements29 = equilizeNoOfElements(oldValues, newValues); - - var _equilizeNoOfElements30 = slicedToArray(_equilizeNoOfElements29, 2); - - oldValues = _equilizeNoOfElements30[0]; - newValues = _equilizeNoOfElements30[1]; - - - this.render({ - xPositions: oldXPos, - yPositions: oldYPos, - values: newValues, - - zeroLine: this.oldData.zeroLine, - radius: this.oldData.radius - }); - - var animateElements = []; - - if (Object.keys(this.paths).length) { - animateElements = animateElements.concat(animatePath(this.paths, newXPos, newYPos, newData.zeroLine, this.constants.spline)); - } - - if (this.units.length) { - this.units.map(function (dot, i) { - animateElements = animateElements.concat(animateDot(dot, newXPos[i], newYPos[i])); - }); - } - - return animateElements; - } - } -}; - -function getComponent(name, constants, getData) { - var keys = Object.keys(componentConfigs).filter(function (k) { - return name.includes(k); - }); - var config = componentConfigs[keys[0]]; - Object.assign(config, { - constants: constants, - getData: getData - }); - return new ChartComponent(config); -} - -var PercentageChart = function (_AggregationChart) { - inherits(PercentageChart, _AggregationChart); - - function PercentageChart(parent, args) { - classCallCheck(this, PercentageChart); - - var _this = possibleConstructorReturn(this, (PercentageChart.__proto__ || Object.getPrototypeOf(PercentageChart)).call(this, parent, args)); - - _this.type = 'percentage'; - _this.setup(); - return _this; - } - - createClass(PercentageChart, [{ - key: 'setMeasures', - value: function setMeasures(options) { - var m = this.measures; - this.barOptions = options.barOptions || {}; - - var b = this.barOptions; - b.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT; - b.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH; - - m.paddings.right = 30; - m.legendHeight = 60; - m.baseHeight = (b.height + b.depth * 0.5) * 8; - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var s = this.state; - - var componentConfigs = [['percentageBars', { - barHeight: this.barOptions.height, - barDepth: this.barOptions.depth - }, function () { - return { - xPositions: s.xPositions, - widths: s.widths, - colors: this.colors - }; - }.bind(this)]]; - - this.components = new Map(componentConfigs.map(function (args) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: 'calc', - value: function calc() { - var _this2 = this; - - get(PercentageChart.prototype.__proto__ || Object.getPrototypeOf(PercentageChart.prototype), 'calc', this).call(this); - var s = this.state; - - s.xPositions = []; - s.widths = []; - - var xPos = 0; - s.sliceTotals.map(function (value) { - var width = _this2.width * value / s.grandTotal; - s.widths.push(width); - s.xPositions.push(xPos); - xPos += width; - }); - } - }, { - key: 'makeDataByIndex', - value: function makeDataByIndex() {} - }, { - key: 'bindTooltip', - value: function bindTooltip() { - var _this3 = this; - - var s = this.state; - this.container.addEventListener('mousemove', function (e) { - var bars = _this3.components.get('percentageBars').store; - var bar = e.target; - if (bars.includes(bar)) { - - var i = bars.indexOf(bar); - var gOff = getOffset(_this3.container), - pOff = getOffset(bar); - - var x = pOff.left - gOff.left + parseInt(bar.getAttribute('width')) / 2; - var y = pOff.top - gOff.top; - var title = (_this3.formattedLabels && _this3.formattedLabels.length > 0 ? _this3.formattedLabels[i] : _this3.state.labels[i]) + ': '; - var fraction = s.sliceTotals[i] / s.grandTotal; - - _this3.tip.setValues(x, y, { name: title, value: (fraction * 100).toFixed(1) + "%" }); - _this3.tip.showTip(); - } - }); - } - }]); - return PercentageChart; -}(AggregationChart); - -var PieChart = function (_AggregationChart) { - inherits(PieChart, _AggregationChart); - - function PieChart(parent, args) { - classCallCheck(this, PieChart); - - var _this = possibleConstructorReturn(this, (PieChart.__proto__ || Object.getPrototypeOf(PieChart)).call(this, parent, args)); - - _this.type = 'pie'; - _this.initTimeout = 0; - _this.init = 1; - - _this.setup(); - return _this; - } - - createClass(PieChart, [{ - key: 'configure', - value: function configure(args) { - get(PieChart.prototype.__proto__ || Object.getPrototypeOf(PieChart.prototype), 'configure', this).call(this, args); - this.mouseMove = this.mouseMove.bind(this); - this.mouseLeave = this.mouseLeave.bind(this); - - this.hoverRadio = args.hoverRadio || 0.1; - this.config.startAngle = args.startAngle || 0; - - this.clockWise = args.clockWise || false; - } - }, { - key: 'calc', - value: function calc() { - var _this2 = this; - - get(PieChart.prototype.__proto__ || Object.getPrototypeOf(PieChart.prototype), 'calc', this).call(this); - var s = this.state; - this.radius = this.height > this.width ? this.center.x : this.center.y; - - var radius = this.radius, - clockWise = this.clockWise; - - - var prevSlicesProperties = s.slicesProperties || []; - s.sliceStrings = []; - s.slicesProperties = []; - var curAngle = 180 - this.config.startAngle; - s.sliceTotals.map(function (total, i) { - var startAngle = curAngle; - var originDiffAngle = total / s.grandTotal * FULL_ANGLE; - var largeArc = originDiffAngle > 180 ? 1 : 0; - var diffAngle = clockWise ? -originDiffAngle : originDiffAngle; - var endAngle = curAngle = curAngle + diffAngle; - var startPosition = getPositionByAngle(startAngle, radius); - var endPosition = getPositionByAngle(endAngle, radius); - - var prevProperty = _this2.init && prevSlicesProperties[i]; - - var curStart = void 0, - curEnd = void 0; - if (_this2.init) { - curStart = prevProperty ? prevProperty.startPosition : startPosition; - curEnd = prevProperty ? prevProperty.endPosition : startPosition; - } else { - curStart = startPosition; - curEnd = endPosition; - } - var curPath = originDiffAngle === 360 ? makeCircleStr(curStart, curEnd, _this2.center, _this2.radius, clockWise, largeArc) : makeArcPathStr(curStart, curEnd, _this2.center, _this2.radius, clockWise, largeArc); - - s.sliceStrings.push(curPath); - s.slicesProperties.push({ - startPosition: startPosition, - endPosition: endPosition, - value: total, - total: s.grandTotal, - startAngle: startAngle, - endAngle: endAngle, - angle: diffAngle - }); - }); - this.init = 0; - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var s = this.state; - - var componentConfigs = [['pieSlices', {}, function () { - return { - sliceStrings: s.sliceStrings, - colors: this.colors - }; - }.bind(this)]]; - - this.components = new Map(componentConfigs.map(function (args) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: 'calTranslateByAngle', - value: function calTranslateByAngle(property) { - var radius = this.radius, - hoverRadio = this.hoverRadio; - - var position = getPositionByAngle(property.startAngle + property.angle / 2, radius); - return 'translate3d(' + position.x * hoverRadio + 'px,' + position.y * hoverRadio + 'px,0)'; - } - }, { - key: 'hoverSlice', - value: function hoverSlice(path, i, flag, e) { - if (!path) return; - var color = this.colors[i]; - if (flag) { - transform(path, this.calTranslateByAngle(this.state.slicesProperties[i])); - path.style.fill = lightenDarkenColor(color, 50); - var g_off = getOffset(this.svg); - var x = e.pageX - g_off.left + 10; - var y = e.pageY - g_off.top - 10; - var title = (this.formatted_labels && this.formatted_labels.length > 0 ? this.formatted_labels[i] : this.state.labels[i]) + ': '; - var percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1); - this.tip.setValues(x, y, { name: title, value: percent + "%" }); - this.tip.showTip(); - } else { - transform(path, 'translate3d(0,0,0)'); - this.tip.hideTip(); - path.style.fill = color; - } - } - }, { - key: 'bindTooltip', - value: function bindTooltip() { - this.container.addEventListener('mousemove', this.mouseMove); - this.container.addEventListener('mouseleave', this.mouseLeave); - } - }, { - key: 'mouseMove', - value: function mouseMove(e) { - var target = e.target; - var slices = this.components.get('pieSlices').store; - var prevIndex = this.curActiveSliceIndex; - var prevAcitve = this.curActiveSlice; - if (slices.includes(target)) { - var i = slices.indexOf(target); - this.hoverSlice(prevAcitve, prevIndex, false); - this.curActiveSlice = target; - this.curActiveSliceIndex = i; - this.hoverSlice(target, i, true, e); - } else { - this.mouseLeave(); - } - } - }, { - key: 'mouseLeave', - value: function mouseLeave() { - this.hoverSlice(this.curActiveSlice, this.curActiveSliceIndex, false); - } - }]); - return PieChart; -}(AggregationChart); - -function normalize(x) { - // Calculates mantissa and exponent of a number - // Returns normalized number and exponent - // https://stackoverflow.com/q/9383593/6495043 - - if (x === 0) { - return [0, 0]; - } - if (isNaN(x)) { - return { mantissa: -6755399441055744, exponent: 972 }; - } - var sig = x > 0 ? 1 : -1; - if (!isFinite(x)) { - return { mantissa: sig * 4503599627370496, exponent: 972 }; - } - - x = Math.abs(x); - var exp = Math.floor(Math.log10(x)); - var man = x / Math.pow(10, exp); - - return [sig * man, exp]; -} - -function getChartRangeIntervals(max) { - var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var upperBound = Math.ceil(max); - var lowerBound = Math.floor(min); - var range = upperBound - lowerBound; - - var noOfParts = range; - var partSize = 1; - - // To avoid too many partitions - if (range > 5) { - if (range % 2 !== 0) { - upperBound++; - // Recalc range - range = upperBound - lowerBound; - } - noOfParts = range / 2; - partSize = 2; - } - - // Special case: 1 and 2 - if (range <= 2) { - noOfParts = 4; - partSize = range / noOfParts; - } - - // Special case: 0 - if (range === 0) { - noOfParts = 5; - partSize = 1; - } - - var intervals = []; - for (var i = 0; i <= noOfParts; i++) { - intervals.push(lowerBound + partSize * i); - } - return intervals; -} - -function getChartIntervals(maxValue) { - var minValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var _normalize = normalize(maxValue), - _normalize2 = slicedToArray(_normalize, 2), - normalMaxValue = _normalize2[0], - exponent = _normalize2[1]; - - var normalMinValue = minValue ? minValue / Math.pow(10, exponent) : 0; - - // Allow only 7 significant digits - normalMaxValue = normalMaxValue.toFixed(6); - - var intervals = getChartRangeIntervals(normalMaxValue, normalMinValue); - intervals = intervals.map(function (value) { - // For negative exponents we want to divide by 10^-exponent to avoid - // floating point arithmetic bugs. For instance, in javascript - // 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6 - if (exponent < 0) { - return value / Math.pow(10, -exponent); - } - return value * Math.pow(10, exponent); - }); - return intervals; -} - -function calcChartIntervals(values) { - var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - //*** Where the magic happens *** - - // Calculates best-fit y intervals from given values - // and returns the interval array - - var maxValue = Math.max.apply(Math, toConsumableArray(values)); - var minValue = Math.min.apply(Math, toConsumableArray(values)); - - // Exponent to be used for pretty print - var exponent = 0, - intervals = []; // eslint-disable-line no-unused-vars - - function getPositiveFirstIntervals(maxValue, absMinValue) { - var intervals = getChartIntervals(maxValue); - - var intervalSize = intervals[1] - intervals[0]; - - // Then unshift the negative values - var value = 0; - for (var i = 1; value < absMinValue; i++) { - value += intervalSize; - intervals.unshift(-1 * value); - } - return intervals; - } - - // CASE I: Both non-negative - - if (maxValue >= 0 && minValue >= 0) { - exponent = normalize(maxValue)[1]; - if (!withMinimum) { - intervals = getChartIntervals(maxValue); - } else { - intervals = getChartIntervals(maxValue, minValue); - } - } - - // CASE II: Only minValue negative - - else if (maxValue > 0 && minValue < 0) { - // `withMinimum` irrelevant in this case, - // We'll be handling both sides of zero separately - // (both starting from zero) - // Because ceil() and floor() behave differently - // in those two regions - - var absMinValue = Math.abs(minValue); - - if (maxValue >= absMinValue) { - exponent = normalize(maxValue)[1]; - intervals = getPositiveFirstIntervals(maxValue, absMinValue); - } else { - // Mirror: maxValue => absMinValue, then change sign - exponent = normalize(absMinValue)[1]; - var posIntervals = getPositiveFirstIntervals(absMinValue, maxValue); - intervals = posIntervals.reverse().map(function (d) { - return d * -1; - }); - } - } - - // CASE III: Both non-positive - - else if (maxValue <= 0 && minValue <= 0) { - // Mirrored Case I: - // Work with positives, then reverse the sign and array - - var pseudoMaxValue = Math.abs(minValue); - var pseudoMinValue = Math.abs(maxValue); - - exponent = normalize(pseudoMaxValue)[1]; - if (!withMinimum) { - intervals = getChartIntervals(pseudoMaxValue); - } else { - intervals = getChartIntervals(pseudoMaxValue, pseudoMinValue); - } - - intervals = intervals.reverse().map(function (d) { - return d * -1; - }); - } - - return intervals; -} - -function getZeroIndex(yPts) { - var zeroIndex = void 0; - var interval = getIntervalSize(yPts); - if (yPts.indexOf(0) >= 0) { - // the range has a given zero - // zero-line on the chart - zeroIndex = yPts.indexOf(0); - } else if (yPts[0] > 0) { - // Minimum value is positive - // zero-line is off the chart: below - var min = yPts[0]; - zeroIndex = -1 * min / interval; - } else { - // Maximum value is negative - // zero-line is off the chart: above - var max = yPts[yPts.length - 1]; - zeroIndex = -1 * max / interval + (yPts.length - 1); - } - return zeroIndex; -} - - - -function getIntervalSize(orderedArray) { - return orderedArray[1] - orderedArray[0]; -} - -function getValueRange(orderedArray) { - return orderedArray[orderedArray.length - 1] - orderedArray[0]; -} - -function scale(val, yAxis) { - return floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier); -} - - - - - -function getClosestInArray(goal, arr) { - var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var closest = arr.reduce(function (prev, curr) { - return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev; - }, []); - - return index ? arr.indexOf(closest) : closest; -} - -function calcDistribution(values, distributionSize) { - // Assume non-negative values, - // implying distribution minimum at zero - - var dataMaxValue = Math.max.apply(Math, toConsumableArray(values)); - - var distributionStep = 1 / (distributionSize - 1); - var distribution = []; - - for (var i = 0; i < distributionSize; i++) { - var checkpoint = dataMaxValue * (distributionStep * i); - distribution.push(checkpoint); - } - - return distribution; -} - -function getMaxCheckpoint(value, distribution) { - return distribution.filter(function (d) { - return d < value; - }).length; -} - -var COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE; -var ROW_HEIGHT = COL_WIDTH; -// const DAY_INCR = 1; - -var Heatmap = function (_BaseChart) { - inherits(Heatmap, _BaseChart); - - function Heatmap(parent, options) { - classCallCheck(this, Heatmap); - - var _this = possibleConstructorReturn(this, (Heatmap.__proto__ || Object.getPrototypeOf(Heatmap)).call(this, parent, options)); - - _this.type = 'heatmap'; - - _this.countLabel = options.countLabel || ''; - - var validStarts = ['Sunday', 'Monday']; - var startSubDomain = validStarts.includes(options.startSubDomain) ? options.startSubDomain : 'Sunday'; - _this.startSubDomainIndex = validStarts.indexOf(startSubDomain); - - _this.setup(); - return _this; - } - - createClass(Heatmap, [{ - key: 'setMeasures', - value: function setMeasures(options) { - var m = this.measures; - this.discreteDomains = options.discreteDomains === 0 ? 0 : 1; - - m.paddings.top = ROW_HEIGHT * 3; - m.paddings.bottom = 0; - m.legendHeight = ROW_HEIGHT * 2; - m.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK + getExtraHeight(m); - - var d = this.data; - var spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0; - this.independentWidth = (getWeeksBetween(d.start, d.end) + spacing) * COL_WIDTH + getExtraWidth(m); - } - }, { - key: 'updateWidth', - value: function updateWidth() { - var spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0; - var noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52; - this.baseWidth = (noOfWeeks + spacing) * COL_WIDTH + getExtraWidth(this.measures); - } - }, { - key: 'prepareData', - value: function prepareData() { - var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; - - if (data.start && data.end && data.start > data.end) { - throw new Error('Start date cannot be greater than end date.'); - } - - if (!data.start) { - data.start = new Date(); - data.start.setFullYear(data.start.getFullYear() - 1); - } - if (!data.end) { - data.end = new Date(); - } - data.dataPoints = data.dataPoints || {}; - - if (parseInt(Object.keys(data.dataPoints)[0]) > 100000) { - var points = {}; - Object.keys(data.dataPoints).forEach(function (timestampSec$$1) { - var date = new Date(timestampSec$$1 * NO_OF_MILLIS); - points[getYyyyMmDd(date)] = data.dataPoints[timestampSec$$1]; - }); - data.dataPoints = points; - } - - return data; - } - }, { - key: 'calc', - value: function calc() { - var s = this.state; - - s.start = clone(this.data.start); - s.end = clone(this.data.end); - - s.firstWeekStart = clone(s.start); - s.noOfWeeks = getWeeksBetween(s.start, s.end); - s.distribution = calcDistribution(Object.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE); - - s.domainConfigs = this.getDomains(); - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var _this2 = this; - - var s = this.state; - var lessCol = this.discreteDomains ? 0 : 1; - - var componentConfigs = s.domainConfigs.map(function (config, i) { - return ['heatDomain', { - index: config.index, - colWidth: COL_WIDTH, - rowHeight: ROW_HEIGHT, - squareSize: HEATMAP_SQUARE_SIZE, - radius: _this2.rawChartArgs.radius || 0, - xTranslate: s.domainConfigs.filter(function (config, j) { - return j < i; - }).map(function (config) { - return config.cols.length - lessCol; - }).reduce(function (a, b) { - return a + b; - }, 0) * COL_WIDTH - }, function () { - return s.domainConfigs[i]; - }.bind(_this2)]; - }); - - this.components = new Map(componentConfigs.map(function (args, i) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - return [args[0] + '-' + i, component]; - })); - - var y = 0; - DAY_NAMES_SHORT.forEach(function (dayName, i) { - if ([1, 3, 5].includes(i)) { - var dayText = makeText('subdomain-name', -COL_WIDTH / 2, y, dayName, { - fontSize: HEATMAP_SQUARE_SIZE, - dy: 8, - textAnchor: 'end' - }); - _this2.drawArea.appendChild(dayText); - } - y += ROW_HEIGHT; - }); - } - }, { - key: 'update', - value: function update(data) { - if (!data) { - console.error('No data to update.'); - } - - this.data = this.prepareData(data); - this.draw(); - this.bindTooltip(); - } - }, { - key: 'bindTooltip', - value: function bindTooltip() { - var _this3 = this; - - this.container.addEventListener('mousemove', function (e) { - _this3.components.forEach(function (comp) { - var daySquares = comp.store; - var daySquare = e.target; - if (daySquares.includes(daySquare)) { - - var count = daySquare.getAttribute('data-value'); - var dateParts = daySquare.getAttribute('data-date').split('-'); - - var month = getMonthName(parseInt(dateParts[1]) - 1, true); - - var gOff = _this3.container.getBoundingClientRect(), - pOff = daySquare.getBoundingClientRect(); - - var width = parseInt(e.target.getAttribute('width')); - var x = pOff.left - gOff.left + width / 2; - var y = pOff.top - gOff.top; - var value = count + ' ' + _this3.countLabel; - var name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2]; - - _this3.tip.setValues(x, y, { name: name, value: value, valueFirst: 1 }, []); - _this3.tip.showTip(); - } - }); - }); - } - }, { - key: 'renderLegend', - value: function renderLegend() { - var _this4 = this; - - this.legendArea.textContent = ''; - var x = 0; - var y = ROW_HEIGHT; - var radius = this.rawChartArgs.radius || 0; - - var lessText = makeText('subdomain-name', x, y, 'Less', { - fontSize: HEATMAP_SQUARE_SIZE + 1, - dy: 9 - }); - x = COL_WIDTH * 2 + COL_WIDTH / 2; - this.legendArea.appendChild(lessText); - - this.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map(function (color, i) { - var square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i, y, HEATMAP_SQUARE_SIZE, radius, color); - _this4.legendArea.appendChild(square); - }); - - var moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH / 4; - var moreText = makeText('subdomain-name', moreTextX, y, 'More', { - fontSize: HEATMAP_SQUARE_SIZE + 1, - dy: 9 - }); - this.legendArea.appendChild(moreText); - } - }, { - key: 'getDomains', - value: function getDomains() { - var s = this.state; - var _ref = [s.start.getMonth(), s.start.getFullYear()], - startMonth = _ref[0], - startYear = _ref[1]; - var _ref2 = [s.end.getMonth(), s.end.getFullYear()], - endMonth = _ref2[0], - endYear = _ref2[1]; - - - var noOfMonths = endMonth - startMonth + 1 + (endYear - startYear) * 12; - - var domainConfigs = []; - - var startOfMonth = clone(s.start); - for (var i = 0; i < noOfMonths; i++) { - var endDate = s.end; - if (!areInSameMonth(startOfMonth, s.end)) { - var _ref3 = [startOfMonth.getMonth(), startOfMonth.getFullYear()], - month = _ref3[0], - year = _ref3[1]; - - endDate = getLastDateInMonth(month, year); - } - domainConfigs.push(this.getDomainConfig(startOfMonth, endDate)); - - addDays(endDate, 1); - startOfMonth = endDate; - } - - return domainConfigs; - } - }, { - key: 'getDomainConfig', - value: function getDomainConfig(startDate) { - var endDate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - var _ref4 = [startDate.getMonth(), startDate.getFullYear()], - month = _ref4[0], - year = _ref4[1]; - - var startOfWeek = setDayToSunday(startDate); // TODO: Monday as well - endDate = clone(endDate) || getLastDateInMonth(month, year); - - var domainConfig = { - index: month, - cols: [] - }; - - addDays(endDate, 1); - var noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate); - - var cols = [], - col = void 0; - for (var i = 0; i < noOfMonthWeeks; i++) { - col = this.getCol(startOfWeek, month); - cols.push(col); - - startOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd); - addDays(startOfWeek, 1); - } - - if (col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) { - addDays(startOfWeek, 1); - cols.push(this.getCol(startOfWeek, month, true)); - } - - domainConfig.cols = cols; - - return domainConfig; - } - }, { - key: 'getCol', - value: function getCol(startDate, month) { - var empty = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - var s = this.state; - - // startDate is the start of week - var currentDate = clone(startDate); - var col = []; - - for (var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) { - var config = {}; - - // Non-generic adjustment for entire heatmap, needs state - var currentDateWithinData = currentDate >= s.start && currentDate <= s.end; - - if (empty || currentDate.getMonth() !== month || !currentDateWithinData) { - config.yyyyMmDd = getYyyyMmDd(currentDate); - } else { - config = this.getSubDomainConfig(currentDate); - } - col.push(config); - } - - return col; - } - }, { - key: 'getSubDomainConfig', - value: function getSubDomainConfig(date) { - var yyyyMmDd = getYyyyMmDd(date); - var dataValue = this.data.dataPoints[yyyyMmDd]; - var config = { - yyyyMmDd: yyyyMmDd, - dataValue: dataValue || 0, - fill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)] - }; - return config; - } - }]); - return Heatmap; -}(BaseChart); - -function dataPrep(data, type) { - data.labels = data.labels || []; - - var datasetLength = data.labels.length; - - // Datasets - var datasets = data.datasets; - var zeroArray = new Array(datasetLength).fill(0); - if (!datasets) { - // default - datasets = [{ - values: zeroArray - }]; - } - - datasets.map(function (d) { - // Set values - if (!d.values) { - d.values = zeroArray; - } else { - // Check for non values - var vals = d.values; - vals = vals.map(function (val) { - return !isNaN(val) ? val : 0; - }); - - // Trim or extend - if (vals.length > datasetLength) { - vals = vals.slice(0, datasetLength); - } else { - vals = fillArray(vals, datasetLength - vals.length, 0); - } - d.values = vals; - } - - // Set type - if (!d.chartType) { - if (!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE; - d.chartType = type; - } - }); - - // Markers - - // Regions - // data.yRegions = data.yRegions || []; - if (data.yRegions) { - data.yRegions.map(function (d) { - if (d.end < d.start) { - var _ref = [d.end, d.start]; - d.start = _ref[0]; - d.end = _ref[1]; - } - }); - } - - return data; -} - -function zeroDataPrep(realData) { - var datasetLength = realData.labels.length; - var zeroArray = new Array(datasetLength).fill(0); - - var zeroData = { - labels: realData.labels.slice(0, -1), - datasets: realData.datasets.map(function (d) { - var axisID = d.axisID; - - return { - axisID: axisID, - name: '', - values: zeroArray.slice(0, -1), - chartType: d.chartType - }; - }) - }; - - if (realData.yMarkers) { - zeroData.yMarkers = [{ - value: 0, - label: '' - }]; - } - - if (realData.yRegions) { - zeroData.yRegions = [{ - start: 0, - end: 0, - label: '' - }]; - } - - return zeroData; -} - -function getShortenedLabels(chartWidth) { - var labels = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - var isSeries = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; - - var allowedSpace = chartWidth / labels.length; - if (allowedSpace <= 0) allowedSpace = 1; - var allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH; - - var seriesMultiple = void 0; - if (isSeries) { - // Find the maximum label length for spacing calculations - var maxLabelLength = Math.max.apply(Math, toConsumableArray(labels.map(function (label) { - return label.length; - }))); - seriesMultiple = Math.ceil(maxLabelLength / allowedLetters); - } - - var calcLabels = labels.map(function (label, i) { - label += ""; - if (label.length > allowedLetters) { - - if (!isSeries) { - if (allowedLetters - 3 > 0) { - label = label.slice(0, allowedLetters - 3) + " ..."; - } else { - label = label.slice(0, allowedLetters) + '..'; - } - } else { - if (i % seriesMultiple !== 0) { - label = ""; - } - } - } - return label; - }); - - return calcLabels; -} - -var AxisChart = function (_BaseChart) { - inherits(AxisChart, _BaseChart); - - function AxisChart(parent, args) { - classCallCheck(this, AxisChart); - - var _this = possibleConstructorReturn(this, (AxisChart.__proto__ || Object.getPrototypeOf(AxisChart)).call(this, parent, args)); - - _this.barOptions = args.barOptions || {}; - _this.lineOptions = args.lineOptions || {}; - - _this.type = args.type || 'line'; - _this.init = 1; - - _this.setup(); - return _this; - } - - createClass(AxisChart, [{ - key: 'setMeasures', - value: function setMeasures() { - if (this.data.datasets.length <= 1) { - this.config.showLegend = 0; - this.measures.paddings.bottom = 30; - } - } - }, { - key: 'configure', - value: function configure(options) { - get(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'configure', this).call(this, options); - var _options$axisOptions = options.axisOptions, - axisOptions = _options$axisOptions === undefined ? {} : _options$axisOptions; - - var _ref = axisOptions || {}, - xAxis = _ref.xAxis, - yAxis = _ref.yAxis; - - options.tooltipOptions = options.tooltipOptions || {}; - - this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span'; - - // this will pass an array - // lets determine if we need two yAxis based on if there is length - // to the yAxis array - if (yAxis && yAxis.length) { - this.config.yAxisConfig = yAxis.map(function (item) { - return { - yAxisMode: item.yAxisMode, - id: item.id, - position: item.position, - title: item.title - }; - }); - } else { - this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span'; - - // if we have yAxis config settings lets populate a yAxis config array. - if (yAxis && yAxis.id && yAxis.position) { - this.config.yAxisConfig = [yAxis]; - } - } - - this.config.xIsSeries = axisOptions.xIsSeries || 0; - this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0; - - this.config.formatTooltipX = options.tooltipOptions.formatTooltipX; - this.config.formatTooltipY = options.tooltipOptions.formatTooltipY; - - this.config.valuesOverPoints = options.valuesOverPoints; - } - }, { - key: 'prepareData', - value: function prepareData() { - var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; - - return dataPrep(data, this.type); - } - }, { - key: 'prepareFirstData', - value: function prepareFirstData() { - var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.data; - - return zeroDataPrep(data); - } - }, { - key: 'calc', - value: function calc() { - var onlyWidthChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - this.calcXPositions(); - if (!onlyWidthChange) { - this.calcYAxisParameters(this.getAllYValues(), this.type === 'line'); - } - this.makeDataByIndex(); - } - }, { - key: 'calcXPositions', - value: function calcXPositions() { - var s = this.state; - var labels = this.data.labels; - s.datasetLength = labels.length; - - s.unitWidth = this.width / s.datasetLength; - // Default, as per bar, and mixed. Only line will be a special case - s.xOffset = s.unitWidth / 2; - - // // For a pure Line Chart - // s.unitWidth = this.width/(s.datasetLength - 1); - // s.xOffset = 0; - - s.xAxis = { - labels: labels, - positions: labels.map(function (d, i) { - return floatTwo(s.xOffset + i * s.unitWidth); - }) - }; - } - }, { - key: 'calcYAxisParameters', - value: function calcYAxisParameters(dataValues) { - var _this2 = this; - - var withMinimum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'false'; - - var yPts = void 0, - scaleMultiplier = void 0, - intervalHeight = void 0, - zeroLine = void 0, - positions = void 0, - yAxisConfigObject = void 0, - yAxisAlignment = void 0, - yKeys = void 0; - yKeys = []; - yAxisConfigObject = this.config.yAxisMode || {}; - yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; - - // if we have an object we have multiple yAxisParameters. - if (dataValues instanceof Array) { - yPts = calcChartIntervals(dataValues, withMinimum); - scaleMultiplier = this.height / getValueRange(yPts); - intervalHeight = getIntervalSize(yPts) * scaleMultiplier; - zeroLine = this.height - getZeroIndex(yPts) * intervalHeight; - - this.state.yAxis = { - labels: yPts, - positions: yPts.map(function (d) { - return zeroLine - d * scaleMultiplier; - }), - title: yAxisConfigObject.title || null, - pos: yAxisAlignment, - scaleMultiplier: scaleMultiplier, - zeroLine: zeroLine - }; - } else { - this.state.yAxis = []; - - var _loop = function _loop(key) { - var dataValue = dataValues[key]; - yAxisConfigObject = _this2.config.yAxisConfig.find(function (item) { - return key === item.id; - }) || []; - yAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left'; - yPts = calcChartIntervals(dataValue, withMinimum); - scaleMultiplier = _this2.height / getValueRange(yPts); - intervalHeight = getIntervalSize(yPts) * scaleMultiplier; - zeroLine = _this2.height - getZeroIndex(yPts) * intervalHeight; - positions = yPts.map(function (d) { - return zeroLine - d * scaleMultiplier; - }); - yKeys.push(key); - - if (_this2.state.yAxis.length > 1) { - var yPtsArray = []; - var firstArr = _this2.state.yAxis[0]; - - // we need to calculate the scaleMultiplier. - - // now that we have an accurate scaleMultiplier we can - // we need to loop through original positions. - scaleMultiplier = _this2.height / getValueRange(yPts); - firstArr.positions.forEach(function (pos) { - yPtsArray.push(Math.ceil(pos / scaleMultiplier)); - }); - yPts = yPtsArray.reverse(); - zeroLine = _this2.height - getZeroIndex(yPts) * intervalHeight; - positions = firstArr.positions; - } - - _this2.state.yAxis.push({ - axisID: key || 'left-axis', - labels: yPts, - title: yAxisConfigObject.title, - pos: yAxisAlignment, - scaleMultiplier: scaleMultiplier, - zeroLine: zeroLine, - positions: positions - }); - }; - - for (var key in dataValues) { - _loop(key); - } - - // the labels are not aligned in length between the two yAxis objects, - // we need to run some new calculations. - if (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) { - var newYptsArr = []; - // find the shorter array - var shortest = this.state.yAxis.reduce(function (p, c) { - return p.length > c.labels.length ? c : p; - }, { length: Infinity }); - // return the longest - var longest = this.state.yAxis.reduce(function (p, c) { - return p.length < c.labels.length ? p : c; - }, { length: Infinity }); - - // we now need to populate the shortest obj with the new scale multiplier - // with the positions of the longest obj. - longest.positions.forEach(function (pos) { - // calculate a new yPts - newYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier)); - }); - - shortest.labels = newYptsArr.reverse(); - shortest.positions = longest.positions; - } - } - - // Dependent if above changes - this.calcDatasetPoints(); - this.calcYExtremes(); - this.calcYRegions(); - } - }, { - key: 'calcDatasetPoints', - value: function calcDatasetPoints() { - var s = this.state; - var scaleAll = function scaleAll(values, id) { - return values.map(function (val) { - var yAxis = s.yAxis; - - - if (yAxis instanceof Array) { - yAxis = yAxis.length > 1 ? yAxis.find(function (axis) { - return id === axis.axisID; - }) : s.yAxis[0]; - } - - return scale(val, yAxis); - }); - }; - - s.barChartIndex = 1; - s.datasets = this.data.datasets.map(function (d, i) { - var values = d.values; - var cumulativeYs = d.cumulativeYs || []; - - return { - name: d.name && d.name.replace(/<|>|&/g, function (char) { - return char == '&' ? '&' : char == '<' ? '<' : '>'; - }), - index: i, - barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex, - chartType: d.chartType, - - values: values, - yPositions: scaleAll(values, d.axisID), - id: d.axisID, - - cumulativeYs: cumulativeYs, - cumulativeYPos: scaleAll(cumulativeYs, d.axisID) - }; - }); - } - }, { - key: 'calcYExtremes', - value: function calcYExtremes() { - var s = this.state; - if (this.barOptions.stacked) { - s.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos; - return; - } - s.yExtremes = new Array(s.datasetLength).fill(9999); - s.datasets.map(function (d) { - d.yPositions.map(function (pos, j) { - if (pos < s.yExtremes[j]) { - s.yExtremes[j] = pos; - } - }); - }); - } - }, { - key: 'calcYRegions', - value: function calcYRegions() { - var s = this.state; - if (this.data.yMarkers) { - this.state.yMarkers = this.data.yMarkers.map(function (d) { - d.position = scale(d.value, s.yAxis); - if (!d.options) d.options = {}; - // if(!d.label.includes(':')) { - // d.label += ': ' + d.value; - // } - return d; - }); - } - if (this.data.yRegions) { - this.state.yRegions = this.data.yRegions.map(function (d) { - d.startPos = scale(d.start, s.yAxis); - d.endPos = scale(d.end, s.yAxis); - if (!d.options) d.options = {}; - return d; - }); - } - } - }, { - key: 'getAllYValues', - value: function getAllYValues() { - var _this3 = this, - _ref2; - - var key = 'values'; - var multiAxis = this.config.yAxisConfig ? true : false; - var allValueLists = multiAxis ? {} : []; - - var groupBy = function groupBy(arr, property) { - return arr.reduce(function (acc, cur) { - acc[cur[property]] = [].concat(toConsumableArray(acc[cur[property]] || []), [cur]); - return acc; - }, {}); - }; - - var generateCumulative = function generateCumulative(arr) { - var cumulative = new Array(_this3.state.datasetLength).fill(0); - arr.forEach(function (d, i) { - var values = arr[i].values; - d[key] = cumulative = cumulative.map(function (c, i) { - return c + values[i]; - }); - }); - }; - - if (this.barOptions.stacked) { - key = 'cumulativeYs'; - // we need to filter out the different yAxis ID's here. - if (multiAxis) { - var groupedDataSets = groupBy(this.data.datasets, 'axisID'); - // const dataSetsByAxis = this.data.dd - for (var axisID in groupedDataSets) { - generateCumulative(groupedDataSets[axisID]); - } - } else { - generateCumulative(this.data.datasets); - } - } - - // this is the trouble maker, we don't want to merge all - // datasets since we are trying to run two yAxis. - if (multiAxis) { - this.data.datasets.forEach(function (d) { - var _allValueLists; - - // if the array exists already just push more data into it. - // otherwise create a new array into the object. - allValueLists[d.axisID || key] ? (_allValueLists = allValueLists[d.axisID || key]).push.apply(_allValueLists, toConsumableArray(d[key])) : allValueLists[d.axisID || key] = [].concat(toConsumableArray(d[key])); - }); - } else { - allValueLists = this.data.datasets.map(function (d) { - return d[key]; - }); - } - - if (this.data.yMarkers && !multiAxis) { - allValueLists.push(this.data.yMarkers.map(function (d) { - return d.value; - })); - } - - if (this.data.yRegions && !multiAxis) { - this.data.yRegions.map(function (d) { - allValueLists.push([d.end, d.start]); - }); - } - - return multiAxis ? allValueLists : (_ref2 = []).concat.apply(_ref2, toConsumableArray(allValueLists)); - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var _this4 = this; - - var componentConfigs = [['xAxis', { - mode: this.config.xAxisMode, - height: this.height - // pos: 'right' - }, function () { - var s = this.state; - s.xAxis.calcLabels = getShortenedLabels(this.width, s.xAxis.labels, this.config.xIsSeries); - - return s.xAxis; - }.bind(this)], ['yRegions', { - width: this.width, - pos: 'right' - }, function () { - return this.state.yRegions; - }.bind(this)]]; - - // if we have multiple yAxisConfigs we need to update the yAxisDefault - // components to multiple yAxis components. - if (this.config.yAxisConfig && this.config.yAxisConfig.length) { - this.config.yAxisConfig.forEach(function (yAxis) { - componentConfigs.push(['yAxis', { - mode: _this4.config.yAxisMode, - width: _this4.width, - shortenNumbers: _this4.config.shortenYAxisNumbers, - pos: yAxis.position || 'left' - }, function () { - return this.state.yAxis; - }.bind(_this4)]); - }); - } else { - componentConfigs.push(['yAxis', { - mode: this.config.yAxisMode, - width: this.width, - shortenNumbers: this.config.shortenYAxisNumbers - }, function () { - return this.state.yAxis; - }.bind(this)]); - } - - var barDatasets = this.state.datasets.filter(function (d) { - return d.chartType === 'bar'; - }); - var lineDatasets = this.state.datasets.filter(function (d) { - return d.chartType === 'line'; - }); - - var barsConfigs = barDatasets.map(function (d) { - var index = d.index; - var barIndex = d.barIndex || index; - return ['barGraph' + '-' + d.index, { - index: index, - color: _this4.colors[index], - stacked: _this4.barOptions.stacked, - - // same for all datasets - valuesOverPoints: _this4.config.valuesOverPoints, - minHeight: _this4.height * MIN_BAR_PERCENT_HEIGHT - }, function () { - var s = this.state; - var yAxis = s.yAxis; - - var d = s.datasets[index]; - var _d$id = d.id, - id = _d$id === undefined ? 'left-axis' : _d$id; - - var stacked = this.barOptions.stacked; - - var spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO; - var barsWidth = s.unitWidth * (1 - spaceRatio); - var barWidth = barsWidth / (stacked ? 1 : barDatasets.length); - - // if there are multiple yAxis we need to return the yAxis with the - // proper ID. - if (yAxis instanceof Array) { - // if the person only configured one yAxis in the array return the first. - yAxis = yAxis.length > 1 ? yAxis.find(function (axis) { - return id === axis.axisID; - }) : s.yAxis[0]; - } - - var xPositions = s.xAxis.positions.map(function (x) { - return x - barsWidth / 2; - }); - - if (!stacked) { - xPositions = xPositions.map(function (p) { - return p + barWidth * barIndex - barWidth; - }); - } - - var labels = new Array(s.datasetLength).fill(''); - if (this.config.valuesOverPoints) { - if (stacked && d.index === s.datasets.length - 1) { - labels = d.cumulativeYs; - } else { - labels = d.values; - } - } - var offsets = new Array(s.datasetLength).fill(0); - if (stacked) { - offsets = d.yPositions.map(function (y, j) { - return y - d.cumulativeYPos[j]; - }); - } - - return { - xPositions: xPositions, - yPositions: d.yPositions, - offsets: offsets, - // values: d.values, - labels: labels, - - zeroLine: yAxis.zeroLine, - barsWidth: barsWidth, - barWidth: barWidth - }; - }.bind(_this4)]; - }); - - var lineConfigs = lineDatasets.map(function (d) { - var index = d.index; - return ['lineGraph' + '-' + d.index, { - index: index, - color: _this4.colors[index], - svgDefs: _this4.svgDefs, - heatline: _this4.lineOptions.heatline, - regionFill: _this4.lineOptions.regionFill, - spline: _this4.lineOptions.spline, - hideDots: _this4.lineOptions.hideDots, - hideLine: _this4.lineOptions.hideLine, - - // same for all datasets - valuesOverPoints: _this4.config.valuesOverPoints - }, function () { - var s = this.state; - var d = s.datasets[index]; - - // if we have more than one yindex lets map the values - var yAxis = s.yAxis.length ? s.yAxis.find(function (axis) { - return d.id === axis.axisID; - }) || s.yAxis[0] : s.yAxis; - - var minLine = yAxis.positions[0] < yAxis.zeroLine ? yAxis.positions[0] : yAxis.zeroLine; - - return { - xPositions: s.xAxis.positions, - yPositions: d.yPositions, - - values: d.values, - - zeroLine: minLine, - radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE - }; - }.bind(_this4)]; - }); - - var markerConfigs = [['yMarkers', { - width: this.width, - pos: 'right' - }, function () { - return this.state.yMarkers; - }.bind(this)]]; - - componentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs); - - var optionals = ['yMarkers', 'yRegions']; - this.dataUnitComponents = []; - - this.components = new Map(componentConfigs.filter(function (args) { - return !optionals.includes(args[0]) || _this4.state[args[0]]; - }).map(function (args) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - if (args[0].includes('lineGraph') || args[0].includes('barGraph')) { - _this4.dataUnitComponents.push(component); - } - return [args[0], component]; - })); - } - }, { - key: 'makeDataByIndex', - value: function makeDataByIndex() { - var _this5 = this; - - this.dataByIndex = {}; - - var s = this.state; - var formatX = this.config.formatTooltipX; - var formatY = this.config.formatTooltipY; - var titles = s.xAxis.labels; - - titles.map(function (label, index) { - var values = _this5.state.datasets.map(function (set$$1, i) { - var value = set$$1.values[index]; - return { - title: set$$1.name, - value: value, - yPos: set$$1.yPositions[index], - color: _this5.colors[i], - formatted: formatY ? formatY(value) : value - }; - }); - - _this5.dataByIndex[index] = { - label: label, - formattedLabel: formatX ? formatX(label) : label, - xPos: s.xAxis.positions[index], - values: values, - yExtreme: s.yExtremes[index] - }; - }); - } - }, { - key: 'bindTooltip', - value: function bindTooltip() { - var _this6 = this; - - // NOTE: could be in tooltip itself, as it is a given functionality for its parent - this.container.addEventListener('mousemove', function (e) { - var m = _this6.measures; - var o = getOffset(_this6.container); - var relX = e.pageX - o.left - getLeftOffset(m); - var relY = e.pageY - o.top; - - if (relY < _this6.height + getTopOffset(m) && relY > getTopOffset(m)) { - _this6.mapTooltipXPosition(relX); - } else { - _this6.tip.hideTip(); - } - }); - } - }, { - key: 'mapTooltipXPosition', - value: function mapTooltipXPosition(relX) { - var s = this.state; - if (!s.yExtremes) return; - - var index = getClosestInArray(relX, s.xAxis.positions, true); - if (index >= 0) { - var dbi = this.dataByIndex[index]; - - this.tip.setValues(dbi.xPos + this.tip.offset.x, dbi.yExtreme + this.tip.offset.y, { name: dbi.formattedLabel, value: '' }, dbi.values, index); - - this.tip.showTip(); - } - } - }, { - key: 'renderLegend', - value: function renderLegend() { - var _this7 = this; - - var s = this.data; - if (s.datasets.length > 1) { - this.legendArea.textContent = ''; - s.datasets.map(function (d, i) { - var barWidth = AXIS_LEGEND_BAR_SIZE; - // let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right; - // let multiplier = s.datasets.length - i; - var rect = legendBar( - // rightEndPoint - multiplier * barWidth, // To right align - barWidth * i, '0', barWidth, _this7.colors[i], d.name, _this7.config.truncateLegends); - _this7.legendArea.appendChild(rect); - }); - } - } - - // Overlay - - }, { - key: 'makeOverlay', - value: function makeOverlay$$1() { - var _this8 = this; - - if (this.init) { - this.init = 0; - return; - } - if (this.overlayGuides) { - this.overlayGuides.forEach(function (g) { - var o = g.overlay; - o.parentNode.removeChild(o); - }); - } - - this.overlayGuides = this.dataUnitComponents.map(function (c) { - return { - type: c.unitType, - overlay: undefined, - units: c.units - }; - }); - - if (this.state.currentIndex === undefined) { - this.state.currentIndex = this.state.datasetLength - 1; - } - - // Render overlays - this.overlayGuides.map(function (d) { - var currentUnit = d.units[_this8.state.currentIndex]; - - d.overlay = makeOverlay[d.type](currentUnit); - _this8.drawArea.appendChild(d.overlay); - }); - } - }, { - key: 'updateOverlayGuides', - value: function updateOverlayGuides() { - if (this.overlayGuides) { - this.overlayGuides.forEach(function (g) { - var o = g.overlay; - o.parentNode.removeChild(o); - }); - } - } - }, { - key: 'bindOverlay', - value: function bindOverlay() { - var _this9 = this; - - this.parent.addEventListener('data-select', function () { - _this9.updateOverlay(); - }); - } - }, { - key: 'bindUnits', - value: function bindUnits() { - var _this10 = this; - - this.dataUnitComponents.map(function (c) { - c.units.map(function (unit) { - unit.addEventListener('click', function () { - var index = unit.getAttribute('data-point-index'); - _this10.setCurrentDataPoint(index); - }); - }); - }); - - // Note: Doesn't work as tooltip is absolutely positioned - this.tip.container.addEventListener('click', function () { - var index = _this10.tip.container.getAttribute('data-point-index'); - _this10.setCurrentDataPoint(index); - }); - } - }, { - key: 'updateOverlay', - value: function updateOverlay$$1() { - var _this11 = this; - - this.overlayGuides.map(function (d) { - var currentUnit = d.units[_this11.state.currentIndex]; - updateOverlay[d.type](currentUnit, d.overlay); - }); - } - }, { - key: 'onLeftArrow', - value: function onLeftArrow() { - this.setCurrentDataPoint(this.state.currentIndex - 1); - } - }, { - key: 'onRightArrow', - value: function onRightArrow() { - this.setCurrentDataPoint(this.state.currentIndex + 1); - } - }, { - key: 'getDataPoint', - value: function getDataPoint() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentIndex; - - var s = this.state; - var data_point = { - index: index, - label: s.xAxis.labels[index], - values: s.datasets.map(function (d) { - return d.values[index]; - }) - }; - return data_point; - } - }, { - key: 'setCurrentDataPoint', - value: function setCurrentDataPoint(index) { - var s = this.state; - index = parseInt(index); - if (index < 0) index = 0; - if (index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1; - if (index === s.currentIndex) return; - s.currentIndex = index; - fire(this.parent, "data-select", this.getDataPoint()); - } - - // API - - }, { - key: 'addDataPoint', - value: function addDataPoint(label, datasetValues) { - var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.state.datasetLength; - - get(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'addDataPoint', this).call(this, label, datasetValues, index); - this.data.labels.splice(index, 0, label); - this.data.datasets.map(function (d, i) { - d.values.splice(index, 0, datasetValues[i]); - }); - this.update(this.data); - } - }, { - key: 'removeDataPoint', - value: function removeDataPoint() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.datasetLength - 1; - - if (this.data.labels.length <= 1) { - return; - } - get(AxisChart.prototype.__proto__ || Object.getPrototypeOf(AxisChart.prototype), 'removeDataPoint', this).call(this, index); - this.data.labels.splice(index, 1); - this.data.datasets.map(function (d) { - d.values.splice(index, 1); - }); - this.update(this.data); - } - }, { - key: 'updateDataset', - value: function updateDataset(datasetValues) { - var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - this.data.datasets[index].values = datasetValues; - this.update(this.data); - } - // addDataset(dataset, index) {} - // removeDataset(index = 0) {} - - }, { - key: 'updateDatasets', - value: function updateDatasets(datasets) { - this.data.datasets.map(function (d, i) { - if (datasets[i]) { - d.values = datasets[i]; - } - }); - this.update(this.data); - } - - // updateDataPoint(dataPoint, index = 0) {} - // addDataPoint(dataPoint, index = 0) {} - // removeDataPoint(index = 0) {} - - }]); - return AxisChart; -}(BaseChart); - -var DonutChart = function (_AggregationChart) { - inherits(DonutChart, _AggregationChart); - - function DonutChart(parent, args) { - classCallCheck(this, DonutChart); - - var _this = possibleConstructorReturn(this, (DonutChart.__proto__ || Object.getPrototypeOf(DonutChart)).call(this, parent, args)); - - _this.type = 'donut'; - _this.initTimeout = 0; - _this.init = 1; - - _this.setup(); - return _this; - } - - createClass(DonutChart, [{ - key: 'configure', - value: function configure(args) { - get(DonutChart.prototype.__proto__ || Object.getPrototypeOf(DonutChart.prototype), 'configure', this).call(this, args); - this.mouseMove = this.mouseMove.bind(this); - this.mouseLeave = this.mouseLeave.bind(this); - - this.hoverRadio = args.hoverRadio || 0.1; - this.config.startAngle = args.startAngle || 0; - - this.clockWise = args.clockWise || false; - this.strokeWidth = args.strokeWidth || 30; - } - }, { - key: 'calc', - value: function calc() { - var _this2 = this; - - get(DonutChart.prototype.__proto__ || Object.getPrototypeOf(DonutChart.prototype), 'calc', this).call(this); - var s = this.state; - this.radius = this.height > this.width ? this.center.x - this.strokeWidth / 2 : this.center.y - this.strokeWidth / 2; - - var radius = this.radius, - clockWise = this.clockWise; - - - var prevSlicesProperties = s.slicesProperties || []; - s.sliceStrings = []; - s.slicesProperties = []; - var curAngle = 180 - this.config.startAngle; - - s.sliceTotals.map(function (total, i) { - var startAngle = curAngle; - var originDiffAngle = total / s.grandTotal * FULL_ANGLE; - var largeArc = originDiffAngle > 180 ? 1 : 0; - var diffAngle = clockWise ? -originDiffAngle : originDiffAngle; - var endAngle = curAngle = curAngle + diffAngle; - var startPosition = getPositionByAngle(startAngle, radius); - var endPosition = getPositionByAngle(endAngle, radius); - - var prevProperty = _this2.init && prevSlicesProperties[i]; - - var curStart = void 0, - curEnd = void 0; - if (_this2.init) { - curStart = prevProperty ? prevProperty.startPosition : startPosition; - curEnd = prevProperty ? prevProperty.endPosition : startPosition; - } else { - curStart = startPosition; - curEnd = endPosition; - } - var curPath = originDiffAngle === 360 ? makeStrokeCircleStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise, largeArc) : makeArcStrokePathStr(curStart, curEnd, _this2.center, _this2.radius, _this2.clockWise, largeArc); - - s.sliceStrings.push(curPath); - s.slicesProperties.push({ - startPosition: startPosition, - endPosition: endPosition, - value: total, - total: s.grandTotal, - startAngle: startAngle, - endAngle: endAngle, - angle: diffAngle - }); - }); - this.init = 0; - } - }, { - key: 'setupComponents', - value: function setupComponents() { - var s = this.state; - - var componentConfigs = [['donutSlices', {}, function () { - return { - sliceStrings: s.sliceStrings, - colors: this.colors, - strokeWidth: this.strokeWidth - }; - }.bind(this)]]; - - this.components = new Map(componentConfigs.map(function (args) { - var component = getComponent.apply(undefined, toConsumableArray(args)); - return [args[0], component]; - })); - } - }, { - key: 'calTranslateByAngle', - value: function calTranslateByAngle(property) { - var radius = this.radius, - hoverRadio = this.hoverRadio; - - var position = getPositionByAngle(property.startAngle + property.angle / 2, radius); - return 'translate3d(' + position.x * hoverRadio + 'px,' + position.y * hoverRadio + 'px,0)'; - } - }, { - key: 'hoverSlice', - value: function hoverSlice(path, i, flag, e) { - if (!path) return; - var color = this.colors[i]; - if (flag) { - transform(path, this.calTranslateByAngle(this.state.slicesProperties[i])); - path.style.stroke = lightenDarkenColor(color, 50); - var g_off = getOffset(this.svg); - var x = e.pageX - g_off.left + 10; - var y = e.pageY - g_off.top - 10; - var title = (this.formatted_labels && this.formatted_labels.length > 0 ? this.formatted_labels[i] : this.state.labels[i]) + ': '; - var percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1); - this.tip.setValues(x, y, { name: title, value: percent + "%" }); - this.tip.showTip(); - } else { - transform(path, 'translate3d(0,0,0)'); - this.tip.hideTip(); - path.style.stroke = color; - } - } - }, { - key: 'bindTooltip', - value: function bindTooltip() { - this.container.addEventListener('mousemove', this.mouseMove); - this.container.addEventListener('mouseleave', this.mouseLeave); - } - }, { - key: 'mouseMove', - value: function mouseMove(e) { - var target = e.target; - var slices = this.components.get('donutSlices').store; - var prevIndex = this.curActiveSliceIndex; - var prevAcitve = this.curActiveSlice; - if (slices.includes(target)) { - var i = slices.indexOf(target); - this.hoverSlice(prevAcitve, prevIndex, false); - this.curActiveSlice = target; - this.curActiveSliceIndex = i; - this.hoverSlice(target, i, true, e); - } else { - this.mouseLeave(); - } - } - }, { - key: 'mouseLeave', - value: function mouseLeave() { - this.hoverSlice(this.curActiveSlice, this.curActiveSliceIndex, false); - } - }]); - return DonutChart; -}(AggregationChart); - -var chartTypes = { - bar: AxisChart, - line: AxisChart, - // multiaxis: MultiAxisChart, - percentage: PercentageChart, - heatmap: Heatmap, - pie: PieChart, - donut: DonutChart -}; - -function getChartByType() { - var chartType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'line'; - var parent = arguments[1]; - var options = arguments[2]; - - if (chartType === 'axis-mixed') { - options.type = 'line'; - return new AxisChart(parent, options); - } - - if (!chartTypes[chartType]) { - console.error("Undefined chart type: " + chartType); - return; - } - - return new chartTypes[chartType](parent, options); -} - -var Chart = function Chart(parent, options) { - classCallCheck(this, Chart); - - return getChartByType(options.type, parent, options); -}; - - - -var Charts = Object.freeze({ - Chart: Chart, - PercentageChart: PercentageChart, - PieChart: PieChart, - Heatmap: Heatmap, - AxisChart: AxisChart -}); - -var frappe = {}; - -frappe.NAME = 'Frappe Charts'; -frappe.VERSION = '1.6.2'; - -frappe = Object.assign({}, frappe, Charts); - -var frappe$1 = frappe; - -return frappe$1; - -}()); +var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function h(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function u(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function M(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function D(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)M(a).appendChild(i);else if("around"===n){var s=M(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function T(t,e){return D("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function C(t,e,i,n){return D("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return D("svg",{className:e,inside:t,width:i,height:n})}function O(t){return D("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),D("g",n)}function S(t){return D("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*i.y,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z\n\t\tL"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*n+o,u=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+"\n\t\tM"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=T(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),C(a,"0%",e,s[0]),C(a,"50%",e,s[1]),C(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return D("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),D("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=D("text",{className:"legend-dataset-text",x:0,y:0,dy:2*oe+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:he,innerHTML:a}),o=D("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(D("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=D("text",{className:"legend-dataset-text",x:0,y:0,dx:oe+"px",dy:oe/3+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:he,innerHTML:a}),o=D("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(D("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||oe;return D("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||he,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le);var s=D("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=D("text",{x:0,y:i>n?i+se:i-se-oe,dy:oe+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:e+""}),o=D("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=D("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=D("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:oe/2-2+"px","font-size":oe+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=D("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||le,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=D("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:le,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=D("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:n+""}),l=D("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),h=Ut(l,2),u=h[0],c=h[1];c-=r,0===u&&(u=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(u,!0)||(u=0),f(i,!0)||(i=0);var d=D("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:u});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=D("text",{className:"data-point-value",x:i/2,y:0,dy:oe/2*-1+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),v=D("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=D("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=D("text",{className:"data-point-value",x:0,y:0,dy:oe/2*-1-i+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),l=D("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var h=H(a.svgDefs,i,!0),u="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(u,"region-fill","none","url(#"+h+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ge,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],fe)}function et(t,e,i){return Z(t,[0,i],[0,e],fe)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},fe,ge],Z(t,[0,n],[0,i],fe)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},de,ge],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],fe)]:[[t,{width:n,height:o,x:e,y:l},de,ge]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],fe)]:[[t,{cx:e,cy:i},de,ge]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},pe,ge];if(s.push(o),t.region){var l=e[0]+","+n+"L",h="L"+e.slice(-1)[0]+", "+n,u=[t.region,{d:"M"+l+r+h},pe,ge];s.push(u)}return s}function rt(t,e){return[t,{d:e},de,ge]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var h=void 0;h="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:u,to:c,begin:"0s",dur:i/1e3+"s",values:u+";"+c,keySplines:ye[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)h.setAttribute(p,d[p]);r.appendChild(h),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ht(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ut(t,e,i){if(0!==i.length){var n=ht(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ve)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/ke)}function yt(t,e){var i=Ae*we;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Pe[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new De(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Mt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Tt(t){function e(t,e){for(var i=Dt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Dt(n,a):Dt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Dt(o,l):Dt(o)).reverse().map(function(t){return-1*t})}return s}function Ct(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return u(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ne(e,i)):Ee[t]?new Ee[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                                          \n\t\t\t\t
                                          '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=10,le="#dadada",he="#555b51",ue={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},ce={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},de=350,pe=350,fe=de,ve=250,ge="easein",ye={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",be=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-h(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ut(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),xe=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-h(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,u=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],u+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(be),ke=7,we=1e3,Ae=86400,Pe=["January","February","March","April","May","June","July","August","September","October","November","December"],Me=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],De=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,h=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=h,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(t,n){t.positions.map(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:e.constants.width}))}),i):(t.positions.forEach(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:this.constants.width})),i)},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var h=[];return this.store.map(function(t,e){h=h.concat(it(t,s[e],n[e],o[e]))}),h}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,h=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,h,r,o,t.fill,n);e.serializedSubDomains.push(a)}h+=s}),h=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,h=m(s,e),u=Ut(h,2);s=u[0],e=u[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var h=m(s,i),u=Ut(h,2);s=u[0],i=u[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Ce=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),h=l.left-o.left+parseInt(s.getAttribute("width"))/2,u=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(h,u,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(xe),Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?_(y,m,t.center,t.radius,a,u):E(y,m,t.center,t.radius,a,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Oe=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*ke+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+h(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+h(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*we);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],h=void 0,u=0;u2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(be),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):(this.config.yAxisMode=r?r.yAxisMode:n.yAxisMode||"span",r&&r.id&&r.position&&(this.config.yAxisConfig=[r])),this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return u(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0,l=void 0,h=void 0,u=void 0;if(u=[],l=this.config.yAxisMode||{},h=l.position?l.position:"left",t instanceof Array)n=Tt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Ct(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),title:l.title||null,pos:h,scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var c in t)!function(c){var d=t[c];if(l=e.config.yAxisConfig.find(function(t){return c===t.id})||[],h=l.position?l.position:"left",n=Tt(d,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Ct(n)*s,o=n.map(function(t){return r-t*a}),u.push(c),e.state.yAxis.length>1){var p=[],f=e.state.yAxis[0];a=e.height/Ot(n),f.positions.forEach(function(t){p.push(Math.ceil(t/a))}),n=p.reverse(),r=e.height-Ct(n)*s,o=f.positions}e.state.yAxis.push({axisID:c||"left-axis",labels:n,title:l.title,pos:h,scaleMultiplier:a,zeroLine:r,positions:o})}(c);if(this.state.yAxis[1]&&this.state.yAxis[0].labels.length!==this.state.yAxis[1].labels.length){var d=[],p=this.state.yAxis.reduce(function(t,e){return t.length>e.labels.length?e:t},{length:1/0}),f=this.state.yAxis.reduce(function(t,e){return t.length1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-u/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:u,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=ue[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];ce[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(be),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?I(y,m,t.center,t.radius,t.clockWise,u):z(y,m,t.center,t.radius,t.clockWise,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Ee={bar:Ne,line:Ne,percentage:Ce,heatmap:Oe,pie:Le,donut:Se},_e=function t(e,i){return jt(this,t),Wt(i.type,e,i)},ze=Object.freeze({Chart:_e,PercentageChart:Ce,PieChart:Le,Heatmap:Oe,AxisChart:Ne}),Ie={};return Ie.NAME="Frappe Charts",Ie.VERSION="1.6.2",Ie=Object.assign({},Ie,ze)}(); //# sourceMappingURL=frappe-charts.min.js.map diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index c2b2051..be935e5 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/objects/SvgTip.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/css/chartsCss.js","../../../src/js/utils/export.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/utils/intervals.js","../../../src/js/charts/Heatmap.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/chart.js","../../../src/js/index.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                            \n\t\t\t\t
                                            `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["$","expr","con","document","querySelector","create","tag","o","element","createElement","i","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","getOffset","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","BASE_MEASURES","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","totalExtraHeight","legendHeight","getExtraWidth","totalExtraWidth","INIT_CHART_UPDATE_TIMEOUT","CHART_POST_ANIMATE_TIMEOUT","DEFAULT_AXIS_CHART_TYPE","AXIS_DATASET_CHART_TYPES","AXIS_LEGEND_BAR_SIZE","BAR_CHART_SPACE_RATIO","MIN_BAR_PERCENT_HEIGHT","LINE_CHART_DOT_SIZE","DOT_OVERLAY_SIZE_INCR","PERCENTAGE_BAR_DEFAULT_HEIGHT","PERCENTAGE_BAR_DEFAULT_DEPTH","HEATMAP_DISTRIBUTION_SIZE","HEATMAP_SQUARE_SIZE","HEATMAP_GUTTER_SIZE","DEFAULT_CHAR_WIDTH","TOOLTIP_POINTER_TRIANGLE_HEIGHT","DEFAULT_CHART_COLORS","HEATMAP_COLORS_GREEN","DEFAULT_COLORS","ANGLE_RATIO","Math","PI","FULL_ANGLE","SvgTip","parent","colors","titleName","titleValue","listValues","titleValueFirst","x","y","setup","makeTooltip","fill","calcPosition","container","hideTip","title","dataPointList","addEventListener","index","innerHTML","set","color","value","formatted","li","width","offsetWidth","offsetHeight","maxLeft","pointer","delta","pointerOffset","name","valueFirst","refresh","opacity","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","abs","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","push","smoothing","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","n","bezierCommand","point","a","cps","cpe","pointStr","command","reduce","acc","PRESET_COLOR_MAP","limitColor","r","lightenDarkenColor","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","HEX_RE","RGB_RE","test","exec","c","ch","AXIS_TICK_LENGTH","LABEL_MARGIN","LABEL_MAX_CHARS","FONT_SIZE","BASE_LINE_COLOR","FONT_FILL","createSVG","createElementNS","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","makeSVGContainer","className","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","stroke","strokeWidth","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","heatSquare","size","data","legendBar","truncate","text","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","position","rotation","labelSvg","yLine","pos","mode","xLine","yMarker","labelPos","yRegion","region","datasetBar","meta","minHeight","datasetDot","dot","getPaths","pointsList","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","makeOverlay","unit","transformValue","nodeName","getAttribute","childNodes","overlay","cloneNode","updateOverlay","attributes","values","filter","includes","attr","specified","nodeValue","UNIT_ANIM_DUR","PATH_ANIM_DUR","MARKER_LINE_ANIM_DUR","REPLACE_ALL_NEW_DUR","STD_EASING","translate","oldCoord","newCoord","duration","old","translateVertLine","newX","oldX","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","rectAnim","groupAnim","animateBar","bar","oldCoordStr","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","EASING","animateSVGElement","props","dur","easingType","oldValues","animElement","newElement","attributeName","animateElement","currentValue","animAttr","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","CSSTEXT","downloadFile","filename","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","firstChild","BaseChart","HTMLElement","Error","rawChartArgs","realData","prepareData","prepareFirstData","validateColors","config","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","error","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","labels","total","datasets","totals","sort","remaining","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","NO_OF_YEAR_MONTHS","NO_OF_DAYS_IN_WEEK","NO_OF_MILLIS","SEC_IN_DAY","MONTH_NAMES","DAY_NAMES_SHORT","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","millisecondsPerDay","areInSameMonth","getMonthName","short","monthName","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","ChartComponent","layerClass","layerTransform","constants","getData","makeElements","animateElements","store","layer","oldData","componentConfigs","sliceStrings","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","newOptions","startPos","endPos","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","monthNameHeight","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","Object","newValues","getComponent","k","assign","PercentageChart","barOptions","component","xPos","bars","get","indexOf","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","normalize","mantissa","exponent","sig","exp","man","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","withMinimum","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","posIntervals","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","zeroIndex","interval","getIntervalSize","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","COL_WIDTH","ROW_HEIGHT","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","spacing","end","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","moreTextX","moreText","startMonth","startYear","endMonth","endYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","dataPrep","datasetLength","zeroArray","vals","chartType","yRegions","zeroDataPrep","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","seriesMultiple","maxLabelLength","AxisChart","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","groupBy","cur","generateCumulative","cumulative","groupedDataSets","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","titles","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","setCurrentDataPoint","data_point","getDataPoint","datasetValues","splice","DonutChart","chartTypes","getChartByType","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                              \n\t\t\t\t
                                              `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","rotation","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file From 31c8c7d0089723e24c7167d3a3a8b5bcd730ef42 Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Mon, 15 Nov 2021 17:14:06 -0800 Subject: [PATCH 7/9] Fixes positioning of labels. --- docs/assets/js/frappe-charts.min.js | 2 +- docs/assets/js/frappe-charts.min.js.map | 2 +- src/js/charts/AxisChart.js | 2 ++ src/js/objects/ChartComponents.js | 4 +-- src/js/utils/draw.js | 36 +++++++++++++++++-------- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index 011925f..555c386 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -1,2 +1,2 @@ -var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function h(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function u(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function M(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function D(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)M(a).appendChild(i);else if("around"===n){var s=M(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function T(t,e){return D("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function C(t,e,i,n){return D("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return D("svg",{className:e,inside:t,width:i,height:n})}function O(t){return D("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),D("g",n)}function S(t){return D("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*i.y,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z\n\t\tL"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*n+o,u=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+"\n\t\tM"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=T(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),C(a,"0%",e,s[0]),C(a,"50%",e,s[1]),C(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return D("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),D("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=D("text",{className:"legend-dataset-text",x:0,y:0,dy:2*oe+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:he,innerHTML:a}),o=D("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(D("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=D("text",{className:"legend-dataset-text",x:0,y:0,dx:oe+"px",dy:oe/3+"px","font-size":1.2*oe+"px","text-anchor":"start",fill:he,innerHTML:a}),o=D("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(D("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||oe;return D("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||he,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le);var s=D("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=D("text",{x:0,y:i>n?i+se:i-se-oe,dy:oe+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:e+""}),o=D("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=le),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=D("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=D("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:oe/2-2+"px","font-size":oe+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=le),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=D("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||le,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=D("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:le,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=D("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:oe/-2+"px","font-size":oe+"px","text-anchor":"start",innerHTML:n+""}),l=D("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),h=Ut(l,2),u=h[0],c=h[1];c-=r,0===u&&(u=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(u,!0)||(u=0),f(i,!0)||(i=0);var d=D("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:u});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=D("text",{className:"data-point-value",x:i/2,y:0,dy:oe/2*-1+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),v=D("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=D("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=D("text",{className:"data-point-value",x:0,y:0,dy:oe/2*-1-i+"px","font-size":oe+"px","text-anchor":"middle",innerHTML:a}),l=D("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var h=H(a.svgDefs,i,!0),u="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(u,"region-fill","none","url(#"+h+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ge,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],fe)}function et(t,e,i){return Z(t,[0,i],[0,e],fe)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},fe,ge],Z(t,[0,n],[0,i],fe)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},de,ge],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],fe)]:[[t,{width:n,height:o,x:e,y:l},de,ge]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],fe)]:[[t,{cx:e,cy:i},de,ge]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},pe,ge];if(s.push(o),t.region){var l=e[0]+","+n+"L",h="L"+e.slice(-1)[0]+", "+n,u=[t.region,{d:"M"+l+r+h},pe,ge];s.push(u)}return s}function rt(t,e){return[t,{d:e},de,ge]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var h=void 0;h="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:u,to:c,begin:"0s",dur:i/1e3+"s",values:u+";"+c,keySplines:ye[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)h.setAttribute(p,d[p]);r.appendChild(h),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ht(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ut(t,e,i){if(0!==i.length){var n=ht(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ve)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:me});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/ke)}function yt(t,e){var i=Ae*we;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Pe[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new De(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Dt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Mt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Tt(t){function e(t,e){for(var i=Dt(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Dt(n,a):Dt(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Dt(o,l):Dt(o)).reverse().map(function(t){return-1*t})}return s}function Ct(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return u(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ne(e,i)):Ee[t]?new Ee[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                                                \n\t\t\t\t
                                                '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=10,le="#dadada",he="#555b51",ue={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},ce={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},de=350,pe=350,fe=de,ve=250,ge="easein",ye={ease:"0.25 0.1 0.25 1",linear:"0 0 1 1",easein:"0.1 0.8 0.2 1",easeout:"0 0 0.58 1",easeinout:"0.42 0 0.58 1"},me=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",be=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-h(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ut(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),xe=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-h(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,u=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],u+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(be),ke=7,we=1e3,Ae=86400,Pe=["January","February","March","April","May","June","July","August","September","October","November","December"],Me=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],De=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,h=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=h,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(t,n){t.positions.map(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:e.constants.width}))}),i):(t.positions.forEach(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:t.zeroLine,width:this.constants.width})),i)},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var h=[];return this.store.map(function(t,e){h=h.concat(it(t,s[e],n[e],o[e]))}),h}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,h=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,h,r,o,t.fill,n);e.serializedSubDomains.push(a)}h+=s}),h=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,h=m(s,e),u=Ut(h,2);s=u[0],e=u[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var h=m(s,i),u=Ut(h,2);s=u[0],i=u[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Ce=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),h=l.left-o.left+parseInt(s.getAttribute("width"))/2,u=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(h,u,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(xe),Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?_(y,m,t.center,t.radius,a,u):E(y,m,t.center,t.radius,a,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Oe=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*ke+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+h(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+h(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*we);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],h=void 0,u=0;u2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(be),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):(this.config.yAxisMode=r?r.yAxisMode:n.yAxisMode||"span",r&&r.id&&r.position&&(this.config.yAxisConfig=[r])),this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return u(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0,l=void 0,h=void 0,u=void 0;if(u=[],l=this.config.yAxisMode||{},h=l.position?l.position:"left",t instanceof Array)n=Tt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Ct(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),title:l.title||null,pos:h,scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var c in t)!function(c){var d=t[c];if(l=e.config.yAxisConfig.find(function(t){return c===t.id})||[],h=l.position?l.position:"left",n=Tt(d,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Ct(n)*s,o=n.map(function(t){return r-t*a}),u.push(c),e.state.yAxis.length>1){var p=[],f=e.state.yAxis[0];a=e.height/Ot(n),f.positions.forEach(function(t){p.push(Math.ceil(t/a))}),n=p.reverse(),r=e.height-Ct(n)*s,o=f.positions}e.state.yAxis.push({axisID:c||"left-axis",labels:n,title:l.title,pos:h,scaleMultiplier:a,zeroLine:r,positions:o})}(c);if(this.state.yAxis[1]&&this.state.yAxis[0].labels.length!==this.state.yAxis[1].labels.length){var d=[],p=this.state.yAxis.reduce(function(t,e){return t.length>e.labels.length?e:t},{length:1/0}),f=this.state.yAxis.reduce(function(t,e){return t.length1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-u/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:u,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=ue[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];ce[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(be),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?I(y,m,t.center,t.radius,t.clockWise,u):z(y,m,t.center,t.radius,t.clockWise,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(xe),Ee={bar:Ne,line:Ne,percentage:Ce,heatmap:Oe,pie:Le,donut:Se},_e=function t(e,i){return jt(this,t),Wt(i.type,e,i)},ze=Object.freeze({Chart:_e,PercentageChart:Ce,PieChart:Le,Heatmap:Oe,AxisChart:Ne}),Ie={};return Ie.NAME="Frappe Charts",Ie.VERSION="1.6.2",Ie=Object.assign({},Ie,ze)}(); +var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function h(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function u(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function M(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function C(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)M(a).appendChild(i);else if("around"===n){var s=M(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function D(t,e){return C("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function T(t,e,i,n){return C("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return C("svg",{className:e,inside:t,width:i,height:n})}function O(t){return C("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),C("g",n)}function S(t){return C("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*i.y,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z\n\t\tL"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*n+o,u=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+"\n\t\tM"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=D(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),T(a,"0%",e,s[0]),T(a,"50%",e,s[1]),T(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return C("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),C("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dy:2*le+"px","font-size":1.2*le+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dx:le+"px",dy:le/3+"px","font-size":1.2*le+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||le;return C("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=he);var s=C("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=C("text",{x:0,y:i>n?i+se:i-se-le,dy:le+"px","font-size":le+"px","text-anchor":"middle",innerHTML:e+""}),o=C("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=he),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=C("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=C("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:le/2-2+"px","font-size":le+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=he),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=he),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=C("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:le/-2+"px","font-size":le+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||he,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=C("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:he,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=C("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:le/-2+"px","font-size":le+"px","text-anchor":"start",innerHTML:n+""}),l=C("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),h=Ut(l,2),u=h[0],c=h[1];c-=r,0===u&&(u=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(u,!0)||(u=0),f(i,!0)||(i=0);var d=C("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:u});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=C("text",{className:"data-point-value",x:i/2,y:0,dy:le/2*-1+"px","font-size":le+"px","text-anchor":"middle",innerHTML:a}),v=C("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=C("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=C("text",{className:"data-point-value",x:0,y:0,dy:le/2*-1-i+"px","font-size":le+"px","text-anchor":"middle",innerHTML:a}),l=C("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var h=H(a.svgDefs,i,!0),u="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(u,"region-fill","none","url(#"+h+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ye,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],ve)}function et(t,e,i){return Z(t,[0,i],[0,e],ve)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},ve,ye],Z(t,[0,n],[0,i],ve)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},pe,ye],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],ve)]:[[t,{width:n,height:o,x:e,y:l},pe,ye]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],ve)]:[[t,{cx:e,cy:i},pe,ye]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},fe,ye];if(s.push(o),t.region){var l=e[0]+","+n+"L",h="L"+e.slice(-1)[0]+", "+n,u=[t.region,{d:"M"+l+r+h},fe,ye];s.push(u)}return s}function rt(t,e){return[t,{d:e},pe,ye]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var h=void 0;h="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:u,to:c,begin:"0s",dur:i/1e3+"s",values:u+";"+c,keySplines:me[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)h.setAttribute(p,d[p]);r.appendChild(h),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ht(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ut(t,e,i){if(0!==i.length){var n=ht(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ge)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:be});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/we)}function yt(t,e){var i=Pe*Ae;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Me[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new De(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Ct(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Mt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Dt(t){function e(t,e){for(var i=Ct(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Ct(n,a):Ct(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Ct(o,l):Ct(o)).reverse().map(function(t){return-1*t})}return s}function Tt(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return u(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Se(e,i)):_e[t]?new _e[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                                                  \n\t\t\t\t
                                                  '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=120,le=10,he="#dadada",ue="#555b51",ce={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},de={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},pe=350,fe=350,ve=pe,ge=250,ye="easein",me={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"},be=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",xe=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-h(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ut(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),ke=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-h(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,u=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],u+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(xe),we=7,Ae=1e3,Pe=86400,Me=["January","February","March","April","May","June","July","August","September","October","November","December"],Ce=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],De=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,h=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=h,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(n,a){n.positions.map(function(t,a){i.push(G(t,n.labels[a],e.constants.width,{mode:e.constants.mode,pos:n.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),n.title&&i.push(U({title:n.title,position:n.pos,height:e.constants.height||t.zeroLine,width:e.constants.width}))}),i):(t.positions.forEach(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:this.constants.height||t.zeroLine,width:this.constants.width})),i)},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var h=[];return this.store.map(function(t,e){h=h.concat(it(t,s[e],n[e],o[e]))}),h}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,h=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,h,r,o,t.fill,n);e.serializedSubDomains.push(a)}h+=s}),h=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,h=m(s,e),u=Ut(h,2);s=u[0],e=u[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var h=m(s,i),u=Ut(h,2);s=u[0],i=u[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),h=l.left-o.left+parseInt(s.getAttribute("width"))/2,u=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(h,u,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(ke),Oe=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?_(y,m,t.center,t.radius,a,u):E(y,m,t.center,t.radius,a,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(ke),Ne=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*we+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+h(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+h(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*Ae);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],h=void 0,u=0;u2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(xe),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):(this.config.yAxisMode=r?r.yAxisMode:n.yAxisMode||"span",r&&r.id&&r.position&&(this.config.yAxisConfig=[r])),this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return u(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0,l=void 0,h=void 0,u=void 0;if(u=[],l=this.config.yAxisMode||{},h=l.position?l.position:"left",t instanceof Array)n=Dt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Tt(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),title:l.title||null,pos:h,scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var c in t)!function(c){var d=t[c];if(l=e.config.yAxisConfig.find(function(t){return c===t.id})||[],h=l.position?l.position:"left",n=Dt(d,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Tt(n)*s,o=n.map(function(t){return r-t*a}),u.push(c),e.state.yAxis.length>1){var p=[],f=e.state.yAxis[0];a=e.height/Ot(n),f.positions.forEach(function(t){p.push(Math.ceil(t/a))}),n=p.reverse(),r=e.height-Tt(n)*s,o=f.positions}e.state.yAxis.push({axisID:c||"left-axis",labels:n,title:l.title,pos:h,scaleMultiplier:a,zeroLine:r,positions:o})}(c);if(this.state.yAxis[1]&&this.state.yAxis[0].labels.length!==this.state.yAxis[1].labels.length){var d=[],p=this.state.yAxis.reduce(function(t,e){return t.length>e.labels.length?e:t},{length:1/0}),f=this.state.yAxis.reduce(function(t,e){return t.length1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-u/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:u,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=ce[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];de[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(xe),Ee=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?I(y,m,t.center,t.radius,t.clockWise,u):z(y,m,t.center,t.radius,t.clockWise,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(ke),_e={bar:Se,line:Se,percentage:Le,heatmap:Ne,pie:Oe,donut:Ee},ze=function t(e,i){return jt(this,t),Wt(i.type,e,i)},Ie=Object.freeze({Chart:ze,PercentageChart:Le,PieChart:Oe,Heatmap:Ne,AxisChart:Se}),He={};return He.NAME="Frappe Charts",He.VERSION="1.6.2",He=Object.assign({},He,Ie)}(); //# sourceMappingURL=frappe-charts.min.js.map diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index be935e5..6356fe7 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const x = options.position === 'left' ? LABEL_MARGIN : options.width;\n // - getStringWidth(options.title, 5);\n const rotation =\n options.position === 'right'\n ? `rotate(90, ${options.width}, ${options.height / 2})`\n : `rotate(270, 0, ${options.height / 2})`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: x - getStringWidth(options.title, 5) / 2,\n y: options.height / 2 - LABEL_MARGIN,\n dy: FONT_SIZE / -2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': 'start',\n transform: rotation,\n innerHTML: options.title + ''\n });\n\n return labelSvg;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n height: item.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                                    \n\t\t\t\t
                                                    `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","rotation","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","labelSvg","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nconst TOTAL_PADDING = 120;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const y = options.position === 'left' ? \n\t\t(options.height - TOTAL_PADDING) / 2 + (getStringWidth(options.title, 5) / 2) : \n\t\t(options.height - TOTAL_PADDING) / 2 - (getStringWidth(options.title, 5) / 2) ;\n\tconst x = options.position === 'left' ? 0 : options.width;\n\tconst y2 = options.position === 'left' ? FONT_SIZE / 3 : FONT_SIZE / 3 * -1;\n\n const rotation =\n options.position === 'right'\n ? `rotate(90)`\n : `rotate(270)`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: 0, // getStringWidth(options.title, 5) / 2,\n y: 0, // y,\n dy: `${y2}px`,\n 'font-size': `${FONT_SIZE}px`,\n 'text-anchor': 'start',\n innerHTML: `${options.title} `\n });\n\n\tlet wrapper = createSVG('g', {\n\t\tx: 0,\n\t\ty: 0,\n\t\ttransformBox: 'fill-box',\n\t\ttransform: `translate(${x}, ${y}) ${rotation}`,\n\t\tclassName: `test-${options.position}`\n\t});\n\n\twrapper.appendChild(labelSvg);\n\n return wrapper;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n\t\t\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                                      \n\t\t\t\t
                                                      `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n\t\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","TOTAL_PADDING","rotation","labelSvg","wrapper","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file diff --git a/src/js/charts/AxisChart.js b/src/js/charts/AxisChart.js index 1effd78..56be818 100644 --- a/src/js/charts/AxisChart.js +++ b/src/js/charts/AxisChart.js @@ -382,6 +382,7 @@ export default class AxisChart extends BaseChart { { mode: this.config.yAxisMode, width: this.width, + height: this.baseHeight, shortenNumbers: this.config.shortenYAxisNumbers, pos: yAxis.position || 'left' }, @@ -396,6 +397,7 @@ export default class AxisChart extends BaseChart { { mode: this.config.yAxisMode, width: this.width, + height: this.baseHeight, shortenNumbers: this.config.shortenYAxisNumbers }, function () { diff --git a/src/js/objects/ChartComponents.js b/src/js/objects/ChartComponents.js index 61fb7e2..5f64ec7 100644 --- a/src/js/objects/ChartComponents.js +++ b/src/js/objects/ChartComponents.js @@ -160,7 +160,7 @@ let componentConfigs = { generateAxisLabel({ title: item.title, position: item.pos, - height: item.zeroLine, + height: this.constants.height || data.zeroLine, width: this.constants.width }) ); @@ -183,7 +183,7 @@ let componentConfigs = { generateAxisLabel({ title: data.title, position: data.pos, - height: data.zeroLine, + height: this.constants.height || data.zeroLine, width: this.constants.width }) ); diff --git a/src/js/utils/draw.js b/src/js/utils/draw.js index 7e765e5..bbf2e77 100644 --- a/src/js/utils/draw.js +++ b/src/js/utils/draw.js @@ -6,6 +6,7 @@ import { lightenDarkenColor } from './colors'; export const AXIS_TICK_LENGTH = 6; const LABEL_MARGIN = 4; const LABEL_MAX_CHARS = 15; +const TOTAL_PADDING = 120; export const FONT_SIZE = 10; const BASE_LINE_COLOR = '#dadada'; const FONT_FILL = '#555b51'; @@ -368,25 +369,38 @@ function makeHoriLine(y, label, x1, x2, options = {}) { export function generateAxisLabel(options) { if (!options.title) return; - const x = options.position === 'left' ? LABEL_MARGIN : options.width; - // - getStringWidth(options.title, 5); + const y = options.position === 'left' ? + (options.height - TOTAL_PADDING) / 2 + (getStringWidth(options.title, 5) / 2) : + (options.height - TOTAL_PADDING) / 2 - (getStringWidth(options.title, 5) / 2) ; + const x = options.position === 'left' ? 0 : options.width; + const y2 = options.position === 'left' ? FONT_SIZE / 3 : FONT_SIZE / 3 * -1; + const rotation = options.position === 'right' - ? `rotate(90, ${options.width}, ${options.height / 2})` - : `rotate(270, 0, ${options.height / 2})`; + ? `rotate(90)` + : `rotate(270)`; const labelSvg = createSVG('text', { className: 'chart-label', - x: x - getStringWidth(options.title, 5) / 2, - y: options.height / 2 - LABEL_MARGIN, - dy: FONT_SIZE / -2 + 'px', - 'font-size': FONT_SIZE + 'px', + x: 0, // getStringWidth(options.title, 5) / 2, + y: 0, // y, + dy: `${y2}px`, + 'font-size': `${FONT_SIZE}px`, 'text-anchor': 'start', - transform: rotation, - innerHTML: options.title + '' + innerHTML: `${options.title} ` }); - return labelSvg; + let wrapper = createSVG('g', { + x: 0, + y: 0, + transformBox: 'fill-box', + transform: `translate(${x}, ${y}) ${rotation}`, + className: `test-${options.position}` + }); + + wrapper.appendChild(labelSvg); + + return wrapper; } export function yLine(y, label, width, options = {}) { From 25207622ab682e74103159fa26ee1d07c4fb16c0 Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Mon, 15 Nov 2021 17:39:29 -0800 Subject: [PATCH 8/9] Adds span/tick support --- docs/assets/js/frappe-charts.min.js | 2 +- docs/assets/js/frappe-charts.min.js.map | 2 +- src/js/charts/AxisChart.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index 555c386..42dff23 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -1,2 +1,2 @@ -var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function h(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function u(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function M(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function C(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)M(a).appendChild(i);else if("around"===n){var s=M(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function D(t,e){return C("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function T(t,e,i,n){return C("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return C("svg",{className:e,inside:t,width:i,height:n})}function O(t){return C("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),C("g",n)}function S(t){return C("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*i.y,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z\n\t\tL"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*n+o,u=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+"\n\t\tM"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=D(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),T(a,"0%",e,s[0]),T(a,"50%",e,s[1]),T(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return C("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),C("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dy:2*le+"px","font-size":1.2*le+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dx:le+"px",dy:le/3+"px","font-size":1.2*le+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||le;return C("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=he);var s=C("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=C("text",{x:0,y:i>n?i+se:i-se-le,dy:le+"px","font-size":le+"px","text-anchor":"middle",innerHTML:e+""}),o=C("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=he),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=C("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=C("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:le/2-2+"px","font-size":le+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=he),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=he),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=C("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:le/-2+"px","font-size":le+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||he,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=C("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:he,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=C("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:le/-2+"px","font-size":le+"px","text-anchor":"start",innerHTML:n+""}),l=C("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),h=Ut(l,2),u=h[0],c=h[1];c-=r,0===u&&(u=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(u,!0)||(u=0),f(i,!0)||(i=0);var d=C("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:u});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=C("text",{className:"data-point-value",x:i/2,y:0,dy:le/2*-1+"px","font-size":le+"px","text-anchor":"middle",innerHTML:a}),v=C("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=C("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=C("text",{className:"data-point-value",x:0,y:0,dy:le/2*-1-i+"px","font-size":le+"px","text-anchor":"middle",innerHTML:a}),l=C("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var h=H(a.svgDefs,i,!0),u="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(u,"region-fill","none","url(#"+h+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ye,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],ve)}function et(t,e,i){return Z(t,[0,i],[0,e],ve)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},ve,ye],Z(t,[0,n],[0,i],ve)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},pe,ye],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],ve)]:[[t,{width:n,height:o,x:e,y:l},pe,ye]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],ve)]:[[t,{cx:e,cy:i},pe,ye]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},fe,ye];if(s.push(o),t.region){var l=e[0]+","+n+"L",h="L"+e.slice(-1)[0]+", "+n,u=[t.region,{d:"M"+l+r+h},fe,ye];s.push(u)}return s}function rt(t,e){return[t,{d:e},pe,ye]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var h=void 0;h="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:u,to:c,begin:"0s",dur:i/1e3+"s",values:u+";"+c,keySplines:me[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)h.setAttribute(p,d[p]);r.appendChild(h),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ht(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ut(t,e,i){if(0!==i.length){var n=ht(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ge)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:be});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/we)}function yt(t,e){var i=Pe*Ae;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Me[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new De(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Ct(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Mt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Dt(t){function e(t,e){for(var i=Ct(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Ct(n,a):Ct(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Ct(o,l):Ct(o)).reverse().map(function(t){return-1*t})}return s}function Tt(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return u(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Se(e,i)):_e[t]?new _e[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                                                        \n\t\t\t\t
                                                        '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=120,le=10,he="#dadada",ue="#555b51",ce={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},de={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},pe=350,fe=350,ve=pe,ge=250,ye="easein",me={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"},be=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",xe=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-h(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ut(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),ke=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-h(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,u=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],u+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(xe),we=7,Ae=1e3,Pe=86400,Me=["January","February","March","April","May","June","July","August","September","October","November","December"],Ce=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],De=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,h=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=h,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(n,a){n.positions.map(function(t,a){i.push(G(t,n.labels[a],e.constants.width,{mode:e.constants.mode,pos:n.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),n.title&&i.push(U({title:n.title,position:n.pos,height:e.constants.height||t.zeroLine,width:e.constants.width}))}),i):(t.positions.forEach(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:this.constants.height||t.zeroLine,width:this.constants.width})),i)},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var h=[];return this.store.map(function(t,e){h=h.concat(it(t,s[e],n[e],o[e]))}),h}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,h=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,h,r,o,t.fill,n);e.serializedSubDomains.push(a)}h+=s}),h=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,h=m(s,e),u=Ut(h,2);s=u[0],e=u[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var h=m(s,i),u=Ut(h,2);s=u[0],i=u[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),h=l.left-o.left+parseInt(s.getAttribute("width"))/2,u=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(h,u,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(ke),Oe=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?_(y,m,t.center,t.radius,a,u):E(y,m,t.center,t.radius,a,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(ke),Ne=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*we+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+h(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+h(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*Ae);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],h=void 0,u=0;u2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(xe),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):(this.config.yAxisMode=r?r.yAxisMode:n.yAxisMode||"span",r&&r.id&&r.position&&(this.config.yAxisConfig=[r])),this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return u(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0,l=void 0,h=void 0,u=void 0;if(u=[],l=this.config.yAxisMode||{},h=l.position?l.position:"left",t instanceof Array)n=Dt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Tt(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),title:l.title||null,pos:h,scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var c in t)!function(c){var d=t[c];if(l=e.config.yAxisConfig.find(function(t){return c===t.id})||[],h=l.position?l.position:"left",n=Dt(d,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Tt(n)*s,o=n.map(function(t){return r-t*a}),u.push(c),e.state.yAxis.length>1){var p=[],f=e.state.yAxis[0];a=e.height/Ot(n),f.positions.forEach(function(t){p.push(Math.ceil(t/a))}),n=p.reverse(),r=e.height-Tt(n)*s,o=f.positions}e.state.yAxis.push({axisID:c||"left-axis",labels:n,title:l.title,pos:h,scaleMultiplier:a,zeroLine:r,positions:o})}(c);if(this.state.yAxis[1]&&this.state.yAxis[0].labels.length!==this.state.yAxis[1].labels.length){var d=[],p=this.state.yAxis.reduce(function(t,e){return t.length>e.labels.length?e:t},{length:1/0}),f=this.state.yAxis.reduce(function(t,e){return t.length1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-u/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:u,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=ce[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];de[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(xe),Ee=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?I(y,m,t.center,t.radius,t.clockWise,u):z(y,m,t.center,t.radius,t.clockWise,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(ke),_e={bar:Se,line:Se,percentage:Le,heatmap:Ne,pie:Oe,donut:Ee},ze=function t(e,i){return jt(this,t),Wt(i.type,e,i)},Ie=Object.freeze({Chart:ze,PercentageChart:Le,PieChart:Oe,Heatmap:Ne,AxisChart:Se}),He={};return He.NAME="Frappe Charts",He.VERSION="1.6.2",He=Object.assign({},He,Ie)}(); +var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function h(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function u(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function M(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function C(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)M(a).appendChild(i);else if("around"===n){var s=M(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function D(t,e){return C("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function T(t,e,i,n){return C("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return C("svg",{className:e,inside:t,width:i,height:n})}function O(t){return C("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),C("g",n)}function S(t){return C("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*i.y,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z\n\t\tL"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*n+o,u=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+"\n\t\tM"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=D(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),T(a,"0%",e,s[0]),T(a,"50%",e,s[1]),T(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return C("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),C("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dy:2*le+"px","font-size":1.2*le+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dx:le+"px",dy:le/3+"px","font-size":1.2*le+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||le;return C("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=he);var s=C("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=C("text",{x:0,y:i>n?i+se:i-se-le,dy:le+"px","font-size":le+"px","text-anchor":"middle",innerHTML:e+""}),o=C("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=he),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=C("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=C("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:le/2-2+"px","font-size":le+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=he),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=he),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=C("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:le/-2+"px","font-size":le+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||he,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=C("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:he,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=C("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:le/-2+"px","font-size":le+"px","text-anchor":"start",innerHTML:n+""}),l=C("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),h=Ut(l,2),u=h[0],c=h[1];c-=r,0===u&&(u=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(u,!0)||(u=0),f(i,!0)||(i=0);var d=C("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:u});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=C("text",{className:"data-point-value",x:i/2,y:0,dy:le/2*-1+"px","font-size":le+"px","text-anchor":"middle",innerHTML:a}),v=C("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=C("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=C("text",{className:"data-point-value",x:0,y:0,dy:le/2*-1-i+"px","font-size":le+"px","text-anchor":"middle",innerHTML:a}),l=C("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var h=H(a.svgDefs,i,!0),u="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(u,"region-fill","none","url(#"+h+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ye,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],ve)}function et(t,e,i){return Z(t,[0,i],[0,e],ve)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},ve,ye],Z(t,[0,n],[0,i],ve)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},pe,ye],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],ve)]:[[t,{width:n,height:o,x:e,y:l},pe,ye]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],ve)]:[[t,{cx:e,cy:i},pe,ye]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},fe,ye];if(s.push(o),t.region){var l=e[0]+","+n+"L",h="L"+e.slice(-1)[0]+", "+n,u=[t.region,{d:"M"+l+r+h},fe,ye];s.push(u)}return s}function rt(t,e){return[t,{d:e},pe,ye]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var h=void 0;h="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:u,to:c,begin:"0s",dur:i/1e3+"s",values:u+";"+c,keySplines:me[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)h.setAttribute(p,d[p]);r.appendChild(h),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ht(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ut(t,e,i){if(0!==i.length){var n=ht(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ge)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:be});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/we)}function yt(t,e){var i=Pe*Ae;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Me[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new De(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Ct(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Mt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Dt(t){function e(t,e){for(var i=Ct(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Ct(n,a):Ct(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Ct(o,l):Ct(o)).reverse().map(function(t){return-1*t})}return s}function Tt(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return u(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Se(e,i)):_e[t]?new _e[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                                                          \n\t\t\t\t
                                                          '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=120,le=10,he="#dadada",ue="#555b51",ce={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},de={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},pe=350,fe=350,ve=pe,ge=250,ye="easein",me={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"},be=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",xe=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-h(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ut(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),ke=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-h(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,u=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],u+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(xe),we=7,Ae=1e3,Pe=86400,Me=["January","February","March","April","May","June","July","August","September","October","November","December"],Ce=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],De=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,h=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=h,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(n,a){n.positions.map(function(t,a){i.push(G(t,n.labels[a],e.constants.width,{mode:e.constants.mode,pos:n.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),n.title&&i.push(U({title:n.title,position:n.pos,height:e.constants.height||t.zeroLine,width:e.constants.width}))}),i):(t.positions.forEach(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:this.constants.height||t.zeroLine,width:this.constants.width})),i)},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var h=[];return this.store.map(function(t,e){h=h.concat(it(t,s[e],n[e],o[e]))}),h}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,h=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,h,r,o,t.fill,n);e.serializedSubDomains.push(a)}h+=s}),h=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,h=m(s,e),u=Ut(h,2);s=u[0],e=u[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var h=m(s,i),u=Ut(h,2);s=u[0],i=u[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),h=l.left-o.left+parseInt(s.getAttribute("width"))/2,u=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(h,u,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(ke),Oe=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?_(y,m,t.center,t.radius,a,u):E(y,m,t.center,t.radius,a,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(ke),Ne=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*we+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+h(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+h(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*Ae);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],h=void 0,u=0;u2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(xe),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):(this.config.yAxisMode=r?r.yAxisMode:n.yAxisMode||"span",r&&r.id&&r.position&&(this.config.yAxisConfig=[r])),this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return u(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0,l=void 0,h=void 0,u=void 0;if(u=[],l=this.config.yAxisMode||{},h=l.position?l.position:"left",t instanceof Array)n=Dt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Tt(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),title:l.title||null,pos:h,scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var c in t)!function(c){var d=t[c];if(l=e.config.yAxisConfig.find(function(t){return c===t.id})||[],h=l.position?l.position:"left",n=Dt(d,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Tt(n)*s,o=n.map(function(t){return r-t*a}),u.push(c),e.state.yAxis.length>1){var p=[],f=e.state.yAxis[0];a=e.height/Ot(n),f.positions.forEach(function(t){p.push(Math.ceil(t/a))}),n=p.reverse(),r=e.height-Tt(n)*s,o=f.positions}e.state.yAxis.push({axisID:c||"left-axis",labels:n,title:l.title,pos:h,scaleMultiplier:a,zeroLine:r,positions:o})}(c);if(this.state.yAxis[1]&&this.state.yAxis[0].labels.length!==this.state.yAxis[1].labels.length){var d=[],p=this.state.yAxis.reduce(function(t,e){return t.length>e.labels.length?e:t},{length:1/0}),f=this.state.yAxis.reduce(function(t,e){return t.length1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-u/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:u,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=ce[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];de[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(xe),Ee=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?I(y,m,t.center,t.radius,t.clockWise,u):z(y,m,t.center,t.radius,t.clockWise,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(ke),_e={bar:Se,line:Se,percentage:Le,heatmap:Ne,pie:Oe,donut:Ee},ze=function t(e,i){return jt(this,t),Wt(i.type,e,i)},Ie=Object.freeze({Chart:ze,PercentageChart:Le,PieChart:Oe,Heatmap:Ne,AxisChart:Se}),He={};return He.NAME="Frappe Charts",He.VERSION="1.6.2",He=Object.assign({},He,Ie)}(); //# sourceMappingURL=frappe-charts.min.js.map diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index 6356fe7..e78f44e 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nconst TOTAL_PADDING = 120;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const y = options.position === 'left' ? \n\t\t(options.height - TOTAL_PADDING) / 2 + (getStringWidth(options.title, 5) / 2) : \n\t\t(options.height - TOTAL_PADDING) / 2 - (getStringWidth(options.title, 5) / 2) ;\n\tconst x = options.position === 'left' ? 0 : options.width;\n\tconst y2 = options.position === 'left' ? FONT_SIZE / 3 : FONT_SIZE / 3 * -1;\n\n const rotation =\n options.position === 'right'\n ? `rotate(90)`\n : `rotate(270)`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: 0, // getStringWidth(options.title, 5) / 2,\n y: 0, // y,\n dy: `${y2}px`,\n 'font-size': `${FONT_SIZE}px`,\n 'text-anchor': 'start',\n innerHTML: `${options.title} `\n });\n\n\tlet wrapper = createSVG('g', {\n\t\tx: 0,\n\t\ty: 0,\n\t\ttransformBox: 'fill-box',\n\t\ttransform: `translate(${x}, ${y}) ${rotation}`,\n\t\tclassName: `test-${options.position}`\n\t});\n\n\twrapper.appendChild(labelSvg);\n\n return wrapper;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n\t\t\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                                            \n\t\t\t\t
                                                            `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n\t\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","TOTAL_PADDING","rotation","labelSvg","wrapper","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nconst TOTAL_PADDING = 120;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const y = options.position === 'left' ? \n\t\t(options.height - TOTAL_PADDING) / 2 + (getStringWidth(options.title, 5) / 2) : \n\t\t(options.height - TOTAL_PADDING) / 2 - (getStringWidth(options.title, 5) / 2) ;\n\tconst x = options.position === 'left' ? 0 : options.width;\n\tconst y2 = options.position === 'left' ? FONT_SIZE / 3 : FONT_SIZE / 3 * -1;\n\n const rotation =\n options.position === 'right'\n ? `rotate(90)`\n : `rotate(270)`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: 0, // getStringWidth(options.title, 5) / 2,\n y: 0, // y,\n dy: `${y2}px`,\n 'font-size': `${FONT_SIZE}px`,\n 'text-anchor': 'start',\n innerHTML: `${options.title} `\n });\n\n\tlet wrapper = createSVG('g', {\n\t\tx: 0,\n\t\ty: 0,\n\t\ttransformBox: 'fill-box',\n\t\ttransform: `translate(${x}, ${y}) ${rotation}`,\n\t\tclassName: `test-${options.position}`\n\t});\n\n\twrapper.appendChild(labelSvg);\n\n return wrapper;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n\t\t\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                                              \n\t\t\t\t
                                                              `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: yAxis.yAxisMode || 'span',\n width: this.width,\n\t\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","TOTAL_PADDING","rotation","labelSvg","wrapper","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"yDACwB,gBAATA,IAAoBC,GAAOC,UAAUC,cAAcH,GAAQA,GAAQ,KA4ClF,QAAgBI,GAAUC,MACrBC,GAAOD,EAAQE,mCAKbD,EAAKE,KAAON,SAASO,gBAAgBC,WAAaR,SAASS,KAAKD,gBAC/DJ,EAAKM,MAAQV,SAASO,gBAAgBI,YAAcX,SAASS,KAAKE,aAO1E,QAAgBC,GAASC,SACI,QAApBA,EAAGC,aAGZ,QAAgBC,GAAoBF,MAE/BT,GAAOS,EAAGR,8BAGbD,GAAKE,KAAO,GACNF,EAAKM,MAAQ,GACbN,EAAKY,SAAWC,OAAOC,aAAelB,SAASO,gBAAgBY,iBAC1DC,QAAUH,OAAOI,YAAcrB,SAASO,gBAAgBe,aAIrE,QAAgBC,GAAuBpB,MAClCqB,GAASP,OAAOQ,iBAAiBtB,GACjCuB,EAAUC,WAAWH,EAAOI,aAC/BD,WAAWH,EAAOK,oBAEZ1B,GAAQmB,YAAcI,EA2B9B,QAAgBI,GAAKC,EAAQC,EAAMC,MAC9BC,GAAMlC,SAASmC,YAAY,gBAE3BC,UAAUJ,GAAM,GAAM,OAErB,GAAIK,KAAKJ,KACTI,GAAKJ,EAAWI,SAGdN,GAAOO,cAAcJ,GC7E7B,QAAgBK,GAAaC,SACrBA,GAAEC,YAAcD,EAAEE,QAAQpC,IAAMkC,EAAEG,SAASrC,IAGnD,QAAgBsC,GAAcJ,SACtBA,GAAEE,QAAQhC,KAAO8B,EAAEG,SAASjC,KAGpC,QAAgBmC,GAAeL,SACPA,GAAEE,QAAQpC,IAAMkC,EAAEE,QAAQ1B,OAC9CwB,EAAEG,SAASrC,IAAMkC,EAAEG,SAAS3B,OAC5BwB,EAAEC,YAAcD,EAAEM,aAItB,QAAgBC,GAAcP,SACPA,GAAEE,QAAQhC,KAAO8B,EAAEE,QAAQtB,MAC9CoB,EAAEG,SAASjC,KAAO8B,EAAEG,SAASvB,MClDjC,QAAgB4B,GAASC,SACjBtB,YAAWsB,EAAEC,QAAQ,IAyC7B,QAAgBC,GAAUC,EAAOC,EAAOlD,MAASmD,0DAC5CnD,OACOmD,EAAQF,EAAM,GAAKA,EAAMA,EAAMG,OAAS,OAE/CC,GAAc,GAAIC,OAAMC,KAAKC,IAAIN,IAAQO,KAAKzD,YAC1CmD,EAAQE,EAAYK,OAAOT,GAASA,EAAMS,OAAOL,GAS1D,QAAgBM,GAAeC,EAAQC,UAC9BD,EAAO,IAAIR,OAASS,EAyB7B,QAAgBC,GAAmBC,EAAOC,YAErCT,KAAKU,IAAIF,EAAQG,IAAeF,IAChCT,KAAKY,IAAIJ,EAAQG,IAAeF,GASrC,QAAgBI,GAAcC,MAAWC,kEACpCC,OAAOC,MAAMH,SACMI,KAAdJ,MACCE,OAAOG,SAASL,MACjBC,GAAeD,EAAY,KAQrC,QAAgBM,GAAM7B,SAGdyB,QAAOhB,KAAKoB,MAAM7B,EAAI,MAAQ,OAOrC,QAAgB8B,GAAUP,MACtBQ,UAAQC,SAAOC,YAEfV,YAAqBW,YAChB,IAAIA,MAAKX,EAAUY,cAGH,qBAAdZ,iBAAAA,KAAwC,OAAdA,QAC5BA,KAGAf,MAAM4B,QAAQb,aAElBU,IAAOV,KACFA,EAAUU,KAEXA,GAAOH,EAAUE,SAGnBD,GC3ID,QAASM,GAAqBC,EAAMC,MACtCC,UAAQC,eACRH,IAAQC,KACFA,EAAWD,IAChBA,MAEKA,EAAOC,IACZA,IAGGC,EAAQC,GAGjB,QAAgBC,GAAqBC,EAAQC,MAC5CC,0DAAaD,EAAOtC,OAASqC,EAAOrC,aAGjCuC,GAAa,IACN3C,EAAUyC,EAAQE,KAElB3C,EAAU0C,EAAQC,IAEpBF,EAAQC,GAGjB,QAAgBE,GAAeC,EAAKC,MAC9BD,QAGDA,GAAIzC,OAAS0C,EACTD,EAAIE,MAAM,EAAGD,EAAI,GAAK,MAEtBD,EAIT,QAAgBG,GAAmBC,MAC9BC,aACiB,gBAAVD,GAAoBC,EAASD,MACnC,IAAqB,gBAAVA,OACN1B,OAAO0B,GACZ1B,OAAOC,MAAM0B,IAAS,MAAOD,MAI9BE,GAAI5C,KAAK6C,MAAM7C,KAAK8C,MAAM9C,KAAKC,IAAI0C,QACnCC,GAAK,EAAG,MAAOD,MACfI,GAAI/C,KAAK6C,MAAMD,EAAI,GACnBI,EAAahD,KAAKiD,IAAI,GAAIL,EAAQ,EAAJG,KAAWJ,EAAS3C,KAAKiD,IAAI,GAAIL,IAAIpD,QAAQ,SAGxEQ,MAAKoB,MAAgB,IAAV4B,GAAe,IAAM,KAAO,GAAI,IAAK,IAAK,IAAK,KAAKD,GAIvE,QAAgBG,GAAwBC,EAAOC,OAG1C,GADAC,MACIC,EAAE,EAAEA,EAAEH,EAAMtD,OAAOyD,MACnBC,MAAMJ,EAAMG,GAAIF,EAAME,QAI1BE,GAAO,SAACC,EAAQC,MACfC,GAAUD,EAAO,GAAKD,EAAO,GAC7BG,EAAUF,EAAO,GAAKD,EAAO,iBAExBzD,KAAK6D,KAAK7D,KAAKiD,IAAIU,EAAS,GAAK3D,KAAKiD,IAAIW,EAAS,UACpD5D,KAAK8D,MAAMF,EAASD,KAIzBI,EAAe,SAACC,EAASC,EAAUC,EAAMC,MAGxCC,GAAIZ,EAFAS,GAAYD,EACZE,GAAQF,GAEZxD,EAAQ4D,EAAE5D,OAAS2D,EAAUnE,KAAKqE,GAAK,GACvCxE,EAfW,GAeFuE,EAAEvE,cACPmE,EAAQ,GAAKhE,KAAKY,IAAIJ,GAASX,EAC/BmE,EAAQ,GAAKhE,KAAKU,IAAIF,GAASX,UAUzB,UAACwD,EAAQiB,SAChBjB,GAAOkB,OAAO,SAACC,EAAKC,EAAOnB,EAAGoB,SAAY,KAANpB,EACrCmB,EAAM,OAAMA,EAAM,GAClBD,MAAOF,EAAQG,EAAOnB,EAAGoB,IAAM,KAGtBrB,EAZI,SAACoB,EAAOnB,EAAGoB,MAC1BC,GAAMZ,EAAaW,EAAEpB,EAAI,GAAIoB,EAAEpB,EAAI,GAAImB,GACvCG,EAAMb,EAAaU,EAAOC,EAAEpB,EAAI,GAAIoB,EAAEpB,EAAI,IAAI,cACtCqB,EAAI,OAAMA,EAAI,OAAMC,EAAI,OAAMA,EAAI,OAAMH,EAAM,OAAMA,EAAM,KCvExE,QAASI,GAAWC,SACfA,GAAI,IAAY,IACXA,EAAI,EAAU,EAChBA,EAGR,QAAgBC,GAAmBC,EAAOC,MACrCC,GAAMC,GAASH,GACfI,GAAW,CACD,MAAVF,EAAI,OACDA,EAAI1C,MAAM,MACL,MAER6C,GAAMC,SAASJ,EAAI,IACnBJ,EAAID,GAAYQ,GAAO,IAAMJ,GAC7BM,EAAIV,GAAaQ,GAAO,EAAK,KAAUJ,GACvCO,EAAIX,GAAkB,IAANQ,GAAkBJ,UAC9BG,EAAS,IAAI,KAAOI,EAAKD,GAAK,EAAMT,GAAK,IAAKW,SAAS,IAGhE,QAAgBC,GAAarF,MAGxBsF,GAAS,mHADA,uCAECC,KAAKvF,IAAWsF,EAAOC,KAAKvF,GC5B3C,QAASwF,GAAEzJ,EAAMC,SACO,gBAATD,IAAoBC,GAAOC,UAAUC,cAAcH,GAAQA,GAAQ,KAGlF,QAAgB0J,GAAUC,EAAK3B,MAC1B3H,GAAUH,SAAS0J,gBAAgB,6BAA8BD,OAEhE,GAAIzC,KAAKc,GAAG,IACZ6B,GAAM7B,EAAEd,MAEF,WAANA,IACD2C,GAAKC,YAAYzJ,OAEf,IAAU,WAAN6G,EAAgB,IACpB6C,GAAMN,EAAEI,KACRG,WAAWC,aAAa5J,EAAS0J,KAC7BD,YAAYC,OAEJ,WAAN7C,EACQ,qBAAR2C,iBAAAA,YACFK,KAAKL,GAAKM,IAAI,cACZC,MAAMC,GAAQR,EAAIQ,MAInB,cAANnD,MAAyB,SACnB,cAANA,IACF,YAAyB2C,IAEjBS,aAAapD,EAAG2C,UAKpBxJ,GAGR,QAASkK,GAAuBC,EAAYC,SACpCf,GAAU,yBACRc,KACJC,KACA,KACA,KACA,KACA,IAIN,QAASC,GAAgBC,EAAUC,EAAQhC,EAAOiC,SAC1CnB,GAAU,eACNiB,uBACc/B,SACdgC,iBACMC,IAIlB,QAAgBC,GAAiBC,EAAQC,EAAWC,EAAOtF,SACnD+D,GAAU,iBACLsB,SACHD,QACDE,SACCtF,IAIV,QAAgBuF,GAAYC,SACpBzB,GAAU,eACRyB,IAIV,QAAgBC,GAAaJ,MAAWK,0DAAU,GAAIN,6DAAOjG,GACxDwG,aACQN,YACAK,SAETN,KAAQO,EAAKC,OAASR,GAClBrB,EAAU,IAAK4B,GAWvB,QAAgBE,GAASC,SACjB/B,GAAU,yEAD0B,KAGvC+B,wEAHkD,mEAAa,6EAAoB,KAYxF,QAAgBC,GAAeC,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EAC3FC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAAqBN,EAAOI,EAAIL,EAAYK,EAAnCG,EAAsCP,EAAOjG,EAAIgG,EAAYhG,YAChEiG,EAAOI,MAAKJ,EAAOjG,YAC1BoG,MAAaE,aACZ7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,OAGf,QAAgBC,GAAcV,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EAC1FC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAA6BN,EAAOI,EAAIL,EAAYK,EAA3CK,EAAyD,EAAXT,EAAOjG,EAA7CwG,EAAoDP,EAAOjG,EAAIgG,EAAYhG,YACtFiG,EAAOI,MAAKJ,EAAOjG,YAC1BoG,MAAaE,aACZ7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWG,cACVN,MAAaM,aACZjI,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,OAGf,QAAgBG,GAAqBZ,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EACjGC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAAqBN,EAAOI,EAAIL,EAAYK,EAAnCG,EAAsCP,EAAOjG,EAAIgG,EAAYhG,YAEhEoG,MAAaE,aACnB7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,EAGf,QAAgBI,GAAoBb,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EAChGC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAA6BN,EAAOI,EAAIL,EAAYK,EAA3CK,EAAuD,EAATjI,EAAa6H,EAAnDE,EAA8DP,EAAOjG,EAAI+F,EAAc/F,YAElGoG,MAAaE,aACnB7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWG,YACVN,MAAaM,aACZjI,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,EAGf,QAAgBK,GAAajC,EAAY5B,MAAO8D,2DAC3CjC,EAAY,sBAA6B7B,EAAQ,KAAM8D,EAAU,UAAY,WAC7EC,EAAcpC,EAAuBC,EAAYC,GACjDmC,GAAa,EAAG,GAAK,UACtBF,QACW,GAAK,GAAK,MAGRC,EAAa,KAAM/D,EAAOgE,EAAU,MACpCD,EAAa,MAAO/D,EAAOgE,EAAU,MACrCD,EAAa,OAAQ/D,EAAOgE,EAAU,IAE/CnC,EAGR,QAAgBoC,GAAcZ,EAAGrG,EAAGqF,EAAOtF,MAC1CmH,0DAAMC,GAA8BjJ,yDAAK,aAkBlC4F,GAAU,kBAfL,mBACRuC,IACArG,QACIqF,SACCtF,OACF7B,iBAEK6E,EAAmB7E,GAAO,8BAGV6B,EAASsF,QAAUA,OAAUtF,iBACvCmH,KAOnB,QAAgBE,GAAWhC,EAAWiB,EAAGrG,EAAGqH,EAAM5I,MAAQP,0DAAK,OAAQoJ,4DAClE5B,aACQN,IACRiB,IACArG,QACIqH,SACCA,KACJ5I,OACEP,iBAGAoG,KAAKgD,GAAM/C,IAAI,cAChB/E,GAAO8H,EAAK9H,KAGXsE,EAAU,OAAQ4B,GAG1B,QAAgB6B,GAAUlB,EAAGrG,EAAGqH,MAAMnJ,0DAAK,OAAQwC,yEAC/BL,EAAeK,EAAO8G,IAAmB9G,KAExDgF,cACQ,eACR,IACA,QACI2B,SACC,WACFnJ,GAEHuJ,EAAO3D,EAAU,kBACT,wBACR,IACA,KACc,EAAZ4D,GAAiB,iBACI,IAAZA,GAAmB,mBAClB,aACTC,aACKjH,IAGRkH,EAAQ9D,EAAU,4BACGuC,OAAMrG,iBAEzBkE,YAAYJ,EAAU,OAAQ4B,MAC9BxB,YAAYuD,GAEXG,EAGR,QAAgBC,GAAUxB,EAAGrG,EAAGqH,MAAMnJ,0DAAK,OAAQwC,yEAC/BL,EAAeK,EAAO8G,IAAmB9G,KAExDgF,cACQ,gBACP,KACA,IACD2B,OACGnJ,GAEHuJ,EAAO3D,EAAU,kBACT,wBACR,IACA,KACE4D,GAAa,QACbA,GAAU,EAAK,iBACM,IAAZA,GAAmB,mBAClB,aACTC,aACKjH,IAGRkH,EAAQ9D,EAAU,4BACGuC,OAAMrG,iBAEzBkE,YAAYJ,EAAU,SAAU4B,MAChCxB,YAAYuD,GAEXG,EAGR,QAAgBE,GAAS1C,EAAWiB,EAAGrG,EAAG+H,MAASC,6DAC9CC,EAAWD,EAAQC,UAAYP,SAI5B5D,GAAU,kBACLsB,IACRiB,IACArG,UANoBd,KAAf8I,EAAQE,GAAmBF,EAAQE,GAAMD,EAAW,GAOnD,iBACIA,EAAW,UAPdD,EAAQ9J,MAAQyJ,iBACVK,EAAQG,YAAc,kBAS3BJ,IAIb,QAASK,GAAa/B,EAAG3F,EAAO2H,EAAIC,MAAIN,4DACnCA,GAAQO,SAAQP,EAAQO,OAASC,OACjCzH,GAAI+C,EAAU,kBACN,iBAAmBkE,EAAQ5C,aAClC,KACA,KACAiD,KACAC,iBAEKN,EAAQO,UAIdd,EAAO3D,EAAU,UACjB,IACAuE,EAAKC,EAAKD,EAAKI,GAAeJ,EAAKI,GAAef,MACjDA,GAAY,iBACHA,GAAY,mBACV,mBACJhH,EAAQ,KAGhBc,EAAOsC,EAAU,4BACKuC,oBAGrBnC,YAAYnD,KACZmD,YAAYuD,GAEVjG,EAGR,QAASkH,GAAa1I,EAAGU,EAAOiI,EAAIC,MAAIZ,4DAC/BA,GAAQO,SAAQP,EAAQO,OAASC,IACjCR,EAAQa,WAAUb,EAAQa,SAAW,IACrCb,EAAQc,YAAWd,EAAQc,UAAY,QACxCd,EAAQe,iBAAgBrI,EAAQD,EAAmBC,OAOnDK,GAAI+C,EAAU,kBAJd,mBACAkE,EAAQ5C,WACc,WAArB4C,EAAQa,SAAwB,SAAW,OAIxCF,KACAC,KACA,KACA,iBAEQZ,EAAQO,UAIpBd,EAAO3D,EAAU,UACQ,SAAtBkE,EAAQc,UAAuBH,EAAKF,GAAeG,EAAoB,EAAfH,KACxD,KACCf,GAAY,EAAI,EAAI,iBACXA,GAAY,mBACViB,EAAKC,EAAK,MAAQ,kBACtBlI,EAAQ,KAGnBc,EAAOsC,EAAU,+BACU9D,uBACT,UAGT,KAATyH,GAAuB,MAATA,MACTjD,MAAM+D,OAAS,2BAGnBrE,YAAYnD,KACZmD,YAAYuD,GAEVjG,EAGX,QAAgBwH,GAAkBhB,MACzBA,EAAQiB,UAEPjJ,GAAyB,SAArBgI,EAAQkB,UACnBlB,EAAQjI,OAASoJ,IAAiB,EAAK/K,EAAe4J,EAAQiB,MAAO,GAAK,GAC1EjB,EAAQjI,OAASoJ,IAAiB,EAAK/K,EAAe4J,EAAQiB,MAAO,GAAK,EACtE5C,EAAyB,SAArB2B,EAAQkB,SAAsB,EAAIlB,EAAQ3C,MAC9CiD,EAA0B,SAArBN,EAAQkB,SAAsBxB,GAAY,EAAIA,GAAY,GAAK,EAEjE0B,EACmB,UAArBpB,EAAQkB,oCAING,EAAWvF,EAAU,kBACZ,gBACR,IACA,KACIwE,mBACSZ,sBACD,kBACDM,EAAQiB,YAGzBK,EAAUxF,EAAU,OACpB,IACA,eACW,kCACUuC,OAAMrG,OAAMoJ,oBACjBpB,EAAQkB,oBAGpBhF,YAAYmF,GAEVC,GAGX,QAAgBC,GAAMvJ,EAAGU,EAAO2E,MAAO2C,4DAC9BnJ,GAAcmB,KAAIA,EAAI,GAEtBgI,EAAQwB,MAAKxB,EAAQwB,IAAM,QAC3BxB,EAAQhD,SAAQgD,EAAQhD,OAAS,GACjCgD,EAAQyB,OAAMzB,EAAQyB,KAAO,QAC7BzB,EAAQO,SAAQP,EAAQO,OAASC,IACjCR,EAAQ5C,YAAW4C,EAAQ5C,UAAY,OAExCuD,IAAM,EAAIe,GACVd,EAAsB,SAAjBZ,EAAQyB,KAAkBpE,EAAQqE,GAAmB,CAEzC,UAAjB1B,EAAQyB,MAAmC,UAAhBzB,EAAQwB,QAC9BnE,EAAQqE,KACRrE,MAGLL,GAAyB,SAAhBgD,EAAQwB,KAAkB,EAAIxB,EAAQhD,OAASgD,EAAQhD,iBAE9DA,KACAA,EAEC0D,EAAa1I,EAAGU,EAAOiI,EAAIC,UACtBZ,EAAQO,iBACLP,EAAQ5C,mBACT4C,EAAQa,mBACPb,EAAQwB,mBACHxB,EAAQe,iBAIhC,QAAgBY,GAAMtD,EAAG3F,EAAOX,MAAQiI,4DAClCnJ,GAAcwH,KAAIA,EAAI,GAEvB2B,EAAQwB,MAAKxB,EAAQwB,IAAM,UAC3BxB,EAAQhD,SAAQgD,EAAQhD,OAAS,GACjCgD,EAAQyB,OAAMzB,EAAQyB,KAAO,QAC7BzB,EAAQO,SAAQP,EAAQO,OAASC,IACjCR,EAAQ5C,YAAW4C,EAAQ5C,UAAY,OAavCiD,GAAKtI,EAAS2J,GACdpB,EAAsB,SAAjBN,EAAQyB,MAAmB,EAAIC,GAAmB3J,QAEvC,SAAjBiI,EAAQyB,MAAmC,QAAhBzB,EAAQwB,SAE/B,EAAIE,KACL,GAGCtB,EAAa/B,EAAG3F,EAAO2H,EAAIC,UACzBN,EAAQO,iBACLP,EAAQ5C,mBACT4C,EAAQa,WAIpB,QAAgBe,GAAQ5J,EAAGU,EAAO2E,MAAO2C,4DACpCA,GAAQ6B,WAAU7B,EAAQ6B,SAAW,YAIrCR,GAAWvF,EAAU,kBACb,gBAJiB,SAArBkE,EAAQ6B,SAAsBpB,GACnCpD,EAAQjH,EAAesC,EAAO,GAAK+H,KAKlC,KACEf,IAAa,EAAK,iBACVA,GAAY,mBACV,kBACJhH,EAAM,KAGdc,EAAOkH,EAAa1I,EAAG,GAAI,EAAGqF,UACzB2C,EAAQO,QAAUC,aACfR,EAAQ5C,WAAa,YACtB4C,EAAQa,oBAGd3E,YAAYmF,GAEV7H,EAGR,QAAgBsI,GAAQzB,EAAIC,EAAIjD,EAAO3E,MAAOsH,6DAEzCjI,EAASsI,EAAKC,EAEd5N,EAAOoJ,EAAU,6EAIX0E,sBACenD,OAAUtF,KAG/B,IACA,QACIsF,SACCtF,GAGLiI,GAAQ6B,WAAU7B,EAAQ6B,SAAW,YAIrCR,GAAWvF,EAAU,kBACb,gBAJiB,SAArBkE,EAAQ6B,SAAsBpB,GACnCpD,EAAQjH,EAAesC,EAAM,GAAI,KAAO+H,KAKvC,KACEf,IAAa,EAAK,iBACVA,GAAY,mBACV,kBACJhH,EAAM,KAGdqJ,EAASjG,EAAU,+BACKwE,iBAGrBpE,YAAYxJ,KACZwJ,YAAYmF,GAEZU,EAGR,QAAgBC,GAAW3D,EAAGxG,EAAMwF,EAAOrC,MAAOtC,0DAAM,GAAIuJ,yDAAM,EAAGjF,yDAAO,EAAGkF,8DAC5DtK,EAAqBC,EAAMqK,EAAKpK,oBAA7CC,OAAQC,UACRgF,EAES,IAAXjF,MACOmK,EAAKC,aACTD,EAAKC,WAINtL,EAAcwH,KAAIA,EAAI,GACtBxH,EAAcmB,KAAIA,EAAI,GACtBnB,EAAckB,GAAQ,KAAOA,EAAS,GACtClB,EAAcwG,GAAO,KAAOA,EAAQ,MAErC3K,GAAOoJ,EAAU,4CAEJd,qBACIiH,IACjB5D,IACArG,QACIqF,SACCtF,WAGA,KAEKW,EAAM7C,OAEb,GACD6G,aAAa,IAAK,KAClBA,aAAa,IAAK,MACnB+C,GAAO3D,EAAU,kBACT,qBACRuB,EAAM,IACN,KACEqC,GAAY,GAAK,EAAK,iBACdA,GAAY,mBACV,mBACJhH,IAGRkH,EAAQ9D,EAAU,wBACDmG,yBACI5D,OAAMrG,iBAEzBkE,YAAYxJ,KACZwJ,YAAYuD,GAEXG,QArBAlN,GAyBT,QAAgB0P,GAAW/D,EAAGrG,EAAGvB,EAAQuE,MAAOtC,0DAAM,GAAIuJ,yDAAM,EAC3DI,EAAMvG,EAAU,yBACHd,qBACIiH,KAChB5D,KACArG,IACDvB,WAGK,KAEKiC,EAAM7C,OAEb,GACF6G,aAAa,KAAM,KACnBA,aAAa,KAAM,MAEnB+C,GAAO3D,EAAU,kBACT,qBACR,IACA,KACE4D,GAAY,GAAK,EAAIjJ,EAAU,iBACvBiJ,GAAY,mBACV,mBACJhH,IAGRkH,EAAQ9D,EAAU,wBACDmG,yBACI5D,OAAMrG,iBAEzBkE,YAAYmG,KACZnG,YAAYuD,GAEXG,QAtBAyC,GA0BT,QAAgBC,GAASnJ,EAAOC,EAAO4B,MAAOgF,6DAAYkC,4DAErDK,EADanJ,EAAMmD,IAAI,SAACvE,EAAGsB,SAAOH,GAAMG,GAAK,IAAMtB,IAC5BwK,KAAK,IAG5BxC,GAAQyC,SACXF,EAAYrJ,EAAwBC,EAAOC,OAExCsJ,GAAO9E,EAAS,IAAI2E,EAAW,kBAAmBvH,MAGnDgF,EAAQ2C,SAAU,IAChBC,GAAc/D,EAAaqD,EAAKW,QAAS7H,KACxCwB,MAAM+D,eAAiBqC,SAGzBE,SACGJ,MAIJ1C,EAAQ+C,WAAY,IAClBC,GAAqBnE,EAAaqD,EAAKW,QAAS7H,GAAO,GAEvD6C,EAAU,IAAS1E,EAAM,OAAM+I,EAAKpK,aAAcyK,MAAgBpJ,EAAMX,OAAO,GAAG,OAAM0J,EAAKpK,WAC3FiK,OAASnE,EAASC,gBAAwB,eAAgBmF,aAG1DF,GC1oBR,QAAgBG,GAAUC,EAAMC,EAAUC,EAAUC,MAC/CC,GAA0B,gBAAbH,GAAwBA,EAAWA,EAASX,KAAK,aAEjEU,GACCzF,UAAW2F,EAASZ,KAAK,OAC1Ba,EACAE,GACA,aACC9F,UAAW6F,IAId,QAAgBE,IAAkB7B,EAAO8B,EAAMC,SACvCT,GAAUtB,GAAQ+B,EAAM,IAAKD,EAAM,GAAIE,IAG/C,QAAgBC,IAAkBrC,EAAOsC,EAAMC,SACvCb,GAAU1B,GAAQ,EAAGuC,IAAQ,EAAGD,GAAOF,IAG/C,QAAgBI,IAAcC,EAAWC,EAAOC,EAAOC,MAClDC,GAAYH,EAAQC,EACpBxR,EAAOsR,EAAUK,WAAW,WAG/B3R,GACEqF,OAAQqM,EAAWE,mBAHV5R,EAAK6R,aAAa,cAGyBH,GACtDT,GACAJ,IAGeN,EAAUe,GAAY,EAAGG,IAAS,EAAGD,GAAQP,KAI9D,QAAgBa,IAAWC,EAAKpG,EAAGxG,EAAMwF,MAAOL,0DAAO,IACpCpF,EAAqBC,8DAAWC,oBAA7CC,OAAQC,iBACRgF,EACe,SAAjByH,EAAIC,WACKD,EAAIJ,WAAW,IAGxBhH,MAAOA,EAAOtF,OAAQA,GACvB4M,GACApB,IAIeN,EAAUwB,EADRA,EAAIF,aAAa,aAAaK,MAAM,KAAK,GAAGpM,MAAM,GAAI,IAC3B6F,EAAGrG,GAAI2L,OAG3Cc,GAAMpH,MAAOA,EAAOtF,OAAQA,EAAQsG,EAAGA,EAAGrG,EAAGA,GAAI2M,GAAepB,KAK3E,QAAgBsB,IAAWxC,EAAKhE,EAAGrG,SACd,WAAjBqK,EAAIqC,UAEUzB,EAAUZ,EADRA,EAAIkC,aAAa,aAAaK,MAAM,KAAK,GAAGpM,MAAM,GAAI,IAC3B6F,EAAGrG,GAAI2L,OAG3CtB,GAAMyC,GAAIzG,EAAG0G,GAAI/M,GAAI2M,GAAepB,KAK/C,QAAgByB,IAAYlC,EAAOmC,EAAUC,EAAUpN,EAAU2K,MAC5D0C,MACA5C,EAAY2C,EAAS3I,IAAI,SAACvE,EAAGsB,SAAO2L,GAAS3L,GAAK,IAAMtB,IAAIwK,KAAK,IAEjEC,KACHF,EAAYrJ,EAAwB+L,EAAUC,OAEzCE,IAAYtC,EAAMJ,MAAOnN,EAAE,IAAMgN,GAAY8C,GAAe9B,SACnDhK,KAAK6L,GAEjBtC,EAAMf,OAAQ,IACZuD,GAAgBL,EAAS,OAAMnN,MAC/ByN,MAAeN,EAASzM,OAAO,GAAG,QAAOV,EAEvC0N,GACL1C,EAAMf,QACLxM,EAAE,IAAM+P,EAAa/C,EAAYgD,GAClCF,GACA9B,MAEchK,KAAKiM,SAGdL,GAGR,QAAgBM,IAAeC,EAAS7H,UAC/B6H,GAAUnQ,EAAGsI,GAAU8G,GAAepB,IC1F/C,QAASoC,IAAkBlT,EAASmT,EAAOC,MAAKC,0DAAW,SAAUxR,6DAAK4C,GAAW6O,4DAEhFC,EAAcvT,EAAQwT,WAAU,GAChCC,EAAazT,EAAQwT,WAAU,OAE/B,GAAIE,KAAiBP,GAAO,IAC3BQ,YACiB,cAAlBD,EACe7T,SAAS0J,gBAAgB,6BAA8B,oBAEvD1J,SAAS0J,gBAAgB,6BAA8B,cAErEqK,GAAeN,EAAUI,IAAkB1T,EAAQ8R,aAAa4B,GAChE5O,EAAQqO,EAAMO,GAEdG,iBACYH,OACTE,KACF9O,QACG,SACFsO,EAAI,IAAO,WACRQ,EAAe,IAAM9O,aACjBgP,GAAOT,YACT,eACA,cACJ,SAGJxR,OACF,KAAmBA,OAGf,GAAIgF,KAAKgN,KACE5J,aAAapD,EAAGgN,EAAShN,MAG7B4C,YAAYkK,GAErB9R,IACSoI,aAAayJ,eAA4B5O,SAEzCmF,aAAayJ,EAAe5O,UAIjCyO,EAAaE,GAGtB,QAAgBzI,IAAUhL,EAAS+J,KAC1BA,MAAMiB,UAAYjB,IAClBA,MAAMgK,gBAAkBhK,IACxBA,MAAMiK,YAAcjK,IACpBA,MAAMkK,aAAelK,IACrBA,MAAMmK,WAAanK,EAG5B,QAASoK,IAAWrJ,EAAcsJ,MAC7BC,MACAC,OAEKxK,IAAI,eACR2G,GAAOzQ,EAAQ,GACf0K,EAAS+F,EAAK9G,WAEd4J,SAAaE,WAET,GAAKhD,QACeyC,mBAAqBlT,8BAErC8G,KAAK2M,KACJ3M,MAAMyM,EAAa7I,IAE5BA,KACI6J,aAAahB,EAAa9C,QAI/B+D,GAAU1J,EAAa0I,WAAU,YAExB1J,IAAI,SAACyJ,EAAa1M,GAC1B0M,EAAY,OACH,GAAGgB,aAAaF,EAAYxN,GAAI0M,EAAY,MAC/C1M,GAAG,GAAKwN,EAAYxN,MAIxB2N,EAGR,QAAgBC,IAAiB/J,EAAQgK,EAAYC,MACpB,IAA7BA,EAAkBvR,WAEjBwR,GAAiBT,GAAWO,EAAYC,EACzCD,GAAW/K,YAAce,MACpBmK,YAAYH,KACZjL,YAAYmL,eAKT,WACPA,EAAejL,YAAce,MACxBmK,YAAYD,KACZnL,YAAYiL,KAElBI,KCnHG,QAASC,IAAaC,EAAUnI,MAClC5E,GAAIpI,SAASoV,cAAc,OAC7BlL,MAAQ,mBACNmL,GAAO,GAAIC,MAAKtI,GAAOhL,KAAM,iCAC7BuT,EAAMtU,OAAOuU,IAAIC,gBAAgBJ,KACnCK,KAAOH,IACPI,SAAWR,WACJ1U,KAAKmJ,YAAYxB,KACxBwN,mBACS,oBACDnV,KAAKuU,YAAY5M,UACnBoN,IAAIK,gBAAgBN,IACzB,KAGJ,QAAgBO,IAAiBC,MAC5BC,GAAQD,EAAIpC,WAAU,KACpBsC,UAAUC,IAAI,qBACd9L,aAAa,QAAS,gCACtBA,aAAa,cAAe,mCAC9B+L,GAAU5M,EAAE6M,OAAO,mBACTC,OAERtM,aAAaoM,EAASH,EAAMM,eAE9BC,GAAYhN,EAAE6M,OAAO,gBACfxM,YAAYoM,GAEfO,EAAUC,UCblB,QAASC,IAAWC,MACfC,GAAS,GAAIxR,MAAKuR,YACfE,WAAWD,EAAOE,aAAeF,EAAOG,qBACxCH,EAGR,QAAgBI,IAAYL,MACvBM,GAAKN,EAAKO,UACVC,EAAKR,EAAKS,WAAa,SAE1BT,EAAKU,eACJF,EAAG,EAAI,GAAK,KAAOA,GACnBF,EAAG,EAAI,GAAK,KAAOA,GACnB9G,KAAK,KAGR,QAAgB8F,IAAMU,SACd,IAAIvR,MAAKuR,EAAKtR,WAiBtB,QAAgBiS,IAAgBC,EAAWC,MACtCC,GAAgBC,GAAeH,SAC5B5T,MAAKgU,KAAKC,GAAeH,EAAeD,GAAWK,IAG3D,QAAgBD,IAAeL,EAAWC,MACrCM,GAAqBC,GAAaC,UAC9BtB,GAAWc,GAAWd,GAAWa,IAAcO,EAGxD,QAAgBG,IAAeV,EAAWC,SAClCD,GAAUH,aAAeI,EAAQJ,YACpCG,EAAUF,gBAAkBG,EAAQH,cAGzC,QAAgBa,IAAajR,MAAGkR,2DAC3BC,EAAYC,GAAYpR,SACrBkR,GAAQC,EAAUjS,MAAM,EAAG,GAAKiS,EAGxC,QAAgBE,IAAoBC,EAAOC,SACnC,IAAIpT,MAAKoT,EAAMD,EAAQ,EAAG,GAIlC,QAAgBb,IAAef,MAC1B8B,GAAUxC,GAAMU,GACd+B,EAAMD,EAAQE,eACT,KAARD,MACMD,GAAW,EAAKC,GAElBD,EAIR,QAAgBG,IAAQjC,EAAMkC,KACxBC,QAAQnC,EAAKO,UAAY2B,GCyc/B,QAAgBE,IAAaC,EAAMC,EAAWC,MACzCjP,GAAOkP,OAAOlP,KAAKmP,IAAkBC,OAAO,kBAAKL,GAAKM,SAASC,KAC/DC,EAASJ,GAAiBnP,EAAK,kBAC5BwP,OAAOD,aACFP,UACFC,IAEH,GAAIQ,IAAeF,GCtiB3B,QAASG,IAAU3N,MAKX,IAAJA,SACM,EAAG,MAETpH,MAAMoH,UACA4N,UAAW,iBAAkBC,SAAU,QAE5CC,GAAM9N,EAAI,EAAI,GAAK,MACnBlH,SAASkH,UACJ4N,SAAgB,iBAANE,EAAwBD,SAAU,OAGjDlW,KAAKC,IAAIoI,MACT+N,GAAMpW,KAAK6C,MAAM7C,KAAK8C,MAAMuF,WAGxB8N,GAFE9N,EAAErI,KAAKiD,IAAI,GAAImT,IAENA,GAGpB,QAASC,IAAuBC,MAAKC,0DAAI,EACpCC,EAAaxW,KAAKgU,KAAKsC,GACvBG,EAAazW,KAAK6C,MAAM0T,GACxBG,EAAQF,EAAaC,EAErBE,EAAYD,EACZE,EAAW,CAGZF,GAAQ,IACPA,EAAQ,GAAM,UAGKD,KAEVC,EAAM,IACP,GAITA,GAAS,MAEAA,KADC,IAKA,IAAVA,MACU,IACD,OAIR,GADAG,MACIvT,EAAI,EAAGA,GAAKqT,EAAWrT,MACpBC,KAAKkT,EAAaG,EAAWtT,SAEjCuT,GAGR,QAASC,IAAkBC,MAAUC,0DAAS,IACZhB,GAAUe,aAAtCE,OAAgBf,OACjBgB,EAAiBF,EAAWA,EAAShX,KAAKiD,IAAI,GAAIiT,GAAW,EAK7DW,EAAYR,KAFCY,EAAezX,QAAQ,GAEe0X,YAC3CL,EAAUtQ,IAAI,kBAIrB2P,GAAW,EACP3U,EAAQvB,KAAKiD,IAAI,IAAKiT,GAEvB3U,EAAQvB,KAAKiD,IAAI,GAAIiT,KAK9B,QAAgBiB,IAAmBC,WAYzBC,GAA0BN,EAAUO,OAOxC,GANAT,GAAYC,GAAkBC,GAE9BQ,EAAeV,EAAU,GAAKA,EAAU,GAGxCtV,EAAQ,EACJ+B,EAAI,EAAG/B,EAAQ+V,EAAahU,OAC1BiU,IACCC,SAAU,EAAKjW,SAEnBsV,MAvBkCY,2DAMtCV,EAAW/W,KAAKsW,kBAAOc,IACvBJ,EAAWhX,KAAKuW,kBAAOa,IAGTP,QAkBfE,GAAY,GAAKC,GAAY,EACpBhB,GAAUe,GAAU,KAC3BU,EAGSX,GAAkBC,EAAUC,GAF5BF,GAAkBC,OAQ3B,IAAGA,EAAW,GAAKC,EAAW,EAAG,IAOjCM,GAActX,KAAKC,IAAI+W,EAExBD,IAAYO,GACHtB,GAAUe,GAAU,KACnBM,EAA0BN,EAAUO,KAGrCtB,GAAUsB,GAAa,KACfD,EAA0BC,EAAaP,GACjC5S,UAAUoC,IAAI,mBAAW,EAANhH,SAOzC,IAAGwX,GAAY,GAAKC,GAAY,EAAG,IAInCU,GAAiB1X,KAAKC,IAAI+W,GAC1BW,EAAiB3X,KAAKC,IAAI8W,EAEnBf,IAAU0B,GAAgB,QACjCD,EAGSX,GAAkBY,EAAgBC,GAFlCb,GAAkBY,IAKTvT,UAAUoC,IAAI,mBAAW,EAANhH,UAGnCsX,GAGR,QAAgBe,IAAaC,MAExBC,GAAWC,GAAgBF,SAC5BA,GAAKG,QAAQ,IAAM,EAGTH,EAAKG,QAAQ,GAChBH,EAAK,GAAK,GAIL,EADJA,EAAK,GACUC,GAKX,EADJD,EAAKA,EAAKhY,OAAS,GACJiY,GAAYD,EAAKhY,OAAS,GAiBrD,QAAgBkY,IAAgBE,SACxBA,GAAa,GAAKA,EAAa,GAGvC,QAAgBC,IAAcD,SACtBA,GAAaA,EAAapY,OAAO,GAAKoY,EAAa,GAG3D,QAAgBE,IAAMlS,EAAKmS,SACnB9Y,GAAS8Y,EAAMtW,SAAWmE,EAAMmS,EAAMC,iBAY9C,QAAgBC,IAAkBC,EAAMC,MAAKvM,2DACxCwM,EAAUD,EAAIjU,OAAO,SAASmU,EAAMC,SAC/B3Y,MAAKC,IAAI0Y,EAAOJ,GAAQvY,KAAKC,IAAIyY,EAAOH,GAAQI,EAAOD,aAGzDzM,GAAQuM,EAAIR,QAAQS,GAAWA,EAGvC,QAAgBG,IAAiBxB,EAAQyB,OASpC,GALAC,GAAe9Y,KAAKsW,kBAAOc,IAE3B2B,EAAmB,GAAKF,EAAmB,GAC3CG,KAEI1V,EAAI,EAAGA,EAAIuV,EAAkBvV,IAAK,IACrC2V,GAAaH,GAAgBC,EAAmBzV,KACvCC,KAAK0V,SAGZD,GAGR,QAAgBE,IAAiB3X,EAAOyX,SAChCA,GAAatD,OAAO,kBAAKnW,GAAIgC,IAAO1B,OClPrC,QAASsZ,IAAS7P,EAAMhL,KACzB8a,OAAS9P,EAAK8P,cAEfC,GAAgB/P,EAAK8P,OAAOvZ,OAG5ByZ,EAAWhQ,EAAKgQ,SAChBC,EAAY,GAAIxZ,OAAMsZ,GAAenZ,KAAK,SAC1CoZ,gBAGMC,OAIDhT,IAAI,eAERhH,EAAE6X,OAEC,IAEFoC,GAAOja,EAAE6X,YACNoC,EAAKjT,IAAI,kBAAStF,OAAMgF,GAAa,EAANA,KAG9BpG,OAASwZ,EACTG,EAAKhX,MAAM,EAAG6W,GAEd5Z,EAAU+Z,EAAMH,EAAgBG,EAAK3Z,OAAQ,KAEnDuX,OAASoC,SAZTpC,OAASmC,CAgBRha,GAAEka,YACDC,GAAyB/D,SAASrX,KACpCmb,UAAYnb,KASbgL,EAAKqQ,YACFA,SAASpT,IAAI,eACdhH,EAAEqa,IAAMra,EAAEK,MAAO,QACCL,EAAEqa,IAAKra,EAAEK,SAA1BA,aAASga,YAKRtQ,EAGR,QAAgBuQ,IAAaC,MACxBT,GAAgBS,EAASV,OAAOvZ,OAChC0Z,EAAY,GAAIxZ,OAAMsZ,GAAenZ,KAAK,GAEvC6Z,UACQD,EAASV,OAAO5W,MAAM,GAAI,YACxBsX,EAASR,SAAS/S,IAAI,SAAChH,iBACVA,EAAXya,YAGE,UACET,EAAU/W,MAAM,GAAI,aACjBjD,EAAEka,oBAKzBK,GAASG,aACFA,iBAEA,QACA,MAKPH,EAASH,aACFA,iBAEA,MACF,QACE,MAKHI,EAGR,QAAgBG,IAAmBC,MAAYf,6DAAWgB,6DACrDC,EAAeF,EAAaf,EAAOvZ,MACpCwa,IAAgB,IAAGA,EAAe,MACjCC,GAAiBD,EAAeE,GAEhCC,YACDJ,EAAU,IAERK,GAAiBza,KAAKsW,kBAAO8C,EAAO7S,IAAI,kBAAS7D,GAAM7C,aAC1CG,KAAKgU,KAAKyG,EAAeH,SAG1BlB,GAAO7S,IAAI,SAAC7D,EAAOY,aAC1B,IACAzD,OAASya,IAEbF,EAOA9W,EAAIkX,GAAmB,MACjB,MAPNF,EAAe,EAAI,EACb5X,EAAMF,MAAM,EAAG8X,EAAe,GAAK,OAEnC5X,EAAMF,MAAM,EAAG8X,GAAkB,MAQrC5X,IC3GT,QAASgY,SAAejB,0DAAY,OAAQtS,eAAQ6C,qBACjC,eAAdyP,KACKnb,KAAO,OACR,GAAIqc,IAAUxT,EAAQ6C,IAGzB4Q,GAAWnB,GAKT,GAAImB,IAAWnB,GAAWtS,EAAQ6C,gBAJhC6Q,MAAM,yBAA2BpB,IC1B3C,SAAqBqB,EAAK3U,OACX,KAARA,IAAiBA,KACtB,IAAI4U,GAAW5U,EAAI4U,QAEnB,IAAKD,GAA2B,mBAAbxe,UAAnB,CAEA,GAAI0e,GAAO1e,SAAS0e,MAAQ1e,SAAS2e,qBAAqB,QAAQ,GAC9DzU,EAAQlK,SAASoV,cAAc,QACnClL,GAAMlI,KAAO,WAEI,QAAbyc,GACEC,EAAKpI,WACPoI,EAAK3U,aAAaG,EAAOwU,EAAKpI,YAKhCoI,EAAK9U,YAAYM,GAGfA,EAAM0U,WACR1U,EAAM0U,WAAWC,QAAUL,EAE3BtU,EAAMN,YAAY5J,SAAS8e,eAAeN,46IdT9CjV,GAAE6M,OAAS,SAAC3M,EAAK3B,MACZ3H,GAAUH,SAASoV,cAAc3L,OAEhC,GAAIzC,KAAKc,GAAG,IACZ6B,GAAM7B,EAAEd,MAEF,WAANA,IACD2C,GAAKC,YAAYzJ,OAEf,IAAU,WAAN6G,EAAgB,IACpB6C,GAAMN,EAAEI,KACRG,WAAWC,aAAa5J,EAAS0J,KAC7BD,YAAYC,OAEJ,WAAN7C,EACQ,qBAAR2C,iBAAAA,YACFK,KAAKL,GAAKM,IAAI,cACZC,MAAMC,GAAQR,EAAIQ,KAGlBnD,IAAK7G,KACP6G,GAAK2C,IAGLS,aAAapD,EAAG2C,SAInBxJ,GCxBD,IAAM4e,kBAEN,UACG,QACF,SACC,kBAGF,UACG,QACF,SACC,eAGI,gBACC,gBACC,iBAEC,IAyBHC,GAA4B,IAI5B5B,IAA4B,OAAQ,OAWpCvQ,GAA+B,EAS/BoR,GAAqB,EAI5BgB,IAAwB,aAAc,OAAQ,SAAU,MAAO,SACpE,SAAU,QAAS,cAAe,SAAU,UAAW,aAAc,aAKzDC,QACPD,QACCA,OACDA,cACOA,YARiB,UAAW,UAAW,UAAW,UAAW,iBAUlEA,IAIK5a,GAAcX,KAAKqE,GAAK,IctGhBoX,oCAEnBtU,OAAAA,aAAS,WACTuU,OAAAA,kCAEKvU,OAASA,OACTuU,OAASA,OACTC,UAAY,QACZC,WAAa,QACbC,mBACAC,gBAAkB,OAElBzT,EAAI,OACJrG,EAAI,OAEJpF,IAAM,OACNI,KAAO,OAEP+e,wDAIAC,qDAIA9b,YACA+b,qEAIApJ,UAAYhN,EAAE6M,OAAO,cACjBwJ,KAAK/U,iBACF,8JAKPgV,eAEAlR,MAAQiR,KAAKrJ,UAAUtW,cAAc,eACrC6f,cAAgBF,KAAKrJ,UAAUtW,cAAc,yBAE7C4K,OAAOkV,iBAAiB,aAAc,aACrCF,sDAKFlR,QACDiR,MAAKjQ,YACF4G,UAAUnM,aAAa,mBAAoBwV,KAAKjQ,SAEnDiQ,KAAKJ,2BACYI,KAAKN,uBAAsBM,KAAKP,UAExCO,KAAKP,qBAAoBO,KAAKN,4BAErC3Q,MAAM6H,UAAY7H,OAClBmR,cAActJ,UAAY,QAE1B+I,WAAWtV,IAAI,SAAC+V,EAAKhZ,MACnB0B,GAAQuX,EAAKb,OAAOpY,IAAM,QAC5B/B,EAA0B,IAAlB+a,EAAIE,WAAmBF,EAAIE,UAAYF,EAAIE,UAAYF,EAAI/a,MAEnEkb,EAAK5W,EAAE6M,OAAO,wCAEW1N,iDAE6B,IAAVzD,GAAeA,EAAQA,EAAQ,6BAC3E+a,EAAIrR,MAAQqR,EAAIrR,MAAQ,QAGvBmR,cAAclW,YAAYuW,+CAK5BpV,GAAQ6U,KAAKrJ,UAAU6J,iBAEtB9f,IAAMsf,KAAKla,EAAIka,KAAKrJ,UAAU8J,adIU,OcFxC3f,KAAOkf,KAAK7T,EAAIhB,EAAM,KACvBuV,GAAUV,KAAK/U,OAAOuV,YAAcrV,EAEpCwV,EAAUX,KAAKrJ,UAAUtW,cAAc,mBAExC2f,KAAKlf,KAAO,IACNwJ,MAAMxJ,oBAAsB,EAAIkf,KAAKlf,gBACxCA,KAAO,MACN,IAAGkf,KAAKlf,KAAO4f,EAAS,IAE1BE,kBADQZ,KAAKlf,KAAO4f,WAEhBpW,MAAMxJ,KAAO8f,OAEhB9f,KAAO4f,SAEJpW,MAAMxJ,6CAINqL,EAAGrG,MAAGiJ,6DAAY4Q,4DAAiB5P,0DAAS,OAChD0P,UAAY1Q,EAAMoK,UAClBuG,WAAa3Q,EAAM1J,WACnBsa,WAAaA,OACbxT,EAAIA,OACJrG,EAAIA,OACJ8Z,gBAAkB7Q,EAAM8R,YAAc,OACtC9Q,MAAQA,OACR+Q,iDAIAnK,UAAUrM,MAAM5J,IAAM,WACtBiW,UAAUrM,MAAMxJ,KAAO,WACvB6V,UAAUrM,MAAMS,QAAU,2CAI1B4L,UAAUrM,MAAM5J,IAAMsf,KAAKtf,IAAM,UACjCiW,UAAUrM,MAAMxJ,KAAOkf,KAAKlf,KAAO,UACnC6V,UAAUrM,MAAMS,QAAU,aX5H3BgW,iBACS,eACN,iBACE,cACH,iBACG,iBACA,gBACD,wBACM,iBACL,kBACC,gBACF,eACD,uBACM,sBACD,WA8BD9X,GAAW,SAACH,SAEpB,4BAA6BY,KAAKZ,iCACEkY,KAAKlY,GAC1CuB,IAAI,SAAC8B,EAAG/E,SAAa,KAANA,EAAUtC,OAAOqH,GAAG5C,SAAS,IAAM,MAClDlB,OAAO,SAAC4Y,EAAGC,YAAUD,EAAIC,IAErBH,GAAiBjY,IAAUA,GC9CtB0G,GAAmB,EAC1BjB,GAAe,EACfjB,GAAkB,GAClB2B,GAAgB,IACTzB,GAAY,GACnBc,GAAkB,UAClBb,GAAY,UA2oBP0T,QACH,SAACnQ,MACHoQ,SACiB,UAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkP,GAAUrQ,EAAK+C,qBACXzJ,MAAMtG,KAAO,YACbsG,MAAMS,QAAU,MAErBqW,KACM5W,aAAa,YAAa4W,GAE5BC,OAGD,SAACrQ,MACHoQ,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkP,GAAUrQ,EAAK+C,YACfxP,EAASyM,EAAKqB,aAAa,KAC3BrO,EAAOgN,EAAKqB,aAAa,iBACrB7H,aAAa,IAAKpB,SAAS7E,GJvmBA,KIwmB3BiG,aAAa,OAAQxG,KACrBsG,MAAMS,QAAU,MAErBqW,KACM5W,aAAa,YAAa4W,GAE5BC,eAGO,SAACrQ,MACXoQ,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkP,GAAUrQ,EAAK+C,YACfxP,EAASyM,EAAKqB,aAAa,KAC3BrO,EAAOgN,EAAKqB,aAAa,iBACrB7H,aAAa,IAAKpB,SAAS7E,GJ1nBA,KI2nB3BiG,aAAa,OAAQxG,KACrBsG,MAAMS,QAAU,MAErBqW,KACM5W,aAAa,YAAa4W,GAE5BC,IAIEC,QACH,SAACtQ,EAAMqQ,MACTD,SACiB,UAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoP,IAAc,IAAK,IAAK,QAAS,iBAC9BrG,OAAOlK,EAAKuQ,YACjB/H,OAAO,kBAAQ+H,GAAW9H,SAAS+H,EAAKrI,OAASqI,EAAKC,YACtDpX,IAAI,cACIG,aAAagX,EAAKrI,KAAMqI,EAAKE,aAGpCN,KACM5W,aAAa,YAAa4W,QAI7B,SAACpQ,EAAMqQ,MACTD,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoP,IAAc,KAAM,aACjBrG,OAAOlK,EAAKuQ,YACjB/H,OAAO,kBAAQ+H,GAAW9H,SAAS+H,EAAKrI,OAASqI,EAAKC,YACtDpX,IAAI,cACIG,aAAagX,EAAKrI,KAAMqI,EAAKE,aAGpCN,KACM5W,aAAa,YAAa4W,gBAIrB,SAACpQ,EAAMqQ,MACjBD,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoP,IAAc,KAAM,aACjBrG,OAAOlK,EAAKuQ,YACjB/H,OAAO,kBAAQ+H,GAAW9H,SAAS+H,EAAKrI,OAASqI,EAAKC,YACtDpX,IAAI,cACIG,aAAagX,EAAKrI,KAAMqI,EAAKE,aAGpCN,KACM5W,aAAa,YAAa4W,KC/vBxB3O,GAAgB,IAChBU,GAAgB,IAChB1B,GAAuBgB,GACvB4C,GAAsB,IAEtBhE,GAAa,SCHpBgD,SACC,yBACE,iBAEA,wBACC,uBACE,iBSVCoC,GAAU,0sDCUFkL,yBACR1W,EAAQ6C,mBAET3I,EAAU2I,QAEf7C,OAA2B,gBAAXA,GAClB7K,SAASC,cAAc4K,GACvBA,IAEG+U,KAAK/U,iBAAkB2W,mBACtB,IAAIC,OAAM,uDAGZC,aAAehU,OAEfiB,MAAQjB,EAAQiB,OAAS,QACzB3M,KAAO0L,EAAQ1L,MAAQ,QAEvBwb,SAAWoC,KAAK+B,YAAYjU,EAAQV,WACpCA,KAAO4S,KAAKgC,iBAAiBhC,KAAKpC,eAElC4B,OAASQ,KAAKiC,eAAenU,EAAQ0R,OAAQQ,KAAK5d,WAElDuX,oBACS,aACD,cACC7L,EAAQoU,aAAe,cACC,KAApBpU,EAAQqU,QAA2BrU,EAAQqU,QAAU,kBACrDrU,EAAQsU,iBAAmB,QAGxCC,SAAWC,KAAKC,MAAMD,KAAKE,UAAUrD,QACtCvc,GAAIod,KAAKqC,cACRI,YAAY3U,GACbkS,KAAKjR,MAAMpL,WAAYd,YAAc,GACrCmd,KAAKrG,OAAO+I,aAAY9f,EAAEM,aAAe,QACxCyf,UAAY7U,EAAQjI,QAAUjD,EAAEggB,gBAEhCC,cACA/U,gBAEAgV,YAAc1D,GAEhBY,KAAKrG,OAAOuI,mBACTa,kBAGDC,UAAUlV,kDAGJV,SACJA,4CAGSA,SACTA,0CAGOoS,EAAQpd,MAChB6gB,gBACIzD,OAAcvb,OAAOqb,GAAeld,KACvC8gB,QAAQ,SAAC/e,MACT2E,GAAQG,GAAS9E,EACnBqF,GAAaV,KAGJzB,KAAKyB,WAFTqa,KAAK,IAAMhf,EAAS,6BAKvB8e,wFASHpd,EAASma,KAAK2C,eACbC,WAAa/c,OACbA,OAASA,EAAS5C,EAAe+c,KAAKqC,eAGtCe,YAAc,iBAAMC,GAAKC,MAAK,IAC/BC,sBACEC,eAAiB,GAAID,gBAAevD,KAAKoD,kBACzCI,eAAeC,QAAQzD,KAAK/U,gBAE3BkV,iBAAiB,SAAUH,KAAKoD,oBAChCjD,iBAAiB,oBAAqBH,KAAKoD,+CAI9CpD,KAAKwD,gBAAgBxD,KAAKwD,eAAeE,oBACtCC,oBAAoB,SAAU3D,KAAKoD,oBACnCO,oBAAoB,oBAAqB3D,KAAKoD,kDAKhDQ,qBACAC,mBACA/D,mBAEAwD,MAAK,GAAO,gDAKZrY,OAAO2L,UAAY,MAEpBpL,WACKwU,KAAK/U,iBACF,kBAGT+U,MAAK8D,qBACFliB,QAAWuJ,MAAO6U,KAAK8D,iBAAmB,YAG3CnN,UAAYhN,EAAE6M,OAAO,MAAOhL,8CAI5BuY,IAAM,GAAIxE,YACNS,KAAKrJ,iBACLqJ,KAAKR,cAETwE,+FAKDC,0DAAuBC,yDACvBD,IAAmBjjB,EAASgf,KAAK/U,eAIhC4Y,mBAEAM,KAAKF,QACLG,qBACAC,uBAEAC,WAAWpB,QAAQ,kBAAKjC,GAAEpB,MAAMQ,EAAKkE,iBAErCC,OAAOxE,KAAKsE,YAAY,GAE1BJ,SACG9W,KAAO4S,KAAKpC,oBACN,aAAY6G,OAAOpE,EAAKjT,OAAS4S,KAAK8C,mBAG7C4B,oBAEAC,gBAAgBT,+EAMhBU,UAAYjjB,EAAuBqe,KAAK/U,aACxCE,MAAQ6U,KAAK4E,UAAYzhB,EAAc6c,KAAKqC,kDAI9CrC,KAAK7J,UACFQ,UAAUvB,YAAY4K,KAAK7J,QAE7BvT,GAAIod,KAAKqC,cAERlM,IAAMnL,EACVgV,KAAKrJ,UACL,qBACAqJ,KAAK4E,UACL5E,KAAK4C,iBAEDjS,QAAUvF,EAAY4U,KAAK7J,KAE7B6J,KAAKjR,MAAMpL,cACRkhB,QAAUjX,EACd,QACAhL,EAAEE,QAAQhC,KACV8B,EAAEE,QAAQpC,IACVsf,KAAKjR,gBAEMnM,EAAEkiB,mBACN,aACFliB,EAAEkiB,oBAKLpkB,GAAMiC,EAAaC,QAClB2hB,SAAWjZ,EACf0U,KAAK5d,KAAO,sCACCY,EAAcJ,QAAOlC,OAGhCsf,KAAKrG,OAAO+I,gBACP1C,KAAKna,OAASjD,EAAEG,SAAS3B,YAC3B2jB,WAAazZ,EACjB,4BACatI,EAAcJ,QAAOlC,QAIjCsf,KAAKjR,MAAMpL,aAAewS,IAAInM,YAAYgW,KAAK6E,cAC7C1O,IAAInM,YAAYgW,KAAKuE,UACvBvE,KAAKrG,OAAO+I,iBAAmBvM,IAAInM,YAAYgW,KAAK+E,iBAElDC,gBAAgBhiB,EAAcJ,GAAID,EAAaC,4CAGrCuJ,EAAGrG,QACbie,IAAIjZ,UACLqB,IACArG,kDAIoBwe,WAAa,GAAIW,oCAEnC7X,GACFA,WACKuR,MAAM,2BAEVvR,KAAO4S,KAAK+B,YAAY3U,QACxB+W,YACAK,OAAOxE,KAAKsE,WAAYtE,KAAKrG,OAAOwI,cACpCuC,2DAGCJ,yDAAWtE,KAAKsE,WAAYnC,4DAC/BnC,MAAKrG,OAAOuI,kBAETa,SAAS1Y,IAAI,kBAAKnC,GAAEgC,WAAWkL,YAAYlN,QAG7CgN,QAEOgO,QAAQ,cACEhO,EAAkBjR,OAAOgd,EAAEwD,OAAOtC,MAEpDjN,EAAkBvR,OAAS,MACZqc,KAAKrJ,UAAWqJ,KAAK7J,IAAKjB,cAChC,aACCgO,QAAQ,kBAAKjC,GAAEiE,WACrBC,ahBpMiC,SgBuM5BjC,QAAQ,kBAAKjC,GAAEiE,cACrBC,iDAKHnF,KAAKrG,OAAOuI,mBACTf,mBACAiE,0GAMSlB,yDACXlE,MAAKrG,OAAOuI,aAEbgC,SACGmB,mBAEAC,eACEtF,KAAKuF,WAAWC,KAAKxF,SACrBA,KAAKyF,YAAYD,KAAKxF,SACtBA,KAAK0F,UAAUF,KAAKxF,SACpBA,KAAK2F,aAAaH,KAAKxF,SACvBA,KAAK4F,YAAYJ,KAAKxF,gBAGpBG,iBAAiB,UAAW,SAAC0F,GAClC1kB,EAAoB2kB,EAAKnP,eACvBkP,GAAKxkB,OAAO0kB,MACbD,EAAKR,WAAWO,EAAEG,YACfV,WAAWO,EAAEG,mmBA2BlBC,GAAW/P,GAAiB8J,KAAK7J,QACxB6J,KAAKjR,OAAS,SAAUkX,aC3TlBC,0BACRjb,EAAQO,+EACbP,EAAQO,yDAGLA,4FACOA,QAEXmO,OAAOwM,gBAAkB3a,EAAK4a,oBAAsBD,oBACpDxM,OAAO0M,UAAY7a,EAAK6a,WAAa,QACrC1M,OAAO2M,gBAAkB9a,EAAK8a,iBAAmB,6CAIlDC,EAAIvG,KAAK6C,MACTwD,EAAYrG,KAAKrG,OAAO0M,YAC1BG,kBAEEC,GAAYzG,KAAK5S,KAAK8P,OAAO7S,IAAI,SAAC7D,EAAOY,MACxCsf,GAAQ,WACPtZ,KAAKgQ,SAAS/S,IAAI,eACbwb,EAAE3K,OAAO9T,MAEXsf,EAAOlgB,KACbgT,OAAO,kBAAcnW,GAAE,IAAM,IAE5BsjB,EAASF,KACVA,EAAU9iB,OAAS0iB,EAAW,GAEtBO,KAAK,SAACpe,EAAGa,SAAeA,GAAE,GAAKb,EAAE,OAElCie,EAAUngB,MAAM,EAAG+f,EAAU,MAGlCQ,GAAiB,CAFLJ,GAAUngB,MAAM+f,EAAU,GAGhChc,IAAI,eAAwBhH,EAAE,OACjCgE,MAAMwf,EAAgB,cACxBrH,OAAO6G,EAAU,GAAK,SAG1BnJ,YACK7S,IAAI,cACRmc,YAAYnf,KAAKnC,EAAM7B,EAAE,OACzB6Z,OAAO7V,KAAKhE,EAAE,QAGfyjB,WAAaP,EAAEC,YAAYne,OAAO,SAACG,EAAGa,SAAMb,GAAIa,GAAG,QAEhD0C,UACDiU,KAAK7U,MAAQ,IACb6U,KAAKna,OAAS,qDAKd0gB,EAAIvG,KAAK6C,WACRkC,WAAWgC,YAAc,QACzBC,aAAeT,EAAEC,YAAYlgB,MAAM,EAAG0Z,KAAKrG,OAAO2M,oBAEnD7iB,GAAQ,EACRqC,EAAI,OACHkhB,aAAa3c,IAAI,SAAChH,EAAG+D,MACrB6f,GAAW,IACXC,EAAUpjB,KAAK6C,OACjBwgB,EAAKhc,MAAQhI,EAAcgkB,EAAK9E,WAAW4E,EAEzCE,GAAKH,aAAarjB,OAASujB,MACnBC,EAAKhc,MAAMgc,EAAKH,aAAarjB,QAEtCF,EAAQyjB,MACF,KACH,OAEF/a,GAAI8a,EAAWxjB,EAAQ,EACvB+C,EAAQ2gB,EAAKxN,OAAOyI,gBAAkBjc,EAAeogB,EAAErJ,OAAO9V,GAAI6f,EAAS,IAAMV,EAAErJ,OAAO9V,GAC1FkZ,EAAY6G,EAAKxN,OAAOwM,eAAiBgB,EAAKxN,OAAOwM,eAAe9iB,GAAKA,EACzE8M,EAAMxC,EACTxB,EACArG,EACA,EACAqhB,EAAK3H,OAAOpY,GACTZ,OAAU8Z,GACb,KAEIyE,WAAW/a,YAAYmG,gBApFewR,ITHjC3J,GAAqB,EAErBG,GAAe,IACfD,GAAa,MAEbM,IAAe,UAAW,WAAY,QAAS,QAAS,MACpE,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAIlD4O,IAAmB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OCcpEvN,oCAEEwN,WAAAA,aAAa,SACbC,eAAAA,aAAiB,KACjBlO,IAAAA,UAEAC,IAAAA,QACAkO,IAAAA,aACAC,IAAAA,gCAEKF,eAAiBA,OACjBlO,UAAYA,OAEZmO,aAAeA,OACflO,QAAUA,OAEVmO,gBAAkBA,OAElBC,cACAvK,eAEAmK,WAAaA,OACbA,WAC0B,kBAApBrH,MAAKqH,WAA4BrH,KAAKqH,aAAerH,KAAKqH,gBAEhEvG,qDAGD1T,QACCA,KAAOA,GAAQ4S,KAAK3G,wCAGvBpO,QACGyc,MAAQpc,EAAa0U,KAAKqH,WAAYrH,KAAKsH,eAAgBrc,uCAI3DuZ,OAAOxE,KAAK5S,WACZua,QAAU3H,KAAK5S,oCAGjBA,mBACEqa,MAAQzH,KAAKuH,aAAana,QAE1Bsa,MAAMX,YAAc,QACpBU,MAAMvE,QAAQ,SAAC3iB,KACRoD,OACFpD,EAAQ2iB,QAAQ,SAACjiB,KACRymB,MAAM1d,YAAY/I,KAE3BoiB,EAAKqE,MAAM1d,YAAYzJ,UAE5B2c,OAAOgG,QAAQ,SAAC3iB,KACZmnB,MAAM1d,YAAYzJ,yCAIxB4hB,mEACJrB,aACD0G,YACDrF,OACgBnC,KAAKwH,gBAAgBxH,KAAK5S,WAEtCoa,WAILjO,4BAEU,qCACCnM,SACLA,GAAKwa,aAAavd,IAAI,SAACkc,EAAGnf,MAC5Bd,GAAQoF,EAAS6a,EAAG,aAAcnZ,EAAKoS,OAAOpY,GAAI,OAAQgG,EAAKya,sBAC7Dvd,MAAMwd,WAAa,iBAClBxhB,8BAIOyhB,SACR/H,MAAKyH,MAAMpd,IAAI,SAAC/D,EAAOc,SAAMmM,IAAejN,EAAOyhB,EAAQH,aAAaxgB,8BAIpE,mCACCgG,SACLA,GAAKwa,aAAavd,IAAI,SAACkc,EAAGnf,MAC5Bd,GAAQoF,EAAS6a,EAAG,WAAY,OAAQnZ,EAAKoS,OAAOpY,aAClDkD,MAAMwd,WAAa,iBAClBxhB,8BAIOyhB,SACR/H,MAAKyH,MAAMpd,IAAI,SAAC/D,EAAOc,SAC7BmM,IAAejN,EAAOyhB,EAAQH,aAAaxgB,mCAKjC,wCACCgG,oBACLA,GAAK4a,WAAW3d,IAAI,SAAC8B,EAAG/E,SAEpB2F,GAAcZ,EADhB,EACsBiB,EAAK6a,OAAO7gB,GACzCiZ,EAAKjH,UAAU8O,UAAW7H,EAAKjH,UAAU+O,SAAU/a,EAAKoS,OAAOpY,gCAKlD2gB,MACZA,EAAS,6BAIK,+BACC3a,cACLuH,WAEAvH,GAAKzJ,UACAuf,QAAQ,SAACkF,EAAMhhB,KACXihB,UAAUhe,IAAI,SAAC2E,EAAU5H,KACjBC,KACLgI,EAAML,EAAUoZ,EAAKlL,OAAO9V,GAAI+f,EAAK/N,UAAUjO,YACrCgc,EAAK/N,UAAU7J,SAChB6Y,EAAK9Y,KAAO6X,EAAK/N,UAAU9J,mBAChB6X,EAAK/N,UAAUvK,oBAKvCuZ,EAAKrZ,SACI1H,KACLyH,SACWsZ,EAAKrZ,eACFqZ,EAAK9Y,WAC/B6X,EAAK/N,UAAUvT,QAAUuH,EAAKxH,eACPuhB,EAAK/N,UAAUjO,WAM/BwJ,MAGN0T,UAAUnF,QAAQ,SAAClU,EAAU5H,KACrBC,KAAKgI,EAAML,EAAU5B,EAAK8P,OAAO9V,GAAI+f,EAAK/N,UAAUjO,YACnDgc,EAAK/N,UAAU7J,SAChBnC,EAAKkC,KAAO6X,EAAK/N,UAAU9J,mBAChB6X,EAAK/N,UAAUvK,oBAI5CzB,EAAK2B,SACC1H,KACRyH,SACQ1B,EAAK2B,eACF3B,EAAKkC,WACP0Q,KAAK5G,UAAUvT,QAAUuH,EAAKxH,eAC/Boa,KAAK5G,UAAUjO,SAKlBwJ,6BAGcoT,cACNO,EAA0B,SAACX,EAASI,MAClCQ,GAASR,EAAQM,UACjBG,EAAYT,EAAQ7K,OACpBuL,EAASd,EAAQU,UACjBK,EAAYf,EAAQzK,SAELnX,EAAqB0iB,EAAQF,iCACvBxiB,EAAqB2iB,EAAWF,oCAEpDhE,kBACUiE,SACHD,IAGL1C,EAAK2B,MAAMpd,IAAI,SAAC/C,EAAMF,SAClBsK,IAAkBpK,EAAMihB,EAAOnhB,GAAIqhB,EAAOrhB,UAMrD4Y,KAAK2H,kBAAmB9jB,aACjBmc,MAAK2H,QAAQzE,QAAQ,SAAC9R,EAAKhK,KACNgK,EAAK2W,EAAQ3gB,SAIzCmhB,GAASR,EAAQM,UACjBG,EAAYT,EAAQ7K,OACpBuL,EAASzI,KAAK2H,QAAQU,UACtBK,EAAY1I,KAAK2H,QAAQzK,SAEVnX,EAAqB0iB,EAAQF,iCACvBxiB,EAAqB2iB,EAAWF,uCAEpDhE,kBACUiE,SACHD,IAGLxI,KAAKyH,MAAMpd,IAAI,SAAC/C,EAAMF,SAClBsK,IAAkBpK,EAAMihB,EAAOnhB,GAAIqhB,EAAOrhB,0BAMnD,+BACCgG,oBACLA,GAAKib,UAAUhe,IAAI,SAAC2E,EAAU5H,SACpCqI,GAAMT,EAAU5B,EAAKub,WAAWvhB,GAAIwhB,EAAKxP,UAAUvT,QACjD0J,KAAMqZ,EAAKxP,UAAU7J,KAAMD,IAAKsZ,EAAKxP,UAAU9J,kCAInCyY,MACXQ,GAASR,EAAQM,UACjBG,EAAYT,EAAQY,WACpBF,EAASzI,KAAK2H,QAAQU,UACtBK,EAAY1I,KAAK2H,QAAQgB,aAEV5iB,EAAqB0iB,EAAQF,iCACvBxiB,EAAqB2iB,EAAWF,uCAEpDhE,kBACOiE,aACCD,IAGNxI,KAAKyH,MAAMpd,IAAI,SAAC/C,EAAMF,SACrBkK,IACNhK,EAAMihB,EAAOnhB,GAAIqhB,EAAOrhB,6BAOf,kCACCgG,oBACLA,GAAK/C,IAAI,SAACzH,SAChB8M,GAAQ9M,EAAEoM,SAAUpM,EAAE4D,MAAOqiB,EAAKzP,UAAUjO,gBACjCvI,EAAEkL,QAAQ6B,cACd,gBACI,uCAIGoY,SACWhiB,EAAqBia,KAAK2H,QAASI,kBAAvDJ,gBAEFY,YAAiBle,IAAI,kBAAKhH,GAAE2L,WAC5BwZ,EAAYT,EAAQ1d,IAAI,kBAAKhH,GAAEmD,QAC/BsiB,EAAaf,EAAQ1d,IAAI,kBAAKhH,GAAEyK,UAEhC2a,EAASzI,KAAK2H,QAAQtd,IAAI,kBAAKhH,GAAE2L,uBAEhCwV,OAAOiE,EAAOpe,IAAI,SAACiF,EAAKlI,mBAEjBqhB,EAAOrhB,SACVohB,EAAUphB,WACR0hB,EAAW1hB,OAIf4Y,KAAKyH,MAAMpd,IAAI,SAAC/C,EAAMF,SACrBsK,IACNpK,EAAMihB,EAAOnhB,GAAIqhB,EAAOrhB,6BAOf,kCACCgG,oBACLA,GAAK/C,IAAI,kBACfuF,GAAQhH,EAAEmgB,SAAUngB,EAAEogB,OAAQC,EAAK7P,UAAUjO,MAC5CvC,EAAEpC,OAAQmJ,SAAU/G,EAAEkF,QAAQ6B,uCAGjBoY,SACWhiB,EAAqBia,KAAK2H,QAASI,kBAAvDJ,gBAEFY,YAAiBle,IAAI,kBAAKhH,GAAE2lB,SAC5BR,EAAYT,EAAQ1d,IAAI,kBAAKhH,GAAEmD,QAC/B0iB,EAAYnB,EAAQ1d,IAAI,kBAAKhH,GAAE0lB,WAC/BD,EAAaf,EAAQ1d,IAAI,kBAAKhH,GAAEyK,UAEhC2a,EAASzI,KAAK2H,QAAQtd,IAAI,kBAAKhH,GAAE2lB,SACjCG,EAAYnJ,KAAK2H,QAAQtd,IAAI,kBAAKhH,GAAE0lB,gBAEnCvE,OAAOiE,EAAOpe,IAAI,SAACiF,EAAKlI,mBAEjB+hB,EAAU/hB,UACZqhB,EAAOrhB,SACRohB,EAAUphB,WACR0hB,EAAW1hB,UAIlBogB,kBAECC,MAAMpd,IAAI,SAACyH,EAAW1K,KACRogB,EAAgBvjB,OAAO4N,GACxCC,EAAWoX,EAAU9hB,GAAImhB,EAAOnhB,GAAIqhB,EAAOrhB,OAItCogB,2BAKI,iBAAoB,sBAAwBxH,KAAK5G,UAAUrJ,6BAC1D3C,gBACuD4S,KAAK5G,UAAnErJ,IAAAA,MAAOqZ,IAAAA,SAAUC,IAAAA,UAAWC,IAAAA,WAAY/kB,IAAAA,OAEzC4H,IAFiDod,WAEjCzjB,EAAI,cAEnB0jB,0BAEAC,KAAKpf,IAAI,SAACqf,EAAMC,GACN,IAAXA,KACGzM,OAAO7V,KACXuG,EAAS,cAAezB,GARL,GAQyBkM,GAAatI,GAAO,GAAM6Z,wBAE1D,OAKTvf,IAAI,SAACwO,EAAKzR,MACXyR,EAAI7U,KAAM,IACRoJ,gBACUyL,EAAIgR,sBACHhR,EAAIiR,qBACN1iB,GAET2iB,EAAS7c,EAAW,MAAOf,EAAGrG,EAAGwjB,EAAY/kB,EAAQsU,EAAI7U,KAAMoJ,KAC9Doc,qBAAqBniB,KAAK0iB,MAE3BV,MAEF,KACCD,IAGCpJ,KAAKwJ,+CAGGzB,MACZA,EAAS,gCAKD,iBAAoB,sCAAwC/H,KAAK5G,UAAUrJ,6BAC1E3C,MACR6T,GAAIjB,KAAK5G,sBACR4Q,SAAW,WACXC,MAAQ7c,EAAK8c,WAAW7f,IAAI,SAACvE,EAAGrD,SAC7BqN,GACN1C,EAAK4a,WAAWvlB,GAChBqD,EACAsH,EAAK6Z,SACLhG,EAAEnY,MACFsE,EAAK8P,OAAOza,GACZA,EACA2K,EAAK+c,QAAQ1nB,aAEF2K,EAAKxH,mBACJwH,EAAKgd,oBACLnJ,EAAEhR,cAIT+P,KAAKiK,gCAEGlC,MACXsC,GAAUtC,EAAQC,WAClBsC,EAAUvC,EAAQmC,WAClBK,EAAaxC,EAAQoC,QACrB3B,EAAYT,EAAQ7K,OAEpBsN,EAAUxK,KAAK2H,QAAQK,WACvByC,EAAUzK,KAAK2H,QAAQuC,WACvBQ,EAAa1K,KAAK2H,QAAQwC,QAC1BzB,EAAY1I,KAAK2H,QAAQzK,SAERnX,EAAqBykB,EAASH,iCAC9BtkB,EAAqB0kB,EAASH,iCACxBvkB,EAAqB2kB,EAAYH,iCACnCxkB,EAAqB2iB,EAAWF,gCAEpDhE,mBACQgG,aACAC,UACHC,SACDlC,WAEExI,KAAK2H,QAAQ/hB,mBACZoa,KAAK2H,QAAQyC,mBACdpK,KAAK2H,QAAQV,cAGpBO,kBAECC,MAAMpd,IAAI,SAACkI,EAAKnL,KACFogB,EAAgBvjB,OAAOqO,GACxCC,EAAK8X,EAAQjjB,GAAIkjB,EAAQljB,GAAI2gB,EAAQd,SAAUsD,EAAWnjB,IACzDxB,SAAUmiB,EAAQniB,cAId4hB,0BAKU,iBACD,sCAAwCxH,KAAK5G,UAAUrJ,6BAErD3C,MACL6T,GAAIjB,KAAK5G,sBACR4Q,SAAW,WACXpZ,SACAqQ,EAAE0J,gBACE/Z,MAAQR,EACThD,EAAK4a,WACL5a,EAAK8c,WACLjJ,EAAEnY,gBAEYmY,EAAExQ,oBACAwQ,EAAEpQ,kBACNoQ,EAAE1Q,iBAGD0Q,EAAEtQ,iBACDvD,EAAKxH,iBAKtBqkB,SAEAhJ,EAAE2J,gBACEX,MAAQ7c,EAAK8c,WAAW7f,IAAI,SAACvE,EAAGrD,SAC1ByN,GACH9C,EAAK4a,WAAWvlB,GAChBqD,EACAsH,EAAK7I,OACL0c,EAAEnY,MACFmY,EAAE4J,iBAAmBzd,EAAK8N,OAAOzY,GAAK,GACtCA,MAKL6W,OAAO4B,OAAO8E,KAAKpP,OAAO3M,OAAO+b,KAAKiK,iCAEjClC,MACRsC,GAAUtC,EAAQC,WAClBsC,EAAUvC,EAAQmC,WAClBY,EAAY/C,EAAQ7M,OAEpBsP,EAAUxK,KAAK2H,QAAQK,WACvByC,EAAUzK,KAAK2H,QAAQuC,WACvBrW,EAAYmM,KAAK2H,QAAQzM,SAERnV,EAAqBykB,EAASH,iCAC9BtkB,EAAqB0kB,EAASH,iCAC1BvkB,EAAqB8N,EAAWiX,gCAEpDtG,mBACWgG,aACAC,SACJK,WAEE9K,KAAK2H,QAAQ/hB,gBACfoa,KAAK2H,QAAQpjB,YAGrBijB,YAEAlO,QAAOlP,KAAK4V,KAAKpP,OAAOjN,WACN6jB,EAAgBvjB,OAC9B6O,GACIkN,KAAKpP,MACLyZ,EACAC,EACAvC,EAAQniB,SACRoa,KAAK5G,UAAU7I,UAKvByP,KAAKiK,MAAMtmB,aACNsmB,MAAM5f,IAAI,SAAC8F,EAAK/I,KACCogB,EAAgBvjB,OAC9B0O,GAAWxC,EAAKka,EAAQjjB,GAAIkjB,EAAQljB,OAKzCogB,KSvhBEuD,0BACR9f,EAAQO,8EACbP,EAAQO,aACTpJ,KAAO,eACPyd,iEAGM/R,MACPlL,GAAIod,KAAKqC,cACR2I,WAAald,EAAQkd,kBAEtB3hB,GAAI2W,KAAKgL,aACXnlB,OAASwD,EAAExD,QlB0D8B,KkBzDzCmH,MAAQ3D,EAAE2D,OAASC,KAEnBlK,SAASvB,MAAQ,KACjB0B,aAAe,KACf0f,WAA0C,GAA5BvZ,EAAExD,OAAmB,GAAVwD,EAAE2D,oDAIzBuZ,GAAIvG,KAAK6C,MAETtJ,IAEF,4BAEYyG,KAAKgL,WAAWnlB,gBACjBma,KAAKgL,WAAWhe,OAE3B,6BAEcuZ,EAAEyB,kBACNzB,EAAE0B,cACFjI,KAAKR,SAEbgG,KAAKxF,aAIJsE,WAAa,GAAIW,KAAI1L,EACxBlP,IAAI,eACA4gB,GAAY/R,mBAAgB1N,WACxBA,EAAK,GAAIyf,wIAMf1E,GAAIvG,KAAK6C,QAEXmF,gBACAC,aAEEiD,GAAO,IACT1E,YAAYnc,IAAI,SAAChF,MACd8F,GAAQkV,EAAKlV,MAAQ9F,EAAQkhB,EAAEO,aACjCmB,OAAO5gB,KAAK8D,KACZ6c,WAAW3gB,KAAK6jB,MACV/f,gGAOLob,EAAIvG,KAAK6C,WACRlM,UAAUwJ,iBAAiB,YAAa,SAAC0F,MACzCsF,GAAOhE,EAAK7C,WAAW8G,IAAI,kBAAkB3D,MAC7ClV,EAAMsT,EAAE1jB,UACTgpB,EAAK1R,SAASlH,GAAM,IAElBnL,GAAI+jB,EAAKrP,QAAQvJ,GACjB8Y,EAAO/qB,EAAU6mB,EAAKxQ,WAAY2U,EAAOhrB,EAAUiS,GAEnDpG,EAAImf,EAAKxqB,KAAOuqB,EAAKvqB,KAAOsI,SAASmJ,EAAIF,aAAa,UAAU,EAChEvM,EAAIwlB,EAAK5qB,IAAM2qB,EAAK3qB,IACpBqO,GAASoY,EAAKoE,iBAAmBpE,EAAKoE,gBAAgB5nB,OAAO,EAC9DwjB,EAAKoE,gBAAgBnkB,GAAK+f,EAAKtE,MAAM3F,OAAO9V,IAAM,KACjDokB,EAAWjF,EAAEC,YAAYpf,GAAGmf,EAAEO,aAE7B/C,IAAI0H,UAAUtf,EAAGrG,GAAIqT,KAAMpK,EAAO1J,OAAiB,IAATmmB,GAAcloB,QAAQ,GAAK,QACrEygB,IAAI2H,oBAlFgCxF,ICIxByF,0BACR1gB,EAAQO,8EACbP,EAAQO,aACTpJ,KAAO,QACP0gB,YAAc,IACdoB,KAAO,IAEPrE,+DAGIrU,4FACOA,QACXogB,UAAY5L,KAAK4L,UAAUpG,KAAKxF,WAChC6L,WAAa7L,KAAK6L,WAAWrG,KAAKxF,WAElC8L,WAAatgB,EAAKsgB,YAAc,QAChCnS,OAAOoS,WAAavgB,EAAKugB,YAAc,OAEvC/f,UAAYR,EAAKQ,YAAa,oIAK/Bua,GAAIvG,KAAK6C,WACRte,OAAUyb,KAAKna,OAASma,KAAK7U,MAAQ6U,KAAKjU,OAAOI,EAAI6T,KAAKjU,OAAOjG,KAE9DvB,GAAsByb,KAAtBzb,OAAQyH,EAAcgU,KAAdhU,UAEVggB,EAAuBzF,EAAE0F,uBAC7BrE,kBACAqE,uBACEC,GAAW,IAAMlM,KAAKrG,OAAOoS,aAC/BvF,YAAYnc,IAAI,SAACqc,EAAOtf,MACnB2kB,GAAaG,EACbC,EAAmBzF,EAAQH,EAAEO,WnB+DZ,ImB9DjB7a,EAAWkgB,EAAkB,IAAM,EAAG,EACtCC,EAAYpgB,GAAamgB,EAAkBA,EAC3CE,EAAWH,GAAsBE,EACjCvgB,EAAgBxH,EAAmB0nB,EAAYxnB,GAC/CuH,EAAczH,EAAmBgoB,EAAU9nB,GAE3C+nB,EAAejM,EAAK6D,MAAQ8H,EAAqB5kB,GAEnDmlB,SAASC,QACVnM,GAAK6D,QACIoI,EAAeA,EAAazgB,cAAgBA,IAC9CygB,EAAeA,EAAaxgB,YAAcD,MAExCA,IACFC,MAEJ2gB,GACe,MAApBN,EACG5f,EAAcggB,EAAUC,EAAQnM,EAAKtU,OAAQsU,EAAK9b,OAAQyH,EAAWC,GACrEL,EAAe2gB,EAAUC,EAAQnM,EAAKtU,OAAQsU,EAAK9b,OAAQyH,EAAWC,KAExE2b,aAAavgB,KAAKolB,KAClBR,iBAAiB5kB,0CAGXqf,QACAH,EAAEO,yCAGFsF,WAIJlI,KAAO,+CAIRqC,GAAIvG,KAAK6C,MAETtJ,IAEF,eAEA,+BAEgBgN,EAAEqB,oBACR5H,KAAKR,SAEbgG,KAAKxF,aAIJsE,WAAa,GAAIW,KAAI1L,EACxBlP,IAAI,eACA4gB,GAAY/R,mBAAgB1N,WACxBA,EAAK,GAAIyf,kDAIAyB,MACbnoB,GAAqByb,KAArBzb,OAAOunB,EAAc9L,KAAd8L,WACP9c,EAAW3K,EAAmBqoB,EAASX,WAAYW,EAASpoB,MAAQ,EAAGC,wBACtDyK,EAAS7C,EAAK2f,QAAiB9c,EAASlJ,EAAKgmB,6CAG1Dtb,EAAKpJ,EAAEulB,EAAK9G,MAClBrV,MACE1H,GAAQkX,KAAKR,OAAOpY,MACvBulB,EAAM,IACEnc,EAAMwP,KAAK4M,oBAAoB5M,KAAK6C,MAAMoJ,iBAAiB7kB,OAChEkD,MAAMtG,KAAO6E,EAAmBC,EAAO,OACxC+jB,GAAQvsB,EAAU0f,KAAK7J,KACvBhK,EAAI0Z,EAAEiH,MAAQD,EAAM/rB,KAAO,GAC3BgF,EAAI+f,EAAEkH,MAAQF,EAAMnsB,IAAM,GAC1BqO,GAASiR,KAAKgN,kBAAoBhN,KAAKgN,iBAAiBrpB,OAAS,EAClEqc,KAAKgN,iBAAiB5lB,GAAK4Y,KAAK6C,MAAM3F,OAAO9V,IAAM,KAClD6lB,GAAuC,IAA5BjN,KAAK6C,MAAM2D,YAAYpf,GAAW4Y,KAAK6C,MAAMiE,YAAYxjB,QAAQ,QAC3EygB,IAAI0H,UAAUtf,EAAGrG,GAAIqT,KAAMpK,EAAO1J,MAAO4nB,EAAU,WACnDlJ,IAAI2H,kBAEClb,EAAK,2BACVuT,IAAI9D,YACJ3V,MAAMtG,KAAO8E,8CAKd6N,UAAUwJ,iBAAiB,YAAaH,KAAK4L,gBAC7CjV,UAAUwJ,iBAAiB,aAAcH,KAAK6L,8CAG1ChG,MACH1jB,GAAS0jB,EAAE1jB,OACb+qB,EAASlN,KAAKsE,WAAW8G,IAAI,aAAa3D,MAC1C0F,EAAYnN,KAAKoN,oBACjBC,EAAarN,KAAKsN,kBACnBJ,EAAOzT,SAAStX,GAAS,IACvBiF,GAAI8lB,EAAOpR,QAAQ3Z,QAClBorB,WAAWF,EAAYF,GAAU,QACjCG,eAAiBnrB,OACjBirB,oBAAsBhmB,OACtBmmB,WAAWprB,EAAQiF,GAAG,EAAMye,aAE5BgG,uDAKD0B,WAAWvN,KAAKsN,eAAetN,KAAKoN,qBAAoB,UA/IzBlH,ICIjBsH,0BACRviB,EAAQ6C,8EACb7C,EAAQ6C,MACT1L,KAAO,YAEPqrB,WAAa3f,EAAQ2f,YAAc,MAEpCC,IAAe,SAAU,UACzBC,EAAiBD,EAAYjU,SAAS3L,EAAQ6f,gBAC/C7f,EAAQ6f,eAAiB,kBACvBC,oBAAsBF,EAAY5R,QAAQ6R,KAE1C9N,iEAGM/R,MACPlL,GAAIod,KAAKqC,cACRwL,gBAA8C,IAA5B/f,EAAQ+f,gBAAwB,EAAI,IAEzD9qB,SAASrC,IAAMotB,KACf/qB,SAAS3B,OAAS,IAClB8B,aAAe4qB,KACflL,WA1BcmL,GA0BY/V,GACzB/U,EAAeL,MAEdS,GAAI2c,KAAK5S,KACT4gB,EAAUhO,KAAK6N,gBZrCY,GYqC0B,OACpD/J,iBA/BWiK,IA+BStW,GAAgBpU,EAAEK,MAAOL,EAAEqa,KACjDsQ,GAAuB7qB,EAAcP,4CAIpCorB,GAAUhO,KAAK6N,gBZ3CY,GY2C0B,EACrDI,EAAYjO,KAAK6C,MAAMoL,UAAYjO,KAAK6C,MAAMoL,UAAY,QACzDrJ,UAtCWmJ,IAsCEE,EAAYD,GAC3B7qB,EAAc6c,KAAKqC,mDAGXjV,0DAAK4S,KAAK5S,QAClBA,EAAK1J,OAAS0J,EAAKsQ,KAAOtQ,EAAK1J,MAAQ0J,EAAKsQ,SACxC,IAAImE,OAAM,kDAGbzU,EAAK1J,UACHA,MAAQ,GAAI6B,QACZ7B,MAAMwqB,YAAa9gB,EAAK1J,MAAM8T,cAAgB,IAEhDpK,EAAKsQ,QAAYA,IAAM,GAAInY,SAC1B4oB,WAAa/gB,EAAK+gB,eAEpB/kB,SAASkQ,OAAOlP,KAAKgD,EAAK+gB,YAAY,IAAM,IAAQ,IAClDhnB,aACGiD,KAAKgD,EAAK+gB,YAAYjL,QAAQ,eAChCpM,GAAO,GAAIvR,MAAK6oB,EAAejW,MAC5BhB,GAAYL,IAAS1J,EAAK+gB,WAAWC,OAExCD,WAAahnB,QAGZiG,qCAIHmZ,GAAIvG,KAAK6C,QAEXnf,MAAQ0S,GAAM4J,KAAK5S,KAAK1J,SACxBga,IAAMtH,GAAM4J,KAAK5S,KAAKsQ,OAEtB2Q,eAAiBjY,GAAMmQ,EAAE7iB,SACzBuqB,UAAYxW,GAAgB8O,EAAE7iB,MAAO6iB,EAAE7I,OACvCZ,aAAeJ,GAChBpD,OAAO4B,OAAO8E,KAAK5S,KAAK+gB,YpBJc,KoBMrCG,cAAgBtO,KAAKuO,kEAInBhI,EAAIvG,KAAK6C,MACT2L,EAAUxO,KAAK6N,gBAAkB,EAAI,EAErCtU,EAAmBgN,EAAE+H,cAAcjkB,IAAI,SAACsP,EAAQvS,UACnD,oBAEQuS,EAAO5J,eAvFAge,aAAAA,cpByEiB,UoBkBvB1N,EAAKyB,aAAavd,QAAU,aA3FtBwpB,GA4FFxH,EAAE+H,cACZ9U,OAAO,SAACG,EAAQlX,SAAMA,GAAI2E,IAC1BiD,IAAI,kBAAUsP,GAAO8P,KAAK9lB,OAAS6qB,IACnCnmB,OAAO,SAACG,EAAGa,SAAMb,GAAIa,GAAG,IAG3B,iBACQkd,GAAE+H,cAAclnB,IACtBoe,KAAKnF,WAIHiE,WAAa,GAAIW,KAAI1L,EACxBlP,IAAI,SAACmB,EAAMpE,MACP6jB,GAAY/R,mBAAgB1N,WACxBA,EAAK,GAAK,IAAMpE,EAAG6jB,SAIzBnlB,GAAI,KACQod,QAAQ,SAACuL,EAASrnB,OAC7B,EAAG,EAAG,GAAGqS,SAASrS,GAAI,IACrBsnB,GAAU9gB,EAAS,kBAAkB,EAAc9H,EAAG2oB,YpBzC3B,MoB4CzB,aACQ,UAGTlK,SAASva,YAAY0kB,MAzHZX,oCA+HV3gB,GACFA,WACKuR,MAAM,2BAGVvR,KAAO4S,KAAK+B,YAAY3U,QACxBkW,YACAU,oEAIArN,UAAUwJ,iBAAiB,YAAa,SAAC0F,KACxCvB,WAAWpB,QAAQ,eACnByL,GAAaC,EAAKnH,MAClBoH,EAAYhJ,EAAE1jB,UACfwsB,EAAWlV,SAASoV,GAAY,IAE9BprB,GAAQorB,EAAUxc,aAAa,cAC/Byc,EAAYD,EAAUxc,aAAa,aAAaK,MAAM,KAEtDgG,EAAQL,GAAajP,SAAS0lB,EAAU,IAAI,GAAG,GAE/CzD,EAAOlE,EAAKxQ,UAAUlW,wBAAyB6qB,EAAOuD,EAAUpuB,wBAEhE0K,EAAQ/B,SAASyc,EAAE1jB,OAAOkQ,aAAa,UACvClG,EAAImf,EAAKxqB,KAAOuqB,EAAKvqB,KAAOqK,EAAM,EAClCrF,EAAIwlB,EAAK5qB,IAAM2qB,EAAK3qB,IACpB2E,EAAQ5B,EAAQ,IAAM0jB,EAAKsG,WAC3BtU,EAAO,OAAST,EAAQ,IAAMoW,EAAU,GAAK,KAAOA,EAAU,KAE7D/K,IAAI0H,UAAUtf,EAAGrG,GAAIqT,KAAMA,EAAM9T,MAAOA,EAAOwb,WAAY,SAC3DkD,IAAI2H,sEAOP3G,WAAWgC,YAAc,MAC1B5a,GAAI,EAEJ5H,EAASyb,KAAK8B,aAAavd,QAAU,EAErCwqB,EAAWnhB,EAAS,iBAAkBzB,EA1K1B4hB,GA0KgC,iBAEpCA,MACN,MAGDiB,QACAjK,WAAW/a,YAAY+kB,QAEvBvP,OAAOlZ,MAAM,EpB5GqB,GoB4GS+D,IAAI,SAACvB,EAAO1B,MACrD2iB,GAAS7c,EAAW,sBAAuBf,EAAI,GAAkB/E,EApLxD2mB,GpByEiB,GoB4GPxpB,EAAQuE,KAC5Bic,WAAW/a,YAAY+f,QAIzBkF,GAAWrhB,EAAS,iBADRzB,EAAI+iB,GAA8CF,EAzLlDjB,GA0LwC,iBAE5CA,MACN,SAGDhJ,WAAW/a,YAAYilB,4CAaxB,GATA1I,GAAIvG,KAAK6C,SACoB0D,EAAE7iB,MAAM6T,WAAYgP,EAAE7iB,MAAM8T,eAAtD2X,OAAYC,UACU7I,EAAE7I,IAAInG,WAAYgP,EAAE7I,IAAIlG,eAE/C6X,OAAyBF,EAAa,EAA6B,SAAbC,GAExDd,KAEAgB,EAAelZ,GAAMmQ,EAAE7iB,OACnB0D,EAAI,EAAGA,EAAIioB,EAAYjoB,IAAK,IAC/BuQ,GAAU4O,EAAE7I,QACZtF,GAAekX,EAAc/I,EAAE7I,KAAM,QACnB4R,EAAa/X,WAAY+X,EAAa9X,iBACjDiB,gBAEGpR,KAAK2Y,KAAKuP,gBAAgBD,EAAc3X,OAE9CA,EAAS,KACFA,QAGT2W,2CAGQ5W,MAAWC,0DAAQ,MACbD,EAAUH,WAAYG,EAAUF,eAAhDkB,OAAOC,OACR6W,EAAc3X,GAAeH,GAG7B+X,SACI/W,gBAHEtC,GAAMuB,IAAYc,GAAmBC,EAAOC,GAOrC,OAIb,GAHA+W,GAAiBjY,GAAgB+X,EAAa7X,GAE9C8R,KAAWzgB,SACP5B,EAAI,EAAGA,EAAIsoB,EAAgBtoB,MAC5B4Y,KAAK2P,OAAOH,EAAa9W,KAC1BrR,KAAK2B,QAEI,GAAIzD,MAAKyD,EAAIgP,GAAqB,GAAG6R,UAC9B,cAGuB7kB,KAA1CgE,EAAIgP,GAAqB,GAAG8R,eACtB0F,EAAa,KAChBnoB,KAAK2Y,KAAK2P,OAAOH,EAAa9W,GAAO,OAG9B+Q,KAAOA,EAEbgG,iCAGD/X,EAAWgB,OAOb,GAPoBkX,2DACpBrJ,EAAIvG,KAAK6C,MAGTgN,EAAczZ,GAAMsB,GACpB1O,KAEI5B,EAAI,EAAGA,EAAI4Q,GAAoB5Q,IAAK2R,GAAQ8W,EAAa,GAAI,IAChElW,MAGAmW,EAAwBD,GAAetJ,EAAE7iB,OAASmsB,GAAetJ,EAAE7I,GAEpEkS,IAASC,EAAYtY,aAAemB,IAAUoX,IACzCjG,SAAW1S,GAAY0Y,KAErB7P,KAAK+P,mBAAmBF,KAE9BxoB,KAAKsS,SAGH3Q,8CAGW8N,MACd+S,GAAW1S,GAAYL,GACvBgT,EAAY9J,KAAK5S,KAAK+gB,WAAWtE,mBAE1BA,YACCC,GAAa,OAClB9J,KAAKR,OAAOxC,GAAiB8M,EAAW9J,KAAK6C,MAAM/F,uBAtRvB6E,ICFhBlD,0BACRxT,EAAQO,8EACbP,EAAQO,aAETwf,WAAaxf,EAAKwf,iBAClBgF,YAAcxkB,EAAKwkB,kBAEnB5tB,KAAOoJ,EAAKpJ,MAAQ,SACpB8hB,KAAO,IAEPrE,mEAIFG,KAAK5S,KAAKgQ,SAASzZ,QAAU,SAC1BgW,OAAO+I,WAAa,OACpBL,SAAStf,SAAS3B,OAAS,sCAIxB0M,4FACaA,SACaA,EAArBmiB,YAAAA,oBACiBA,MAAjBC,IAAAA,MAAOhU,IAAAA,QAEPkK,eAAiBtY,EAAQsY,wBAE5BzM,OAAOwW,UAAYD,EAAQA,EAAMC,UAAYF,EAAYE,WAAa,OAKvEjU,GAASA,EAAMvY,YACVgW,OAAOyW,YAAclU,EAAM7R,IAAI,SAAC+d,oBAElBA,EAAKiI,aACZjI,EAAKkI,YACClI,EAAKpZ,eACRoZ,EAAKrZ,eAIf4K,OAAO0W,UAAYnU,EAAQA,EAAMmU,UAAYJ,EAAYI,WAAa,OAGhFnU,GAASA,EAAMoU,IAAMpU,EAAMlN,gBACzB2K,OAAOyW,aAAelU,UAIlBvC,OAAO4W,UAAYN,EAAYM,WAAa,OAC5C5W,OAAO6W,oBAAsBP,EAAYO,qBAAuB,OAEhE7W,OAAO8W,eAAiB3iB,EAAQsY,eAAeqK,oBAC/C9W,OAAOwM,eAAiBrY,EAAQsY,eAAeD,oBAE/CxM,OAAOkR,iBAAmB/c,EAAQ+c,6DAItC5N,2DADS+C,KAAK5S,KACC4S,KAAK5d,uDAIpBub,2DADcqC,KAAK5S,wCAItB6W,gEACCyM,iBACDzM,QACE0M,oBAAoB3Q,KAAK4Q,gBAA+B,SAAd5Q,KAAK5d,WAEhDyuB,8DAIDtK,GAAIvG,KAAK6C,MACT3F,EAAS8C,KAAK5S,KAAK8P,SACrBC,cAAgBD,EAAOvZ,SAEvBmtB,UAAY9Q,KAAK7U,MAAOob,EAAEpJ,gBAE1B4T,QAAUxK,EAAEuK,UAAU,IAMtBZ,cACOhT,YACGA,EAAO7S,IAAI,SAAChH,EAAG+D,SACzBhE,GAASmjB,EAAEwK,QAAU3pB,EAAImf,EAAEuK,0DAMPE,cAAYzV,yDAAc,QACtCI,SAAMQ,SAAiB8U,SAAgBrrB,SAAUyiB,SAAW6I,SAAmBC,SAAgBC,mBAErFpR,KAAKrG,OAAO0W,gBACfa,EAAkBliB,SAAWkiB,EAAkBliB,SAAW,OAGjEgiB,YAAsBntB,SACfoX,GAAmB+V,EAAYzV,KACpByE,KAAKna,OAASmW,GAAcL,KAC7BE,GAAgBF,GAAQQ,IAC9B6D,KAAKna,OAAS6V,GAAaC,GAAQsV,OAEzCpO,MAAM3G,cACCP,YACGA,EAAKtR,IAAI,SAAChH,SAAMuC,GAAWvC,EAAI8Y,UAC/C+U,EAAkBniB,OAAS,SAC7BoiB,kBACwBhV,WACPvW,OAEX,MACEid,MAAM3G,aACN,GAAI5W,KAAO0rB,aAAP1rB,MACCwkB,GAAYkH,EAAW1rB,QACrB+a,EAAK1G,OAAOyW,YAAYiB,KAAK,SAACjJ,SAAS9iB,KAAQ8iB,EAAKkI,WACvDY,EAAkBliB,SAAWkiB,EAAkBliB,SAAW,SACxDiM,GAAmB6O,EAAWvO,KACnB8E,EAAKxa,OAASmW,GAAcL,KAC7BE,GAAgBF,GAAQQ,IAC9BkE,EAAKxa,OAAS6V,GAAaC,GAAQsV,IAClCtV,EAAKtR,IAAI,SAAChH,SAAMuC,GAAWvC,EAAI8Y,MACjD9U,KAAK/B,GAEK+a,EAAKwC,MAAM3G,MAAMvY,OAAS,EAAG,IACvB2tB,MACAC,EAAWlR,EAAKwC,MAAM3G,MAAM,KAM/BmE,EAAKxa,OAASmW,GAAcL,KACtB0M,UAAUnF,QAAQ,SAAC5T,KACdjI,KAAKvD,KAAKgU,KAAKxI,EAAM6M,QAE5BmV,EAAUrpB,YACNoY,EAAKxa,OAAS6V,GAAaC,GAAQsV,IAClCM,EAASlJ,YAGpBxF,MAAM3G,MAAM7U,aACL/B,GAAO,mBACPqW,QACDuV,EAAkBniB,UACpBoiB,8CAhCJ7rB,MAyCd0a,KAAK6C,MAAM3G,MAAM,IAAM8D,KAAK6C,MAAM3G,MAAM,GAAGgB,OAAOvZ,SAAWqc,KAAK6C,MAAM3G,MAAM,GAAGgB,OAAOvZ,OAAQ,IAC7F6tB,MAEAC,EAAWzR,KAAK6C,MAAM3G,MAAM7T,OAAO,SAAC3B,EAAEua,SACpCva,GAAE/C,OAASsd,EAAE/D,OAAOvZ,OAASsd,EAAIva,IAEvC/C,OAAQ+tB,EAAAA,IAEJC,EAAU3R,KAAK6C,MAAM3G,MAAM7T,OAAO,SAAC3B,EAAEua,SACnCva,GAAE/C,OAASsd,EAAE/D,OAAOvZ,OAAS+C,EAAIua,IAEvCtd,OAAQ+tB,EAAAA,MAIFrJ,UAAUnF,QAAQ,SAAC5T,KAEfjI,KAAKvD,KAAKgU,KAAKxI,EAAMmiB,EAAStV,sBAGjCe,OAASsU,EAAWvpB,YACpBogB,UAAYsJ,EAAQtJ,gBAKpBuJ,yBACAC,qBACAC,8DAIDvL,GAAIvG,KAAK6C,MACTkP,EAAW,SAAC7W,EAAQoV,SACbpV,GAAO7Q,IAAI,SAACN,MACTmS,GAAUqK,EAAVrK,YAEFA,aAAiBrY,WACxBqY,EAAMvY,OAAS,EAAIuY,EAAMmV,KAAK,SAACW,SAAS1B,KAAO0B,EAAKlU,SAAUyI,EAAErK,MAAM,IAG5DD,GAAMlS,EAAKmS,QAIxB+V,cAAgB,IAChB7U,SAAW4C,KAAK5S,KAAKgQ,SAAS/S,IAAI,SAAChH,EAAG+D,MAChC8T,GAAS7X,EAAE6X,OACXgX,EAAe7uB,EAAE6uB,6BAIb7uB,EAAE8V,MACF9V,EAAE8V,KAAKgZ,QAAQ,SAAU,SAACC,SACd,KAARA,EAAc,QAAkB,KAARA,EAAc,OAAS,eAEhDhrB,WACmB,QAAhB/D,EAAEka,UAAsBgJ,EAAE0L,gBAAkB1L,EAAE0L,wBAC7C5uB,EAAEka,iBAELrC,aACI6W,EAAS7W,EAAQ7X,EAAEya,WAC3Bza,EAAEya,oBAEQoU,iBACEH,EAASG,EAAc7uB,EAAEya,sDAMnDyI,GAAIvG,KAAK6C,SACV7C,KAAKgL,WAAWqH,sBAChBC,UAAY/L,EAAEnJ,SAASmJ,EAAEnJ,SAASzZ,OAAS,GAAG4uB,kBAG/CD,UAAY,GAAIzuB,OAAM0iB,EAAEpJ,eAAenZ,KAAK,QAC5CoZ,SAAS/S,IAAI,cACZ6f,WAAW7f,IAAI,SAACiF,EAAK7M,GACnB6M,EAAMiX,EAAE+L,UAAU7vB,OAClB6vB,UAAU7vB,GAAK6M,iDAOhBiX,GAAIvG,KAAK6C,KACV7C,MAAK5S,KAAK2Q,gBACP8E,MAAM9E,SAAWiC,KAAK5S,KAAK2Q,SAAS1T,IAAI,qBAC1C2E,SAAWiN,GAAM5Y,EAAEgC,MAAOkhB,EAAErK,OAC1B7Y,EAAEyK,UAASzK,EAAEyK,YAIVzK,KAGN2c,KAAK5S,KAAKqQ,gBACPoF,MAAMpF,SAAWuC,KAAK5S,KAAKqQ,SAASpT,IAAI,qBAC1C0e,SAAW9M,GAAM5Y,EAAEK,MAAO6iB,EAAErK,SAC5B8M,OAAS/M,GAAM5Y,EAAEqa,IAAK6I,EAAErK,OACtB7Y,EAAEyK,UAASzK,EAAEyK,YACVzK,0DAMCiC,EAAM,SACNktB,IAAYxS,KAAKrG,OAAOyW,YACxBqC,EAAgBD,QAShBE,EAAqB,SAACpW,MAClBqW,GAAa,GAAI9uB,OAAMsjB,EAAKtE,MAAM1F,eAAenZ,KAAK,KACtDkf,QAAQ,SAAC7f,EAAG+D,MACR8T,GAASoB,EAAIlV,GAAG8T,SAClB5V,GAAOqtB,EAAaA,EAAWtoB,IAAI,SAAC4W,EAAG7Z,SAC9B6Z,GAAI/F,EAAO9T,WAK1B4Y,KAAKgL,WAAWqH,aACV,eAEFG,EAAW,IACLI,GArBA,SAACtW,EAAKoQ,SACTpQ,GAAIjU,OAAO,SAACC,EAAKuqB,YAChBA,EAAInG,iBAAkBpkB,EAAIuqB,EAAInG,UAAmBmG,IAC9CvqB,QAkByB0X,KAAK5S,KAAKgQ,SAAU,cAE/C,GAAIU,KAAU8U,KACIA,EAAgB9U,WAGpBkC,KAAK5S,KAAKgQ,gBAMjCoV,QACKplB,KAAKgQ,SAAS8F,QAAQ,SAAC7f,WAGVA,EAAEya,QAAUxY,QACNjC,EAAEya,QAAUxY,IAAK+B,gBAAQhE,EAAEiC,KACxCmtB,EAAcpvB,EAAEya,QAAUxY,gBAAWjC,EAAEiC,SAGlC0a,KAAK5S,KAAKgQ,SAAS/S,IAAI,SAAChH,SAC7BA,GAAEiC,KAIb0a,KAAK5S,KAAK2Q,WAAayU,KACTnrB,KAAK2Y,KAAK5S,KAAK2Q,SAAS1T,IAAI,SAAChH,SAAMA,GAAEgC,SAGnD2a,KAAK5S,KAAKqQ,WAAa+U,QAClBplB,KAAKqQ,SAASpT,IAAI,SAAChH,KACNgE,MAAMhE,EAAEqa,IAAKra,EAAEK,UAI9B8uB,EAAYC,SAAmBxuB,kBAAUwuB,yDAIlDlZ,IAEF,cAEOyG,KAAKrG,OAAOwW,iBACVnQ,KAAKna,QAGd,cACK0gB,GAAIvG,KAAK6C,eACXqN,MAAMvH,WAAa3K,GAAmBgC,KAAK7U,MAC5Cob,EAAE2J,MAAMhT,OAAQ8C,KAAKrG,OAAO4W,WAEtBhK,EAAE2J,OACR1K,KAAKxF,QAIP,kBAEQA,KAAK7U,UACP,SAEN,iBACQ6U,MAAK6C,MAAMpF,UACjB+H,KAAKxF,OAMCA,MAAKrG,OAAOyW,aAAepQ,KAAKrG,OAAOyW,YAAYzsB,YAC9CgW,OAAOyW,YAAYlN,QAAQ,SAAChH,KACZ7U,MACb,cAEU6U,EAAMmU,WAAa,aAClBvK,EAAK3a,aACtB2a,EAAKlD,0BACqBkD,EAAKnM,OAAO6W,wBACvBtU,EAAMlN,UAAY,QAE3B,iBACWgR,MAAK6C,MAAM3G,OACpBsJ,KAAKM,SAIEze,MACb,cAEU2Y,KAAKrG,OAAO0W,gBACXrQ,KAAK7U,aACnB6U,KAAK4C,0BACkB5C,KAAKrG,OAAO6W,qBAEhC,iBACWxQ,MAAK6C,MAAM3G,OACpBsJ,KAAKxF,WAIjB8S,GAAc9S,KAAK6C,MAAMzF,SAAS5D,OAAO,kBAAqB,QAAhBnW,EAAEka,YAChDwV,EAAe/S,KAAK6C,MAAMzF,SAAS5D,OAAO,kBAAqB,SAAhBnW,EAAEka,YAEjDyV,EAAcF,EAAYzoB,IAAI,eACpB0F,GAAQ1M,EAAE0M,MACVkjB,EAAW5vB,EAAE4vB,UAAYljB,SAErC,YAAmB1M,EAAE0M,aAEbA,QACA+V,EAAKtG,OAAOzP,WACV+V,EAAKkF,WAAWqH,yBAGPvM,EAAKnM,OAAOkR,2BrBhWG,EqBiWtB/E,EAAKjgB,QAEjB,cACoB0gB,GAAIvG,KAAK6C,MACP3G,EAAUqK,EAAVrK,MACF7Y,EAAIkjB,EAAEnJ,SAASrN,KACQ1M,EAArBitB,GAAAA,aAAK,cACP+B,EAAUrS,KAAKgL,WAAWqH,QAE1Ba,EAAalT,KAAKgL,WAAWkI,YrB3WhB,GqB4Wb9I,EAAY7D,EAAEuK,WAAa,EAAIoC,GAC/BjM,EAAWmD,GAAaiI,EAAU,EAAIS,EAAYnvB,OAIjEuY,aAAiBrY,WAEZqY,EAAMvY,OAAS,EAAIuY,EAAMmV,KAAK,SAACW,SAAS1B,KAAO0B,EAAKlU,SAAUyI,EAAErK,MAAM,OAI5D8L,GAAazB,EAAE2J,MAAM7H,UAAUhe,IAAI,SAAC8B,SAAMA,GAAIie,EAAY,GAEzDiI,OACYrK,EAAW3d,IAAI,SAAC3D,SAClBA,GAAIugB,EAAWgM,EAAWhM,QAIrC/J,GAAS,GAAIrZ,OAAM0iB,EAAEpJ,eAAenZ,KAAK,GACzCgc,MAAKrG,OAAOkR,qBACRwH,GAAWhvB,EAAE0M,QAAUwW,EAAEnJ,SAASzZ,OAAS,EAClCN,EAAE6uB,aAEF7uB,EAAE6X,WAGfiP,GAAU,GAAItmB,OAAM0iB,EAAEpJ,eAAenZ,KAAK,SAC1CquB,OACUhvB,EAAE6mB,WAAW7f,IAAI,SAACvE,EAAGrD,SAAMqD,GAAIzC,EAAEkvB,eAAe9vB,kBAIhEulB,aACA3kB,EAAE6mB,mBACLC,SAEDjN,WAEEhB,EAAMtW,mBACLwkB,WACDnD,IAEVzB,KAAKM,MAICqN,EAAcJ,EAAa1oB,IAAI,SAAChH,MAC5B0M,GAAQ1M,EAAE0M,aAEV,aAAoB1M,EAAE0M,aAEXA,QACA+V,EAAKtG,OAAOzP,WACV+V,EAAKnV,iBACJmV,EAAKkK,YAAYvf,oBACfqV,EAAKkK,YAAYnf,kBACrBiV,EAAKkK,YAAYzf,gBACfuV,EAAKkK,YAAYpF,kBACjB9E,EAAKkK,YAAYrF,0BAGT7E,EAAKnM,OAAOkR,kBAElC,cACQtE,GAAIvG,KAAK6C,MACTxf,EAAIkjB,EAAEnJ,SAASrN,GAGbmM,EAAQqK,EAAErK,MAAMvY,OAChB4iB,EAAErK,MAAMmV,KAAK,SAACW,SAAS3uB,GAAEitB,KAAO0B,EAAKlU,UAAWyI,EAAErK,MAAM,GACxDqK,EAAErK,MAEJkX,EACAlX,EAAMmM,UAAU,GAAKnM,EAAMtW,SACrBsW,EAAMmM,UAAU,GAChBnM,EAAMtW,2BAGA2gB,EAAE2J,MAAM7H,qBACRhlB,EAAE6mB,kBAEN7mB,EAAE6X,gBAEAkY,SACFpT,KAAKgQ,YAAYqD,SrB9bd,IqBgcjB7N,KAAKM,MAIjBwN,IAEF,kBAEQtT,KAAK7U,UACP,SAEN,iBACQ6U,MAAK6C,MAAM9E,UACjByH,KAAKxF,UAIUzG,EAAiBtV,OAAO+uB,EAAaG,EAAaG,MAEjEC,IAAa,WAAY,iBACxBC,2BAEAlP,WAAa,GAAIW,KAAI1L,EACxBC,OAAO,mBAAS+Z,EAAU9Z,SAASjO,EAAK,KAAOsa,EAAKjD,MAAMrX,EAAK,MAC/DnB,IAAI,eACA4gB,GAAY/R,mBAAgB1N,WAC7BA,EAAK,GAAGiO,SAAS,cAAgBjO,EAAK,GAAGiO,SAAS,gBAC/C+Z,mBAAmBnsB,KAAK4jB,IAEtBzf,EAAK,GAAIyf,gEAKdwI,kBAEDlN,GAAIvG,KAAK6C,MACT6Q,EAAU1T,KAAKrG,OAAO8W,eACtBkD,EAAU3T,KAAKrG,OAAOwM,cACbI,GAAE2J,MAAMhT,OAEd7S,IAAI,SAAC7D,EAAOuJ,MACdmL,GAAS0N,EAAK/F,MAAMzF,SAAS/S,IAAI,SAAC+V,EAAKhZ,MACtC/B,GAAQ+a,EAAIlF,OAAOnL,gBAEfqQ,EAAIjH,WACJ9T,OACD+a,EAAI8J,WAAWna,SACd6Y,EAAKpJ,OAAOpY,aACRusB,EAAUA,EAAQtuB,GAASA,OAInCouB,YAAY1jB,UACTvJ,iBACSktB,EAAUA,EAAQltB,GAASA,OACrC+f,EAAE2J,MAAM7H,UAAUtY,UAChBmL,WACEqL,EAAE+L,UAAUviB,4DAOnB4G,UAAUwJ,iBAAiB,YAAa,SAAC0F,MACzCjjB,GAAIimB,EAAKxG,SACTna,EAAI5H,EAAUuoB,EAAKlS,WACnBid,EAAO/N,EAAEiH,MAAQ5kB,EAAEpH,KAAOkC,EAAcJ,GACxCixB,EAAOhO,EAAEkH,MAAQ7kB,EAAExH,GAEpBmzB,GAAOhL,EAAKhjB,OAASlD,EAAaC,IACjCixB,EAAQlxB,EAAaC,KACnBkxB,oBAAoBF,KAEpB7P,IAAI9D,wDAKQ2T,MACfrN,GAAIvG,KAAK6C,SACT0D,EAAE+L,cAEFviB,GAAQqM,GAAkBwX,EAAMrN,EAAE2J,MAAM7H,WAAW,MACnDtY,GAAS,EAAG,IACXgkB,GAAM/T,KAAKyT,YAAY1jB,QAEtBgU,IAAI0H,UACRsI,EAAI7I,KAAOlL,KAAK+D,IAAIjZ,OAAOqB,EAC3B4nB,EAAIC,SAAWhU,KAAK+D,IAAIjZ,OAAOhF,GAC9BqT,KAAM4a,EAAIE,eAAgB5uB,MAAO,IAClC0uB,EAAI7Y,OACJnL,QAGIgU,IAAI2H,8DAKNnF,EAAIvG,KAAK5S,IACVmZ,GAAEnJ,SAASzZ,OAAS,SACjBohB,WAAWgC,YAAc,KAC5B3J,SAAS/S,IAAI,SAAChH,EAAG+D,MAId5G,GAAO6M,ErBjjBqB,IqBmjBpBjG,EACX,IrBpjB+B,IqBsjB/B6hB,EAAKzJ,OAAOpY,GACZ/D,EAAE8V,KACF8P,EAAKtP,OAAOyI,mBACR2C,WAAW/a,YAAYxJ,0DAS3Bwf,KAAKkE,sBACFA,KAAO,EAGVlE,MAAKkU,oBACFA,cAAchR,QAAQ,eACtBhb,GAAIoB,EAAE+X,UACRnX,WAAWkL,YAAYlN,UAItBgsB,cAAgBlU,KAAKwT,mBAAmBnpB,IAAI,wBAEzC4W,EAAE+I,qBACChlB,SACFic,EAAEgJ,aAIoBjlB,KAA5Bgb,KAAK6C,MAAMsR,oBACRtR,MAAMsR,aAAenU,KAAK6C,MAAM1F,cAAgB,QAIjD+W,cAAc7pB,IAAI,eAClB+pB,GAAc/wB,EAAE4mB,MAAMoK,EAAKxR,MAAMsR,gBAEnC9S,QAAUF,GAAY9d,EAAEjB,MAAMgyB,KAC3B7P,SAASva,YAAY3G,EAAEge,yDAK1BrB,KAAKkU,oBACFA,cAAchR,QAAQ,eACtBhb,GAAIoB,EAAE+X,UACRnX,WAAWkL,YAAYlN,2DAMtB+C,OAAOkV,iBAAiB,cAAe,aACtCmB,sEAKDkS,mBAAmBnpB,IAAI,cACzB4f,MAAM5f,IAAI,cACN8V,iBAAiB,QAAS,cAC1BpQ,GAAQiB,EAAKqB,aAAa,sBACzBiiB,oBAAoBvkB,cAMvBgU,IAAIpN,UAAUwJ,iBAAiB,QAAS,cACxCpQ,GAAQwkB,EAAKxQ,IAAIpN,UAAUtE,aAAa,sBACvCiiB,oBAAoBvkB,6DAKrBmkB,cAAc7pB,IAAI,eAClB+pB,GAAc/wB,EAAE4mB,MAAMuK,EAAK3R,MAAMsR,iBACvB9wB,EAAEjB,MAAMgyB,EAAa/wB,EAAEge,sDAKjCiT,oBAAoBtU,KAAK6C,MAAMsR,aAAe,+CAI9CG,oBAAoBtU,KAAK6C,MAAMsR,aAAe,6CAGvCpkB,0DAAMiQ,KAAK6C,MAAMsR,aACzB5N,EAAIvG,KAAK6C,mBAEL9S,QACAwW,EAAE2J,MAAMhT,OAAOnN,UACdwW,EAAEnJ,SAAS/S,IAAI,kBAAKhH,GAAE6X,OAAOnL,kDAKnBA,MACfwW,GAAIvG,KAAK6C,SACLzZ,SAAS2G,IACN,IAAGA,EAAQ,GACnBA,GAASwW,EAAE2J,MAAMhT,OAAOvZ,SAAQoM,EAAQwW,EAAE2J,MAAMhT,OAAOvZ,OAAS,GAChEoM,IAAUwW,EAAE4N,iBACbA,aAAepkB,IACZiQ,KAAK/U,OAAQ,cAAe+U,KAAKyU,sDAM1BjuB,EAAOkuB,MAAe3kB,0DAAMiQ,KAAK6C,MAAM1F,0GAChC3W,EAAOkuB,EAAe3kB,QACpC3C,KAAK8P,OAAOyX,OAAO5kB,EAAO,EAAGvJ,QAC7B4G,KAAKgQ,SAAS/S,IAAI,SAAChH,EAAG+D,KACxB8T,OAAOyZ,OAAO5kB,EAAO,EAAG2kB,EAActtB,WAEpCqd,OAAOzE,KAAK5S,mDAGF2C,0DAAQiQ,KAAK6C,MAAM1F,cAAc,CAC5C6C,MAAK5S,KAAK8P,OAAOvZ,QAAU,mGAGToM,QACjB3C,KAAK8P,OAAOyX,OAAO5kB,EAAO,QAC1B3C,KAAKgQ,SAAS/S,IAAI,cACpB6Q,OAAOyZ,OAAO5kB,EAAO,UAEnB0U,OAAOzE,KAAK5S,6CAGJsnB,MAAe3kB,0DAAM,OAC7B3C,KAAKgQ,SAASrN,GAAOmL,OAASwZ,OAC9BjQ,OAAOzE,KAAK5S,6CAKHgQ,QACThQ,KAAKgQ,SAAS/S,IAAI,SAAChH,EAAG+D,GACvBgW,EAAShW,OACT8T,OAASkC,EAAShW,WAGjBqd,OAAOzE,KAAK5S,aAlwBoBuU,ICFlBiT,0BACR3pB,EAAQO,8EACbP,EAAQO,aACTpJ,KAAO,UACP0gB,YAAc,IACdoB,KAAO,IAEPrE,+DAGIrU,4FACOA,QACXogB,UAAY5L,KAAK4L,UAAUpG,KAAKxF,WAChC6L,WAAa7L,KAAK6L,WAAWrG,KAAKxF,WAElC8L,WAAatgB,EAAKsgB,YAAc,QAChCnS,OAAOoS,WAAavgB,EAAKugB,YAAc,OAEvC/f,UAAYR,EAAKQ,YAAa,OAC9B6b,YAAcrc,EAAKqc,aAAe,qIAKnCtB,GAAIvG,KAAK6C,WACRte,OACJyb,KAAKna,OAASma,KAAK7U,MAChB6U,KAAKjU,OAAOI,EAAI6T,KAAK6H,YAAc,EACnC7H,KAAKjU,OAAOjG,EAAIka,KAAK6H,YAAc,KAE/BtjB,GAAsByb,KAAtBzb,OAAQyH,EAAcgU,KAAdhU,UAEVggB,EAAuBzF,EAAE0F,uBAC7BrE,kBACAqE,uBACEC,GAAW,IAAMlM,KAAKrG,OAAOoS,aAE/BvF,YAAYnc,IAAI,SAACqc,EAAOtf,MACnB2kB,GAAaG,EACbC,EAAmBzF,EAAQH,EAAEO,WtB0DZ,IsBzDjB7a,EAAWkgB,EAAkB,IAAM,EAAG,EACtCC,EAAYpgB,GAAamgB,EAAkBA,EAC3CE,EAAWH,GAAsBE,EACjCvgB,EAAgBxH,EAAmB0nB,EAAYxnB,GAC/CuH,EAAczH,EAAmBgoB,EAAU9nB,GAE3C+nB,EAAejM,EAAK6D,MAAQ8H,EAAqB5kB,GAEnDmlB,SAASC,QACVnM,GAAK6D,QACIoI,EAAeA,EAAazgB,cAAgBA,IAC9CygB,EAAeA,EAAaxgB,YAAcD,MAExCA,IACFC,MAEJ2gB,GACe,MAApBN,EACGzf,EAAoB6f,EAAUC,EAAQnM,EAAKtU,OAAQsU,EAAK9b,OAAQ8b,EAAKrU,UAAWC,GAChFQ,EAAqB8f,EAAUC,EAAQnM,EAAKtU,OAAQsU,EAAK9b,OAAQ8b,EAAKrU,UAAWC,KAEnF2b,aAAavgB,KAAKolB,KAClBR,iBAAiB5kB,0CAGXqf,QACAH,EAAEO,yCAGFsF,WAIJlI,KAAO,+CAIRqC,GAAIvG,KAAK6C,MAETtJ,IAEF,iBAEA,+BAEgBgN,EAAEqB,oBACR5H,KAAKR,mBACAQ,KAAK6H,cAElBrC,KAAKxF,aAIJsE,WAAa,GAAIW,KAAI1L,EACxBlP,IAAI,eACA4gB,GAAY/R,mBAAgB1N,WACxBA,EAAK,GAAIyf,kDAIAyB,MACZnoB,GAAuByb,KAAvBzb,OAAQunB,EAAe9L,KAAf8L,WACT9c,EAAW3K,EAAmBqoB,EAASX,WAAYW,EAASpoB,MAAQ,EAAGC,wBACtDyK,EAAS7C,EAAK2f,QAAiB9c,EAASlJ,EAAKgmB,6CAG1Dtb,EAAKpJ,EAAEulB,EAAK9G,MAClBrV,MACE1H,GAAQkX,KAAKR,OAAOpY,MACvBulB,EAAM,IACEnc,EAAMwP,KAAK4M,oBAAoB5M,KAAK6C,MAAMoJ,iBAAiB7kB,OAChEkD,MAAM+D,OAASxF,EAAmBC,EAAO,OAC1C+jB,GAAQvsB,EAAU0f,KAAK7J,KACvBhK,EAAI0Z,EAAEiH,MAAQD,EAAM/rB,KAAO,GAC3BgF,EAAI+f,EAAEkH,MAAQF,EAAMnsB,IAAM,GAC1BqO,GAASiR,KAAKgN,kBAAoBhN,KAAKgN,iBAAiBrpB,OAAS,EAClEqc,KAAKgN,iBAAiB5lB,GAAK4Y,KAAK6C,MAAM3F,OAAO9V,IAAM,KAClD6lB,GAAuC,IAA5BjN,KAAK6C,MAAM2D,YAAYpf,GAAW4Y,KAAK6C,MAAMiE,YAAYxjB,QAAQ,QAC3EygB,IAAI0H,UAAUtf,EAAGrG,GAAIqT,KAAMpK,EAAO1J,MAAO4nB,EAAU,WACnDlJ,IAAI2H,kBAEClb,EAAK,2BACVuT,IAAI9D,YACJ3V,MAAM+D,OAASvF,8CAKhB6N,UAAUwJ,iBAAiB,YAAaH,KAAK4L,gBAC7CjV,UAAUwJ,iBAAiB,aAAcH,KAAK6L,8CAG1ChG,MACH1jB,GAAS0jB,EAAE1jB,OACb+qB,EAASlN,KAAKsE,WAAW8G,IAAI,eAAe3D,MAC5C0F,EAAYnN,KAAKoN,oBACjBC,EAAarN,KAAKsN,kBACnBJ,EAAOzT,SAAStX,GAAS,IACvBiF,GAAI8lB,EAAOpR,QAAQ3Z,QAClBorB,WAAWF,EAAYF,GAAU,QACjCG,eAAiBnrB,OACjBirB,oBAAsBhmB,OACtBmmB,WAAWprB,EAAQiF,GAAG,EAAMye,aAE5BgG,uDAKD0B,WAAWvN,KAAKsN,eAAetN,KAAKoN,qBAAoB,UArJvBlH,IVAlCxH,QACAD,QACCA,cAEMsM,WACHyC,OACJ7B,SACEiJ,IAiBFC,GACL,WAAY5pB,EAAQ6C,qBACZ0Q,GAAe1Q,EAAQ1L,KAAM6I,EAAQ6C,wFWjC1CgnB,YAEJA,IAAOC,KAAU,gBACjBD,GAAOE,QAAU,QAEjBF,GAAiBxb,OAAOM,UAAYkb,GAAQG"} \ No newline at end of file diff --git a/src/js/charts/AxisChart.js b/src/js/charts/AxisChart.js index 56be818..9223f33 100644 --- a/src/js/charts/AxisChart.js +++ b/src/js/charts/AxisChart.js @@ -380,7 +380,7 @@ export default class AxisChart extends BaseChart { componentConfigs.push([ 'yAxis', { - mode: this.config.yAxisMode, + mode: yAxis.yAxisMode || 'span', width: this.width, height: this.baseHeight, shortenNumbers: this.config.shortenYAxisNumbers, From 9f68f1ac5f7e8eb7a089d13b27d44fa0702d7931 Mon Sep 17 00:00:00 2001 From: Kaleb White Date: Sat, 27 Nov 2021 18:12:40 -0800 Subject: [PATCH 9/9] Bug fix where chart labels collided with y-axis labels. --- docs/assets/js/frappe-charts.min.js | 2 +- docs/assets/js/frappe-charts.min.js.map | 2 +- src/js/objects/ChartComponents.js | 3 ++- src/js/utils/draw.js | 18 +++++++++++++----- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/docs/assets/js/frappe-charts.min.js b/docs/assets/js/frappe-charts.min.js index 42dff23..010b4a2 100644 --- a/docs/assets/js/frappe-charts.min.js +++ b/docs/assets/js/frappe-charts.min.js @@ -1,2 +1,2 @@ -var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function h(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function u(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function M(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function C(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)M(a).appendChild(i);else if("around"===n){var s=M(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function D(t,e){return C("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function T(t,e,i,n){return C("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return C("svg",{className:e,inside:t,width:i,height:n})}function O(t){return C("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),C("g",n)}function S(t){return C("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*i.y,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z\n\t\tL"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*n+o,u=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+"\n\t\tM"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=D(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),T(a,"0%",e,s[0]),T(a,"50%",e,s[1]),T(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return C("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),C("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dy:2*le+"px","font-size":1.2*le+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,re):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dx:le+"px",dy:le/3+"px","font-size":1.2*le+"px","text-anchor":"start",fill:ue,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||le;return C("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ue,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=he);var s=C("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=C("text",{x:0,y:i>n?i+se:i-se-le,dy:le+"px","font-size":le+"px","text-anchor":"middle",innerHTML:e+""}),o=C("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=he),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s=C("line",{className:"line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),x1:i,x2:n,y1:0,y2:0,styles:{stroke:a.stroke}}),r=C("text",{x:"left"===a.alignment?i-se:n+4*se,y:0,dy:le/2-2+"px","font-size":le+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=he),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=he),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=C("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:le/-2+"px","font-size":le+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||he,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=C("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:he,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=C("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:le/-2+"px","font-size":le+"px","text-anchor":"start",innerHTML:n+""}),l=C("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),h=Ut(l,2),u=h[0],c=h[1];c-=r,0===u&&(u=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(u,!0)||(u=0),f(i,!0)||(i=0);var d=C("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:u});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=C("text",{className:"data-point-value",x:i/2,y:0,dy:le/2*-1+"px","font-size":le+"px","text-anchor":"middle",innerHTML:a}),v=C("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=C("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=C("text",{className:"data-point-value",x:0,y:0,dy:le/2*-1-i+"px","font-size":le+"px","text-anchor":"middle",innerHTML:a}),l=C("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var h=H(a.svgDefs,i,!0),u="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(u,"region-fill","none","url(#"+h+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,ye,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],ve)}function et(t,e,i){return Z(t,[0,i],[0,e],ve)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},ve,ye],Z(t,[0,n],[0,i],ve)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},pe,ye],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],ve)]:[[t,{width:n,height:o,x:e,y:l},pe,ye]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],ve)]:[[t,{cx:e,cy:i},pe,ye]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},fe,ye];if(s.push(o),t.region){var l=e[0]+","+n+"L",h="L"+e.slice(-1)[0]+", "+n,u=[t.region,{d:"M"+l+r+h},fe,ye];s.push(u)}return s}function rt(t,e){return[t,{d:e},pe,ye]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var h=void 0;h="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:u,to:c,begin:"0s",dur:i/1e3+"s",values:u+";"+c,keySplines:me[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)h.setAttribute(p,d[p]);r.appendChild(h),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ht(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ut(t,e,i){if(0!==i.length){var n=ht(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ge)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:be});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/we)}function yt(t,e){var i=Pe*Ae;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Me[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Te).filter(function(e){return t.includes(e)}),a=Te[n[0]];return Object.assign(a,{constants:e,getData:i}),new De(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Ct(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Mt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Dt(t){function e(t,e){for(var i=Ct(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Ct(n,a):Ct(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Ct(o,l):Ct(o)).reverse().map(function(t){return-1*t})}return s}function Tt(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return u(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Se(e,i)):_e[t]?new _e[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                                                                \n\t\t\t\t
                                                                '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=15,oe=120,le=10,he="#dadada",ue="#555b51",ce={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},de={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},pe=350,fe=350,ve=pe,ge=250,ye="easein",me={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"},be=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",xe=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-h(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ut(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),ke=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-h(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,u=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],u+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(xe),we=7,Ae=1e3,Pe=86400,Me=["January","February","March","April","May","June","July","August","September","October","November","December"],Ce=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],De=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,h=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=h,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Te={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(n,a){n.positions.map(function(t,a){i.push(G(t,n.labels[a],e.constants.width,{mode:e.constants.mode,pos:n.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),n.title&&i.push(U({title:n.title,position:n.pos,height:e.constants.height||t.zeroLine,width:e.constants.width}))}),i):(t.positions.forEach(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:this.constants.height||t.zeroLine,width:this.constants.width})),i)},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var h=[];return this.store.map(function(t,e){h=h.concat(it(t,s[e],n[e],o[e]))}),h}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,h=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,h,r,o,t.fill,n);e.serializedSubDomains.push(a)}h+=s}),h=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,h=m(s,e),u=Ut(h,2);s=u[0],e=u[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var h=m(s,i),u=Ut(h,2);s=u[0],i=u[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Le=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),h=l.left-o.left+parseInt(s.getAttribute("width"))/2,u=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(h,u,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(ke),Oe=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?_(y,m,t.center,t.radius,a,u):E(y,m,t.center,t.radius,a,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(ke),Ne=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*we+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+h(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+h(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*Ae);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],h=void 0,u=0;u2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(xe),Se=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):(this.config.yAxisMode=r?r.yAxisMode:n.yAxisMode||"span",r&&r.id&&r.position&&(this.config.yAxisConfig=[r])),this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return u(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0,l=void 0,h=void 0,u=void 0;if(u=[],l=this.config.yAxisMode||{},h=l.position?l.position:"left",t instanceof Array)n=Dt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Tt(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),title:l.title||null,pos:h,scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var c in t)!function(c){var d=t[c];if(l=e.config.yAxisConfig.find(function(t){return c===t.id})||[],h=l.position?l.position:"left",n=Dt(d,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Tt(n)*s,o=n.map(function(t){return r-t*a}),u.push(c),e.state.yAxis.length>1){var p=[],f=e.state.yAxis[0];a=e.height/Ot(n),f.positions.forEach(function(t){p.push(Math.ceil(t/a))}),n=p.reverse(),r=e.height-Tt(n)*s,o=f.positions}e.state.yAxis.push({axisID:c||"left-axis",labels:n,title:l.title,pos:h,scaleMultiplier:a,zeroLine:r,positions:o})}(c);if(this.state.yAxis[1]&&this.state.yAxis[0].labels.length!==this.state.yAxis[1].labels.length){var d=[],p=this.state.yAxis.reduce(function(t,e){return t.length>e.labels.length?e:t},{length:1/0}),f=this.state.yAxis.reduce(function(t,e){return t.length1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-u/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:u,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=ce[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];de[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(xe),Ee=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?I(y,m,t.center,t.radius,t.clockWise,u):z(y,m,t.center,t.radius,t.clockWise,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(ke),_e={bar:Se,line:Se,percentage:Le,heatmap:Ne,pie:Oe,donut:Ee},ze=function t(e,i){return jt(this,t),Wt(i.type,e,i)},Ie=Object.freeze({Chart:ze,PercentageChart:Le,PieChart:Oe,Heatmap:Ne,AxisChart:Se}),He={};return He.NAME="Frappe Charts",He.VERSION="1.6.2",He=Object.assign({},He,Ie)}(); +var frappe=function(){"use strict";function t(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function e(t){var e=t.getBoundingClientRect();return{top:e.top+(document.documentElement.scrollTop||document.body.scrollTop),left:e.left+(document.documentElement.scrollLeft||document.body.scrollLeft)}}function i(t){return null===t.offsetParent}function n(t){var e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)}function a(t){var e=window.getComputedStyle(t),i=parseFloat(e.paddingLeft)+parseFloat(e.paddingRight);return t.clientWidth-i}function s(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var a in i)n[a]=i[a];return t.dispatchEvent(n)}function r(t){return t.titleHeight+t.margins.top+t.paddings.top}function o(t){return t.margins.left+t.paddings.left}function l(t){return t.margins.top+t.margins.bottom+t.paddings.top+t.paddings.bottom+t.titleHeight+t.legendHeight}function h(t){return t.margins.left+t.margins.right+t.paddings.left+t.paddings.right}function u(t){return parseFloat(t.toFixed(2))}function c(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];i||(i=n?t[0]:t[t.length-1]);var a=new Array(Math.abs(e)).fill(i);return t=n?a.concat(t):t.concat(a)}function d(t,e){return(t+"").length*e}function p(t,e){return{x:Math.sin(t*te)*e,y:Math.cos(t*te)*e}}function f(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!Number.isNaN(t)&&(void 0!==t&&(!!Number.isFinite(t)&&!(e&&t<0)))}function v(t){return Number(Math.round(t+"e4")+"e-4")}function g(t){var e=void 0,i=void 0,n=void 0;if(t instanceof Date)return new Date(t.getTime());if("object"!==(void 0===t?"undefined":Ft(t))||null===t)return t;e=Array.isArray(t)?[]:{};for(n in t)i=t[n],e[n]=g(i);return e}function y(t,e){var i=void 0,n=void 0;return t<=e?(i=e-t,n=t):(i=t-e,n=e),[i,n]}function m(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length-t.length;return i>0?t=c(t,i):e=c(e,i),[t,e]}function b(t,e){if(t)return t.length>e?t.slice(0,e-3)+"...":t}function x(t){var e=void 0;if("number"==typeof t)e=t;else if("string"==typeof t&&(e=Number(t),Number.isNaN(e)))return t;var i=Math.floor(Math.log10(Math.abs(e)));if(i<=2)return e;var n=Math.floor(i/3),a=Math.pow(10,i-3*n)*+(e/Math.pow(10,i)).toFixed(1);return Math.round(100*a)/100+" "+["","K","M","B","T"][n]}function k(t,e){for(var i=[],n=0;n255?255:t<0?0:t}function A(t,e){var i=ne(t),n=!1;"#"==i[0]&&(i=i.slice(1),n=!0);var a=parseInt(i,16),s=w((a>>16)+e),r=w((a>>8&255)+e),o=w((255&a)+e);return(n?"#":"")+(o|r<<8|s<<16).toString(16)}function P(t){var e=/(^\s*)(rgb|hsl)(a?)[(]\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*,\s*([\d.]+\s*%?)\s*(?:,\s*([\d.]+)\s*)?[)]$/i;return/(^\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i.test(t)||e.test(t)}function M(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function C(t,e){var i=document.createElementNS("http://www.w3.org/2000/svg",t);for(var n in e){var a=e[n];if("inside"===n)M(a).appendChild(i);else if("around"===n){var s=M(a);s.parentNode.insertBefore(i,s),i.appendChild(s)}else"styles"===n?"object"===(void 0===a?"undefined":Ft(a))&&Object.keys(a).map(function(t){i.style[t]=a[t]}):("className"===n&&(n="class"),"innerHTML"===n?i.textContent=a:i.setAttribute(n,a))}return i}function D(t,e){return C("linearGradient",{inside:t,id:e,x1:0,x2:0,y1:0,y2:1})}function T(t,e,i,n){return C("stop",{inside:t,style:"stop-color: "+i,offset:e,"stop-opacity":n})}function L(t,e,i,n){return C("svg",{className:e,inside:t,width:i,height:n})}function O(t){return C("defs",{inside:t})}function N(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,n={className:t,transform:e};return i&&(n.inside=i),C("g",n)}function S(t){return C("path",{className:arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",d:t,styles:{stroke:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"none",fill:arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none","stroke-width":arguments.length>4&&void 0!==arguments[4]?arguments[4]:2}})}function E(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z"}function _(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*i.y,u=i.y+e.y;return"M"+i.x+" "+i.y+"\n\t\tL"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+" z\n\t\tL"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u+" z"}function z(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=i.y+e.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h}function I(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=i.x+t.x,o=i.y+t.y,l=i.x+e.x,h=2*n+o,u=i.y+t.y;return"M"+r+" "+o+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+h+"\n\t\tM"+r+" "+h+"\n\t\tA "+n+" "+n+" 0 "+s+" "+(a?1:0)+"\n\t\t"+l+" "+u}function H(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n="path-fill-gradient-"+e+"-"+(i?"lighter":"default"),a=D(t,n),s=[1,.6,.2];return i&&(s=[.4,.2,0]),T(a,"0%",e,s[0]),T(a,"50%",e,s[1]),T(a,"100%",e,s[2]),n}function W(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Kt,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none";return C("rect",{className:"percentage-bar",x:t,y:e,width:i,height:n,fill:s,styles:{stroke:A(s,-25),"stroke-dasharray":"0, "+(n+i)+", "+i+", "+n,"stroke-width":a}})}function F(t,e,i,n,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"none",r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},o={className:t,x:e,y:i,width:n,height:n,rx:a,fill:s};return Object.keys(r).map(function(t){o[t]=r[t]}),C("rect",o)}function j(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,oe):a;var s={className:"legend-bar",x:0,y:0,width:i,height:"2px",fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dy:2*he+"px","font-size":1.2*he+"px","text-anchor":"start",fill:ce,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("rect",s)),o.appendChild(r),o}function R(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"none",a=arguments[4];a=arguments.length>5&&void 0!==arguments[5]&&arguments[5]?b(a,oe):a;var s={className:"legend-dot",cx:0,cy:0,r:i,fill:n},r=C("text",{className:"legend-dataset-text",x:0,y:0,dx:he+"px",dy:he/3+"px","font-size":1.2*he+"px","text-anchor":"start",fill:ce,innerHTML:a}),o=C("g",{transform:"translate("+t+", "+e+")"});return o.appendChild(C("circle",s)),o.appendChild(r),o}function Y(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=a.fontSize||he;return C("text",{className:t,x:e,y:i,dy:(void 0!==a.dy?a.dy:s/2)+"px","font-size":s+"px",fill:a.fill||ce,"text-anchor":a.textAnchor||"start",innerHTML:n})}function B(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=ue);var s=C("line",{className:"line-vertical "+a.className,x1:0,x2:0,y1:i,y2:n,styles:{stroke:a.stroke}}),r=C("text",{x:0,y:i>n?i+se:i-se-he,dy:he+"px","font-size":he+"px","text-anchor":"middle",innerHTML:e+""}),o=C("g",{transform:"translate("+t+", 0)"});return o.appendChild(s),o.appendChild(r),o}function V(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};a.stroke||(a.stroke=ue),a.lineType||(a.lineType=""),a.alignment||(a.alignment="left"),a.shortenNumbers&&(e=x(e));var s="line-horizontal "+a.className+("dashed"===a.lineType?"dashed":""),r="left"===a.alignment?a.title?i-se+re:i-se:a.title?n+4*se-re:n+4*se,o=C("line",{className:s,x1:a.title?i+re:i,x2:a.title?n-re:n,y1:0,y2:0,styles:{stroke:a.stroke}}),l=C("text",{x:r,y:0,dy:he/2-2+"px","font-size":he+"px","text-anchor":i3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="left"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=ue),n.className||(n.className="");var a=-1*ae,s="span"===n.mode?i+ae:0;"tick"===n.mode&&"right"===n.pos&&(a=i+ae,s=i);var r="left"===n.pos?-1*n.offset:n.offset;return a+=r,s+=r,V(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType,alignment:n.pos,title:n.title,shortenNumbers:n.shortenNumbers})}function q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};f(t)||(t=0),n.pos||(n.pos="bottom"),n.offset||(n.offset=0),n.mode||(n.mode="span"),n.stroke||(n.stroke=ue),n.className||(n.className="");var a=i+ae,s="span"===n.mode?-1*ae:i;return"tick"===n.mode&&"top"===n.pos&&(a=-1*ae,s=0),B(t,e,a,s,{stroke:n.stroke,className:n.className,lineType:n.lineType})}function X(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n.labelPos||(n.labelPos="right");var a=C("text",{className:"chart-label",x:"left"===n.labelPos?se:i-d(e,5)-se,y:0,dy:he/-2+"px","font-size":he+"px","text-anchor":"start",innerHTML:e+""}),s=V(t,"",0,i,{stroke:n.stroke||ue,className:n.className||"",lineType:n.lineType});return s.appendChild(a),s}function J(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=t-e,r=C("rect",{className:"bar mini",styles:{fill:"rgba(228, 234, 239, 0.49)",stroke:ue,"stroke-dasharray":i+", "+s},x:0,y:0,width:i,height:s});a.labelPos||(a.labelPos="right");var o=C("text",{className:"chart-label",x:"left"===a.labelPos?se:i-d(n+"",4.5)-se,y:0,dy:he/-2+"px","font-size":he+"px","text-anchor":"start",innerHTML:n+""}),l=C("g",{transform:"translate(0, "+e+")"});return l.appendChild(r),l.appendChild(o),l}function K(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,o=arguments.length>7&&void 0!==arguments[7]?arguments[7]:{},l=y(e,o.zeroLine),h=Ut(l,2),u=h[0],c=h[1];c-=r,0===u&&(u=o.minHeight,c-=o.minHeight),f(t)||(t=0),f(c)||(c=0),f(u,!0)||(u=0),f(i,!0)||(i=0);var d=C("rect",{className:"bar mini",style:"fill: "+n,"data-point-index":s,x:t,y:c,width:i,height:u});if((a+="")||a.length){d.setAttribute("y",0),d.setAttribute("x",0);var p=C("text",{className:"data-point-value",x:i/2,y:0,dy:he/2*-1+"px","font-size":he+"px","text-anchor":"middle",innerHTML:a}),v=C("g",{"data-point-index":s,transform:"translate("+t+", "+c+")"});return v.appendChild(d),v.appendChild(p),v}return d}function $(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,r=C("circle",{style:"fill: "+n,"data-point-index":s,cx:t,cy:e,r:i});if((a+="")||a.length){r.setAttribute("cy",0),r.setAttribute("cx",0);var o=C("text",{className:"data-point-value",x:0,y:0,dy:he/2*-1-i+"px","font-size":he+"px","text-anchor":"middle",innerHTML:a}),l=C("g",{"data-point-index":s,transform:"translate("+t+", "+e+")"});return l.appendChild(r),l.appendChild(o),l}return r}function Q(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},s=e.map(function(e,i){return t[i]+","+e}).join("L");n.spline&&(s=k(t,e));var r=S("M"+s,"line-graph-path",i);if(n.heatline){var o=H(a.svgDefs,i);r.style.stroke="url(#"+o+")"}var l={path:r};if(n.regionFill){var h=H(a.svgDefs,i,!0),u="M"+t[0]+","+a.zeroLine+"L"+s+"L"+t.slice(-1)[0]+","+a.zeroLine;l.region=S(u,"region-fill","none","url(#"+h+")")}return l}function Z(t,e,i,n){var a="string"==typeof e?e:e.join(", ");return[t,{transform:i.join(", ")},n,me,"translate",{transform:a}]}function tt(t,e,i){return Z(t,[i,0],[e,0],ge)}function et(t,e,i){return Z(t,[0,i],[0,e],ge)}function it(t,e,i,n){var a=e-i,s=t.childNodes[0];return[[s,{height:a,"stroke-dasharray":s.getAttribute("width")+", "+a},ge,me],Z(t,[0,n],[0,i],ge)]}function nt(t,e,i,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=y(i,(arguments.length>5&&void 0!==arguments[5]?arguments[5]:{}).zeroLine),r=Ut(s,2),o=r[0],l=r[1];return l-=a,"rect"!==t.nodeName?[[t.childNodes[0],{width:n,height:o},fe,me],Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,l],ge)]:[[t,{width:n,height:o,x:e,y:l},fe,me]]}function at(t,e,i){return"circle"!==t.nodeName?[Z(t,t.getAttribute("transform").split("(")[1].slice(0,-1),[e,i],ge)]:[[t,{cx:e,cy:i},fe,me]]}function st(t,e,i,n,a){var s=[],r=i.map(function(t,i){return e[i]+","+t}).join("L");a&&(r=k(e,i));var o=[t.path,{d:"M"+r},ve,me];if(s.push(o),t.region){var l=e[0]+","+n+"L",h="L"+e.slice(-1)[0]+", "+n,u=[t.region,{d:"M"+l+r+h},ve,me];s.push(u)}return s}function rt(t,e){return[t,{d:e},fe,me]}function ot(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"linear",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},r=t.cloneNode(!0),o=t.cloneNode(!0);for(var l in e){var h=void 0;h="transform"===l?document.createElementNS("http://www.w3.org/2000/svg","animateTransform"):document.createElementNS("http://www.w3.org/2000/svg","animate");var u=s[l]||t.getAttribute(l),c=e[l],d={attributeName:l,from:u,to:c,begin:"0s",dur:i/1e3+"s",values:u+";"+c,keySplines:be[n],keyTimes:"0;1",calcMode:"spline",fill:"freeze"};a&&(d.type=a);for(var p in d)h.setAttribute(p,d[p]);r.appendChild(h),a?o.setAttribute(l,"translate("+c+")"):o.setAttribute(l,c)}return[r,o]}function lt(t,e){t.style.transform=e,t.style.webkitTransform=e,t.style.msTransform=e,t.style.mozTransform=e,t.style.oTransform=e}function ht(t,e){var i=[],n=[];e.map(function(t){var e=t[0],a=e.parentNode,s=void 0,r=void 0;t[0]=e;var o=ot.apply(void 0,Gt(t)),l=Ut(o,2);s=l[0],r=l[1],i.push(r),n.push([s,a]),a&&a.replaceChild(s,e)});var a=t.cloneNode(!0);return n.map(function(t,n){t[1]&&(t[1].replaceChild(i[n],t[0]),e[n][0]=i[n])}),a}function ut(t,e,i){if(0!==i.length){var n=ht(e,i);e.parentNode==t&&(t.removeChild(e),t.appendChild(n)),setTimeout(function(){n.parentNode==t&&(t.removeChild(n),t.appendChild(e))},ye)}}function ct(t,e){var i=document.createElement("a");i.style="display: none";var n=new Blob(e,{type:"image/svg+xml; charset=utf-8"}),a=window.URL.createObjectURL(n);i.href=a,i.download=t,document.body.appendChild(i),i.click(),setTimeout(function(){document.body.removeChild(i),window.URL.revokeObjectURL(a)},300)}function dt(e){var i=e.cloneNode(!0);i.classList.add("chart-container"),i.setAttribute("xmlns","http://www.w3.org/2000/svg"),i.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");var n=t.create("style",{innerHTML:xe});i.insertBefore(n,i.firstChild);var a=t.create("div");return a.appendChild(i),a.innerHTML}function pt(t){var e=new Date(t);return e.setMinutes(e.getMinutes()-e.getTimezoneOffset()),e}function ft(t){var e=t.getDate(),i=t.getMonth()+1;return[t.getFullYear(),(i>9?"":"0")+i,(e>9?"":"0")+e].join("-")}function vt(t){return new Date(t.getTime())}function gt(t,e){var i=kt(t);return Math.ceil(yt(i,e)/Ae)}function yt(t,e){var i=Me*Pe;return(pt(e)-pt(t))/i}function mt(t,e){return t.getMonth()===e.getMonth()&&t.getFullYear()===e.getFullYear()}function bt(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=Ce[t];return e?i.slice(0,3):i}function xt(t,e){return new Date(e,t+1,0)}function kt(t){var e=vt(t),i=e.getDay();return 0!==i&&wt(e,-1*i),e}function wt(t,e){t.setDate(t.getDate()+e)}function At(t,e,i){var n=Object.keys(Le).filter(function(e){return t.includes(e)}),a=Le[n[0]];return Object.assign(a,{constants:e,getData:i}),new Te(a)}function Pt(t){if(0===t)return[0,0];if(isNaN(t))return{mantissa:-6755399441055744,exponent:972};var e=t>0?1:-1;if(!isFinite(t))return{mantissa:4503599627370496*e,exponent:972};t=Math.abs(t);var i=Math.floor(Math.log10(t));return[e*(t/Math.pow(10,i)),i]}function Mt(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Math.ceil(t),n=Math.floor(e),a=i-n,s=a,r=1;a>5&&(a%2!=0&&(a=++i-n),s=a/2,r=2),a<=2&&(r=a/(s=4)),0===a&&(s=5,r=1);for(var o=[],l=0;l<=s;l++)o.push(n+r*l);return o}function Ct(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=Pt(t),n=Ut(i,2),a=n[0],s=n[1],r=e?e/Math.pow(10,s):0,o=Mt(a=a.toFixed(6),r);return o=o.map(function(t){return s<0?t/Math.pow(10,-s):t*Math.pow(10,s)})}function Dt(t){function e(t,e){for(var i=Ct(t),n=i[1]-i[0],a=0,s=1;a1&&void 0!==arguments[1]&&arguments[1],n=Math.max.apply(Math,Gt(t)),a=Math.min.apply(Math,Gt(t)),s=[];if(n>=0&&a>=0)Pt(n)[1],s=i?Ct(n,a):Ct(n);else if(n>0&&a<0){var r=Math.abs(a);n>=r?(Pt(n)[1],s=e(n,r)):(Pt(r)[1],s=e(r,n).reverse().map(function(t){return-1*t}))}else if(n<=0&&a<=0){var o=Math.abs(a),l=Math.abs(n);Pt(o)[1],s=(s=i?Ct(o,l):Ct(o)).reverse().map(function(t){return-1*t})}return s}function Tt(t){var e=Lt(t);return t.indexOf(0)>=0?t.indexOf(0):t[0]>0?-1*t[0]/e:-1*t[t.length-1]/e+(t.length-1)}function Lt(t){return t[1]-t[0]}function Ot(t){return t[t.length-1]-t[0]}function Nt(t,e){return u(e.zeroLine-t*e.scaleMultiplier)}function St(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=e.reduce(function(e,i){return Math.abs(i-t)i?n.slice(0,i):c(n,i-n.length,0),t.values=n}else t.values=a;t.chartType||(Jt.includes(e),t.chartType=e)}),t.yRegions&&t.yRegions.map(function(t){if(t.end1&&void 0!==arguments[1]?arguments[1]:[],i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=t/e.length;n<=0&&(n=1);var a=n/$t,s=void 0;if(i){var r=Math.max.apply(Math,Gt(e.map(function(t){return t.length})));s=Math.ceil(r/a)}return e.map(function(t,e){return(t+="").length>a&&(i?e%s!=0&&(t=""):t=a-3>0?t.slice(0,a-3)+" ...":t.slice(0,a)+".."),t})}function Wt(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"line",e=arguments[1],i=arguments[2];return"axis-mixed"===t?(i.type="line",new Ee(e,i)):ze[t]?new ze[t](e,i):void console.error("Undefined chart type: "+t)}!function(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css","top"===i&&n.firstChild?n.insertBefore(a,n.firstChild):n.appendChild(a),a.styleSheet?a.styleSheet.cssText=t:a.appendChild(document.createTextNode(t))}}('.chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ol,.graph-svg-tip ul{padding-left:0;display:-webkit-box;display:-ms-flexbox;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;-webkit-box-flex:1;-ms-flex:1;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}');var Ft="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},jt=(function(){function t(t){this.value=t}function e(e){function i(t,e){return new Promise(function(i,a){var o={key:t,arg:e,resolve:i,reject:a,next:null};r?r=r.next=o:(s=r=o,n(t,e))})}function n(i,s){try{var r=e[i](s),o=r.value;o instanceof t?Promise.resolve(o.value).then(function(t){n("next",t)},function(t){n("throw",t)}):a(r.done?"return":"normal",r.value)}catch(t){a("throw",t)}}function a(t,e){switch(t){case"return":s.resolve({value:e,done:!0});break;case"throw":s.reject(e);break;default:s.resolve({value:e,done:!1})}(s=s.next)?n(s.key,s.arg):r=null}var s,r;this._invoke=i,"function"!=typeof e.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype.throw=function(t){return this._invoke("throw",t)},e.prototype.return=function(t){return this._invoke("return",t)}}(),function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}),Rt=function(){function t(t,e){for(var i=0;i\n\t\t\t\t
                                                                  \n\t\t\t\t
                                                                  '}),this.hideTip(),this.title=this.container.querySelector(".title"),this.dataPointList=this.container.querySelector(".data-point-list"),this.parent.addEventListener("mouseleave",function(){e.hideTip()})}},{key:"fill",value:function(){var e=this,i=void 0;this.index&&this.container.setAttribute("data-point-index",this.index),i=this.titleValueFirst?""+this.titleValue+""+this.titleName:this.titleName+""+this.titleValue+"",this.title.innerHTML=i,this.dataPointList.innerHTML="",this.listValues.map(function(i,n){var a=e.colors[n]||"black",s=0===i.formatted||i.formatted?i.formatted:i.value,r=t.create("li",{styles:{"border-top":"3px solid "+a},innerHTML:''+(0===s||s?s:"")+"\n\t\t\t\t\t"+(i.title?i.title:"")});e.dataPointList.appendChild(r)})}},{key:"calcPosition",value:function(){var t=this.container.offsetWidth;this.top=this.y-this.container.offsetHeight-5,this.left=this.x-t/2;var e=this.parent.offsetWidth-t,i=this.container.querySelector(".svg-pointer");if(this.left<0)i.style.left="calc(50% - "+-1*this.left+"px)",this.left=0;else if(this.left>e){var n="calc(50% + "+(this.left-e)+"px)";i.style.left=n,this.left=e}else i.style.left="50%"}},{key:"setValues",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;this.titleName=i.name,this.titleValue=i.value,this.listValues=n,this.x=t,this.y=e,this.titleValueFirst=i.valueFirst||0,this.index=a,this.refresh()}},{key:"hideTip",value:function(){this.container.style.top="0px",this.container.style.left="0px",this.container.style.opacity="0"}},{key:"showTip",value:function(){this.container.style.top=this.top+"px",this.container.style.left=this.left+"px",this.container.style.opacity="1"}}]),e}(),ie={"light-blue":"#7cd6fd",blue:"#5e64ff",violet:"#743ee2",red:"#ff5858",orange:"#ffa00a",yellow:"#feef72",green:"#28a745","light-green":"#98d85b",purple:"#b554ff",magenta:"#ffa3ef",black:"#36114C",grey:"#bdd3e6","light-grey":"#f0f4f7","dark-grey":"#b8c2cc"},ne=function(t){return/rgb[a]{0,1}\([\d, ]+\)/gim.test(t)?/\D+(\d*)\D+(\d*)\D+(\d*)/gim.exec(t).map(function(t,e){return 0!==e?Number(t).toString(16):"#"}).reduce(function(t,e){return""+t+e}):ie[t]||t},ae=6,se=4,re=25,oe=15,le=120,he=10,ue="#dadada",ce="#555b51",de={bar:function(t){var e=void 0;"rect"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode();return i.style.fill="#000000",i.style.opacity="0.4",e&&i.setAttribute("transform",e),i},dot:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i},heat_square:function(t){var e=void 0;"circle"!==t.nodeName&&(e=t.getAttribute("transform"),t=t.childNodes[0]);var i=t.cloneNode(),n=t.getAttribute("r"),a=t.getAttribute("fill");return i.setAttribute("r",parseInt(n)+4),i.setAttribute("fill",a),i.style.opacity="0.6",e&&i.setAttribute("transform",e),i}},pe={bar:function(t,e){var i=void 0;"rect"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["x","y","width","height"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},dot:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)},heat_square:function(t,e){var i=void 0;"circle"!==t.nodeName&&(i=t.getAttribute("transform"),t=t.childNodes[0]);var n=["cx","cy"];Object.values(t.attributes).filter(function(t){return n.includes(t.name)&&t.specified}).map(function(t){e.setAttribute(t.name,t.nodeValue)}),i&&e.setAttribute("transform",i)}},fe=350,ve=350,ge=fe,ye=250,me="easein",be={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"},xe=".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}",ke=function(){function e(t,i){if(jt(this,e),i=g(i),this.parent="string"==typeof t?document.querySelector(t):t,!(this.parent instanceof HTMLElement))throw new Error("No `parent` element to render on was provided.");this.rawChartArgs=i,this.title=i.title||"",this.type=i.type||"",this.realData=this.prepareData(i.data),this.data=this.prepareFirstData(this.realData),this.colors=this.validateColors(i.colors,this.type),this.config={showTooltip:1,showLegend:1,isNavigable:i.isNavigable||0,animate:void 0!==i.animate?i.animate:1,truncateLegends:i.truncateLegends||1},this.measures=JSON.parse(JSON.stringify(qt));var n=this.measures;this.setMeasures(i),this.title.length||(n.titleHeight=0),this.config.showLegend||(n.legendHeight=0),this.argHeight=i.height||n.baseHeight,this.state={},this.options={},this.initTimeout=Xt,this.config.isNavigable&&(this.overlays=[]),this.configure(i)}return Rt(e,[{key:"prepareData",value:function(t){return t}},{key:"prepareFirstData",value:function(t){return t}},{key:"validateColors",value:function(t,e){var i=[];return(t=(t||[]).concat(Zt[e])).forEach(function(t){var e=ne(t);P(e)?i.push(e):console.warn('"'+t+'" is not a valid color.')}),i}},{key:"setMeasures",value:function(){}},{key:"configure",value:function(){var t=this,e=this.argHeight;this.baseHeight=e,this.height=e-l(this.measures),this.boundDrawFn=function(){return t.draw(!0)},ResizeObserver&&(this.resizeObserver=new ResizeObserver(this.boundDrawFn),this.resizeObserver.observe(this.parent)),window.addEventListener("resize",this.boundDrawFn),window.addEventListener("orientationchange",this.boundDrawFn)}},{key:"destroy",value:function(){this.resizeObserver&&this.resizeObserver.disconnect(),window.removeEventListener("resize",this.boundDrawFn),window.removeEventListener("orientationchange",this.boundDrawFn)}},{key:"setup",value:function(){this.makeContainer(),this.updateWidth(),this.makeTooltip(),this.draw(!1,!0)}},{key:"makeContainer",value:function(){this.parent.innerHTML="";var e={inside:this.parent,className:"chart-container"};this.independentWidth&&(e.styles={width:this.independentWidth+"px"}),this.container=t.create("div",e)}},{key:"makeTooltip",value:function(){this.tip=new ee({parent:this.container,colors:this.colors}),this.bindTooltip()}},{key:"bindTooltip",value:function(){}},{key:"draw",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e&&i(this.parent)||(this.updateWidth(),this.calc(e),this.makeChartArea(),this.setupComponents(),this.components.forEach(function(e){return e.setup(t.drawArea)}),this.render(this.components,!1),n&&(this.data=this.realData,setTimeout(function(){t.update(t.data)},this.initTimeout)),this.renderLegend(),this.setupNavigation(n))}},{key:"calc",value:function(){}},{key:"updateWidth",value:function(){this.baseWidth=a(this.parent),this.width=this.baseWidth-h(this.measures)}},{key:"makeChartArea",value:function(){this.svg&&this.container.removeChild(this.svg);var t=this.measures;this.svg=L(this.container,"frappe-chart chart",this.baseWidth,this.baseHeight),this.svgDefs=O(this.svg),this.title.length&&(this.titleEL=Y("title",t.margins.left,t.margins.top,this.title,{fontSize:t.titleFontSize,fill:"#666666",dy:t.titleFontSize}));var e=r(t);this.drawArea=N(this.type+"-chart chart-draw-area","translate("+o(t)+", "+e+")"),this.config.showLegend&&(e+=this.height+t.paddings.bottom,this.legendArea=N("chart-legend","translate("+o(t)+", "+e+")")),this.title.length&&this.svg.appendChild(this.titleEL),this.svg.appendChild(this.drawArea),this.config.showLegend&&this.svg.appendChild(this.legendArea),this.updateTipOffset(o(t),r(t))}},{key:"updateTipOffset",value:function(t,e){this.tip.offset={x:t,y:e}}},{key:"setupComponents",value:function(){this.components=new Map}},{key:"update",value:function(t){t||console.error("No data to update."),this.data=this.prepareData(t),this.calc(),this.render(this.components,this.config.animate),this.renderLegend()}},{key:"render",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.components,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.config.isNavigable&&this.overlays.map(function(t){return t.parentNode.removeChild(t)});var n=[];e.forEach(function(t){n=n.concat(t.update(i))}),n.length>0?(ut(this.container,this.svg,n),setTimeout(function(){e.forEach(function(t){return t.make()}),t.updateNav()},400)):(e.forEach(function(t){return t.make()}),this.updateNav())}},{key:"updateNav",value:function(){this.config.isNavigable&&(this.makeOverlay(),this.bindUnits())}},{key:"renderLegend",value:function(){}},{key:"setupNavigation",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.config.isNavigable&&e&&(this.bindOverlay(),this.keyActions={13:this.onEnterKey.bind(this),37:this.onLeftArrow.bind(this),38:this.onUpArrow.bind(this),39:this.onRightArrow.bind(this),40:this.onDownArrow.bind(this)},document.addEventListener("keydown",function(e){n(t.container)&&(e=e||window.event,t.keyActions[e.keyCode]&&t.keyActions[e.keyCode]())}))}},{key:"makeOverlay",value:function(){}},{key:"updateOverlay",value:function(){}},{key:"bindOverlay",value:function(){}},{key:"bindUnits",value:function(){}},{key:"onLeftArrow",value:function(){}},{key:"onRightArrow",value:function(){}},{key:"onUpArrow",value:function(){}},{key:"onDownArrow",value:function(){}},{key:"onEnterKey",value:function(){}},{key:"addDataPoint",value:function(){}},{key:"removeDataPoint",value:function(){}},{key:"getDataPoint",value:function(){}},{key:"setCurrentDataPoint",value:function(){}},{key:"updateDataset",value:function(){}},{key:"export",value:function(){var t=dt(this.svg);ct(this.title||"Chart",[t])}}]),e}(),we=function(t){function e(t,i){return jt(this,e),Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i))}return Bt(e,t),Rt(e,[{key:"configure",value:function(t){Yt(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"configure",this).call(this,t),this.config.formatTooltipY=(t.tooltipOptions||{}).formatTooltipY,this.config.maxSlices=t.maxSlices||20,this.config.maxLegendPoints=t.maxLegendPoints||20}},{key:"calc",value:function(){var t=this,e=this.state,i=this.config.maxSlices;e.sliceTotals=[];var n=this.data.labels.map(function(e,i){var n=0;return t.data.datasets.map(function(t){n+=t.values[i]}),[n,e]}).filter(function(t){return t[0]>=0}),a=n;if(n.length>i){n.sort(function(t,e){return e[0]-t[0]}),a=n.slice(0,i-1);var s=0;n.slice(i-1).map(function(t){s+=t[0]}),a.push([s,"Rest"]),this.colors[i-1]="grey"}e.labels=[],a.map(function(t){e.sliceTotals.push(v(t[0])),e.labels.push(t[1])}),e.grandTotal=e.sliceTotals.reduce(function(t,e){return t+e},0),this.center={x:this.width/2,y:this.height/2}}},{key:"renderLegend",value:function(){var t=this,e=this.state;this.legendArea.textContent="",this.legendTotals=e.sliceTotals.slice(0,this.config.maxLegendPoints);var i=0,n=0;this.legendTotals.map(function(a,s){var r=150,o=Math.floor((t.width-h(t.measures))/r);t.legendTotals.lengtho&&(i=0,n+=20);var l=r*i+5,u=t.config.truncateLegends?b(e.labels[s],r/10):e.labels[s],c=t.config.formatTooltipY?t.config.formatTooltipY(a):a,d=R(l,n,5,t.colors[s],u+": "+c,!1);t.legendArea.appendChild(d),i++})}}]),e}(ke),Ae=7,Pe=1e3,Me=86400,Ce=["January","February","March","April","May","June","July","August","September","October","November","December"],De=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Te=function(){function t(e){var i=e.layerClass,n=void 0===i?"":i,a=e.layerTransform,s=void 0===a?"":a,r=e.constants,o=e.getData,l=e.makeElements,h=e.animateElements;jt(this,t),this.layerTransform=s,this.constants=r,this.makeElements=l,this.getData=o,this.animateElements=h,this.store=[],this.labels=[],this.layerClass=n,this.layerClass="function"==typeof this.layerClass?this.layerClass():this.layerClass,this.refresh()}return Rt(t,[{key:"refresh",value:function(t){this.data=t||this.getData()}},{key:"setup",value:function(t){this.layer=N(this.layerClass,this.layerTransform,t)}},{key:"make",value:function(){this.render(this.data),this.oldData=this.data}},{key:"render",value:function(t){var e=this;this.store=this.makeElements(t),this.layer.textContent="",this.store.forEach(function(t){t.length?t.forEach(function(t){e.layer.appendChild(t)}):e.layer.appendChild(t)}),this.labels.forEach(function(t){e.layer.appendChild(t)})}},{key:"update",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.refresh();var e=[];return t&&(e=this.animateElements(this.data)||[]),e}}]),t}(),Le={donutSlices:{layerClass:"donut-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"donut-path",t.colors[i],"none",t.strokeWidth);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},pieSlices:{layerClass:"pie-slices",makeElements:function(t){return t.sliceStrings.map(function(e,i){var n=S(e,"pie-path","none",t.colors[i]);return n.style.transition="transform .3s;",n})},animateElements:function(t){return this.store.map(function(e,i){return rt(e,t.sliceStrings[i])})}},percentageBars:{layerClass:"percentage-bars",makeElements:function(t){var e=this;return t.xPositions.map(function(i,n){return W(i,0,t.widths[n],e.constants.barHeight,e.constants.barDepth,t.colors[n])})},animateElements:function(t){if(t)return[]}},yAxis:{layerClass:"y axis",makeElements:function(t){var e=this,i=[];return t.length?(t.forEach(function(n,a){n.positions.map(function(t,a){i.push(G(t,n.labels[a],e.constants.width,{mode:e.constants.mode,pos:n.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers,title:n.title}))}),n.title&&i.push(U({title:n.title,position:n.pos,height:e.constants.height||t.zeroLine,width:e.constants.width}))}),i):(t.positions.forEach(function(n,a){i.push(G(n,t.labels[a],e.constants.width,{mode:e.constants.mode,pos:t.pos||e.constants.pos,shortenNumbers:e.constants.shortenNumbers}))}),t.title&&i.push(U({title:t.title,position:t.pos,height:this.constants.height||t.zeroLine,width:this.constants.width})),i)},animateElements:function(t){var e=this,i=function(t,i){var n=i.positions,a=i.labels,s=t.positions,r=t.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],e.render({positions:s,labels:a}),e.store.map(function(t,e){return et(t,n[e],s[e])})};if(this.oldData instanceof Array)return this.oldData.forEach(function(e,n){i(e,t[n])});var n=t.positions,a=t.labels,s=this.oldData.positions,r=this.oldData.labels,o=m(s,n),l=Ut(o,2);s=l[0],n=l[1];var h=m(r,a),u=Ut(h,2);return r=u[0],a=u[1],this.render({positions:s,labels:a}),this.store.map(function(t,e){return et(t,n[e],s[e])})}},xAxis:{layerClass:"x axis",makeElements:function(t){var e=this;return t.positions.map(function(i,n){return q(i,t.calcLabels[n],e.constants.height,{mode:e.constants.mode,pos:e.constants.pos})})},animateElements:function(t){var e=t.positions,i=t.calcLabels,n=this.oldData.positions,a=this.oldData.calcLabels,s=m(n,e),r=Ut(s,2);n=r[0],e=r[1];var o=m(a,i),l=Ut(o,2);return a=l[0],i=l[1],this.render({positions:n,calcLabels:i}),this.store.map(function(t,i){return tt(t,e[i],n[i])})}},yMarkers:{layerClass:"y-markers",makeElements:function(t){var e=this;return t.map(function(t){return X(t.position,t.label,e.constants.width,{labelPos:t.options.labelPos,mode:"span",lineType:"dashed"})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.position}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.options}),r=this.oldData.map(function(t){return t.position});return this.render(r.map(function(t,e){return{position:r[e],label:a[e],options:s[e]}})),this.store.map(function(t,e){return et(t,n[e],r[e])})}},yRegions:{layerClass:"y-regions",makeElements:function(t){var e=this;return t.map(function(t){return J(t.startPos,t.endPos,e.constants.width,t.label,{labelPos:t.options.labelPos})})},animateElements:function(t){var e=m(this.oldData,t),i=Ut(e,2);this.oldData=i[0];var n=(t=i[1]).map(function(t){return t.endPos}),a=t.map(function(t){return t.label}),s=t.map(function(t){return t.startPos}),r=t.map(function(t){return t.options}),o=this.oldData.map(function(t){return t.endPos}),l=this.oldData.map(function(t){return t.startPos});this.render(o.map(function(t,e){return{startPos:l[e],endPos:o[e],label:a[e],options:r[e]}}));var h=[];return this.store.map(function(t,e){h=h.concat(it(t,s[e],n[e],o[e]))}),h}},heatDomain:{layerClass:function(){return"heat-domain domain-"+this.constants.index},makeElements:function(t){var e=this,i=this.constants,n=i.index,a=i.colWidth,s=i.rowHeight,r=i.squareSize,o=i.radius,l=i.xTranslate,h=0;return this.serializedSubDomains=[],t.cols.map(function(t,i){1===i&&e.labels.push(Y("domain-name",l,-12,bt(n,!0).toUpperCase(),{fontSize:9})),t.map(function(t,i){if(t.fill){var n={"data-date":t.yyyyMmDd,"data-value":t.dataValue,"data-day":i},a=F("day",l,h,r,o,t.fill,n);e.serializedSubDomains.push(a)}h+=s}),h=0,l+=a}),this.serializedSubDomains},animateElements:function(t){if(t)return[]}},barGraph:{layerClass:function(){return"dataset-units dataset-bars dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="bar",this.units=t.yPositions.map(function(i,n){return K(t.xPositions[n],i,t.barWidth,e.color,t.labels[n],n,t.offsets[n],{zeroLine:t.zeroLine,barsWidth:t.barsWidth,minHeight:e.minHeight})}),this.units},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.offsets,a=t.labels,s=this.oldData.xPositions,r=this.oldData.yPositions,o=this.oldData.offsets,l=this.oldData.labels,h=m(s,e),u=Ut(h,2);s=u[0],e=u[1];var c=m(r,i),d=Ut(c,2);r=d[0],i=d[1];var p=m(o,n),f=Ut(p,2);o=f[0],n=f[1];var v=m(l,a),g=Ut(v,2);l=g[0],a=g[1],this.render({xPositions:s,yPositions:r,offsets:o,labels:a,zeroLine:this.oldData.zeroLine,barsWidth:this.oldData.barsWidth,barWidth:this.oldData.barWidth});var y=[];return this.store.map(function(a,s){y=y.concat(nt(a,e[s],i[s],t.barWidth,n[s],{zeroLine:t.zeroLine}))}),y}},lineGraph:{layerClass:function(){return"dataset-units dataset-line dataset-"+this.constants.index},makeElements:function(t){var e=this.constants;return this.unitType="dot",this.paths={},e.hideLine||(this.paths=Q(t.xPositions,t.yPositions,e.color,{heatline:e.heatline,regionFill:e.regionFill,spline:e.spline},{svgDefs:e.svgDefs,zeroLine:t.zeroLine})),this.units=[],e.hideDots||(this.units=t.yPositions.map(function(i,n){return $(t.xPositions[n],i,t.radius,e.color,e.valuesOverPoints?t.values[n]:"",n)})),Object.values(this.paths).concat(this.units)},animateElements:function(t){var e=t.xPositions,i=t.yPositions,n=t.values,a=this.oldData.xPositions,s=this.oldData.yPositions,r=this.oldData.values,o=m(a,e),l=Ut(o,2);a=l[0],e=l[1];var h=m(s,i),u=Ut(h,2);s=u[0],i=u[1];var c=m(r,n),d=Ut(c,2);r=d[0],n=d[1],this.render({xPositions:a,yPositions:s,values:n,zeroLine:this.oldData.zeroLine,radius:this.oldData.radius});var p=[];return Object.keys(this.paths).length&&(p=p.concat(st(this.paths,e,i,t.zeroLine,this.constants.spline))),this.units.length&&this.units.map(function(t,n){p=p.concat(at(t,e[n],i[n]))}),p}}},Oe=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="percentage",n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(t){var e=this.measures;this.barOptions=t.barOptions||{};var i=this.barOptions;i.height=i.height||20,i.depth=i.depth||Kt,e.paddings.right=30,e.legendHeight=60,e.baseHeight=8*(i.height+.5*i.depth)}},{key:"setupComponents",value:function(){var t=this.state,e=[["percentageBars",{barHeight:this.barOptions.height,barDepth:this.barOptions.depth},function(){return{xPositions:t.xPositions,widths:t.widths,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;e.xPositions=[],e.widths=[];var n=0;e.sliceTotals.map(function(i){var a=t.width*i/e.grandTotal;e.widths.push(a),e.xPositions.push(n),n+=a})}},{key:"makeDataByIndex",value:function(){}},{key:"bindTooltip",value:function(){var t=this,i=this.state;this.container.addEventListener("mousemove",function(n){var a=t.components.get("percentageBars").store,s=n.target;if(a.includes(s)){var r=a.indexOf(s),o=e(t.container),l=e(s),h=l.left-o.left+parseInt(s.getAttribute("width"))/2,u=l.top-o.top,c=(t.formattedLabels&&t.formattedLabels.length>0?t.formattedLabels[r]:t.state.labels[r])+": ",d=i.sliceTotals[r]/i.grandTotal;t.tip.setValues(h,u,{name:c,value:(100*d).toFixed(1)+"%"}),t.tip.showTip()}})}}]),i}(we),Ne=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="pie",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x:this.center.y;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?_(y,m,t.center,t.radius,a,u):E(y,m,t.center,t.radius,a,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["pieSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.fill=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.fill=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("pieSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(we),Se=function(t){function e(t,i){jt(this,e);var n=Vt(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));n.type="heatmap",n.countLabel=i.countLabel||"";var a=["Sunday","Monday"],s=a.includes(i.startSubDomain)?i.startSubDomain:"Sunday";return n.startSubDomainIndex=a.indexOf(s),n.setup(),n}return Bt(e,t),Rt(e,[{key:"setMeasures",value:function(t){var e=this.measures;this.discreteDomains=0===t.discreteDomains?0:1,e.paddings.top=36,e.paddings.bottom=0,e.legendHeight=24,e.baseHeight=12*Ae+l(e);var i=this.data,n=this.discreteDomains?12:0;this.independentWidth=12*(gt(i.start,i.end)+n)+h(e)}},{key:"updateWidth",value:function(){var t=this.discreteDomains?12:0,e=this.state.noOfWeeks?this.state.noOfWeeks:52;this.baseWidth=12*(e+t)+h(this.measures)}},{key:"prepareData",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data;if(t.start&&t.end&&t.start>t.end)throw new Error("Start date cannot be greater than end date.");if(t.start||(t.start=new Date,t.start.setFullYear(t.start.getFullYear()-1)),t.end||(t.end=new Date),t.dataPoints=t.dataPoints||{},parseInt(Object.keys(t.dataPoints)[0])>1e5){var e={};Object.keys(t.dataPoints).forEach(function(i){var n=new Date(i*Pe);e[ft(n)]=t.dataPoints[i]}),t.dataPoints=e}return t}},{key:"calc",value:function(){var t=this.state;t.start=vt(this.data.start),t.end=vt(this.data.end),t.firstWeekStart=vt(t.start),t.noOfWeeks=gt(t.start,t.end),t.distribution=Et(Object.values(this.data.dataPoints),5),t.domainConfigs=this.getDomains()}},{key:"setupComponents",value:function(){var t=this,e=this.state,i=this.discreteDomains?0:1,n=e.domainConfigs.map(function(n,a){return["heatDomain",{index:n.index,colWidth:12,rowHeight:12,squareSize:10,radius:t.rawChartArgs.radius||0,xTranslate:12*e.domainConfigs.filter(function(t,e){return e1&&void 0!==arguments[1]?arguments[1]:"",i=[t.getMonth(),t.getFullYear()],n=i[0],a=i[1],s=kt(t),r={index:n,cols:[]};wt(e=vt(e)||xt(n,a),1);for(var o=gt(s,e),l=[],h=void 0,u=0;u2&&void 0!==arguments[2]&&arguments[2],n=this.state,a=vt(t),s=[],r=0;r=n.start&&a<=n.end;i||a.getMonth()!==e||!l?o.yyyyMmDd=ft(a):o=this.getSubDomainConfig(a),s.push(o)}return s}},{key:"getSubDomainConfig",value:function(t){var e=ft(t),i=this.data.dataPoints[e];return{yyyyMmDd:e,dataValue:i||0,fill:this.colors[_t(i,this.state.distribution)]}}}]),e}(ke),Ee=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.barOptions=e.barOptions||{},n.lineOptions=e.lineOptions||{},n.type=e.type||"line",n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"setMeasures",value:function(){this.data.datasets.length<=1&&(this.config.showLegend=0,this.measures.paddings.bottom=30)}},{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t);var e=t.axisOptions,n=void 0===e?{}:e,a=n||{},s=a.xAxis,r=a.yAxis;t.tooltipOptions=t.tooltipOptions||{},this.config.xAxisMode=s?s.xAxisMode:n.xAxisMode||"span",r&&r.length?this.config.yAxisConfig=r.map(function(t){return{yAxisMode:t.yAxisMode,id:t.id,position:t.position,title:t.title}}):(this.config.yAxisMode=r?r.yAxisMode:n.yAxisMode||"span",r&&r.id&&r.position&&(this.config.yAxisConfig=[r])),this.config.xIsSeries=n.xIsSeries||0,this.config.shortenYAxisNumbers=n.shortenYAxisNumbers||0,this.config.formatTooltipX=t.tooltipOptions.formatTooltipX,this.config.formatTooltipY=t.tooltipOptions.formatTooltipY,this.config.valuesOverPoints=t.valuesOverPoints}},{key:"prepareData",value:function(){return zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data,this.type)}},{key:"prepareFirstData",value:function(){return It(arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.data)}},{key:"calc",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.calcXPositions(),t||this.calcYAxisParameters(this.getAllYValues(),"line"===this.type),this.makeDataByIndex()}},{key:"calcXPositions",value:function(){var t=this.state,e=this.data.labels;t.datasetLength=e.length,t.unitWidth=this.width/t.datasetLength,t.xOffset=t.unitWidth/2,t.xAxis={labels:e,positions:e.map(function(e,i){return u(t.xOffset+i*t.unitWidth)})}}},{key:"calcYAxisParameters",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"false",n=void 0,a=void 0,s=void 0,r=void 0,o=void 0,l=void 0,h=void 0,u=void 0;if(u=[],l=this.config.yAxisMode||{},h=l.position?l.position:"left",t instanceof Array)n=Dt(t,i),a=this.height/Ot(n),s=Lt(n)*a,r=this.height-Tt(n)*s,this.state.yAxis={labels:n,positions:n.map(function(t){return r-t*a}),title:l.title||null,pos:h,scaleMultiplier:a,zeroLine:r};else{this.state.yAxis=[];for(var c in t)!function(c){var d=t[c];if(l=e.config.yAxisConfig.find(function(t){return c===t.id})||[],h=l.position?l.position:"left",n=Dt(d,i),a=e.height/Ot(n),s=Lt(n)*a,r=e.height-Tt(n)*s,o=n.map(function(t){return r-t*a}),u.push(c),e.state.yAxis.length>1){var p=[],f=e.state.yAxis[0];a=e.height/Ot(n),f.positions.forEach(function(t){p.push(Math.ceil(t/a))}),n=p.reverse(),r=e.height-Tt(n)*s,o=f.positions}e.state.yAxis.push({axisID:c||"left-axis",labels:n,title:l.title,pos:h,scaleMultiplier:a,zeroLine:r,positions:o})}(c);if(this.state.yAxis[1]&&this.state.yAxis[0].labels.length!==this.state.yAxis[1].labels.length){var d=[],p=this.state.yAxis.reduce(function(t,e){return t.length>e.labels.length?e:t},{length:1/0}),f=this.state.yAxis.reduce(function(t,e){return t.length1?n.find(function(t){return i===t.axisID}):t.yAxis[0]),Nt(e,n)})};t.barChartIndex=1,t.datasets=this.data.datasets.map(function(i,n){var a=i.values,s=i.cumulativeYs||[];return{name:i.name&&i.name.replace(/<|>|&/g,function(t){return"&"==t?"&":"<"==t?"<":">"}),index:n,barIndex:"bar"===i.chartType?t.barChartIndex++:t.barChartIndex,chartType:i.chartType,values:a,yPositions:e(a,i.axisID),id:i.axisID,cumulativeYs:s,cumulativeYPos:e(s,i.axisID)}})}},{key:"calcYExtremes",value:function(){var t=this.state;if(this.barOptions.stacked)return void(t.yExtremes=t.datasets[t.datasets.length-1].cumulativeYPos);t.yExtremes=new Array(t.datasetLength).fill(9999),t.datasets.map(function(e){e.yPositions.map(function(e,i){e1?e.find(function(t){return o===t.axisID}):t.yAxis[0]);var d=t.xAxis.positions.map(function(t){return t-u/2});l||(d=d.map(function(t){return t+c*a-c}));var p=new Array(t.datasetLength).fill("");this.config.valuesOverPoints&&(p=l&&s.index===t.datasets.length-1?s.cumulativeYs:s.values);var f=new Array(t.datasetLength).fill(0);return l&&(f=s.yPositions.map(function(t,e){return t-s.cumulativeYPos[e]})),{xPositions:d,yPositions:s.yPositions,offsets:f,labels:p,zeroLine:e.zeroLine,barsWidth:u,barWidth:c}}.bind(t)]}),s=n.map(function(e){var i=e.index;return["lineGraph-"+e.index,{index:i,color:t.colors[i],svgDefs:t.svgDefs,heatline:t.lineOptions.heatline,regionFill:t.lineOptions.regionFill,spline:t.lineOptions.spline,hideDots:t.lineOptions.hideDots,hideLine:t.lineOptions.hideLine,valuesOverPoints:t.config.valuesOverPoints},function(){var t=this.state,e=t.datasets[i],n=t.yAxis.length?t.yAxis.find(function(t){return e.id===t.axisID})||t.yAxis[0]:t.yAxis,a=n.positions[0]r(n)?t.mapTooltipXPosition(s):t.tip.hideTip()})}},{key:"mapTooltipXPosition",value:function(t){var e=this.state;if(e.yExtremes){var i=St(t,e.xAxis.positions,!0);if(i>=0){var n=this.dataByIndex[i];this.tip.setValues(n.xPos+this.tip.offset.x,n.yExtreme+this.tip.offset.y,{name:n.formattedLabel,value:""},n.values,i),this.tip.showTip()}}}},{key:"renderLegend",value:function(){var t=this,e=this.data;e.datasets.length>1&&(this.legendArea.textContent="",e.datasets.map(function(e,i){var n=j(100*i,"0",100,t.colors[i],e.name,t.config.truncateLegends);t.legendArea.appendChild(n)}))}},{key:"makeOverlay",value:function(){var t=this;if(this.init)return void(this.init=0);this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)}),this.overlayGuides=this.dataUnitComponents.map(function(t){return{type:t.unitType,overlay:void 0,units:t.units}}),void 0===this.state.currentIndex&&(this.state.currentIndex=this.state.datasetLength-1),this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];e.overlay=de[e.type](i),t.drawArea.appendChild(e.overlay)})}},{key:"updateOverlayGuides",value:function(){this.overlayGuides&&this.overlayGuides.forEach(function(t){var e=t.overlay;e.parentNode.removeChild(e)})}},{key:"bindOverlay",value:function(){var t=this;this.parent.addEventListener("data-select",function(){t.updateOverlay()})}},{key:"bindUnits",value:function(){var t=this;this.dataUnitComponents.map(function(e){e.units.map(function(e){e.addEventListener("click",function(){var i=e.getAttribute("data-point-index");t.setCurrentDataPoint(i)})})}),this.tip.container.addEventListener("click",function(){var e=t.tip.container.getAttribute("data-point-index");t.setCurrentDataPoint(e)})}},{key:"updateOverlay",value:function(){var t=this;this.overlayGuides.map(function(e){var i=e.units[t.state.currentIndex];pe[e.type](i,e.overlay)})}},{key:"onLeftArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex-1)}},{key:"onRightArrow",value:function(){this.setCurrentDataPoint(this.state.currentIndex+1)}},{key:"getDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.currentIndex,e=this.state;return{index:t,label:e.xAxis.labels[t],values:e.datasets.map(function(e){return e.values[t]})}}},{key:"setCurrentDataPoint",value:function(t){var e=this.state;(t=parseInt(t))<0&&(t=0),t>=e.xAxis.labels.length&&(t=e.xAxis.labels.length-1),t!==e.currentIndex&&(e.currentIndex=t,s(this.parent,"data-select",this.getDataPoint()))}},{key:"addDataPoint",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.state.datasetLength;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"addDataPoint",this).call(this,t,e,n),this.data.labels.splice(n,0,t),this.data.datasets.map(function(t,i){t.values.splice(n,0,e[i])}),this.update(this.data)}},{key:"removeDataPoint",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.datasetLength-1;this.data.labels.length<=1||(Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"removeDataPoint",this).call(this,t),this.data.labels.splice(t,1),this.data.datasets.map(function(e){e.values.splice(t,1)}),this.update(this.data))}},{key:"updateDataset",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.data.datasets[e].values=t,this.update(this.data)}},{key:"updateDatasets",value:function(t){this.data.datasets.map(function(e,i){t[i]&&(e.values=t[i])}),this.update(this.data)}}]),i}(ke),_e=function(t){function i(t,e){jt(this,i);var n=Vt(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t,e));return n.type="donut",n.initTimeout=0,n.init=1,n.setup(),n}return Bt(i,t),Rt(i,[{key:"configure",value:function(t){Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"configure",this).call(this,t),this.mouseMove=this.mouseMove.bind(this),this.mouseLeave=this.mouseLeave.bind(this),this.hoverRadio=t.hoverRadio||.1,this.config.startAngle=t.startAngle||0,this.clockWise=t.clockWise||!1,this.strokeWidth=t.strokeWidth||30}},{key:"calc",value:function(){var t=this;Yt(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"calc",this).call(this);var e=this.state;this.radius=this.height>this.width?this.center.x-this.strokeWidth/2:this.center.y-this.strokeWidth/2;var n=this.radius,a=this.clockWise,s=e.slicesProperties||[];e.sliceStrings=[],e.slicesProperties=[];var r=180-this.config.startAngle;e.sliceTotals.map(function(i,o){var l=r,h=i/e.grandTotal*360,u=h>180?1:0,c=a?-h:h,d=r+=c,f=p(l,n),v=p(d,n),g=t.init&&s[o],y=void 0,m=void 0;t.init?(y=g?g.startPosition:f,m=g?g.endPosition:f):(y=f,m=v);var b=360===h?I(y,m,t.center,t.radius,t.clockWise,u):z(y,m,t.center,t.radius,t.clockWise,u);e.sliceStrings.push(b),e.slicesProperties.push({startPosition:f,endPosition:v,value:i,total:e.grandTotal,startAngle:l,endAngle:d,angle:c})}),this.init=0}},{key:"setupComponents",value:function(){var t=this.state,e=[["donutSlices",{},function(){return{sliceStrings:t.sliceStrings,colors:this.colors,strokeWidth:this.strokeWidth}}.bind(this)]];this.components=new Map(e.map(function(t){var e=At.apply(void 0,Gt(t));return[t[0],e]}))}},{key:"calTranslateByAngle",value:function(t){var e=this.radius,i=this.hoverRadio,n=p(t.startAngle+t.angle/2,e);return"translate3d("+n.x*i+"px,"+n.y*i+"px,0)"}},{key:"hoverSlice",value:function(t,i,n,a){if(t){var s=this.colors[i];if(n){lt(t,this.calTranslateByAngle(this.state.slicesProperties[i])),t.style.stroke=A(s,50);var r=e(this.svg),o=a.pageX-r.left+10,l=a.pageY-r.top-10,h=(this.formatted_labels&&this.formatted_labels.length>0?this.formatted_labels[i]:this.state.labels[i])+": ",u=(100*this.state.sliceTotals[i]/this.state.grandTotal).toFixed(1);this.tip.setValues(o,l,{name:h,value:u+"%"}),this.tip.showTip()}else lt(t,"translate3d(0,0,0)"),this.tip.hideTip(),t.style.stroke=s}}},{key:"bindTooltip",value:function(){this.container.addEventListener("mousemove",this.mouseMove),this.container.addEventListener("mouseleave",this.mouseLeave)}},{key:"mouseMove",value:function(t){var e=t.target,i=this.components.get("donutSlices").store,n=this.curActiveSliceIndex,a=this.curActiveSlice;if(i.includes(e)){var s=i.indexOf(e);this.hoverSlice(a,n,!1),this.curActiveSlice=e,this.curActiveSliceIndex=s,this.hoverSlice(e,s,!0,t)}else this.mouseLeave()}},{key:"mouseLeave",value:function(){this.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,!1)}}]),i}(we),ze={bar:Ee,line:Ee,percentage:Oe,heatmap:Se,pie:Ne,donut:_e},Ie=function t(e,i){return jt(this,t),Wt(i.type,e,i)},He=Object.freeze({Chart:Ie,PercentageChart:Oe,PieChart:Ne,Heatmap:Se,AxisChart:Ee}),We={};return We.NAME="Frappe Charts",We.VERSION="1.6.2",We=Object.assign({},We,He)}(); //# sourceMappingURL=frappe-charts.min.js.map diff --git a/docs/assets/js/frappe-charts.min.js.map b/docs/assets/js/frappe-charts.min.js.map index e78f44e..5b661f4 100644 --- a/docs/assets/js/frappe-charts.min.js.map +++ b/docs/assets/js/frappe-charts.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_MAX_CHARS = 15;\nconst TOTAL_PADDING = 120;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n let l = createSVG('line', {\n className: className,\n x1: x1,\n x2: x2,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\n let text = createSVG('text', {\n x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const y = options.position === 'left' ? \n\t\t(options.height - TOTAL_PADDING) / 2 + (getStringWidth(options.title, 5) / 2) : \n\t\t(options.height - TOTAL_PADDING) / 2 - (getStringWidth(options.title, 5) / 2) ;\n\tconst x = options.position === 'left' ? 0 : options.width;\n\tconst y2 = options.position === 'left' ? FONT_SIZE / 3 : FONT_SIZE / 3 * -1;\n\n const rotation =\n options.position === 'right'\n ? `rotate(90)`\n : `rotate(270)`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: 0, // getStringWidth(options.title, 5) / 2,\n y: 0, // y,\n dy: `${y2}px`,\n 'font-size': `${FONT_SIZE}px`,\n 'text-anchor': 'start',\n innerHTML: `${options.title} `\n });\n\n\tlet wrapper = createSVG('g', {\n\t\tx: 0,\n\t\ty: 0,\n\t\ttransformBox: 'fill-box',\n\t\ttransform: `translate(${x}, ${y}) ${rotation}`,\n\t\tclassName: `test-${options.position}`\n\t});\n\n\twrapper.appendChild(labelSvg);\n\n return wrapper;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n\t\t\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                                                    \n\t\t\t\t
                                                                    `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: yAxis.yAxisMode || 'span',\n width: this.width,\n\t\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","generateAxisLabel","title","position","TOTAL_PADDING","rotation","labelSvg","wrapper","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-charts.min.js","sources":["../../../src/js/utils/dom.js","../../../src/js/utils/constants.js","../../../src/js/utils/helpers.js","../../../src/js/utils/draw-utils.js","../../../src/js/utils/colors.js","../../../src/js/utils/draw.js","../../../src/js/utils/animate.js","../../../src/js/utils/animation.js","../../../src/js/utils/export.js","../../../src/js/utils/date-utils.js","../../../src/js/objects/ChartComponents.js","../../../src/js/utils/intervals.js","../../../src/js/utils/axis-chart-utils.js","../../../src/js/chart.js","../../../node_modules/style-inject/dist/style-inject.es.js","../../../src/js/objects/SvgTip.js","../../../src/css/chartsCss.js","../../../src/js/charts/BaseChart.js","../../../src/js/charts/AggregationChart.js","../../../src/js/charts/PercentageChart.js","../../../src/js/charts/PieChart.js","../../../src/js/charts/Heatmap.js","../../../src/js/charts/AxisChart.js","../../../src/js/charts/DonutChart.js","../../../src/js/index.js"],"sourcesContent":["export function $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function findNodeIndex(node)\n{\n\tvar i = 0;\n\twhile (node.previousSibling) {\n\t\tnode = node.previousSibling;\n\t\ti++;\n\t}\n\treturn i;\n}\n\n$.create = (tag, o) => {\n\tvar element = document.createElement(tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (i in element ) {\n\t\t\telement[i] = val;\n\t\t}\n\t\telse {\n\t\t\telement.setAttribute(i, val);\n\t\t}\n\t}\n\n\treturn element;\n};\n\nexport function getOffset(element) {\n\tlet rect = element.getBoundingClientRect();\n\treturn {\n\t\t// https://stackoverflow.com/a/7436602/6495043\n\t\t// rect.top varies with scroll, so we add whatever has been\n\t\t// scrolled to it to get absolute distance from actual page top\n\t\ttop: rect.top + (document.documentElement.scrollTop || document.body.scrollTop),\n\t\tleft: rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft)\n\t};\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n// an element's offsetParent property will return null whenever it, or any of its parents,\n// is hidden via the display style property.\nexport function isHidden(el) {\n\treturn (el.offsetParent === null);\n}\n\nexport function isElementInViewport(el) {\n\t// Although straightforward: https://stackoverflow.com/a/7557433/6495043\n\tvar rect = el.getBoundingClientRect();\n\n\treturn (\n\t\trect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */\n rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */\n\t);\n}\n\nexport function getElementContentWidth(element) {\n\tvar styles = window.getComputedStyle(element);\n\tvar padding = parseFloat(styles.paddingLeft) +\n\t\tparseFloat(styles.paddingRight);\n\n\treturn element.clientWidth - padding;\n}\n\nexport function bind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function (event) {\n\t\t\t\telement.addEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function unbind(element, o){\n\tif (element) {\n\t\tfor (var event in o) {\n\t\t\tvar callback = o[event];\n\n\t\t\tevent.split(/\\s+/).forEach(function(event) {\n\t\t\t\telement.removeEventListener(event, callback);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function fire(target, type, properties) {\n\tvar evt = document.createEvent(\"HTMLEvents\");\n\n\tevt.initEvent(type, true, true );\n\n\tfor (var j in properties) {\n\t\tevt[j] = properties[j];\n\t}\n\n\treturn target.dispatchEvent(evt);\n}\n\n// https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\nexport function forEachNode(nodeList, callback, scope) {\n\tif(!nodeList) return;\n\tfor (var i = 0; i < nodeList.length; i++) {\n\t\tcallback.call(scope, nodeList[i], i);\n\t}\n}\n\nexport function activate($parent, $child, commonClass, activeClass='active', index = -1) {\n\tlet $children = $parent.querySelectorAll(`.${commonClass}.${activeClass}`);\n\n\tforEachNode($children, (node, i) => {\n\t\tif(index >= 0 && i <= index) return;\n\t\tnode.classList.remove(activeClass);\n\t});\n\n\t$child.classList.add(activeClass);\n}\n","export const ALL_CHART_TYPES = ['line', 'scatter', 'bar', 'percentage', 'heatmap', 'pie'];\n\nexport const COMPATIBLE_CHARTS = {\n\tbar: ['line', 'scatter', 'percentage', 'pie'],\n\tline: ['scatter', 'bar', 'percentage', 'pie'],\n\tpie: ['line', 'scatter', 'percentage', 'bar'],\n\tpercentage: ['bar', 'line', 'scatter', 'pie'],\n\theatmap: []\n};\n\nexport const DATA_COLOR_DIVISIONS = {\n\tbar: 'datasets',\n\tline: 'datasets',\n\tpie: 'labels',\n\tpercentage: 'labels',\n\theatmap: HEATMAP_DISTRIBUTION_SIZE\n};\n\nexport const BASE_MEASURES = {\n\tmargins: {\n\t\ttop: 10,\n\t\tbottom: 10,\n\t\tleft: 20,\n\t\tright: 20\n\t},\n\tpaddings: {\n\t\ttop: 20,\n\t\tbottom: 40,\n\t\tleft: 30,\n\t\tright: 10\n\t},\n\n\tbaseHeight: 240,\n\ttitleHeight: 20,\n\tlegendHeight: 30,\n\n\ttitleFontSize: 12,\n};\n\nexport function getTopOffset(m) {\n\treturn m.titleHeight + m.margins.top + m.paddings.top;\n}\n\nexport function getLeftOffset(m) {\n\treturn m.margins.left + m.paddings.left;\n}\n\nexport function getExtraHeight(m) {\n\tlet totalExtraHeight = m.margins.top + m.margins.bottom\n\t\t+ m.paddings.top + m.paddings.bottom\n\t\t+ m.titleHeight + m.legendHeight;\n\treturn totalExtraHeight;\n}\n\nexport function getExtraWidth(m) {\n\tlet totalExtraWidth = m.margins.left + m.margins.right\n\t\t+ m.paddings.left + m.paddings.right;\n\n\treturn totalExtraWidth;\n}\n\nexport const INIT_CHART_UPDATE_TIMEOUT = 700;\nexport const CHART_POST_ANIMATE_TIMEOUT = 400;\n\nexport const DEFAULT_AXIS_CHART_TYPE = 'line';\nexport const AXIS_DATASET_CHART_TYPES = ['line', 'bar'];\n\nexport const AXIS_LEGEND_BAR_SIZE = 100;\n\nexport const BAR_CHART_SPACE_RATIO = 0.5;\nexport const MIN_BAR_PERCENT_HEIGHT = 0.00;\n\nexport const LINE_CHART_DOT_SIZE = 4;\nexport const DOT_OVERLAY_SIZE_INCR = 4;\n\nexport const PERCENTAGE_BAR_DEFAULT_HEIGHT = 20;\nexport const PERCENTAGE_BAR_DEFAULT_DEPTH = 2;\n\n// Fixed 5-color theme,\n// More colors are difficult to parse visually\nexport const HEATMAP_DISTRIBUTION_SIZE = 5;\n\nexport const HEATMAP_SQUARE_SIZE = 10;\nexport const HEATMAP_GUTTER_SIZE = 2;\n\nexport const DEFAULT_CHAR_WIDTH = 7;\n\nexport const TOOLTIP_POINTER_TRIANGLE_HEIGHT = 5;\n\nconst DEFAULT_CHART_COLORS = ['light-blue', 'blue', 'violet', 'red', 'orange',\n\t'yellow', 'green', 'light-green', 'purple', 'magenta', 'light-grey', 'dark-grey'];\nconst HEATMAP_COLORS_GREEN = ['#ebedf0', '#c6e48b', '#7bc96f', '#239a3b', '#196127'];\nexport const HEATMAP_COLORS_BLUE = ['#ebedf0', '#c0ddf9', '#73b3f3', '#3886e1', '#17459e'];\nexport const HEATMAP_COLORS_YELLOW = ['#ebedf0', '#fdf436', '#ffc700', '#ff9100', '#06001c'];\n\nexport const DEFAULT_COLORS = {\n\tbar: DEFAULT_CHART_COLORS,\n\tline: DEFAULT_CHART_COLORS,\n\tpie: DEFAULT_CHART_COLORS,\n\tpercentage: DEFAULT_CHART_COLORS,\n\theatmap: HEATMAP_COLORS_GREEN,\n\tdonut: DEFAULT_CHART_COLORS\n};\n\n// Universal constants\nexport const ANGLE_RATIO = Math.PI / 180;\nexport const FULL_ANGLE = 360;\n","import { ANGLE_RATIO } from './constants';\n\n/**\n * Returns the value of a number upto 2 decimal places.\n * @param {Number} d Any number\n */\nexport function floatTwo(d) {\n\treturn parseFloat(d.toFixed(2));\n}\n\n/**\n * Returns whether or not two given arrays are equal.\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n */\nexport function arraysEqual(arr1, arr2) {\n\tif(arr1.length !== arr2.length) return false;\n\tlet areEqual = true;\n\tarr1.map((d, i) => {\n\t\tif(arr2[i] !== d) areEqual = false;\n\t});\n\treturn areEqual;\n}\n\n/**\n * Shuffles array in place. ES6 version\n * @param {Array} array An array containing the items.\n */\nexport function shuffle(array) {\n\t// Awesomeness: https://bost.ocks.org/mike/shuffle/\n\t// https://stackoverflow.com/a/2450976/6495043\n\t// https://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array?noredirect=1&lq=1\n\n\tfor (let i = array.length - 1; i > 0; i--) {\n\t\tlet j = Math.floor(Math.random() * (i + 1));\n\t\t[array[i], array[j]] = [array[j], array[i]];\n\t}\n\n\treturn array;\n}\n\n/**\n * Fill an array with extra points\n * @param {Array} array Array\n * @param {Number} count number of filler elements\n * @param {Object} element element to fill with\n * @param {Boolean} start fill at start?\n */\nexport function fillArray(array, count, element, start=false) {\n\tif(!element) {\n\t\telement = start ? array[0] : array[array.length - 1];\n\t}\n\tlet fillerArray = new Array(Math.abs(count)).fill(element);\n\tarray = start ? fillerArray.concat(array) : array.concat(fillerArray);\n\treturn array;\n}\n\n/**\n * Returns pixel width of string.\n * @param {String} string\n * @param {Number} charWidth Width of single char in pixels\n */\nexport function getStringWidth(string, charWidth) {\n\treturn (string+\"\").length * charWidth;\n}\n\nexport function bindChange(obj, getFn, setFn) {\n\treturn new Proxy(obj, {\n\t\tset: function(target, prop, value) {\n\t\t\tsetFn();\n\t\t\treturn Reflect.set(target, prop, value);\n\t\t},\n\t\tget: function(target, prop) {\n\t\t\tgetFn();\n\t\t\treturn Reflect.get(target, prop);\n\t\t}\n\t});\n}\n\n// https://stackoverflow.com/a/29325222\nexport function getRandomBias(min, max, bias, influence) {\n\tconst range = max - min;\n\tconst biasValue = range * bias + min;\n\tvar rnd = Math.random() * range + min,\t\t// random in range\n\t\tmix = Math.random() * influence;\t\t// random mixer\n\treturn rnd * (1 - mix) + biasValue * mix;\t// mix full range and bias\n}\n\nexport function getPositionByAngle(angle, radius) {\n\treturn {\n\t\tx: Math.sin(angle * ANGLE_RATIO) * radius,\n\t\ty: Math.cos(angle * ANGLE_RATIO) * radius,\n\t};\n}\n\n/**\n * Check if a number is valid for svg attributes\n * @param {object} candidate Candidate to test\n * @param {Boolean} nonNegative flag to treat negative number as invalid\n */\nexport function isValidNumber(candidate, nonNegative=false) {\n\tif (Number.isNaN(candidate)) return false;\n\telse if (candidate === undefined) return false;\n\telse if (!Number.isFinite(candidate)) return false;\n\telse if (nonNegative && candidate < 0) return false;\n\telse return true;\n}\n\n/**\n * Round a number to the closes precision, max max precision 4\n * @param {Number} d Any Number\n */\nexport function round(d) {\n\t// https://floating-point-gui.de/\n\t// https://www.jacklmoore.com/notes/rounding-in-javascript/\n\treturn Number(Math.round(d + 'e4') + 'e-4');\n}\n\n/**\n * Creates a deep clone of an object\n * @param {Object} candidate Any Object\n */\n export function deepClone(candidate) {\n\tlet cloned, value, key;\n \n\tif (candidate instanceof Date) {\n\t return new Date(candidate.getTime());\n\t}\n \n\tif (typeof candidate !== \"object\" || candidate === null) {\n\t return candidate;\n\t}\n \n\tcloned = Array.isArray(candidate) ? [] : {};\n \n\tfor (key in candidate) {\n\t value = candidate[key];\n \n\t cloned[key] = deepClone(value);\n\t}\n \n\treturn cloned;\n }","import { fillArray } from './helpers';\n\nexport function getBarHeightAndYAttr(yTop, zeroLine) {\n\tlet height, y;\n\tif (yTop <= zeroLine) {\n\t\theight = zeroLine - yTop;\n\t\ty = yTop;\n\t} else {\n\t\theight = yTop - zeroLine;\n\t\ty = zeroLine;\n\t}\n\n\treturn [height, y];\n}\n\nexport function equilizeNoOfElements(array1, array2,\n\textraCount = array2.length - array1.length) {\n\n\t// Doesn't work if either has zero elements.\n\tif(extraCount > 0) {\n\t\tarray1 = fillArray(array1, extraCount);\n\t} else {\n\t\tarray2 = fillArray(array2, extraCount);\n\t}\n\treturn [array1, array2];\n}\n\nexport function truncateString(txt, len) {\n\tif (!txt) {\n\t\treturn;\n\t}\n\tif (txt.length > len) {\n\t\treturn txt.slice(0, len-3) + '...';\n\t} else {\n\t\treturn txt;\n\t}\n}\n\nexport function shortenLargeNumber(label) {\n\tlet number;\n\tif (typeof label === 'number') number = label;\n\telse if (typeof label === 'string') {\n\t\tnumber = Number(label);\n\t\tif (Number.isNaN(number)) return label;\n\t}\n\n\t// Using absolute since log wont work for negative numbers\n\tlet p = Math.floor(Math.log10(Math.abs(number)));\n\tif (p <= 2) return number; // Return as is for a 3 digit number of less\n\tlet\tl = Math.floor(p / 3);\n\tlet shortened = (Math.pow(10, p - l * 3) * +(number / Math.pow(10, p)).toFixed(1));\n\n\t// Correct for floating point error upto 2 decimal places\n\treturn Math.round(shortened*100)/100 + ' ' + ['', 'K', 'M', 'B', 'T'][l];\n}\n\n// cubic bezier curve calculation (from example by François Romain)\nexport function getSplineCurvePointsStr(xList, yList) {\n\n\tlet points=[];\n\tfor(let i=0;i {\n\t\tlet lengthX = pointB[0] - pointA[0];\n\t\tlet lengthY = pointB[1] - pointA[1];\n\t\treturn {\n\t\t\tlength: Math.sqrt(Math.pow(lengthX, 2) + Math.pow(lengthY, 2)),\n\t\t\tangle: Math.atan2(lengthY, lengthX)\n\t\t};\n\t};\n \n\tlet controlPoint = (current, previous, next, reverse) => {\n\t\tlet p = previous || current;\n\t\tlet n = next || current;\n\t\tlet o = line(p, n);\n\t\tlet angle = o.angle + (reverse ? Math.PI : 0);\n\t\tlet length = o.length * smoothing;\n\t\tlet x = current[0] + Math.cos(angle) * length;\n\t\tlet y = current[1] + Math.sin(angle) * length;\n\t\treturn [x, y];\n\t};\n \n\tlet bezierCommand = (point, i, a) => {\n\t\tlet cps = controlPoint(a[i - 1], a[i - 2], point);\n\t\tlet cpe = controlPoint(point, a[i - 1], a[i + 1], true);\n\t\treturn `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;\n\t};\n \n\tlet pointStr = (points, command) => {\n\t\treturn points.reduce((acc, point, i, a) => i === 0\n\t\t\t? `${point[0]},${point[1]}`\n\t\t\t: `${acc} ${command(point, i, a)}`, '');\n\t};\n \n\treturn pointStr(points, bezierCommand);\n}\n","const PRESET_COLOR_MAP = {\n\t'light-blue': '#7cd6fd',\n\t'blue': '#5e64ff',\n\t'violet': '#743ee2',\n\t'red': '#ff5858',\n\t'orange': '#ffa00a',\n\t'yellow': '#feef72',\n\t'green': '#28a745',\n\t'light-green': '#98d85b',\n\t'purple': '#b554ff',\n\t'magenta': '#ffa3ef',\n\t'black': '#36114C',\n\t'grey': '#bdd3e6',\n\t'light-grey': '#f0f4f7',\n\t'dark-grey': '#b8c2cc'\n};\n\nfunction limitColor(r){\n\tif (r > 255) return 255;\n\telse if (r < 0) return 0;\n\treturn r;\n}\n\nexport function lightenDarkenColor(color, amt) {\n\tlet col = getColor(color);\n\tlet usePound = false;\n\tif (col[0] == \"#\") {\n\t\tcol = col.slice(1);\n\t\tusePound = true;\n\t}\n\tlet num = parseInt(col,16);\n\tlet r = limitColor((num >> 16) + amt);\n\tlet b = limitColor(((num >> 8) & 0x00FF) + amt);\n\tlet g = limitColor((num & 0x0000FF) + amt);\n\treturn (usePound?\"#\":\"\") + (g | (b << 8) | (r << 16)).toString(16);\n}\n\nexport function isValidColor(string) {\n\t// https://stackoverflow.com/a/32685393\n\tlet HEX_RE = /(^\\s*)(#)((?:[A-Fa-f0-9]{3}){1,2})$/i;\n\tlet RGB_RE = /(^\\s*)(rgb|hsl)(a?)[(]\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*,\\s*([\\d.]+\\s*%?)\\s*(?:,\\s*([\\d.]+)\\s*)?[)]$/i;\n\treturn HEX_RE.test(string) || RGB_RE.test(string);\n}\n\nexport const getColor = (color) => {\n\t// When RGB color, convert to hexadecimal (alpha value is omitted)\n\tif((/rgb[a]{0,1}\\([\\d, ]+\\)/gim).test(color)) {\n\t\treturn (/\\D+(\\d*)\\D+(\\d*)\\D+(\\d*)/gim).exec(color)\n\t\t\t.map((x, i) => (i !== 0 ? Number(x).toString(16) : '#'))\n\t\t\t.reduce((c, ch) => `${c}${ch}`);\n\t}\n\treturn PRESET_COLOR_MAP[color] || color;\n};\n","import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';\nimport { getStringWidth, isValidNumber } from './helpers';\nimport { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';\nimport { lightenDarkenColor } from './colors';\n\nexport const AXIS_TICK_LENGTH = 6;\nconst LABEL_MARGIN = 4;\nconst LABEL_WIDTH = 25;\nconst LABEL_MAX_CHARS = 15;\nconst TOTAL_PADDING = 120;\nexport const FONT_SIZE = 10;\nconst BASE_LINE_COLOR = '#dadada';\nconst FONT_FILL = '#555b51';\n\nfunction $(expr, con) {\n\treturn typeof expr === \"string\"? (con || document).querySelector(expr) : expr || null;\n}\n\nexport function createSVG(tag, o) {\n\tvar element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n\n\tfor (var i in o) {\n\t\tvar val = o[i];\n\n\t\tif (i === \"inside\") {\n\t\t\t$(val).appendChild(element);\n\t\t}\n\t\telse if (i === \"around\") {\n\t\t\tvar ref = $(val);\n\t\t\tref.parentNode.insertBefore(element, ref);\n\t\t\telement.appendChild(ref);\n\n\t\t} else if (i === \"styles\") {\n\t\t\tif(typeof val === \"object\") {\n\t\t\t\tObject.keys(val).map(prop => {\n\t\t\t\t\telement.style[prop] = val[prop];\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif(i === \"className\") { i = \"class\"; }\n\t\t\tif(i === \"innerHTML\") {\n\t\t\t\telement['textContent'] = val;\n\t\t\t} else {\n\t\t\t\telement.setAttribute(i, val);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn element;\n}\n\nfunction renderVerticalGradient(svgDefElem, gradientId) {\n\treturn createSVG('linearGradient', {\n\t\tinside: svgDefElem,\n\t\tid: gradientId,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: 0,\n\t\ty2: 1\n\t});\n}\n\nfunction setGradientStop(gradElem, offset, color, opacity) {\n\treturn createSVG('stop', {\n\t\t'inside': gradElem,\n\t\t'style': `stop-color: ${color}`,\n\t\t'offset': offset,\n\t\t'stop-opacity': opacity\n\t});\n}\n\nexport function makeSVGContainer(parent, className, width, height) {\n\treturn createSVG('svg', {\n\t\tclassName: className,\n\t\tinside: parent,\n\t\twidth: width,\n\t\theight: height\n\t});\n}\n\nexport function makeSVGDefs(svgContainer) {\n\treturn createSVG('defs', {\n\t\tinside: svgContainer,\n\t});\n}\n\nexport function makeSVGGroup(className, transform='', parent=undefined) {\n\tlet args = {\n\t\tclassName: className,\n\t\ttransform: transform\n\t};\n\tif(parent) args.inside = parent;\n\treturn createSVG('g', args);\n}\n\nexport function wrapInSVGGroup(elements, className='') {\n\tlet g = createSVG('g', {\n\t\tclassName: className\n\t});\n\telements.forEach(e => g.appendChild(e));\n\treturn g;\n}\n\nexport function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {\n\treturn createSVG('path', {\n\t\tclassName: className,\n\t\td: pathStr,\n\t\tstyles: {\n\t\t\tstroke: stroke,\n\t\t\tfill: fill,\n\t\t\t'stroke-width': strokeWidth\n\t\t}\n\t});\n}\n\nexport function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];\n\treturn `M${center.x} ${center.y}\n\t\tL${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc} z\n\t\tL${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY} z`;\n}\n\nexport function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){\n\tlet [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];\n\tlet [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];\n\n\treturn `M${arcStartX} ${arcStartY}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${midArc}\n\t\tM${arcStartX} ${midArc}\n\t\tA ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}\n\t\t${arcEndX} ${arcEndY}`;\n}\n\nexport function makeGradient(svgDefElem, color, lighter = false) {\n\tlet gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');\n\tlet gradientDef = renderVerticalGradient(svgDefElem, gradientId);\n\tlet opacities = [1, 0.6, 0.2];\n\tif(lighter) {\n\t\topacities = [0.4, 0.2, 0];\n\t}\n\n\tsetGradientStop(gradientDef, \"0%\", color, opacities[0]);\n\tsetGradientStop(gradientDef, \"50%\", color, opacities[1]);\n\tsetGradientStop(gradientDef, \"100%\", color, opacities[2]);\n\n\treturn gradientId;\n}\n\nexport function percentageBar(x, y, width, height,\n\tdepth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {\n\n\tlet args = {\n\t\tclassName: 'percentage-bar',\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height,\n\t\tfill: fill,\n\t\tstyles: {\n\t\t\t'stroke': lightenDarkenColor(fill, -25),\n\t\t\t// Diabolically good: https://stackoverflow.com/a/9000859\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n\t\t\t'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,\n\t\t\t'stroke-width': depth\n\t\t},\n\t};\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function heatSquare(className, x, y, size, radius, fill='none', data={}) {\n\tlet args = {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: size,\n\t\theight: size,\n\t\trx: radius,\n\t\tfill: fill\n\t};\n\n\tObject.keys(data).map(key => {\n\t\targs[key] = data[key];\n\t});\n\n\treturn createSVG(\"rect\", args);\n}\n\nexport function legendBar(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-bar',\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: size,\n\t\theight: '2px',\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE * 2) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"rect\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function legendDot(x, y, size, fill='none', label, truncate=false) {\n\tlabel = truncate ? truncateString(label, LABEL_MAX_CHARS) : label;\n\n\tlet args = {\n\t\tclassName: 'legend-dot',\n\t\tcx: 0,\n\t\tcy: 0,\n\t\tr: size,\n\t\tfill: fill\n\t};\n\tlet text = createSVG('text', {\n\t\tclassName: 'legend-dataset-text',\n\t\tx: 0,\n\t\ty: 0,\n\t\tdx: (FONT_SIZE) + 'px',\n\t\tdy: (FONT_SIZE/3) + 'px',\n\t\t'font-size': (FONT_SIZE * 1.2) + 'px',\n\t\t'text-anchor': 'start',\n\t\tfill: FONT_FILL,\n\t\tinnerHTML: label\n\t});\n\n\tlet group = createSVG('g', {\n\t\ttransform: `translate(${x}, ${y})`\n\t});\n\tgroup.appendChild(createSVG(\"circle\", args));\n\tgroup.appendChild(text);\n\n\treturn group;\n}\n\nexport function makeText(className, x, y, content, options = {}) {\n\tlet fontSize = options.fontSize || FONT_SIZE;\n\tlet dy = options.dy !== undefined ? options.dy : (fontSize / 2);\n\tlet fill = options.fill || FONT_FILL;\n\tlet textAnchor = options.textAnchor || 'start';\n\treturn createSVG('text', {\n\t\tclassName: className,\n\t\tx: x,\n\t\ty: y,\n\t\tdy: dy + 'px',\n\t\t'font-size': fontSize + 'px',\n\t\tfill: fill,\n\t\t'text-anchor': textAnchor,\n\t\tinnerHTML: content\n\t});\n}\n\nfunction makeVertLine(x, label, y1, y2, options={}) {\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tlet l = createSVG('line', {\n\t\tclassName: 'line-vertical ' + options.className,\n\t\tx1: 0,\n\t\tx2: 0,\n\t\ty1: y1,\n\t\ty2: y2,\n\t\tstyles: {\n\t\t\tstroke: options.stroke\n\t\t}\n\t});\n\n\tlet text = createSVG('text', {\n\t\tx: 0,\n\t\ty: y1 > y2 ? y1 + LABEL_MARGIN : y1 - LABEL_MARGIN - FONT_SIZE,\n\t\tdy: FONT_SIZE + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'middle',\n\t\tinnerHTML: label + \"\"\n\t});\n\n\tlet line = createSVG('g', {\n\t\ttransform: `translate(${ x }, 0)`\n\t});\n\n\tline.appendChild(l);\n\tline.appendChild(text);\n\n\treturn line;\n}\n\nfunction makeHoriLine(y, label, x1, x2, options = {}) {\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.lineType) options.lineType = '';\n if (!options.alignment) options.alignment = 'left';\n if (options.shortenNumbers) label = shortenLargeNumber(label);\n\n let className =\n 'line-horizontal ' +\n options.className +\n (options.lineType === 'dashed' ? 'dashed' : '');\n\n\tconst textXPos = options.alignment === 'left' ? \n\t\toptions.title ? (x1 - LABEL_MARGIN) + LABEL_WIDTH : x1 - LABEL_MARGIN : \n\t\toptions.title ? (x2 + LABEL_MARGIN * 4) - LABEL_WIDTH : x2 + LABEL_MARGIN * 4;\n\tconst lineX1Post = options.title ? x1 + LABEL_WIDTH : x1;\n\tconst lineX2Post = options.title ? x2 - LABEL_WIDTH : x2;\n\n let l = createSVG('line', {\n className: className,\n x1: lineX1Post,\n x2: lineX2Post,\n y1: 0,\n y2: 0,\n styles: {\n stroke: options.stroke\n }\n });\n\t\n let text = createSVG('text', {\n x: textXPos,\n y: 0,\n dy: FONT_SIZE / 2 - 2 + 'px',\n 'font-size': FONT_SIZE + 'px',\n 'text-anchor': x1 < x2 ? 'end' : 'start',\n innerHTML: label + ''\n });\n\n let line = createSVG('g', {\n transform: `translate(0, ${y})`,\n 'stroke-opacity': 1\n });\n\n if (text === 0 || text === '0') {\n line.style.stroke = 'rgba(27, 31, 35, 0.6)';\n }\n\n line.appendChild(l);\n line.appendChild(text);\n\n return line;\n}\n\nexport function generateAxisLabel(options) {\n if (!options.title) return;\n\n const y = options.position === 'left' ? \n\t\t(options.height - TOTAL_PADDING) / 2 + (getStringWidth(options.title, 5) / 2) : \n\t\t(options.height - TOTAL_PADDING) / 2 - (getStringWidth(options.title, 5) / 2) ;\n\tconst x = options.position === 'left' ? 0 : options.width;\n\tconst y2 = options.position === 'left' ? FONT_SIZE - LABEL_WIDTH : FONT_SIZE + LABEL_WIDTH * -1;\n\n const rotation =\n options.position === 'right'\n ? `rotate(90)`\n : `rotate(270)`;\n\n const labelSvg = createSVG('text', {\n className: 'chart-label',\n x: 0, // getStringWidth(options.title, 5) / 2,\n y: 0, // y,\n dy: `${y2}px`,\n 'font-size': `${FONT_SIZE}px`,\n 'text-anchor': 'start',\n innerHTML: `${options.title} `\n });\n\n\tlet wrapper = createSVG('g', {\n\t\tx: 0,\n\t\ty: 0,\n\t\ttransformBox: 'fill-box',\n\t\ttransform: `translate(${x}, ${y}) ${rotation}`,\n\t\tclassName: `test-${options.position}`\n\t});\n\n\twrapper.appendChild(labelSvg);\n\n return wrapper;\n}\n\nexport function yLine(y, label, width, options = {}) {\n if (!isValidNumber(y)) y = 0;\n\n if (!options.pos) options.pos = 'left';\n if (!options.offset) options.offset = 0;\n if (!options.mode) options.mode = 'span';\n if (!options.stroke) options.stroke = BASE_LINE_COLOR;\n if (!options.className) options.className = '';\n\n let x1 = -1 * AXIS_TICK_LENGTH;\n let x2 = options.mode === 'span' ? width + AXIS_TICK_LENGTH : 0;\n\n if (options.mode === 'tick' && options.pos === 'right') {\n x1 = width + AXIS_TICK_LENGTH;\n x2 = width;\n }\n\n let offset = options.pos === 'left' ? -1 * options.offset : options.offset;\n\n x1 += offset;\n x2 += offset;\n\n return makeHoriLine(y, label, x1, x2, {\n stroke: options.stroke,\n className: options.className,\n lineType: options.lineType,\n alignment: options.pos,\n\t\ttitle: options.title,\n shortenNumbers: options.shortenNumbers\n });\n}\n\nexport function xLine(x, label, height, options={}) {\n\tif (!isValidNumber(x)) x = 0;\n\n\tif(!options.pos) options.pos = 'bottom';\n\tif(!options.offset) options.offset = 0;\n\tif(!options.mode) options.mode = 'span';\n\tif(!options.stroke) options.stroke = BASE_LINE_COLOR;\n\tif(!options.className) options.className = '';\n\n\t// Draw X axis line in span/tick mode with optional label\n\t// \ty2(span)\n\t// \t\t\t\t\t\t|\n\t// \t\t\t\t\t\t|\n\t//\t\t\t\tx line\t|\n\t//\t\t\t\t\t\t|\n\t// \t\t\t\t\t \t|\n\t// ---------------------+-- y2(tick)\n\t//\t\t\t\t\t\t|\n\t//\t\t\t\t\t\t\ty1\n\n\tlet y1 = height + AXIS_TICK_LENGTH;\n\tlet y2 = options.mode === 'span' ? -1 * AXIS_TICK_LENGTH : height;\n\n\tif(options.mode === 'tick' && options.pos === 'top') {\n\t\t// top axis ticks\n\t\ty1 = -1 * AXIS_TICK_LENGTH;\n\t\ty2 = 0;\n\t}\n\n\treturn makeVertLine(x, label, y1, y2, {\n\t\tstroke: options.stroke,\n\t\tclassName: options.className,\n\t\tlineType: options.lineType\n\t});\n}\n\nexport function yMarker(y, label, width, options={}) {\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label, 5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet line = makeHoriLine(y, '', 0, width, {\n\t\tstroke: options.stroke || BASE_LINE_COLOR,\n\t\tclassName: options.className || '',\n\t\tlineType: options.lineType\n\t});\n\n\tline.appendChild(labelSvg);\n\n\treturn line;\n}\n\nexport function yRegion(y1, y2, width, label, options={}) {\n\t// return a group\n\tlet height = y1 - y2;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`, // remove class\n\t\tstyles: {\n\t\t\tfill: `rgba(228, 234, 239, 0.49)`,\n\t\t\tstroke: BASE_LINE_COLOR,\n\t\t\t'stroke-dasharray': `${width}, ${height}`\n\t\t},\n\t\t// 'data-point-index': index,\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tif(!options.labelPos) options.labelPos = 'right';\n\tlet x = options.labelPos === 'left' ? LABEL_MARGIN\n\t\t: width - getStringWidth(label+\"\", 4.5) - LABEL_MARGIN;\n\n\tlet labelSvg = createSVG('text', {\n\t\tclassName: 'chart-label',\n\t\tx: x,\n\t\ty: 0,\n\t\tdy: (FONT_SIZE / -2) + 'px',\n\t\t'font-size': FONT_SIZE + 'px',\n\t\t'text-anchor': 'start',\n\t\tinnerHTML: label+\"\"\n\t});\n\n\tlet region = createSVG('g', {\n\t\ttransform: `translate(0, ${y2})`\n\t});\n\n\tregion.appendChild(rect);\n\tregion.appendChild(labelSvg);\n\n\treturn region;\n}\n\nexport function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\n\tif(height === 0) {\n\t\theight = meta.minHeight;\n\t\ty -= meta.minHeight;\n\t}\n\n\t// Preprocess numbers to avoid svg building errors\n\tif (!isValidNumber(x)) x = 0;\n\tif (!isValidNumber(y)) y = 0;\n\tif (!isValidNumber(height, true)) height = 0;\n\tif (!isValidNumber(width, true)) width = 0;\n\n\tlet rect = createSVG('rect', {\n\t\tclassName: `bar mini`,\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tx: x,\n\t\ty: y,\n\t\twidth: width,\n\t\theight: height\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn rect;\n\t} else {\n\t\trect.setAttribute('y', 0);\n\t\trect.setAttribute('x', 0);\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: width/2,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(rect);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function datasetDot(x, y, radius, color, label='', index=0) {\n\tlet dot = createSVG('circle', {\n\t\tstyle: `fill: ${color}`,\n\t\t'data-point-index': index,\n\t\tcx: x,\n\t\tcy: y,\n\t\tr: radius\n\t});\n\n\tlabel += \"\";\n\n\tif(!label && !label.length) {\n\t\treturn dot;\n\t} else {\n\t\tdot.setAttribute('cy', 0);\n\t\tdot.setAttribute('cx', 0);\n\n\t\tlet text = createSVG('text', {\n\t\t\tclassName: 'data-point-value',\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tdy: (FONT_SIZE / 2 * -1 - radius) + 'px',\n\t\t\t'font-size': FONT_SIZE + 'px',\n\t\t\t'text-anchor': 'middle',\n\t\t\tinnerHTML: label\n\t\t});\n\n\t\tlet group = createSVG('g', {\n\t\t\t'data-point-index': index,\n\t\t\ttransform: `translate(${x}, ${y})`\n\t\t});\n\t\tgroup.appendChild(dot);\n\t\tgroup.appendChild(text);\n\n\t\treturn group;\n\t}\n}\n\nexport function getPaths(xList, yList, color, options={}, meta={}) {\n\tlet pointsList = yList.map((y, i) => (xList[i] + ',' + y));\n\tlet pointsStr = pointsList.join(\"L\");\n\n\t// Spline\n\tif (options.spline)\n\t\tpointsStr = getSplineCurvePointsStr(xList, yList);\n\n\tlet path = makePath(\"M\"+pointsStr, 'line-graph-path', color);\n\n\t// HeatLine\n\tif(options.heatline) {\n\t\tlet gradient_id = makeGradient(meta.svgDefs, color);\n\t\tpath.style.stroke = `url(#${gradient_id})`;\n\t}\n\n\tlet paths = {\n\t\tpath: path\n\t};\n\n\t// Region\n\tif(options.regionFill) {\n\t\tlet gradient_id_region = makeGradient(meta.svgDefs, color, true);\n\n\t\tlet pathStr = \"M\" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;\n\t\tpaths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);\n\t}\n\n\treturn paths;\n}\n\nexport let makeOverlay = {\n\t'bar': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\toverlay.style.fill = '#000000';\n\t\toverlay.style.opacity = '0.4';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'dot': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t},\n\n\t'heat_square': (unit) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet overlay = unit.cloneNode();\n\t\tlet radius = unit.getAttribute('r');\n\t\tlet fill = unit.getAttribute('fill');\n\t\toverlay.setAttribute('r', parseInt(radius) + DOT_OVERLAY_SIZE_INCR);\n\t\toverlay.setAttribute('fill', fill);\n\t\toverlay.style.opacity = '0.6';\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t\treturn overlay;\n\t}\n};\n\nexport let updateOverlay = {\n\t'bar': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'rect') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['x', 'y', 'width', 'height'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'dot': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n\n\t'heat_square': (unit, overlay) => {\n\t\tlet transformValue;\n\t\tif(unit.nodeName !== 'circle') {\n\t\t\ttransformValue = unit.getAttribute('transform');\n\t\t\tunit = unit.childNodes[0];\n\t\t}\n\t\tlet attributes = ['cx', 'cy'];\n\t\tObject.values(unit.attributes)\n\t\t\t.filter(attr => attributes.includes(attr.name) && attr.specified)\n\t\t\t.map(attr => {\n\t\t\t\toverlay.setAttribute(attr.name, attr.nodeValue);\n\t\t\t});\n\n\t\tif(transformValue) {\n\t\t\toverlay.setAttribute('transform', transformValue);\n\t\t}\n\t},\n};\n","import { getBarHeightAndYAttr, getSplineCurvePointsStr } from './draw-utils';\n\nexport const UNIT_ANIM_DUR = 350;\nexport const PATH_ANIM_DUR = 350;\nexport const MARKER_LINE_ANIM_DUR = UNIT_ANIM_DUR;\nexport const REPLACE_ALL_NEW_DUR = 250;\n\nexport const STD_EASING = 'easein';\n\nexport function translate(unit, oldCoord, newCoord, duration) {\n\tlet old = typeof oldCoord === 'string' ? oldCoord : oldCoord.join(', ');\n\treturn [\n\t\tunit,\n\t\t{transform: newCoord.join(', ')},\n\t\tduration,\n\t\tSTD_EASING,\n\t\t\"translate\",\n\t\t{transform: old}\n\t];\n}\n\nexport function translateVertLine(xLine, newX, oldX) {\n\treturn translate(xLine, [oldX, 0], [newX, 0], MARKER_LINE_ANIM_DUR);\n}\n\nexport function translateHoriLine(yLine, newY, oldY) {\n\treturn translate(yLine, [0, oldY], [0, newY], MARKER_LINE_ANIM_DUR);\n}\n\nexport function animateRegion(rectGroup, newY1, newY2, oldY2) {\n\tlet newHeight = newY1 - newY2;\n\tlet rect = rectGroup.childNodes[0];\n\tlet width = rect.getAttribute(\"width\");\n\tlet rectAnim = [\n\t\trect,\n\t\t{ height: newHeight, 'stroke-dasharray': `${width}, ${newHeight}` },\n\t\tMARKER_LINE_ANIM_DUR,\n\t\tSTD_EASING\n\t];\n\n\tlet groupAnim = translate(rectGroup, [0, oldY2], [0, newY2], MARKER_LINE_ANIM_DUR);\n\treturn [rectAnim, groupAnim];\n}\n\nexport function animateBar(bar, x, yTop, width, offset=0, meta={}) {\n\tlet [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);\n\ty -= offset;\n\tif(bar.nodeName !== 'rect') {\n\t\tlet rect = bar.childNodes[0];\n\t\tlet rectAnim = [\n\t\t\trect,\n\t\t\t{width: width, height: height},\n\t\t\tUNIT_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\n\t\tlet oldCoordStr = bar.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(bar, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [rectAnim, groupAnim];\n\t} else {\n\t\treturn [[bar, {width: width, height: height, x: x, y: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// bar.animate({height: args.newHeight, y: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animateDot(dot, x, y) {\n\tif(dot.nodeName !== 'circle') {\n\t\tlet oldCoordStr = dot.getAttribute(\"transform\").split(\"(\")[1].slice(0, -1);\n\t\tlet groupAnim = translate(dot, oldCoordStr, [x, y], MARKER_LINE_ANIM_DUR);\n\t\treturn [groupAnim];\n\t} else {\n\t\treturn [[dot, {cx: x, cy: y}, UNIT_ANIM_DUR, STD_EASING]];\n\t}\n\t// dot.animate({cy: yTop}, UNIT_ANIM_DUR, mina.easein);\n}\n\nexport function animatePath(paths, newXList, newYList, zeroLine, spline) {\n\tlet pathComponents = [];\n\tlet pointsStr = newYList.map((y, i) => (newXList[i] + ',' + y)).join(\"L\");\n\n\tif (spline)\n\t\tpointsStr = getSplineCurvePointsStr(newXList, newYList);\n\n\tconst animPath = [paths.path, {d:\"M\" + pointsStr}, PATH_ANIM_DUR, STD_EASING];\n\tpathComponents.push(animPath);\n\n\tif(paths.region) {\n\t\tlet regStartPt = `${newXList[0]},${zeroLine}L`;\n\t\tlet regEndPt = `L${newXList.slice(-1)[0]}, ${zeroLine}`;\n\n\t\tconst animRegion = [\n\t\t\tpaths.region,\n\t\t\t{d:\"M\" + regStartPt + pointsStr + regEndPt},\n\t\t\tPATH_ANIM_DUR,\n\t\t\tSTD_EASING\n\t\t];\n\t\tpathComponents.push(animRegion);\n\t}\n\n\treturn pathComponents;\n}\n\nexport function animatePathStr(oldPath, pathStr) {\n\treturn [oldPath, {d: pathStr}, UNIT_ANIM_DUR, STD_EASING];\n}\n","// Leveraging SMIL Animations\n\nimport { REPLACE_ALL_NEW_DUR } from './animate';\n\nconst EASING = {\n\tease: \"0.25 0.1 0.25 1\",\n\tlinear: \"0 0 1 1\",\n\t// easein: \"0.42 0 1 1\",\n\teasein: \"0.1 0.8 0.2 1\",\n\teaseout: \"0 0 0.58 1\",\n\teaseinout: \"0.42 0 0.58 1\"\n};\n\nfunction animateSVGElement(element, props, dur, easingType=\"linear\", type=undefined, oldValues={}) {\n\n\tlet animElement = element.cloneNode(true);\n\tlet newElement = element.cloneNode(true);\n\n\tfor(var attributeName in props) {\n\t\tlet animateElement;\n\t\tif(attributeName === 'transform') {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animateTransform\");\n\t\t} else {\n\t\t\tanimateElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"animate\");\n\t\t}\n\t\tlet currentValue = oldValues[attributeName] || element.getAttribute(attributeName);\n\t\tlet value = props[attributeName];\n\n\t\tlet animAttr = {\n\t\t\tattributeName: attributeName,\n\t\t\tfrom: currentValue,\n\t\t\tto: value,\n\t\t\tbegin: \"0s\",\n\t\t\tdur: dur/1000 + \"s\",\n\t\t\tvalues: currentValue + \";\" + value,\n\t\t\tkeySplines: EASING[easingType],\n\t\t\tkeyTimes: \"0;1\",\n\t\t\tcalcMode: \"spline\",\n\t\t\tfill: 'freeze'\n\t\t};\n\n\t\tif(type) {\n\t\t\tanimAttr[\"type\"] = type;\n\t\t}\n\n\t\tfor (var i in animAttr) {\n\t\t\tanimateElement.setAttribute(i, animAttr[i]);\n\t\t}\n\n\t\tanimElement.appendChild(animateElement);\n\n\t\tif(type) {\n\t\t\tnewElement.setAttribute(attributeName, `translate(${value})`);\n\t\t} else {\n\t\t\tnewElement.setAttribute(attributeName, value);\n\t\t}\n\t}\n\n\treturn [animElement, newElement];\n}\n\nexport function transform(element, style) { // eslint-disable-line no-unused-vars\n\telement.style.transform = style;\n\telement.style.webkitTransform = style;\n\telement.style.msTransform = style;\n\telement.style.mozTransform = style;\n\telement.style.oTransform = style;\n}\n\nfunction animateSVG(svgContainer, elements) {\n\tlet newElements = [];\n\tlet animElements = [];\n\n\telements.map(element => {\n\t\tlet unit = element[0];\n\t\tlet parent = unit.parentNode;\n\n\t\tlet animElement, newElement;\n\n\t\telement[0] = unit;\n\t\t[animElement, newElement] = animateSVGElement(...element);\n\n\t\tnewElements.push(newElement);\n\t\tanimElements.push([animElement, parent]);\n\t\t\n\t\tif (parent) {\n\t\t\tparent.replaceChild(animElement, unit);\n\t\t}\n\t});\n\n\tlet animSvg = svgContainer.cloneNode(true);\n\n\tanimElements.map((animElement, i) => {\n\t\tif (animElement[1]) {\n\t\t\tanimElement[1].replaceChild(newElements[i], animElement[0]);\n\t\t\telements[i][0] = newElements[i];\n\t\t}\n\t});\n\n\treturn animSvg;\n}\n\nexport function runSMILAnimation(parent, svgElement, elementsToAnimate) {\n\tif(elementsToAnimate.length === 0) return;\n\n\tlet animSvgElement = animateSVG(svgElement, elementsToAnimate);\n\tif(svgElement.parentNode == parent) {\n\t\tparent.removeChild(svgElement);\n\t\tparent.appendChild(animSvgElement);\n\n\t}\n\n\t// Replace the new svgElement (data has already been replaced)\n\tsetTimeout(() => {\n\t\tif(animSvgElement.parentNode == parent) {\n\t\t\tparent.removeChild(animSvgElement);\n\t\t\tparent.appendChild(svgElement);\n\t\t}\n\t}, REPLACE_ALL_NEW_DUR);\n}\n","import { $ } from '../utils/dom';\nimport { CSSTEXT } from '../../css/chartsCss';\n\nexport function downloadFile(filename, data) {\n\tvar a = document.createElement('a');\n\ta.style = \"display: none\";\n\tvar blob = new Blob(data, {type: \"image/svg+xml; charset=utf-8\"});\n\tvar url = window.URL.createObjectURL(blob);\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\tsetTimeout(function(){\n\t\tdocument.body.removeChild(a);\n\t\twindow.URL.revokeObjectURL(url);\n\t}, 300);\n}\n\nexport function prepareForExport(svg) {\n\tlet clone = svg.cloneNode(true);\n\tclone.classList.add('chart-container');\n\tclone.setAttribute('xmlns', \"http://www.w3.org/2000/svg\");\n\tclone.setAttribute('xmlns:xlink', \"http://www.w3.org/1999/xlink\");\n\tlet styleEl = $.create('style', {\n\t\t'innerHTML': CSSTEXT\n\t});\n\tclone.insertBefore(styleEl, clone.firstChild);\n\n\tlet container = $.create('div');\n\tcontainer.appendChild(clone);\n\n\treturn container.innerHTML;\n}\n","// Playing around with dates\n\nexport const NO_OF_YEAR_MONTHS = 12;\nexport const NO_OF_DAYS_IN_WEEK = 7;\nexport const DAYS_IN_YEAR = 375;\nexport const NO_OF_MILLIS = 1000;\nexport const SEC_IN_DAY = 86400;\n\nexport const MONTH_NAMES = [\"January\", \"February\", \"March\", \"April\", \"May\",\n\t\"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\nexport const MONTH_NAMES_SHORT = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n\t\"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nexport const DAY_NAMES_SHORT = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nexport const DAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\",\n\t\"Thursday\", \"Friday\", \"Saturday\"];\n\n// https://stackoverflow.com/a/11252167/6495043\nfunction treatAsUtc(date) {\n\tlet result = new Date(date);\n\tresult.setMinutes(result.getMinutes() - result.getTimezoneOffset());\n\treturn result;\n}\n\nexport function getYyyyMmDd(date) {\n\tlet dd = date.getDate();\n\tlet mm = date.getMonth() + 1; // getMonth() is zero-based\n\treturn [\n\t\tdate.getFullYear(),\n\t\t(mm>9 ? '' : '0') + mm,\n\t\t(dd>9 ? '' : '0') + dd\n\t].join('-');\n}\n\nexport function clone(date) {\n\treturn new Date(date.getTime());\n}\n\nexport function timestampSec(date) {\n\treturn date.getTime()/NO_OF_MILLIS;\n}\n\nexport function timestampToMidnight(timestamp, roundAhead = false) {\n\tlet midnightTs = Math.floor(timestamp - (timestamp % SEC_IN_DAY));\n\tif(roundAhead) {\n\t\treturn midnightTs + SEC_IN_DAY;\n\t}\n\treturn midnightTs;\n}\n\n// export function getMonthsBetween(startDate, endDate) {}\n\nexport function getWeeksBetween(startDate, endDate) {\n\tlet weekStartDate = setDayToSunday(startDate);\n\treturn Math.ceil(getDaysBetween(weekStartDate, endDate) / NO_OF_DAYS_IN_WEEK);\n}\n\nexport function getDaysBetween(startDate, endDate) {\n\tlet millisecondsPerDay = SEC_IN_DAY * NO_OF_MILLIS;\n\treturn (treatAsUtc(endDate) - treatAsUtc(startDate)) / millisecondsPerDay;\n}\n\nexport function areInSameMonth(startDate, endDate) {\n\treturn startDate.getMonth() === endDate.getMonth()\n\t\t&& startDate.getFullYear() === endDate.getFullYear();\n}\n\nexport function getMonthName(i, short=false) {\n\tlet monthName = MONTH_NAMES[i];\n\treturn short ? monthName.slice(0, 3) : monthName;\n}\n\nexport function getLastDateInMonth (month, year) {\n\treturn new Date(year, month + 1, 0); // 0: last day in previous month\n}\n\n// mutates\nexport function setDayToSunday(date) {\n\tlet newDate = clone(date);\n\tconst day = newDate.getDay();\n\tif(day !== 0) {\n\t\taddDays(newDate, (-1) * day);\n\t}\n\treturn newDate;\n}\n\n// mutates\nexport function addDays(date, numberOfDays) {\n\tdate.setDate(date.getDate() + numberOfDays);\n}\n","import { makeSVGGroup } from '../utils/draw';\nimport {\n makeText,\n makePath,\n xLine,\n yLine,\n generateAxisLabel,\n yMarker,\n yRegion,\n datasetBar,\n datasetDot,\n percentageBar,\n getPaths,\n heatSquare\n} from '../utils/draw';\nimport { equilizeNoOfElements } from '../utils/draw-utils';\nimport {\n translateHoriLine,\n translateVertLine,\n animateRegion,\n animateBar,\n animateDot,\n animatePath,\n animatePathStr\n} from '../utils/animate';\nimport { getMonthName } from '../utils/date-utils';\n\nclass ChartComponent {\n constructor({\n layerClass = '',\n layerTransform = '',\n constants,\n\n getData,\n makeElements,\n animateElements\n }) {\n this.layerTransform = layerTransform;\n this.constants = constants;\n\n this.makeElements = makeElements;\n this.getData = getData;\n\n this.animateElements = animateElements;\n\n this.store = [];\n this.labels = [];\n\n this.layerClass = layerClass;\n this.layerClass =\n typeof this.layerClass === 'function' ? this.layerClass() : this.layerClass;\n\n this.refresh();\n }\n\n refresh(data) {\n this.data = data || this.getData();\n }\n\n setup(parent) {\n this.layer = makeSVGGroup(this.layerClass, this.layerTransform, parent);\n }\n\n make() {\n this.render(this.data);\n this.oldData = this.data;\n }\n\n render(data) {\n this.store = this.makeElements(data);\n\n this.layer.textContent = '';\n this.store.forEach((element) => {\n element.length\n ? element.forEach((el) => {\n this.layer.appendChild(el);\n })\n : this.layer.appendChild(element);\n });\n this.labels.forEach((element) => {\n this.layer.appendChild(element);\n });\n }\n\n update(animate = true) {\n\t\tthis.refresh();\n\t\tlet animateElements = [];\n\t\tif(animate) {\n\t\t\tanimateElements = this.animateElements(this.data) || [];\n\t\t}\n\t\treturn animateElements;\n\t}\n}\n\nlet componentConfigs = {\n\tdonutSlices: {\n\t\tlayerClass: 'donut-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) => {\n\t\t\t\tlet slice = makePath(s, 'donut-path', data.colors[i], 'none', data.strokeWidth);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) => animatePathStr(slice, newData.sliceStrings[i]));\n\t\t},\n\t},\n\tpieSlices: {\n\t\tlayerClass: 'pie-slices',\n\t\tmakeElements(data) {\n\t\t\treturn data.sliceStrings.map((s, i) =>{\n\t\t\t\tlet slice = makePath(s, 'pie-path', 'none', data.colors[i]);\n\t\t\t\tslice.style.transition = 'transform .3s;';\n\t\t\t\treturn slice;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\treturn this.store.map((slice, i) =>\n\t\t\t\tanimatePathStr(slice, newData.sliceStrings[i])\n\t\t\t);\n\t\t}\n\t},\n\tpercentageBars: {\n\t\tlayerClass: 'percentage-bars',\n\t\tmakeElements(data) {\n\t\t\treturn data.xPositions.map((x, i) =>{\n\t\t\t\tlet y = 0;\n\t\t\t\tlet bar = percentageBar(x, y, data.widths[i],\n\t\t\t\t\tthis.constants.barHeight, this.constants.barDepth, data.colors[i]);\n\t\t\t\treturn bar;\n\t\t\t});\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n yAxis: {\n layerClass: 'y axis',\n makeElements(data) {\n let elements = [];\n\t\t\t// will loop through each yaxis dataset if it exists \n if (data.length) {\n data.forEach((item, i) => {\n item.positions.map((position, i) => {\n elements.push(\n yLine(position, item.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: item.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers,\n\t\t\t\t\t\t\t\ttitle: item.title\n })\n );\n });\n // we need to make yAxis titles if they are defined\n if (item.title) {\n elements.push(\n generateAxisLabel({\n title: item.title,\n position: item.pos,\n\t\t\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n width: this.constants.width\n })\n );\n }\n });\n\n return elements;\n }\n\n data.positions.forEach((position, i) => {\n elements.push(yLine(position, data.labels[i], this.constants.width, {\n mode: this.constants.mode,\n pos: data.pos || this.constants.pos,\n shortenNumbers: this.constants.shortenNumbers\n }));\n });\n\n\t\t\tif (data.title) {\n\t\t\t\telements.push(\n\t\t\t\t\tgenerateAxisLabel({\n\t\t\t\t\t\ttitle: data.title,\n\t\t\t\t\t\tposition: data.pos,\n\t\t\t\t\t\theight: this.constants.height || data.zeroLine,\n\t\t\t\t\t\twidth: this.constants.width\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn elements;\n },\n\n animateElements(newData) {\n const animateMultipleElements = (oldData, newData) => {\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = oldData.positions;\n let oldLabels = oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n };\n\n // we will need to animate both axis if we have more than one.\n // so check if the oldData is an array of values.\n if (this.oldData instanceof Array) {\n return this.oldData.forEach((old, i) => {\n animateMultipleElements(old, newData[i]);\n });\n }\n\n let newPos = newData.positions;\n let newLabels = newData.labels;\n let oldPos = this.oldData.positions;\n let oldLabels = this.oldData.labels;\n\n [oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n [oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n this.render({\n positions: oldPos,\n labels: newLabels\n });\n\n return this.store.map((line, i) => {\n return translateHoriLine(line, newPos[i], oldPos[i]);\n });\n }\n },\n\n\txAxis: {\n\t\tlayerClass: 'x axis',\n\t\tmakeElements(data) {\n\t\t\treturn data.positions.map((position, i) =>\n\t\t\t\txLine(position, data.calcLabels[i], this.constants.height,\n\t\t\t\t\t{mode: this.constants.mode, pos: this.constants.pos})\n\t\t\t);\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tlet newPos = newData.positions;\n\t\t\tlet newLabels = newData.calcLabels;\n\t\t\tlet oldPos = this.oldData.positions;\n\t\t\tlet oldLabels = this.oldData.calcLabels;\n\n\t\t\t[oldPos, newPos] = equilizeNoOfElements(oldPos, newPos);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\tpositions: oldPos,\n\t\t\t\tcalcLabels: newLabels\n\t\t\t});\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateVertLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyMarkers: {\n\t\tlayerClass: 'y-markers',\n\t\tmakeElements(data) {\n\t\t\treturn data.map((m) => \n\t\t\t\tyMarker(m.position, m.label, this.constants.width, {\n\t\t\t\t\tlabelPos: m.options.labelPos,\n\t\t\t\t\tmode: 'span',\n\t\t\t\t\tlineType: 'dashed'\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.position);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.position);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tposition: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\treturn this.store.map((line, i) => {\n\t\t\t\treturn translateHoriLine(\n\t\t\t\t\tline, newPos[i], oldPos[i]\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t},\n\n\tyRegions: {\n\t\tlayerClass: 'y-regions',\n\t\tmakeElements(data) {\n\t\t\treturn data.map(r =>\n\t\t\t\tyRegion(r.startPos, r.endPos, this.constants.width,\n\t\t\t\t\tr.label, {labelPos: r.options.labelPos})\n\t\t\t);\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\t[this.oldData, newData] = equilizeNoOfElements(this.oldData, newData);\n\n\t\t\tlet newPos = newData.map(d => d.endPos);\n\t\t\tlet newLabels = newData.map(d => d.label);\n\t\t\tlet newStarts = newData.map(d => d.startPos);\n\t\t\tlet newOptions = newData.map(d => d.options);\n\n\t\t\tlet oldPos = this.oldData.map(d => d.endPos);\n\t\t\tlet oldStarts = this.oldData.map(d => d.startPos);\n\n\t\t\tthis.render(oldPos.map((pos, i) => {\n\t\t\t\treturn {\n\t\t\t\t\tstartPos: oldStarts[i],\n\t\t\t\t\tendPos: oldPos[i],\n\t\t\t\t\tlabel: newLabels[i],\n\t\t\t\t\toptions: newOptions[i]\n\t\t\t\t};\n\t\t\t}));\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((rectGroup, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateRegion(\n\t\t\t\t\trectGroup, newStarts[i], newPos[i], oldPos[i]\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n\theatDomain: {\n\t\tlayerClass: function() { return 'heat-domain domain-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet {index, colWidth, rowHeight, squareSize, radius, xTranslate} = this.constants;\n\t\t\tlet monthNameHeight = -12;\n\t\t\tlet x = xTranslate, y = 0;\n\n\t\t\tthis.serializedSubDomains = [];\n\n\t\t\tdata.cols.map((week, weekNo) => {\n\t\t\t\tif(weekNo === 1) {\n\t\t\t\t\tthis.labels.push(\n\t\t\t\t\t\tmakeText('domain-name', x, monthNameHeight, getMonthName(index, true).toUpperCase(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfontSize: 9\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tweek.map((day, i) => {\n\t\t\t\t\tif(day.fill) {\n\t\t\t\t\t\tlet data = {\n\t\t\t\t\t\t\t'data-date': day.yyyyMmDd,\n\t\t\t\t\t\t\t'data-value': day.dataValue,\n\t\t\t\t\t\t\t'data-day': i\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet square = heatSquare('day', x, y, squareSize, radius, day.fill, data);\n\t\t\t\t\t\tthis.serializedSubDomains.push(square);\n\t\t\t\t\t}\n\t\t\t\t\ty += rowHeight;\n\t\t\t\t});\n\t\t\t\ty = 0;\n\t\t\t\tx += colWidth;\n\t\t\t});\n\n\t\t\treturn this.serializedSubDomains;\n\t\t},\n\n\t\tanimateElements(newData) {\n\t\t\tif(newData) return [];\n\t\t}\n\t},\n\n\tbarGraph: {\n\t\tlayerClass: function() { return 'dataset-units dataset-bars dataset-' + this.constants.index; },\n\t\tmakeElements(data) {\n\t\t\tlet c = this.constants;\n\t\t\tthis.unitType = 'bar';\n\t\t\tthis.units = data.yPositions.map((y, j) => {\n\t\t\t\treturn datasetBar(\n\t\t\t\t\tdata.xPositions[j],\n\t\t\t\t\ty,\n\t\t\t\t\tdata.barWidth,\n\t\t\t\t\tc.color,\n\t\t\t\t\tdata.labels[j],\n\t\t\t\t\tj,\n\t\t\t\t\tdata.offsets[j],\n\t\t\t\t\t{\n\t\t\t\t\t\tzeroLine: data.zeroLine,\n\t\t\t\t\t\tbarsWidth: data.barsWidth,\n\t\t\t\t\t\tminHeight: c.minHeight\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t\treturn this.units;\n\t\t},\n\t\tanimateElements(newData) {\n\t\t\tlet newXPos = newData.xPositions;\n\t\t\tlet newYPos = newData.yPositions;\n\t\t\tlet newOffsets = newData.offsets;\n\t\t\tlet newLabels = newData.labels;\n\n\t\t\tlet oldXPos = this.oldData.xPositions;\n\t\t\tlet oldYPos = this.oldData.yPositions;\n\t\t\tlet oldOffsets = this.oldData.offsets;\n\t\t\tlet oldLabels = this.oldData.labels;\n\n\t\t\t[oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n\t\t\t[oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n\t\t\t[oldOffsets, newOffsets] = equilizeNoOfElements(oldOffsets, newOffsets);\n\t\t\t[oldLabels, newLabels] = equilizeNoOfElements(oldLabels, newLabels);\n\n\t\t\tthis.render({\n\t\t\t\txPositions: oldXPos,\n\t\t\t\tyPositions: oldYPos,\n\t\t\t\toffsets: oldOffsets,\n\t\t\t\tlabels: newLabels,\n\n\t\t\t\tzeroLine: this.oldData.zeroLine,\n\t\t\t\tbarsWidth: this.oldData.barsWidth,\n\t\t\t\tbarWidth: this.oldData.barWidth,\n\t\t\t});\n\n\t\t\tlet animateElements = [];\n\n\t\t\tthis.store.map((bar, i) => {\n\t\t\t\tanimateElements = animateElements.concat(animateBar(\n\t\t\t\t\tbar, newXPos[i], newYPos[i], newData.barWidth, newOffsets[i],\n\t\t\t\t\t{zeroLine: newData.zeroLine}\n\t\t\t\t));\n\t\t\t});\n\n\t\t\treturn animateElements;\n\t\t}\n\t},\n\n lineGraph: {\n layerClass: function () {\n return 'dataset-units dataset-line dataset-' + this.constants.index;\n },\n makeElements(data) {\n let c = this.constants;\n this.unitType = 'dot';\n this.paths = {};\n if (!c.hideLine) {\n this.paths = getPaths(\n data.xPositions,\n data.yPositions,\n c.color,\n {\n heatline: c.heatline,\n regionFill: c.regionFill,\n spline: c.spline\n },\n {\n svgDefs: c.svgDefs,\n zeroLine: data.zeroLine\n }\n );\n }\n\n this.units = [];\n\n if (!c.hideDots) {\n this.units = data.yPositions.map((y, j) => {\n return datasetDot(\n data.xPositions[j],\n y,\n data.radius,\n c.color,\n c.valuesOverPoints ? data.values[j] : '',\n j\n );\n });\n }\n\n return Object.values(this.paths).concat(this.units);\n },\n animateElements(newData) {\n let newXPos = newData.xPositions;\n let newYPos = newData.yPositions;\n let newValues = newData.values;\n\n let oldXPos = this.oldData.xPositions;\n let oldYPos = this.oldData.yPositions;\n let oldValues = this.oldData.values;\n\n [oldXPos, newXPos] = equilizeNoOfElements(oldXPos, newXPos);\n [oldYPos, newYPos] = equilizeNoOfElements(oldYPos, newYPos);\n [oldValues, newValues] = equilizeNoOfElements(oldValues, newValues);\n\n this.render({\n xPositions: oldXPos,\n yPositions: oldYPos,\n values: newValues,\n\n zeroLine: this.oldData.zeroLine,\n radius: this.oldData.radius\n });\n\n let animateElements = [];\n\n if (Object.keys(this.paths).length) {\n animateElements = animateElements.concat(\n animatePath(\n this.paths,\n newXPos,\n newYPos,\n newData.zeroLine,\n this.constants.spline\n )\n );\n }\n\n if (this.units.length) {\n this.units.map((dot, i) => {\n animateElements = animateElements.concat(\n animateDot(dot, newXPos[i], newYPos[i])\n );\n });\n }\n\n return animateElements;\n }\n }\n};\n\nexport function getComponent(name, constants, getData) {\n\tlet keys = Object.keys(componentConfigs).filter(k => name.includes(k));\n\tlet config = componentConfigs[keys[0]];\n\tObject.assign(config, {\n\t\tconstants: constants,\n\t\tgetData: getData\n\t});\n\treturn new ChartComponent(config);\n}\n","import { floatTwo } from './helpers';\n\nfunction normalize(x) {\n\t// Calculates mantissa and exponent of a number\n\t// Returns normalized number and exponent\n\t// https://stackoverflow.com/q/9383593/6495043\n\n\tif(x===0) {\n\t\treturn [0, 0];\n\t}\n\tif(isNaN(x)) {\n\t\treturn {mantissa: -6755399441055744, exponent: 972};\n\t}\n\tvar sig = x > 0 ? 1 : -1;\n\tif(!isFinite(x)) {\n\t\treturn {mantissa: sig * 4503599627370496, exponent: 972};\n\t}\n\n\tx = Math.abs(x);\n\tvar exp = Math.floor(Math.log10(x));\n\tvar man = x/Math.pow(10, exp);\n\n\treturn [sig * man, exp];\n}\n\nfunction getChartRangeIntervals(max, min=0) {\n\tlet upperBound = Math.ceil(max);\n\tlet lowerBound = Math.floor(min);\n\tlet range = upperBound - lowerBound;\n\n\tlet noOfParts = range;\n\tlet partSize = 1;\n\n\t// To avoid too many partitions\n\tif(range > 5) {\n\t\tif(range % 2 !== 0) {\n\t\t\tupperBound++;\n\t\t\t// Recalc range\n\t\t\trange = upperBound - lowerBound;\n\t\t}\n\t\tnoOfParts = range/2;\n\t\tpartSize = 2;\n\t}\n\n\t// Special case: 1 and 2\n\tif(range <= 2) {\n\t\tnoOfParts = 4;\n\t\tpartSize = range/noOfParts;\n\t}\n\n\t// Special case: 0\n\tif(range === 0) {\n\t\tnoOfParts = 5;\n\t\tpartSize = 1;\n\t}\n\n\tlet intervals = [];\n\tfor(var i = 0; i <= noOfParts; i++){\n\t\tintervals.push(lowerBound + partSize * i);\n\t}\n\treturn intervals;\n}\n\nfunction getChartIntervals(maxValue, minValue=0) {\n\tlet [normalMaxValue, exponent] = normalize(maxValue);\n\tlet normalMinValue = minValue ? minValue/Math.pow(10, exponent): 0;\n\n\t// Allow only 7 significant digits\n\tnormalMaxValue = normalMaxValue.toFixed(6);\n\n\tlet intervals = getChartRangeIntervals(normalMaxValue, normalMinValue);\n\tintervals = intervals.map(value => {\n\t\t// For negative exponents we want to divide by 10^-exponent to avoid\n\t\t// floating point arithmetic bugs. For instance, in javascript\n\t\t// 6 * 10^-1 == 0.6000000000000001, we instead want 6 / 10^1 == 0.6\n\t\tif (exponent < 0) {\n\t\t\treturn value / Math.pow(10, -exponent);\n\t\t}\n\t\treturn value * Math.pow(10, exponent);\n\t});\n\treturn intervals;\n}\n\nexport function calcChartIntervals(values, withMinimum=false) {\n\t//*** Where the magic happens ***\n\n\t// Calculates best-fit y intervals from given values\n\t// and returns the interval array\n\n\tlet maxValue = Math.max(...values);\n\tlet minValue = Math.min(...values);\n\n\t// Exponent to be used for pretty print\n\tlet exponent = 0, intervals = []; // eslint-disable-line no-unused-vars\n\n\tfunction getPositiveFirstIntervals(maxValue, absMinValue) {\n\t\tlet intervals = getChartIntervals(maxValue);\n\n\t\tlet intervalSize = intervals[1] - intervals[0];\n\n\t\t// Then unshift the negative values\n\t\tlet value = 0;\n\t\tfor(var i = 1; value < absMinValue; i++) {\n\t\t\tvalue += intervalSize;\n\t\t\tintervals.unshift((-1) * value);\n\t\t}\n\t\treturn intervals;\n\t}\n\n\t// CASE I: Both non-negative\n\n\tif(maxValue >= 0 && minValue >= 0) {\n\t\texponent = normalize(maxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(maxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(maxValue, minValue);\n\t\t}\n\t}\n\n\t// CASE II: Only minValue negative\n\n\telse if(maxValue > 0 && minValue < 0) {\n\t\t// `withMinimum` irrelevant in this case,\n\t\t// We'll be handling both sides of zero separately\n\t\t// (both starting from zero)\n\t\t// Because ceil() and floor() behave differently\n\t\t// in those two regions\n\n\t\tlet absMinValue = Math.abs(minValue);\n\n\t\tif(maxValue >= absMinValue) {\n\t\t\texponent = normalize(maxValue)[1];\n\t\t\tintervals = getPositiveFirstIntervals(maxValue, absMinValue);\n\t\t} else {\n\t\t\t// Mirror: maxValue => absMinValue, then change sign\n\t\t\texponent = normalize(absMinValue)[1];\n\t\t\tlet posIntervals = getPositiveFirstIntervals(absMinValue, maxValue);\n\t\t\tintervals = posIntervals.reverse().map(d => d * (-1));\n\t\t}\n\n\t}\n\n\t// CASE III: Both non-positive\n\n\telse if(maxValue <= 0 && minValue <= 0) {\n\t\t// Mirrored Case I:\n\t\t// Work with positives, then reverse the sign and array\n\n\t\tlet pseudoMaxValue = Math.abs(minValue);\n\t\tlet pseudoMinValue = Math.abs(maxValue);\n\n\t\texponent = normalize(pseudoMaxValue)[1];\n\t\tif(!withMinimum) {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue);\n\t\t} else {\n\t\t\tintervals = getChartIntervals(pseudoMaxValue, pseudoMinValue);\n\t\t}\n\n\t\tintervals = intervals.reverse().map(d => d * (-1));\n\t}\n\n\treturn intervals;\n}\n\nexport function getZeroIndex(yPts) {\n\tlet zeroIndex;\n\tlet interval = getIntervalSize(yPts);\n\tif(yPts.indexOf(0) >= 0) {\n\t\t// the range has a given zero\n\t\t// zero-line on the chart\n\t\tzeroIndex = yPts.indexOf(0);\n\t} else if(yPts[0] > 0) {\n\t\t// Minimum value is positive\n\t\t// zero-line is off the chart: below\n\t\tlet min = yPts[0];\n\t\tzeroIndex = (-1) * min / interval;\n\t} else {\n\t\t// Maximum value is negative\n\t\t// zero-line is off the chart: above\n\t\tlet max = yPts[yPts.length - 1];\n\t\tzeroIndex = (-1) * max / interval + (yPts.length - 1);\n\t}\n\treturn zeroIndex;\n}\n\nexport function getRealIntervals(max, noOfIntervals, min = 0, asc = 1) {\n\tlet range = max - min;\n\tlet part = range * 1.0 / noOfIntervals;\n\tlet intervals = [];\n\n\tfor(var i = 0; i <= noOfIntervals; i++) {\n\t\tintervals.push(min + part * i);\n\t}\n\n\treturn asc ? intervals : intervals.reverse();\n}\n\nexport function getIntervalSize(orderedArray) {\n\treturn orderedArray[1] - orderedArray[0];\n}\n\nexport function getValueRange(orderedArray) {\n\treturn orderedArray[orderedArray.length-1] - orderedArray[0];\n}\n\nexport function scale(val, yAxis) {\n\treturn floatTwo(yAxis.zeroLine - val * yAxis.scaleMultiplier);\n}\n\nexport function isInRange(val, min, max) {\n\treturn val > min && val < max;\n}\n\nexport function isInRange2D(coord, minCoord, maxCoord) {\n\treturn isInRange(coord[0], minCoord[0], maxCoord[0])\n\t\t&& isInRange(coord[1], minCoord[1], maxCoord[1]);\n}\n\nexport function getClosestInArray(goal, arr, index = false) {\n\tlet closest = arr.reduce(function(prev, curr) {\n\t\treturn (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);\n\t}, []);\n\n\treturn index ? arr.indexOf(closest) : closest;\n}\n\nexport function calcDistribution(values, distributionSize) {\n\t// Assume non-negative values,\n\t// implying distribution minimum at zero\n\n\tlet dataMaxValue = Math.max(...values);\n\n\tlet distributionStep = 1 / (distributionSize - 1);\n\tlet distribution = [];\n\n\tfor(var i = 0; i < distributionSize; i++) {\n\t\tlet checkpoint = dataMaxValue * (distributionStep * i);\n\t\tdistribution.push(checkpoint);\n\t}\n\n\treturn distribution;\n}\n\nexport function getMaxCheckpoint(value, distribution) {\n\treturn distribution.filter(d => d < value).length;\n}\n","import { fillArray } from '../utils/helpers';\nimport { DEFAULT_AXIS_CHART_TYPE, AXIS_DATASET_CHART_TYPES, DEFAULT_CHAR_WIDTH } from '../utils/constants';\n\nexport function dataPrep(data, type) {\n\tdata.labels = data.labels || [];\n\n\tlet datasetLength = data.labels.length;\n\n\t// Datasets\n\tlet datasets = data.datasets;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\tif(!datasets) {\n\t\t// default\n\t\tdatasets = [{\n\t\t\tvalues: zeroArray\n\t\t}];\n\t}\n\n\tdatasets.map(d=> {\n\t\t// Set values\n\t\tif(!d.values) {\n\t\t\td.values = zeroArray;\n\t\t} else {\n\t\t\t// Check for non values\n\t\t\tlet vals = d.values;\n\t\t\tvals = vals.map(val => (!isNaN(val) ? val : 0));\n\n\t\t\t// Trim or extend\n\t\t\tif(vals.length > datasetLength) {\n\t\t\t\tvals = vals.slice(0, datasetLength);\n\t\t\t} else {\n\t\t\t\tvals = fillArray(vals, datasetLength - vals.length, 0);\n\t\t\t}\n\t\t\td.values = vals;\n\t\t}\n\n\t\t// Set type\n\t\tif(!d.chartType ) {\n\t\t\tif(!AXIS_DATASET_CHART_TYPES.includes(type)) type === DEFAULT_AXIS_CHART_TYPE;\n\t\t\td.chartType = type;\n\t\t}\n\n\t});\n\n\t// Markers\n\n\t// Regions\n\t// data.yRegions = data.yRegions || [];\n\tif(data.yRegions) {\n\t\tdata.yRegions.map(d => {\n\t\t\tif(d.end < d.start) {\n\t\t\t\t[d.start, d.end] = [d.end, d.start];\n\t\t\t}\n\t\t});\n\t}\n\n\treturn data;\n}\n\nexport function zeroDataPrep(realData) {\n\tlet datasetLength = realData.labels.length;\n\tlet zeroArray = new Array(datasetLength).fill(0);\n\n let zeroData = {\n labels: realData.labels.slice(0, -1),\n datasets: realData.datasets.map((d) => {\n const { axisID } = d;\n return {\n axisID,\n name: '',\n values: zeroArray.slice(0, -1),\n chartType: d.chartType\n };\n })\n };\n\n\tif(realData.yMarkers) {\n\t\tzeroData.yMarkers = [\n\t\t\t{\n\t\t\t\tvalue: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\tif(realData.yRegions) {\n\t\tzeroData.yRegions = [\n\t\t\t{\n\t\t\t\tstart: 0,\n\t\t\t\tend: 0,\n\t\t\t\tlabel: ''\n\t\t\t}\n\t\t];\n\t}\n\n\treturn zeroData;\n}\n\nexport function getShortenedLabels(chartWidth, labels=[], isSeries=true) {\n\tlet allowedSpace = chartWidth / labels.length;\n\tif(allowedSpace <= 0) allowedSpace = 1;\n\tlet allowedLetters = allowedSpace / DEFAULT_CHAR_WIDTH;\n\n\tlet seriesMultiple;\n\tif(isSeries) {\n\t\t// Find the maximum label length for spacing calculations\n\t\tlet maxLabelLength = Math.max(...labels.map(label => label.length));\n\t\tseriesMultiple = Math.ceil(maxLabelLength/allowedLetters);\n\t}\n\n\tlet calcLabels = labels.map((label, i) => {\n\t\tlabel += \"\";\n\t\tif(label.length > allowedLetters) {\n\n\t\t\tif(!isSeries) {\n\t\t\t\tif(allowedLetters-3 > 0) {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters-3) + \" ...\";\n\t\t\t\t} else {\n\t\t\t\t\tlabel = label.slice(0, allowedLetters) + '..';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(i % seriesMultiple !== 0) {\n\t\t\t\t\tlabel = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t});\n\n\treturn calcLabels;\n}\n","import '../css/charts.scss';\n\n// import MultiAxisChart from './charts/MultiAxisChart';\nimport PercentageChart from './charts/PercentageChart';\nimport PieChart from './charts/PieChart';\nimport Heatmap from './charts/Heatmap';\nimport AxisChart from './charts/AxisChart';\nimport DonutChart from './charts/DonutChart';\n\nconst chartTypes = {\n\tbar: AxisChart,\n\tline: AxisChart,\n\t// multiaxis: MultiAxisChart,\n\tpercentage: PercentageChart,\n\theatmap: Heatmap,\n\tpie: PieChart,\n\tdonut: DonutChart,\n};\n\nfunction getChartByType(chartType = 'line', parent, options) {\n\tif (chartType === 'axis-mixed') {\n\t\toptions.type = 'line';\n\t\treturn new AxisChart(parent, options);\n\t}\n\n\tif (!chartTypes[chartType]) {\n\t\tconsole.error(\"Undefined chart type: \" + chartType);\n\t\treturn;\n\t}\n\n\treturn new chartTypes[chartType](parent, options);\n}\n\nclass Chart {\n\tconstructor(parent, options) {\n\t\treturn getChartByType(options.type, parent, options);\n\t}\n}\n\nexport { Chart, PercentageChart, PieChart, Heatmap, AxisChart };","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { $ } from '../utils/dom';\nimport { TOOLTIP_POINTER_TRIANGLE_HEIGHT } from '../utils/constants';\n\nexport default class SvgTip {\n\tconstructor({\n\t\tparent = null,\n\t\tcolors = []\n\t}) {\n\t\tthis.parent = parent;\n\t\tthis.colors = colors;\n\t\tthis.titleName = '';\n\t\tthis.titleValue = '';\n\t\tthis.listValues = [];\n\t\tthis.titleValueFirst = 0;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\n\t\tthis.top = 0;\n\t\tthis.left = 0;\n\n\t\tthis.setup();\n\t}\n\n\tsetup() {\n\t\tthis.makeTooltip();\n\t}\n\n\trefresh() {\n\t\tthis.fill();\n\t\tthis.calcPosition();\n\t}\n\n\tmakeTooltip() {\n\t\tthis.container = $.create('div', {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'graph-svg-tip comparison',\n\t\t\tinnerHTML: `\n\t\t\t\t
                                                                      \n\t\t\t\t
                                                                      `\n\t\t});\n\t\tthis.hideTip();\n\n\t\tthis.title = this.container.querySelector('.title');\n\t\tthis.dataPointList = this.container.querySelector('.data-point-list');\n\n\t\tthis.parent.addEventListener('mouseleave', () => {\n\t\t\tthis.hideTip();\n\t\t});\n\t}\n\n\tfill() {\n\t\tlet title;\n\t\tif(this.index) {\n\t\t\tthis.container.setAttribute('data-point-index', this.index);\n\t\t}\n\t\tif(this.titleValueFirst) {\n\t\t\ttitle = `${this.titleValue}${this.titleName}`;\n\t\t} else {\n\t\t\ttitle = `${this.titleName}${this.titleValue}`;\n\t\t}\n\t\tthis.title.innerHTML = title;\n\t\tthis.dataPointList.innerHTML = '';\n\n\t\tthis.listValues.map((set, i) => {\n\t\t\tconst color = this.colors[i] || 'black';\n\t\t\tlet value = set.formatted === 0 || set.formatted ? set.formatted : set.value;\n\n\t\t\tlet li = $.create('li', {\n\t\t\t\tstyles: {\n\t\t\t\t\t'border-top': `3px solid ${color}`\n\t\t\t\t},\n\t\t\t\tinnerHTML: `${ value === 0 || value ? value : '' }\n\t\t\t\t\t${set.title ? set.title : '' }`\n\t\t\t});\n\n\t\t\tthis.dataPointList.appendChild(li);\n\t\t});\n\t}\n\n\tcalcPosition() {\n\t\tlet width = this.container.offsetWidth;\n\n\t\tthis.top = this.y - this.container.offsetHeight\n\t\t\t- TOOLTIP_POINTER_TRIANGLE_HEIGHT;\n\t\tthis.left = this.x - width/2;\n\t\tlet maxLeft = this.parent.offsetWidth - width;\n\n\t\tlet pointer = this.container.querySelector('.svg-pointer');\n\n\t\tif(this.left < 0) {\n\t\t\tpointer.style.left = `calc(50% - ${-1 * this.left}px)`;\n\t\t\tthis.left = 0;\n\t\t} else if(this.left > maxLeft) {\n\t\t\tlet delta = this.left - maxLeft;\n\t\t\tlet pointerOffset = `calc(50% + ${delta}px)`;\n\t\t\tpointer.style.left = pointerOffset;\n\n\t\t\tthis.left = maxLeft;\n\t\t} else {\n\t\t\tpointer.style.left = `50%`;\n\t\t}\n\t}\n\n\tsetValues(x, y, title = {}, listValues = [], index = -1) {\n\t\tthis.titleName = title.name;\n\t\tthis.titleValue = title.value;\n\t\tthis.listValues = listValues;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.titleValueFirst = title.valueFirst || 0;\n\t\tthis.index = index;\n\t\tthis.refresh();\n\t}\n\n\thideTip() {\n\t\tthis.container.style.top = '0px';\n\t\tthis.container.style.left = '0px';\n\t\tthis.container.style.opacity = '0';\n\t}\n\n\tshowTip() {\n\t\tthis.container.style.top = this.top + 'px';\n\t\tthis.container.style.left = this.left + 'px';\n\t\tthis.container.style.opacity = '1';\n\t}\n}\n","export const CSSTEXT = \".chart-container{position:relative;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif}.chart-container .axis,.chart-container .chart-label{fill:#555b51}.chart-container .axis line,.chart-container .chart-label line{stroke:#dadada}.chart-container .dataset-units circle{stroke:#fff;stroke-width:2}.chart-container .dataset-units path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container .dataset-path{stroke-width:2px}.chart-container .path-group path{fill:none;stroke-opacity:1;stroke-width:2px}.chart-container line.dashed{stroke-dasharray:5,3}.chart-container .axis-line .specific-value{text-anchor:start}.chart-container .axis-line .y-line{text-anchor:end}.chart-container .axis-line .x-line{text-anchor:middle}.chart-container .legend-dataset-text{fill:#6c7680;font-weight:600}.graph-svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,.8);border-radius:3px}.graph-svg-tip ul{padding-left:0;display:flex}.graph-svg-tip ol{padding-left:0;display:flex}.graph-svg-tip ul.data-point-list li{min-width:90px;flex:1;font-weight:600}.graph-svg-tip strong{color:#dfe2e5;font-weight:600}.graph-svg-tip .svg-pointer{position:absolute;height:5px;margin:0 0 0 -5px;content:' ';border:5px solid transparent;border-top-color:rgba(0,0,0,.8)}.graph-svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.graph-svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.graph-svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.graph-svg-tip.comparison li{display:inline-block;padding:5px 10px}\";","import SvgTip from '../objects/SvgTip';\nimport { $, isElementInViewport, getElementContentWidth, isHidden } from '../utils/dom';\nimport { makeSVGContainer, makeSVGDefs, makeSVGGroup, makeText } from '../utils/draw';\nimport { BASE_MEASURES, getExtraHeight, getExtraWidth, getTopOffset, getLeftOffset,\n\tINIT_CHART_UPDATE_TIMEOUT, CHART_POST_ANIMATE_TIMEOUT, DEFAULT_COLORS} from '../utils/constants';\nimport { getColor, isValidColor } from '../utils/colors';\nimport { runSMILAnimation } from '../utils/animation';\nimport { downloadFile, prepareForExport } from '../utils/export';\nimport { deepClone } from '../utils/helpers';\n\nexport default class BaseChart {\n\tconstructor(parent, options) {\n\t\t// deepclone options to avoid making changes to orignal object\n\t\toptions = deepClone(options);\n\n\t\tthis.parent = typeof parent === 'string'\n\t\t\t? document.querySelector(parent)\n\t\t\t: parent;\n\n\t\tif (!(this.parent instanceof HTMLElement)) {\n\t\t\tthrow new Error('No `parent` element to render on was provided.');\n\t\t}\n\n\t\tthis.rawChartArgs = options;\n\n\t\tthis.title = options.title || '';\n\t\tthis.type = options.type || '';\n\n\t\tthis.realData = this.prepareData(options.data);\n\t\tthis.data = this.prepareFirstData(this.realData);\n\n\t\tthis.colors = this.validateColors(options.colors, this.type);\n\n\t\tthis.config = {\n\t\t\tshowTooltip: 1, // calculate\n\t\t\tshowLegend: 1, // calculate\n\t\t\tisNavigable: options.isNavigable || 0,\n\t\t\tanimate: (typeof options.animate !== 'undefined') ? options.animate : 1,\n\t\t\ttruncateLegends: options.truncateLegends || 1\n\t\t};\n\n\t\tthis.measures = JSON.parse(JSON.stringify(BASE_MEASURES));\n\t\tlet m = this.measures;\n\t\tthis.setMeasures(options);\n\t\tif(!this.title.length) { m.titleHeight = 0; }\n\t\tif(!this.config.showLegend) m.legendHeight = 0;\n\t\tthis.argHeight = options.height || m.baseHeight;\n\n\t\tthis.state = {};\n\t\tthis.options = {};\n\n\t\tthis.initTimeout = INIT_CHART_UPDATE_TIMEOUT;\n\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.overlays = [];\n\t\t}\n\n\t\tthis.configure(options);\n\t}\n\n\tprepareData(data) {\n\t\treturn data;\n\t}\n\n\tprepareFirstData(data) {\n\t\treturn data;\n\t}\n\n\tvalidateColors(colors, type) {\n\t\tconst validColors = [];\n\t\tcolors = (colors || []).concat(DEFAULT_COLORS[type]);\n\t\tcolors.forEach((string) => {\n\t\t\tconst color = getColor(string);\n\t\t\tif(!isValidColor(color)) {\n\t\t\t\tconsole.warn('\"' + string + '\" is not a valid color.');\n\t\t\t} else {\n\t\t\t\tvalidColors.push(color);\n\t\t\t}\n\t\t});\n\t\treturn validColors;\n\t}\n\n\tsetMeasures() {\n\t\t// Override measures, including those for title and legend\n\t\t// set config for legend and title\n\t}\n\n\tconfigure() {\n\t\tlet height = this.argHeight;\n\t\tthis.baseHeight = height;\n\t\tthis.height = height - getExtraHeight(this.measures);\n\n\t\t// Bind window events\n\t\tthis.boundDrawFn = () => this.draw(true);\n\t\tif (ResizeObserver) {\n\t\t\tthis.resizeObserver = new ResizeObserver(this.boundDrawFn);\n\t\t\tthis.resizeObserver.observe(this.parent);\n\t\t}\n\t\twindow.addEventListener('resize', this.boundDrawFn);\n\t\twindow.addEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeObserver) this.resizeObserver.disconnect();\n\t\twindow.removeEventListener('resize', this.boundDrawFn);\n\t\twindow.removeEventListener('orientationchange', this.boundDrawFn);\n\t}\n\n\t// Has to be called manually\n\tsetup() {\n\t\tthis.makeContainer();\n\t\tthis.updateWidth();\n\t\tthis.makeTooltip();\n\n\t\tthis.draw(false, true);\n\t}\n\n\tmakeContainer() {\n\t\t// Chart needs a dedicated parent element\n\t\tthis.parent.innerHTML = '';\n\n\t\tlet args = {\n\t\t\tinside: this.parent,\n\t\t\tclassName: 'chart-container'\n\t\t};\n\n\t\tif(this.independentWidth) {\n\t\t\targs.styles = { width: this.independentWidth + 'px' };\n\t\t}\n\n\t\tthis.container = $.create('div', args);\n\t}\n\n\tmakeTooltip() {\n\t\tthis.tip = new SvgTip({\n\t\t\tparent: this.container,\n\t\t\tcolors: this.colors\n\t\t});\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {}\n\n\tdraw(onlyWidthChange=false, init=false) {\n\t\tif (onlyWidthChange && isHidden(this.parent)) {\n\t\t\t// Don't update anything if the chart is hidden\n\t\t\treturn;\n\t\t}\n\t\tthis.updateWidth();\n\n\t\tthis.calc(onlyWidthChange);\n\t\tthis.makeChartArea();\n\t\tthis.setupComponents();\n\n\t\tthis.components.forEach(c => c.setup(this.drawArea));\n\t\t// this.components.forEach(c => c.make());\n\t\tthis.render(this.components, false);\n\n\t\tif(init) {\n\t\t\tthis.data = this.realData;\n\t\t\tsetTimeout(() => {this.update(this.data);}, this.initTimeout);\n\t\t}\n\n\t\tthis.renderLegend();\n\n\t\tthis.setupNavigation(init);\n\t}\n\n\tcalc() {} // builds state\n\n\tupdateWidth() {\n\t\tthis.baseWidth = getElementContentWidth(this.parent);\n\t\tthis.width = this.baseWidth - getExtraWidth(this.measures);\n\t}\n\n\tmakeChartArea() {\n\t\tif(this.svg) {\n\t\t\tthis.container.removeChild(this.svg);\n\t\t}\n\t\tlet m = this.measures;\n\n\t\tthis.svg = makeSVGContainer(\n\t\t\tthis.container,\n\t\t\t'frappe-chart chart',\n\t\t\tthis.baseWidth,\n\t\t\tthis.baseHeight\n\t\t);\n\t\tthis.svgDefs = makeSVGDefs(this.svg);\n\n\t\tif(this.title.length) {\n\t\t\tthis.titleEL = makeText(\n\t\t\t\t'title',\n\t\t\t\tm.margins.left,\n\t\t\t\tm.margins.top,\n\t\t\t\tthis.title,\n\t\t\t\t{\n\t\t\t\t\tfontSize: m.titleFontSize,\n\t\t\t\t\tfill: '#666666',\n\t\t\t\t\tdy: m.titleFontSize\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tlet top = getTopOffset(m);\n\t\tthis.drawArea = makeSVGGroup(\n\t\t\tthis.type + '-chart chart-draw-area',\n\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t);\n\n\t\tif(this.config.showLegend) {\n\t\t\ttop += this.height + m.paddings.bottom;\n\t\t\tthis.legendArea = makeSVGGroup(\n\t\t\t\t'chart-legend',\n\t\t\t\t`translate(${getLeftOffset(m)}, ${top})`\n\t\t\t);\n\t\t}\n\n\t\tif(this.title.length) { this.svg.appendChild(this.titleEL); }\n\t\tthis.svg.appendChild(this.drawArea);\n\t\tif(this.config.showLegend) { this.svg.appendChild(this.legendArea); }\n\n\t\tthis.updateTipOffset(getLeftOffset(m), getTopOffset(m));\n\t}\n\n\tupdateTipOffset(x, y) {\n\t\tthis.tip.offset = {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tsetupComponents() { this.components = new Map(); }\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\t\tthis.data = this.prepareData(data);\n\t\tthis.calc(); // builds state\n\t\tthis.render(this.components, this.config.animate);\n\t\tthis.renderLegend();\n\t}\n\n\trender(components=this.components, animate=true) {\n\t\tif(this.config.isNavigable) {\n\t\t\t// Remove all existing overlays\n\t\t\tthis.overlays.map(o => o.parentNode.removeChild(o));\n\t\t\t// ref.parentNode.insertBefore(element, ref);\n\t\t}\n\t\tlet elementsToAnimate = [];\n\t\t// Can decouple to this.refreshComponents() first to save animation timeout\n\t\tcomponents.forEach(c => {\n\t\t\telementsToAnimate = elementsToAnimate.concat(c.update(animate));\n\t\t});\n\t\tif(elementsToAnimate.length > 0) {\n\t\t\trunSMILAnimation(this.container, this.svg, elementsToAnimate);\n\t\t\tsetTimeout(() => {\n\t\t\t\tcomponents.forEach(c => c.make());\n\t\t\t\tthis.updateNav();\n\t\t\t}, CHART_POST_ANIMATE_TIMEOUT);\n\t\t} else {\n\t\t\tcomponents.forEach(c => c.make());\n\t\t\tthis.updateNav();\n\t\t}\n\t}\n\n\tupdateNav() {\n\t\tif(this.config.isNavigable) {\n\t\t\tthis.makeOverlay();\n\t\t\tthis.bindUnits();\n\t\t}\n\t}\n\n\trenderLegend() {}\n\n\tsetupNavigation(init=false) {\n\t\tif(!this.config.isNavigable) return;\n\n\t\tif(init) {\n\t\t\tthis.bindOverlay();\n\n\t\t\tthis.keyActions = {\n\t\t\t\t'13': this.onEnterKey.bind(this),\n\t\t\t\t'37': this.onLeftArrow.bind(this),\n\t\t\t\t'38': this.onUpArrow.bind(this),\n\t\t\t\t'39': this.onRightArrow.bind(this),\n\t\t\t\t'40': this.onDownArrow.bind(this),\n\t\t\t};\n\n\t\t\tdocument.addEventListener('keydown', (e) => {\n\t\t\t\tif(isElementInViewport(this.container)) {\n\t\t\t\t\te = e || window.event;\n\t\t\t\t\tif(this.keyActions[e.keyCode]) {\n\t\t\t\t\t\tthis.keyActions[e.keyCode]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tmakeOverlay() {}\n\tupdateOverlay() {}\n\tbindOverlay() {}\n\tbindUnits() {}\n\n\tonLeftArrow() {}\n\tonRightArrow() {}\n\tonUpArrow() {}\n\tonDownArrow() {}\n\tonEnterKey() {}\n\n\taddDataPoint() {}\n\tremoveDataPoint() {}\n\n\tgetDataPoint() {}\n\tsetCurrentDataPoint() {}\n\n\tupdateDataset() {}\n\n\texport() {\n\t\tlet chartSvg = prepareForExport(this.svg);\n\t\tdownloadFile(this.title || 'Chart', [chartSvg]);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { truncateString } from '../utils/draw-utils';\nimport { legendDot } from '../utils/draw';\nimport { round } from '../utils/helpers';\nimport { getExtraWidth } from '../utils/constants';\n\nexport default class AggregationChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\n\t\tthis.config.formatTooltipY = (args.tooltipOptions || {}).formatTooltipY;\n\t\tthis.config.maxSlices = args.maxSlices || 20;\n\t\tthis.config.maxLegendPoints = args.maxLegendPoints || 20;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\t\tlet maxSlices = this.config.maxSlices;\n\t\ts.sliceTotals = [];\n\n\t\tlet allTotals = this.data.labels.map((label, i) => {\n\t\t\tlet total = 0;\n\t\t\tthis.data.datasets.map(e => {\n\t\t\t\ttotal += e.values[i];\n\t\t\t});\n\t\t\treturn [total, label];\n\t\t}).filter(d => { return d[0] >= 0; }); // keep only positive results\n\n\t\tlet totals = allTotals;\n\t\tif(allTotals.length > maxSlices) {\n\t\t\t// Prune and keep a grey area for rest as per maxSlices\n\t\t\tallTotals.sort((a, b) => { return b[0] - a[0]; });\n\n\t\t\ttotals = allTotals.slice(0, maxSlices-1);\n\t\t\tlet remaining = allTotals.slice(maxSlices-1);\n\n\t\t\tlet sumOfRemaining = 0;\n\t\t\tremaining.map(d => {sumOfRemaining += d[0];});\n\t\t\ttotals.push([sumOfRemaining, 'Rest']);\n\t\t\tthis.colors[maxSlices-1] = 'grey';\n\t\t}\n\n\t\ts.labels = [];\n\t\ttotals.map(d => {\n\t\t\ts.sliceTotals.push(round(d[0]));\n\t\t\ts.labels.push(d[1]);\n\t\t});\n\n\t\ts.grandTotal = s.sliceTotals.reduce((a, b) => a + b, 0);\n\n\t\tthis.center = {\n\t\t\tx: this.width / 2,\n\t\t\ty: this.height / 2\n\t\t};\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.state;\n\t\tthis.legendArea.textContent = '';\n\t\tthis.legendTotals = s.sliceTotals.slice(0, this.config.maxLegendPoints);\n\n\t\tlet count = 0;\n\t\tlet y = 0;\n\t\tthis.legendTotals.map((d, i) => {\n\t\t\tlet barWidth = 150;\n\t\t\tlet divisor = Math.floor(\n\t\t\t\t(this.width - getExtraWidth(this.measures))/barWidth\n\t\t\t);\n\t\t\tif (this.legendTotals.length < divisor) {\n\t\t\t\tbarWidth = this.width/this.legendTotals.length;\n\t\t\t}\n\t\t\tif(count > divisor) {\n\t\t\t\tcount = 0;\n\t\t\t\ty += 20;\n\t\t\t}\n\t\t\tlet x = barWidth * count + 5;\n\t\t\tlet label = this.config.truncateLegends ? truncateString(s.labels[i], barWidth/10) : s.labels[i];\n\t\t\tlet formatted = this.config.formatTooltipY ? this.config.formatTooltipY(d) : d;\n\t\t\tlet dot = legendDot(\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\t5,\n\t\t\t\tthis.colors[i],\n\t\t\t\t`${label}: ${formatted}`,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.legendArea.appendChild(dot);\n\t\t\tcount++;\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getOffset } from '../utils/dom';\nimport { getComponent } from '../objects/ChartComponents';\nimport { PERCENTAGE_BAR_DEFAULT_HEIGHT, PERCENTAGE_BAR_DEFAULT_DEPTH } from '../utils/constants';\n\nexport default class PercentageChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'percentage';\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.barOptions = options.barOptions || {};\n\n\t\tlet b = this.barOptions;\n\t\tb.height = b.height || PERCENTAGE_BAR_DEFAULT_HEIGHT;\n\t\tb.depth = b.depth || PERCENTAGE_BAR_DEFAULT_DEPTH;\n\n\t\tm.paddings.right = 30;\n\t\tm.legendHeight = 60;\n\t\tm.baseHeight = (b.height + b.depth * 0.5) * 8;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'percentageBars',\n\t\t\t\t{\n\t\t\t\t\tbarHeight: this.barOptions.height,\n\t\t\t\t\tbarDepth: this.barOptions.depth,\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: s.xPositions,\n\t\t\t\t\t\twidths: s.widths,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\n\t\ts.xPositions = [];\n\t\ts.widths = [];\n\n\t\tlet xPos = 0;\n\t\ts.sliceTotals.map((value) => {\n\t\t\tlet width = this.width * value / s.grandTotal;\n\t\t\ts.widths.push(width);\n\t\t\ts.xPositions.push(xPos);\n\t\t\txPos += width;\n\t\t});\n\t}\n\n\tmakeDataByIndex() { }\n\n\tbindTooltip() {\n\t\tlet s = this.state;\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet bars = this.components.get('percentageBars').store;\n\t\t\tlet bar = e.target;\n\t\t\tif(bars.includes(bar)) {\n\n\t\t\t\tlet i = bars.indexOf(bar);\n\t\t\t\tlet gOff = getOffset(this.container), pOff = getOffset(bar);\n\n\t\t\t\tlet x = pOff.left - gOff.left + parseInt(bar.getAttribute('width'))/2;\n\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\tlet title = (this.formattedLabels && this.formattedLabels.length>0\n\t\t\t\t\t? this.formattedLabels[i] : this.state.labels[i]) + ': ';\n\t\t\t\tlet fraction = s.sliceTotals[i]/s.grandTotal;\n\n\t\t\t\tthis.tip.setValues(x, y, {name: title, value: (fraction*100).toFixed(1) + \"%\"});\n\t\t\t\tthis.tip.showTip();\n\t\t\t}\n\t\t});\n\t}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcPathStr, makeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class PieChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'pie';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius = (this.height > this.width ? this.center.x : this.center.y);\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeCircleStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc)\n\t\t\t\t\t: makeArcPathStr(curStart, curEnd, this.center, this.radius, clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'pieSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{radius,hoverRadio} = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.fill = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.fill = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('pieSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { makeText, heatSquare } from '../utils/draw';\nimport { DAY_NAMES_SHORT, addDays, areInSameMonth, getLastDateInMonth, setDayToSunday, getYyyyMmDd, getWeeksBetween, getMonthName, clone,\n\tNO_OF_MILLIS, NO_OF_YEAR_MONTHS, NO_OF_DAYS_IN_WEEK } from '../utils/date-utils';\nimport { calcDistribution, getMaxCheckpoint } from '../utils/intervals';\nimport { getExtraHeight, getExtraWidth, HEATMAP_DISTRIBUTION_SIZE, HEATMAP_SQUARE_SIZE,\n\tHEATMAP_GUTTER_SIZE } from '../utils/constants';\n\nconst COL_WIDTH = HEATMAP_SQUARE_SIZE + HEATMAP_GUTTER_SIZE;\nconst ROW_HEIGHT = COL_WIDTH;\n// const DAY_INCR = 1;\n\nexport default class Heatmap extends BaseChart {\n\tconstructor(parent, options) {\n\t\tsuper(parent, options);\n\t\tthis.type = 'heatmap';\n\n\t\tthis.countLabel = options.countLabel || '';\n\n\t\tlet validStarts = ['Sunday', 'Monday'];\n\t\tlet startSubDomain = validStarts.includes(options.startSubDomain)\n\t\t\t? options.startSubDomain : 'Sunday';\n\t\tthis.startSubDomainIndex = validStarts.indexOf(startSubDomain);\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures(options) {\n\t\tlet m = this.measures;\n\t\tthis.discreteDomains = options.discreteDomains === 0 ? 0 : 1;\n\n\t\tm.paddings.top = ROW_HEIGHT * 3;\n\t\tm.paddings.bottom = 0;\n\t\tm.legendHeight = ROW_HEIGHT * 2;\n\t\tm.baseHeight = ROW_HEIGHT * NO_OF_DAYS_IN_WEEK\n\t\t\t+ getExtraHeight(m);\n\n\t\tlet d = this.data;\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tthis.independentWidth = (getWeeksBetween(d.start, d.end)\n\t\t\t+ spacing) * COL_WIDTH + getExtraWidth(m);\n\t}\n\n\tupdateWidth() {\n\t\tlet spacing = this.discreteDomains ? NO_OF_YEAR_MONTHS : 0;\n\t\tlet noOfWeeks = this.state.noOfWeeks ? this.state.noOfWeeks : 52;\n\t\tthis.baseWidth = (noOfWeeks + spacing) * COL_WIDTH\n\t\t\t+ getExtraWidth(this.measures);\n\t}\n\n\tprepareData(data=this.data) {\n\t\tif(data.start && data.end && data.start > data.end) {\n\t\t\tthrow new Error('Start date cannot be greater than end date.');\n\t\t}\n\n\t\tif(!data.start) {\n\t\t\tdata.start = new Date();\n\t\t\tdata.start.setFullYear( data.start.getFullYear() - 1 );\n\t\t}\n\t\tif(!data.end) { data.end = new Date(); }\n\t\tdata.dataPoints = data.dataPoints || {};\n\n\t\tif(parseInt(Object.keys(data.dataPoints)[0]) > 100000) {\n\t\t\tlet points = {};\n\t\t\tObject.keys(data.dataPoints).forEach(timestampSec => {\n\t\t\t\tlet date = new Date(timestampSec * NO_OF_MILLIS);\n\t\t\t\tpoints[getYyyyMmDd(date)] = data.dataPoints[timestampSec];\n\t\t\t});\n\t\t\tdata.dataPoints = points;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tcalc() {\n\t\tlet s = this.state;\n\n\t\ts.start = clone(this.data.start);\n\t\ts.end = clone(this.data.end);\n\n\t\ts.firstWeekStart = clone(s.start);\n\t\ts.noOfWeeks = getWeeksBetween(s.start, s.end);\n\t\ts.distribution = calcDistribution(\n\t\t\tObject.values(this.data.dataPoints), HEATMAP_DISTRIBUTION_SIZE);\n\n\t\ts.domainConfigs = this.getDomains();\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\t\tlet lessCol = this.discreteDomains ? 0 : 1;\n\n\t\tlet componentConfigs = s.domainConfigs.map((config, i) => [\n\t\t\t'heatDomain',\n\t\t\t{\n\t\t\t\tindex: config.index,\n\t\t\t\tcolWidth: COL_WIDTH,\n\t\t\t\trowHeight: ROW_HEIGHT,\n\t\t\t\tsquareSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\tradius: this.rawChartArgs.radius || 0,\n\t\t\t\txTranslate: s.domainConfigs\n\t\t\t\t\t.filter((config, j) => j < i)\n\t\t\t\t\t.map(config => config.cols.length - lessCol)\n\t\t\t\t\t.reduce((a, b) => a + b, 0)\n\t\t\t\t\t* COL_WIDTH\n\t\t\t},\n\t\t\tfunction() {\n\t\t\t\treturn s.domainConfigs[i];\n\t\t\t}.bind(this)\n\n\t\t]);\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map((args, i) => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0] + '-' + i, component];\n\t\t\t})\n\t\t);\n\n\t\tlet y = 0;\n\t\tDAY_NAMES_SHORT.forEach((dayName, i) => {\n\t\t\tif([1, 3, 5].includes(i)) {\n\t\t\t\tlet dayText = makeText('subdomain-name', -COL_WIDTH/2, y, dayName,\n\t\t\t\t\t{\n\t\t\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE,\n\t\t\t\t\t\tdy: 8,\n\t\t\t\t\t\ttextAnchor: 'end'\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tthis.drawArea.appendChild(dayText);\n\t\t\t}\n\t\t\ty += ROW_HEIGHT;\n\t\t});\n\t}\n\n\tupdate(data) {\n\t\tif(!data) {\n\t\t\tconsole.error('No data to update.');\n\t\t}\n\n\t\tthis.data = this.prepareData(data);\n\t\tthis.draw();\n\t\tthis.bindTooltip();\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tthis.components.forEach(comp => {\n\t\t\t\tlet daySquares = comp.store;\n\t\t\t\tlet daySquare = e.target;\n\t\t\t\tif(daySquares.includes(daySquare)) {\n\n\t\t\t\t\tlet count = daySquare.getAttribute('data-value');\n\t\t\t\t\tlet dateParts = daySquare.getAttribute('data-date').split('-');\n\n\t\t\t\t\tlet month = getMonthName(parseInt(dateParts[1])-1, true);\n\n\t\t\t\t\tlet gOff = this.container.getBoundingClientRect(), pOff = daySquare.getBoundingClientRect();\n\n\t\t\t\t\tlet width = parseInt(e.target.getAttribute('width'));\n\t\t\t\t\tlet x = pOff.left - gOff.left + width/2;\n\t\t\t\t\tlet y = pOff.top - gOff.top;\n\t\t\t\t\tlet value = count + ' ' + this.countLabel;\n\t\t\t\t\tlet name = ' on ' + month + ' ' + dateParts[0] + ', ' + dateParts[2];\n\n\t\t\t\t\tthis.tip.setValues(x, y, {name: name, value: value, valueFirst: 1}, []);\n\t\t\t\t\tthis.tip.showTip();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\trenderLegend() {\n\t\tthis.legendArea.textContent = '';\n\t\tlet x = 0;\n\t\tlet y = ROW_HEIGHT;\n\t\tlet radius = this.rawChartArgs.radius || 0;\n\n\t\tlet lessText = makeText('subdomain-name', x, y, 'Less',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tx = (COL_WIDTH * 2) + COL_WIDTH/2;\n\t\tthis.legendArea.appendChild(lessText);\n\n\t\tthis.colors.slice(0, HEATMAP_DISTRIBUTION_SIZE).map((color, i) => {\n\t\t\tconst square = heatSquare('heatmap-legend-unit', x + (COL_WIDTH + 3) * i,\n\t\t\t\ty, HEATMAP_SQUARE_SIZE, radius, color);\n\t\t\tthis.legendArea.appendChild(square);\n\t\t});\n\n\t\tlet moreTextX = x + HEATMAP_DISTRIBUTION_SIZE * (COL_WIDTH + 3) + COL_WIDTH/4;\n\t\tlet moreText = makeText('subdomain-name', moreTextX, y, 'More',\n\t\t\t{\n\t\t\t\tfontSize: HEATMAP_SQUARE_SIZE + 1,\n\t\t\t\tdy: 9\n\t\t\t}\n\t\t);\n\t\tthis.legendArea.appendChild(moreText);\n\t}\n\n\tgetDomains() {\n\t\tlet s = this.state;\n\t\tconst [startMonth, startYear] = [s.start.getMonth(), s.start.getFullYear()];\n\t\tconst [endMonth, endYear] = [s.end.getMonth(), s.end.getFullYear()];\n\n\t\tconst noOfMonths = (endMonth - startMonth + 1) + (endYear - startYear) * 12;\n\n\t\tlet domainConfigs = [];\n\n\t\tlet startOfMonth = clone(s.start);\n\t\tfor(var i = 0; i < noOfMonths; i++) {\n\t\t\tlet endDate = s.end;\n\t\t\tif(!areInSameMonth(startOfMonth, s.end)) {\n\t\t\t\tlet [month, year] = [startOfMonth.getMonth(), startOfMonth.getFullYear()];\n\t\t\t\tendDate = getLastDateInMonth(month, year);\n\t\t\t}\n\t\t\tdomainConfigs.push(this.getDomainConfig(startOfMonth, endDate));\n\n\t\t\taddDays(endDate, 1);\n\t\t\tstartOfMonth = endDate;\n\t\t}\n\n\t\treturn domainConfigs;\n\t}\n\n\tgetDomainConfig(startDate, endDate='') {\n\t\tlet [month, year] = [startDate.getMonth(), startDate.getFullYear()];\n\t\tlet startOfWeek = setDayToSunday(startDate); // TODO: Monday as well\n\t\tendDate = clone(endDate) || getLastDateInMonth(month, year);\n\n\t\tlet domainConfig = {\n\t\t\tindex: month,\n\t\t\tcols: []\n\t\t};\n\n\t\taddDays(endDate, 1);\n\t\tlet noOfMonthWeeks = getWeeksBetween(startOfWeek, endDate);\n\n\t\tlet cols = [], col;\n\t\tfor(var i = 0; i < noOfMonthWeeks; i++) {\n\t\t\tcol = this.getCol(startOfWeek, month);\n\t\t\tcols.push(col);\n\n\t\t\tstartOfWeek = new Date(col[NO_OF_DAYS_IN_WEEK - 1].yyyyMmDd);\n\t\t\taddDays(startOfWeek, 1);\n\t\t}\n\n\t\tif(col[NO_OF_DAYS_IN_WEEK - 1].dataValue !== undefined) {\n\t\t\taddDays(startOfWeek, 1);\n\t\t\tcols.push(this.getCol(startOfWeek, month, true));\n\t\t}\n\n\t\tdomainConfig.cols = cols;\n\n\t\treturn domainConfig;\n\t}\n\n\tgetCol(startDate, month, empty = false) {\n\t\tlet s = this.state;\n\n\t\t// startDate is the start of week\n\t\tlet currentDate = clone(startDate);\n\t\tlet col = [];\n\n\t\tfor(var i = 0; i < NO_OF_DAYS_IN_WEEK; i++, addDays(currentDate, 1)) {\n\t\t\tlet config = {};\n\n\t\t\t// Non-generic adjustment for entire heatmap, needs state\n\t\t\tlet currentDateWithinData = currentDate >= s.start && currentDate <= s.end;\n\n\t\t\tif(empty || currentDate.getMonth() !== month || !currentDateWithinData) {\n\t\t\t\tconfig.yyyyMmDd = getYyyyMmDd(currentDate);\n\t\t\t} else {\n\t\t\t\tconfig = this.getSubDomainConfig(currentDate);\n\t\t\t}\n\t\t\tcol.push(config);\n\t\t}\n\n\t\treturn col;\n\t}\n\n\tgetSubDomainConfig(date) {\n\t\tlet yyyyMmDd = getYyyyMmDd(date);\n\t\tlet dataValue = this.data.dataPoints[yyyyMmDd];\n\t\tlet config = {\n\t\t\tyyyyMmDd: yyyyMmDd,\n\t\t\tdataValue: dataValue || 0,\n\t\t\tfill: this.colors[getMaxCheckpoint(dataValue, this.state.distribution)]\n\t\t};\n\t\treturn config;\n\t}\n}\n","import BaseChart from './BaseChart';\nimport { dataPrep, zeroDataPrep, getShortenedLabels } from '../utils/axis-chart-utils';\nimport { AXIS_LEGEND_BAR_SIZE } from '../utils/constants';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset, fire } from '../utils/dom';\nimport { calcChartIntervals, getIntervalSize, getValueRange, getZeroIndex, scale, getClosestInArray } from '../utils/intervals';\nimport { floatTwo } from '../utils/helpers';\nimport { makeOverlay, updateOverlay, legendBar } from '../utils/draw';\nimport { getTopOffset, getLeftOffset, MIN_BAR_PERCENT_HEIGHT, BAR_CHART_SPACE_RATIO,\n\tLINE_CHART_DOT_SIZE } from '../utils/constants';\n\nexport default class AxisChart extends BaseChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\n\t\tthis.barOptions = args.barOptions || {};\n\t\tthis.lineOptions = args.lineOptions || {};\n\n\t\tthis.type = args.type || 'line';\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tsetMeasures() {\n\t\tif(this.data.datasets.length <= 1) {\n\t\t\tthis.config.showLegend = 0;\n\t\t\tthis.measures.paddings.bottom = 30;\n\t\t}\n\t}\n\n\tconfigure(options) {\n super.configure(options);\n const { axisOptions = {} } = options;\n const { xAxis, yAxis } = axisOptions || {};\n\n options.tooltipOptions = options.tooltipOptions || {};\n\n this.config.xAxisMode = xAxis ? xAxis.xAxisMode : axisOptions.xAxisMode || 'span';\n\n // this will pass an array\n // lets determine if we need two yAxis based on if there is length\n // to the yAxis array\n if (yAxis && yAxis.length) {\n this.config.yAxisConfig = yAxis.map((item) => {\n return {\n yAxisMode: item.yAxisMode,\n id: item.id,\n position: item.position,\n title: item.title\n };\n });\n } else {\n this.config.yAxisMode = yAxis ? yAxis.yAxisMode : axisOptions.yAxisMode || 'span';\n\n\t\t\t// if we have yAxis config settings lets populate a yAxis config array.\n\t\t\tif (yAxis && yAxis.id && yAxis.position) {\n\t\t\t\tthis.config.yAxisConfig = [yAxis]\n\t\t\t}\n }\n\n this.config.xIsSeries = axisOptions.xIsSeries || 0;\n this.config.shortenYAxisNumbers = axisOptions.shortenYAxisNumbers || 0;\n\n this.config.formatTooltipX = options.tooltipOptions.formatTooltipX;\n this.config.formatTooltipY = options.tooltipOptions.formatTooltipY;\n\n this.config.valuesOverPoints = options.valuesOverPoints;\n\t}\n\n\tprepareData(data=this.data) {\n\t\treturn dataPrep(data, this.type);\n\t}\n\n\tprepareFirstData(data=this.data) {\n\t\treturn zeroDataPrep(data);\n\t}\n\n\tcalc(onlyWidthChange = false) {\n\t\tthis.calcXPositions();\n\t\tif(!onlyWidthChange) {\n\t\t\tthis.calcYAxisParameters(this.getAllYValues(), this.type === 'line');\n\t\t}\n\t\tthis.makeDataByIndex();\n\t}\n\n\tcalcXPositions() {\n\t\tlet s = this.state;\n\t\tlet labels = this.data.labels;\n\t\ts.datasetLength = labels.length;\n\n\t\ts.unitWidth = this.width/(s.datasetLength);\n\t\t// Default, as per bar, and mixed. Only line will be a special case\n\t\ts.xOffset = s.unitWidth/2;\n\n\t\t// // For a pure Line Chart\n\t\t// s.unitWidth = this.width/(s.datasetLength - 1);\n\t\t// s.xOffset = 0;\n\n\t\ts.xAxis = {\n\t\t\tlabels: labels,\n\t\t\tpositions: labels.map((d, i) =>\n\t\t\t\tfloatTwo(s.xOffset + i * s.unitWidth)\n\t\t\t)\n\t\t};\n\t}\n\n\n calcYAxisParameters(dataValues, withMinimum = 'false') {\n let yPts, scaleMultiplier, intervalHeight, zeroLine, positions, yAxisConfigObject, yAxisAlignment, yKeys;\n\t\tyKeys = [];\n\t\tyAxisConfigObject = this.config.yAxisMode || {};\t\n\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n\n // if we have an object we have multiple yAxisParameters.\n if (dataValues instanceof Array) {\n yPts = calcChartIntervals(dataValues, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n\n this.state.yAxis = {\n labels: yPts,\n positions: yPts.map((d) => zeroLine - d * scaleMultiplier),\n\t\t\t\ttitle: yAxisConfigObject.title || null,\n\t\t\t\tpos: yAxisAlignment,\n scaleMultiplier: scaleMultiplier,\n zeroLine: zeroLine\n };\n } else {\n this.state.yAxis = [];\n for (let key in dataValues) {\n const dataValue = dataValues[key];\n\t\t\t\tyAxisConfigObject = this.config.yAxisConfig.find((item) => key === item.id) || [];\n\t\t\t\tyAxisAlignment = yAxisConfigObject.position ? yAxisConfigObject.position : 'left';\t\n yPts = calcChartIntervals(dataValue, withMinimum);\n scaleMultiplier = this.height / getValueRange(yPts);\n intervalHeight = getIntervalSize(yPts) * scaleMultiplier;\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = yPts.map((d) => zeroLine - d * scaleMultiplier);\n\t\t\t\tyKeys.push(key);\n\n if (this.state.yAxis.length > 1) {\n const yPtsArray = [];\n const firstArr = this.state.yAxis[0];\n\n\t\t\t\t\t// we need to calculate the scaleMultiplier.\n\n\t\t\t\t\t// now that we have an accurate scaleMultiplier we can \n // we need to loop through original positions.\n\t\t\t\t\tscaleMultiplier = this.height / getValueRange(yPts);\n firstArr.positions.forEach((pos) => {\n yPtsArray.push(Math.ceil(pos / scaleMultiplier));\n });\n yPts = yPtsArray.reverse();\n zeroLine = this.height - getZeroIndex(yPts) * intervalHeight;\n positions = firstArr.positions;\n }\n\n this.state.yAxis.push({\n axisID: key || 'left-axis',\n labels: yPts,\n title: yAxisConfigObject.title,\n pos: yAxisAlignment,\n scaleMultiplier,\n zeroLine,\n positions\n });\n }\n\n\t\t\t// the labels are not aligned in length between the two yAxis objects,\n\t\t\t// we need to run some new calculations.\n\t\t\tif (this.state.yAxis[1] && this.state.yAxis[0].labels.length !== this.state.yAxis[1].labels.length) {\n\t\t\t\tconst newYptsArr = [];\n\t\t\t\t// find the shorter array\n\t\t\t\tconst shortest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length > c.labels.length ? c : p;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\t\t\t\t// return the longest\n\t\t\t\tconst longest = this.state.yAxis.reduce((p,c) => { \n\t\t\t\t\treturn p.length < c.labels.length ? p : c;\n\t\t\t\t},\n\t\t\t\t{ length: Infinity });\n\n\t\t\t\t// we now need to populate the shortest obj with the new scale multiplier\n\t\t\t\t// with the positions of the longest obj.\n\t\t\t\tlongest.positions.forEach((pos) => {\n\t\t\t\t\t// calculate a new yPts\n\t\t\t\t\tnewYptsArr.push(Math.ceil(pos / shortest.scaleMultiplier));\n\t\t\t\t});\n\n\t\t\t\tshortest.labels = newYptsArr.reverse();\n\t\t\t\tshortest.positions = longest.positions;\n\t\t\t}\n }\n\n // Dependent if above changes\n this.calcDatasetPoints();\n this.calcYExtremes();\n this.calcYRegions();\n }\n\n calcDatasetPoints() {\n let s = this.state;\n let scaleAll = (values, id) => {\n return values.map((val) => {\n let { yAxis } = s;\n\n if (yAxis instanceof Array) {\n\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n }\n\n return scale(val, yAxis);\n });\n };\n\n s.barChartIndex = 1;\n s.datasets = this.data.datasets.map((d, i) => {\n let values = d.values;\n let cumulativeYs = d.cumulativeYs || [];\n\n return {\n name:\n d.name &&\n d.name.replace(/<|>|&/g, (char) =>\n char == '&' ? '&' : char == '<' ? '<' : '>'\n ),\n index: i,\n barIndex: d.chartType === 'bar' ? s.barChartIndex++ : s.barChartIndex,\n chartType: d.chartType,\n\n values: values,\n yPositions: scaleAll(values, d.axisID),\n id: d.axisID,\n\n cumulativeYs: cumulativeYs,\n cumulativeYPos: scaleAll(cumulativeYs, d.axisID)\n };\n });\n }\n\n\tcalcYExtremes() {\n\t\tlet s = this.state;\n\t\tif(this.barOptions.stacked) {\n\t\t\ts.yExtremes = s.datasets[s.datasets.length - 1].cumulativeYPos;\n\t\t\treturn;\n\t\t}\n\t\ts.yExtremes = new Array(s.datasetLength).fill(9999);\n\t\ts.datasets.map(d => {\n\t\t\td.yPositions.map((pos, j) => {\n\t\t\t\tif(pos < s.yExtremes[j]) {\n\t\t\t\t\ts.yExtremes[j] = pos;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tcalcYRegions() {\n\t\tlet s = this.state;\n\t\tif(this.data.yMarkers) {\n\t\t\tthis.state.yMarkers = this.data.yMarkers.map(d => {\n\t\t\t\td.position = scale(d.value, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\t// if(!d.label.includes(':')) {\n\t\t\t\t// \td.label += ': ' + d.value;\n\t\t\t\t// }\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t\tif(this.data.yRegions) {\n\t\t\tthis.state.yRegions = this.data.yRegions.map(d => {\n\t\t\t\td.startPos = scale(d.start, s.yAxis);\n\t\t\t\td.endPos = scale(d.end, s.yAxis);\n\t\t\t\tif(!d.options) d.options = {};\n\t\t\t\treturn d;\n\t\t\t});\n\t\t}\n\t}\n\n getAllYValues() {\n let key = 'values';\n let multiAxis = this.config.yAxisConfig ? true : false;\n let allValueLists = multiAxis ? {} : [];\n\n let groupBy = (arr, property) => {\n return arr.reduce((acc, cur) => {\n acc[cur[property]] = [...(acc[cur[property]] || []), cur];\n return acc;\n }, {});\n };\n\n let generateCumulative = (arr) => {\n let cumulative = new Array(this.state.datasetLength).fill(0);\n arr.forEach((d, i) => {\n let values = arr[i].values;\n d[key] = cumulative = cumulative.map((c, i) => {\n return c + values[i];\n });\n });\n };\n\n if (this.barOptions.stacked) {\n key = 'cumulativeYs';\n // we need to filter out the different yAxis ID's here.\n if (multiAxis) {\n const groupedDataSets = groupBy(this.data.datasets, 'axisID');\n // const dataSetsByAxis = this.data.dd\n for (var axisID in groupedDataSets) {\n generateCumulative(groupedDataSets[axisID]);\n }\n } else {\n generateCumulative(this.data.datasets);\n }\n }\n\n // this is the trouble maker, we don't want to merge all\n // datasets since we are trying to run two yAxis.\n if (multiAxis) {\n this.data.datasets.forEach((d) => {\n // if the array exists already just push more data into it.\n // otherwise create a new array into the object.\n allValueLists[d.axisID || key]\n ? allValueLists[d.axisID || key].push(...d[key])\n : (allValueLists[d.axisID || key] = [...d[key]]);\n });\n } else {\n allValueLists = this.data.datasets.map((d) => {\n return d[key];\n });\n }\n\n if (this.data.yMarkers && !multiAxis) {\n allValueLists.push(this.data.yMarkers.map((d) => d.value));\n }\n\n if (this.data.yRegions && !multiAxis) {\n this.data.yRegions.map((d) => {\n allValueLists.push([d.end, d.start]);\n });\n }\n\n return multiAxis ? allValueLists : [].concat(...allValueLists);\n }\n\n\tsetupComponents() {\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'xAxis',\n\t\t\t\t{\n\t\t\t\t\tmode: this.config.xAxisMode,\n\t\t\t\t\theight: this.height,\n\t\t\t\t\t// pos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\tlet s = this.state;\n\t\t\t\t\ts.xAxis.calcLabels = getShortenedLabels(this.width,\n\t\t\t\t\t\ts.xAxis.labels, this.config.xIsSeries);\n\n\t\t\t\t\treturn s.xAxis;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\n\t\t\t[\n\t\t\t\t'yRegions',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yRegions;\n\t\t\t\t}.bind(this)\n\t\t\t],\n\t\t];\n\n // if we have multiple yAxisConfigs we need to update the yAxisDefault\n // components to multiple yAxis components.\n if (this.config.yAxisConfig && this.config.yAxisConfig.length) {\n this.config.yAxisConfig.forEach((yAxis) => {\n componentConfigs.push([\n 'yAxis',\n {\n mode: yAxis.yAxisMode || 'span',\n width: this.width,\n\t\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers,\n pos: yAxis.position || 'left'\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n });\n } else {\n componentConfigs.push([\n 'yAxis',\n {\n mode: this.config.yAxisMode,\n width: this.width,\n\t\t\t\t\theight: this.baseHeight,\n shortenNumbers: this.config.shortenYAxisNumbers\n },\n function () {\n return this.state.yAxis;\n }.bind(this)\n ]);\n }\n\n\t\tlet barDatasets = this.state.datasets.filter(d => d.chartType === 'bar');\n\t\tlet lineDatasets = this.state.datasets.filter(d => d.chartType === 'line');\n\n\t\tlet barsConfigs = barDatasets.map(d => {\n let index = d.index;\n let barIndex = d.barIndex || index;\n\t\t\treturn [\n\t\t\t\t'barGraph' + '-' + d.index,\n\t\t\t\t{\n\t\t\t\t\tindex: index,\n\t\t\t\t\tcolor: this.colors[index],\n\t\t\t\t\tstacked: this.barOptions.stacked,\n\n\t\t\t\t\t// same for all datasets\n\t\t\t\t\tvaluesOverPoints: this.config.valuesOverPoints,\n\t\t\t\t\tminHeight: this.height * MIN_BAR_PERCENT_HEIGHT,\n\t\t\t\t},\n\t\t\t\tfunction() {\n let s = this.state;\n let { yAxis } = s;\n let d = s.datasets[index];\n let { id = 'left-axis' } = d;\n let stacked = this.barOptions.stacked;\n\n let spaceRatio = this.barOptions.spaceRatio || BAR_CHART_SPACE_RATIO;\n let barsWidth = s.unitWidth * (1 - spaceRatio);\n let barWidth = barsWidth / (stacked ? 1 : barDatasets.length);\n\n // if there are multiple yAxis we need to return the yAxis with the\n // proper ID.\n\t\t\t\t\tif (yAxis instanceof Array) {\n\t\t\t\t\t\t// if the person only configured one yAxis in the array return the first.\n\t\t\t\t\t\tyAxis = yAxis.length > 1 ? yAxis.find((axis) => id === axis.axisID) : s.yAxis[0];\n\t\t\t\t\t}\n\n\n let xPositions = s.xAxis.positions.map((x) => x - barsWidth / 2);\n\n if (!stacked) {\n xPositions = xPositions.map((p) => {\n return p + barWidth * barIndex - barWidth;\n });\n }\n\n let labels = new Array(s.datasetLength).fill('');\n if (this.config.valuesOverPoints) {\n if (stacked && d.index === s.datasets.length - 1) {\n labels = d.cumulativeYs;\n } else {\n labels = d.values;\n }\n }\n let offsets = new Array(s.datasetLength).fill(0);\n if (stacked) {\n offsets = d.yPositions.map((y, j) => y - d.cumulativeYPos[j]);\n }\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\txPositions: xPositions,\n\t\t\t\t\t\tyPositions: d.yPositions,\n\t\t\t\t\t\toffsets: offsets,\n\t\t\t\t\t\t// values: d.values,\n\t\t\t\t\t\tlabels: labels,\n\n\t\t\t\t\t\tzeroLine: yAxis.zeroLine,\n\t\t\t\t\t\tbarsWidth: barsWidth,\n\t\t\t\t\t\tbarWidth: barWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t];\n\t\t});\n\n let lineConfigs = lineDatasets.map((d) => {\n let index = d.index;\n return [\n 'lineGraph' + '-' + d.index,\n {\n index: index,\n color: this.colors[index],\n svgDefs: this.svgDefs,\n heatline: this.lineOptions.heatline,\n regionFill: this.lineOptions.regionFill,\n spline: this.lineOptions.spline,\n hideDots: this.lineOptions.hideDots,\n hideLine: this.lineOptions.hideLine,\n\n // same for all datasets\n valuesOverPoints: this.config.valuesOverPoints\n },\n function () {\n let s = this.state;\n let d = s.datasets[index];\n\n // if we have more than one yindex lets map the values\n const yAxis = s.yAxis.length\n ? s.yAxis.find((axis) => d.id === axis.axisID) || s.yAxis[0]\n : s.yAxis;\n\n let minLine =\n yAxis.positions[0] < yAxis.zeroLine\n ? yAxis.positions[0]\n : yAxis.zeroLine;\n\n return {\n xPositions: s.xAxis.positions,\n yPositions: d.yPositions,\n\n values: d.values,\n\n zeroLine: minLine,\n radius: this.lineOptions.dotSize || LINE_CHART_DOT_SIZE\n };\n }.bind(this)\n ];\n });\n\n\t\tlet markerConfigs = [\n\t\t\t[\n\t\t\t\t'yMarkers',\n\t\t\t\t{\n\t\t\t\t\twidth: this.width,\n\t\t\t\t\tpos: 'right'\n\t\t\t\t},\n\t\t\t\tfunction() {\n\t\t\t\t\treturn this.state.yMarkers;\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tcomponentConfigs = componentConfigs.concat(barsConfigs, lineConfigs, markerConfigs);\n\n\t\tlet optionals = ['yMarkers', 'yRegions'];\n\t\tthis.dataUnitComponents = [];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.filter(args => !optionals.includes(args[0]) || this.state[args[0]])\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\tif(args[0].includes('lineGraph') || args[0].includes('barGraph')) {\n\t\t\t\t\tthis.dataUnitComponents.push(component);\n\t\t\t\t}\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tmakeDataByIndex() {\n\t\tthis.dataByIndex = {};\n\n\t\tlet s = this.state;\n\t\tlet formatX = this.config.formatTooltipX;\n\t\tlet formatY = this.config.formatTooltipY;\n\t\tlet titles = s.xAxis.labels;\n\n\t\ttitles.map((label, index) => {\n\t\t\tlet values = this.state.datasets.map((set, i) => {\n\t\t\t\tlet value = set.values[index];\n\t\t\t\treturn {\n\t\t\t\t\ttitle: set.name,\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tyPos: set.yPositions[index],\n\t\t\t\t\tcolor: this.colors[i],\n\t\t\t\t\tformatted: formatY ? formatY(value) : value,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tthis.dataByIndex[index] = {\n\t\t\t\tlabel: label,\n\t\t\t\tformattedLabel: formatX ? formatX(label) : label,\n\t\t\t\txPos: s.xAxis.positions[index],\n\t\t\t\tvalues: values,\n\t\t\t\tyExtreme: s.yExtremes[index],\n\t\t\t};\n\t\t});\n\t}\n\n\tbindTooltip() {\n\t\t// NOTE: could be in tooltip itself, as it is a given functionality for its parent\n\t\tthis.container.addEventListener('mousemove', (e) => {\n\t\t\tlet m = this.measures;\n\t\t\tlet o = getOffset(this.container);\n\t\t\tlet relX = e.pageX - o.left - getLeftOffset(m);\n\t\t\tlet relY = e.pageY - o.top;\n\n\t\t\tif(relY < this.height + getTopOffset(m)\n\t\t\t\t&& relY > getTopOffset(m)) {\n\t\t\t\tthis.mapTooltipXPosition(relX);\n\t\t\t} else {\n\t\t\t\tthis.tip.hideTip();\n\t\t\t}\n\t\t});\n\t}\n\n\tmapTooltipXPosition(relX) {\n\t\tlet s = this.state;\n\t\tif(!s.yExtremes) return;\n\n\t\tlet index = getClosestInArray(relX, s.xAxis.positions, true);\n\t\tif (index >= 0) {\n\t\t\tlet dbi = this.dataByIndex[index];\n\n\t\t\tthis.tip.setValues(\n\t\t\t\tdbi.xPos + this.tip.offset.x,\n\t\t\t\tdbi.yExtreme + this.tip.offset.y,\n\t\t\t\t{name: dbi.formattedLabel, value: ''},\n\t\t\t\tdbi.values,\n\t\t\t\tindex\n\t\t\t);\n\n\t\t\tthis.tip.showTip();\n\t\t}\n\t}\n\n\trenderLegend() {\n\t\tlet s = this.data;\n\t\tif(s.datasets.length > 1) {\n\t\t\tthis.legendArea.textContent = '';\n\t\t\ts.datasets.map((d, i) => {\n\t\t\t\tlet barWidth = AXIS_LEGEND_BAR_SIZE;\n\t\t\t\t// let rightEndPoint = this.baseWidth - this.measures.margins.left - this.measures.margins.right;\n\t\t\t\t// let multiplier = s.datasets.length - i;\n\t\t\t\tlet rect = legendBar(\n\t\t\t\t\t// rightEndPoint - multiplier * barWidth,\t// To right align\n\t\t\t\t\tbarWidth * i,\n\t\t\t\t\t'0',\n\t\t\t\t\tbarWidth,\n\t\t\t\t\tthis.colors[i],\n\t\t\t\t\td.name,\n\t\t\t\t\tthis.config.truncateLegends);\n\t\t\t\tthis.legendArea.appendChild(rect);\n\t\t\t});\n\t\t}\n\t}\n\n\n\n\t// Overlay\n\tmakeOverlay() {\n\t\tif(this.init) {\n\t\t\tthis.init = 0;\n\t\t\treturn;\n\t\t}\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\n\t\tthis.overlayGuides = this.dataUnitComponents.map(c => {\n\t\t\treturn {\n\t\t\t\ttype: c.unitType,\n\t\t\t\toverlay: undefined,\n\t\t\t\tunits: c.units,\n\t\t\t};\n\t\t});\n\n\t\tif(this.state.currentIndex === undefined) {\n\t\t\tthis.state.currentIndex = this.state.datasetLength - 1;\n\t\t}\n\n\t\t// Render overlays\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\n\t\t\td.overlay = makeOverlay[d.type](currentUnit);\n\t\t\tthis.drawArea.appendChild(d.overlay);\n\t\t});\n\t}\n\n\tupdateOverlayGuides() {\n\t\tif(this.overlayGuides) {\n\t\t\tthis.overlayGuides.forEach(g => {\n\t\t\t\tlet o = g.overlay;\n\t\t\t\to.parentNode.removeChild(o);\n\t\t\t});\n\t\t}\n\t}\n\n\tbindOverlay() {\n\t\tthis.parent.addEventListener('data-select', () => {\n\t\t\tthis.updateOverlay();\n\t\t});\n\t}\n\n\tbindUnits() {\n\t\tthis.dataUnitComponents.map(c => {\n\t\t\tc.units.map(unit => {\n\t\t\t\tunit.addEventListener('click', () => {\n\t\t\t\t\tlet index = unit.getAttribute('data-point-index');\n\t\t\t\t\tthis.setCurrentDataPoint(index);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Note: Doesn't work as tooltip is absolutely positioned\n\t\tthis.tip.container.addEventListener('click', () => {\n\t\t\tlet index = this.tip.container.getAttribute('data-point-index');\n\t\t\tthis.setCurrentDataPoint(index);\n\t\t});\n\t}\n\n\tupdateOverlay() {\n\t\tthis.overlayGuides.map(d => {\n\t\t\tlet currentUnit = d.units[this.state.currentIndex];\n\t\t\tupdateOverlay[d.type](currentUnit, d.overlay);\n\t\t});\n\t}\n\n\tonLeftArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex - 1);\n\t}\n\n\tonRightArrow() {\n\t\tthis.setCurrentDataPoint(this.state.currentIndex + 1);\n\t}\n\n\tgetDataPoint(index=this.state.currentIndex) {\n\t\tlet s = this.state;\n\t\tlet data_point = {\n\t\t\tindex: index,\n\t\t\tlabel: s.xAxis.labels[index],\n\t\t\tvalues: s.datasets.map(d => d.values[index])\n\t\t};\n\t\treturn data_point;\n\t}\n\n\tsetCurrentDataPoint(index) {\n\t\tlet s = this.state;\n\t\tindex = parseInt(index);\n\t\tif(index < 0) index = 0;\n\t\tif(index >= s.xAxis.labels.length) index = s.xAxis.labels.length - 1;\n\t\tif(index === s.currentIndex) return;\n\t\ts.currentIndex = index;\n\t\tfire(this.parent, \"data-select\", this.getDataPoint());\n\t}\n\n\n\n\t// API\n\taddDataPoint(label, datasetValues, index=this.state.datasetLength) {\n\t\tsuper.addDataPoint(label, datasetValues, index);\n\t\tthis.data.labels.splice(index, 0, label);\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\td.values.splice(index, 0, datasetValues[i]);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tremoveDataPoint(index = this.state.datasetLength-1) {\n\t\tif (this.data.labels.length <= 1) {\n\t\t\treturn;\n\t\t}\n\t\tsuper.removeDataPoint(index);\n\t\tthis.data.labels.splice(index, 1);\n\t\tthis.data.datasets.map(d => {\n\t\t\td.values.splice(index, 1);\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\tupdateDataset(datasetValues, index=0) {\n\t\tthis.data.datasets[index].values = datasetValues;\n\t\tthis.update(this.data);\n\t}\n\t// addDataset(dataset, index) {}\n\t// removeDataset(index = 0) {}\n\n\tupdateDatasets(datasets) {\n\t\tthis.data.datasets.map((d, i) => {\n\t\t\tif(datasets[i]) {\n\t\t\t\td.values = datasets[i];\n\t\t\t}\n\t\t});\n\t\tthis.update(this.data);\n\t}\n\n\t// updateDataPoint(dataPoint, index = 0) {}\n\t// addDataPoint(dataPoint, index = 0) {}\n\t// removeDataPoint(index = 0) {}\n}\n","import AggregationChart from './AggregationChart';\nimport { getComponent } from '../objects/ChartComponents';\nimport { getOffset } from '../utils/dom';\nimport { getPositionByAngle } from '../utils/helpers';\nimport { makeArcStrokePathStr, makeStrokeCircleStr } from '../utils/draw';\nimport { lightenDarkenColor } from '../utils/colors';\nimport { transform } from '../utils/animation';\nimport { FULL_ANGLE } from '../utils/constants';\n\nexport default class DonutChart extends AggregationChart {\n\tconstructor(parent, args) {\n\t\tsuper(parent, args);\n\t\tthis.type = 'donut';\n\t\tthis.initTimeout = 0;\n\t\tthis.init = 1;\n\n\t\tthis.setup();\n\t}\n\n\tconfigure(args) {\n\t\tsuper.configure(args);\n\t\tthis.mouseMove = this.mouseMove.bind(this);\n\t\tthis.mouseLeave = this.mouseLeave.bind(this);\n\n\t\tthis.hoverRadio = args.hoverRadio || 0.1;\n\t\tthis.config.startAngle = args.startAngle || 0;\n\n\t\tthis.clockWise = args.clockWise || false;\n\t\tthis.strokeWidth = args.strokeWidth || 30;\n\t}\n\n\tcalc() {\n\t\tsuper.calc();\n\t\tlet s = this.state;\n\t\tthis.radius =\n\t\t\tthis.height > this.width\n\t\t\t\t? this.center.x - this.strokeWidth / 2\n\t\t\t\t: this.center.y - this.strokeWidth / 2;\n\n\t\tconst { radius, clockWise } = this;\n\n\t\tconst prevSlicesProperties = s.slicesProperties || [];\n\t\ts.sliceStrings = [];\n\t\ts.slicesProperties = [];\n\t\tlet curAngle = 180 - this.config.startAngle;\n\n\t\ts.sliceTotals.map((total, i) => {\n\t\t\tconst startAngle = curAngle;\n\t\t\tconst originDiffAngle = (total / s.grandTotal) * FULL_ANGLE;\n\t\t\tconst largeArc = originDiffAngle > 180 ? 1: 0;\n\t\t\tconst diffAngle = clockWise ? -originDiffAngle : originDiffAngle;\n\t\t\tconst endAngle = curAngle = curAngle + diffAngle;\n\t\t\tconst startPosition = getPositionByAngle(startAngle, radius);\n\t\t\tconst endPosition = getPositionByAngle(endAngle, radius);\n\n\t\t\tconst prevProperty = this.init && prevSlicesProperties[i];\n\n\t\t\tlet curStart,curEnd;\n\t\t\tif(this.init) {\n\t\t\t\tcurStart = prevProperty ? prevProperty.startPosition : startPosition;\n\t\t\t\tcurEnd = prevProperty ? prevProperty.endPosition : startPosition;\n\t\t\t} else {\n\t\t\t\tcurStart = startPosition;\n\t\t\t\tcurEnd = endPosition;\n\t\t\t}\n\t\t\tconst curPath =\n\t\t\t\toriginDiffAngle === 360\n\t\t\t\t\t? makeStrokeCircleStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc)\n\t\t\t\t\t: makeArcStrokePathStr(curStart, curEnd, this.center, this.radius, this.clockWise, largeArc);\n\n\t\t\ts.sliceStrings.push(curPath);\n\t\t\ts.slicesProperties.push({\n\t\t\t\tstartPosition,\n\t\t\t\tendPosition,\n\t\t\t\tvalue: total,\n\t\t\t\ttotal: s.grandTotal,\n\t\t\t\tstartAngle,\n\t\t\t\tendAngle,\n\t\t\t\tangle: diffAngle\n\t\t\t});\n\n\t\t});\n\t\tthis.init = 0;\n\t}\n\n\tsetupComponents() {\n\t\tlet s = this.state;\n\n\t\tlet componentConfigs = [\n\t\t\t[\n\t\t\t\t'donutSlices',\n\t\t\t\t{ },\n\t\t\t\tfunction() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsliceStrings: s.sliceStrings,\n\t\t\t\t\t\tcolors: this.colors,\n\t\t\t\t\t\tstrokeWidth: this.strokeWidth,\n\t\t\t\t\t};\n\t\t\t\t}.bind(this)\n\t\t\t]\n\t\t];\n\n\t\tthis.components = new Map(componentConfigs\n\t\t\t.map(args => {\n\t\t\t\tlet component = getComponent(...args);\n\t\t\t\treturn [args[0], component];\n\t\t\t}));\n\t}\n\n\tcalTranslateByAngle(property){\n\t\tconst{ radius, hoverRadio } = this;\n\t\tconst position = getPositionByAngle(property.startAngle+(property.angle / 2),radius);\n\t\treturn `translate3d(${(position.x) * hoverRadio}px,${(position.y) * hoverRadio}px,0)`;\n\t}\n\n\thoverSlice(path,i,flag,e){\n\t\tif(!path) return;\n\t\tconst color = this.colors[i];\n\t\tif(flag) {\n\t\t\ttransform(path, this.calTranslateByAngle(this.state.slicesProperties[i]));\n\t\t\tpath.style.stroke = lightenDarkenColor(color, 50);\n\t\t\tlet g_off = getOffset(this.svg);\n\t\t\tlet x = e.pageX - g_off.left + 10;\n\t\t\tlet y = e.pageY - g_off.top - 10;\n\t\t\tlet title = (this.formatted_labels && this.formatted_labels.length > 0\n\t\t\t\t? this.formatted_labels[i] : this.state.labels[i]) + ': ';\n\t\t\tlet percent = (this.state.sliceTotals[i] * 100 / this.state.grandTotal).toFixed(1);\n\t\t\tthis.tip.setValues(x, y, {name: title, value: percent + \"%\"});\n\t\t\tthis.tip.showTip();\n\t\t} else {\n\t\t\ttransform(path,'translate3d(0,0,0)');\n\t\t\tthis.tip.hideTip();\n\t\t\tpath.style.stroke = color;\n\t\t}\n\t}\n\n\tbindTooltip() {\n\t\tthis.container.addEventListener('mousemove', this.mouseMove);\n\t\tthis.container.addEventListener('mouseleave', this.mouseLeave);\n\t}\n\n\tmouseMove(e){\n\t\tconst target = e.target;\n\t\tlet slices = this.components.get('donutSlices').store;\n\t\tlet prevIndex = this.curActiveSliceIndex;\n\t\tlet prevAcitve = this.curActiveSlice;\n\t\tif(slices.includes(target)) {\n\t\t\tlet i = slices.indexOf(target);\n\t\t\tthis.hoverSlice(prevAcitve, prevIndex,false);\n\t\t\tthis.curActiveSlice = target;\n\t\t\tthis.curActiveSliceIndex = i;\n\t\t\tthis.hoverSlice(target, i, true, e);\n\t\t} else {\n\t\t\tthis.mouseLeave();\n\t\t}\n\t}\n\n\tmouseLeave(){\n\t\tthis.hoverSlice(this.curActiveSlice,this.curActiveSliceIndex,false);\n\t}\n}\n","import * as Charts from './chart';\n\nlet frappe = { };\n\nfrappe.NAME = 'Frappe Charts';\nfrappe.VERSION = '1.6.2';\n\nfrappe = Object.assign({ }, frappe, Charts);\n\nexport default frappe;"],"names":["expr","con","document","querySelector","getOffset","element","rect","getBoundingClientRect","top","documentElement","scrollTop","body","left","scrollLeft","isHidden","el","offsetParent","isElementInViewport","bottom","window","innerHeight","clientHeight","right","innerWidth","clientWidth","getElementContentWidth","styles","getComputedStyle","padding","parseFloat","paddingLeft","paddingRight","fire","target","type","properties","evt","createEvent","initEvent","j","dispatchEvent","getTopOffset","m","titleHeight","margins","paddings","getLeftOffset","getExtraHeight","legendHeight","getExtraWidth","floatTwo","d","toFixed","fillArray","array","count","start","length","fillerArray","Array","Math","abs","fill","concat","getStringWidth","string","charWidth","getPositionByAngle","angle","radius","sin","ANGLE_RATIO","cos","isValidNumber","candidate","nonNegative","Number","isNaN","undefined","isFinite","round","deepClone","cloned","value","key","Date","getTime","isArray","getBarHeightAndYAttr","yTop","zeroLine","height","y","equilizeNoOfElements","array1","array2","extraCount","truncateString","txt","len","slice","shortenLargeNumber","label","number","p","floor","log10","l","shortened","pow","getSplineCurvePointsStr","xList","yList","points","i","push","line","pointA","pointB","lengthX","lengthY","sqrt","atan2","controlPoint","current","previous","next","reverse","o","PI","command","reduce","acc","point","a","cps","cpe","limitColor","r","lightenDarkenColor","color","amt","col","getColor","usePound","num","parseInt","b","g","toString","isValidColor","RGB_RE","test","$","createSVG","tag","createElementNS","val","appendChild","ref","parentNode","insertBefore","keys","map","style","prop","setAttribute","renderVerticalGradient","svgDefElem","gradientId","setGradientStop","gradElem","offset","opacity","makeSVGContainer","parent","className","width","makeSVGDefs","svgContainer","makeSVGGroup","transform","args","inside","makePath","pathStr","makeArcPathStr","startPosition","endPosition","center","clockWise","largeArc","arcStartX","x","arcStartY","arcEndX","arcEndY","makeCircleStr","midArc","makeArcStrokePathStr","makeStrokeCircleStr","makeGradient","lighter","gradientDef","opacities","percentageBar","depth","PERCENTAGE_BAR_DEFAULT_DEPTH","heatSquare","size","data","legendBar","LABEL_MAX_CHARS","text","FONT_SIZE","FONT_FILL","group","legendDot","makeText","content","options","fontSize","dy","textAnchor","makeVertLine","y1","y2","stroke","BASE_LINE_COLOR","LABEL_MARGIN","makeHoriLine","x1","x2","lineType","alignment","shortenNumbers","textXPos","title","LABEL_WIDTH","generateAxisLabel","position","TOTAL_PADDING","rotation","labelSvg","wrapper","yLine","pos","mode","AXIS_TICK_LENGTH","xLine","yMarker","labelPos","yRegion","region","datasetBar","index","meta","minHeight","datasetDot","dot","getPaths","pointsStr","join","spline","path","heatline","gradient_id","svgDefs","paths","regionFill","gradient_id_region","translate","unit","oldCoord","newCoord","duration","old","STD_EASING","translateVertLine","newX","oldX","MARKER_LINE_ANIM_DUR","translateHoriLine","newY","oldY","animateRegion","rectGroup","newY1","newY2","oldY2","newHeight","childNodes","stroke-dasharray","getAttribute","animateBar","bar","nodeName","UNIT_ANIM_DUR","split","animateDot","cx","cy","animatePath","newXList","newYList","pathComponents","animPath","PATH_ANIM_DUR","regStartPt","regEndPt","animRegion","animatePathStr","oldPath","animateSVGElement","props","dur","easingType","oldValues","animElement","cloneNode","newElement","attributeName","animateElement","currentValue","animAttr","EASING","webkitTransform","msTransform","mozTransform","oTransform","animateSVG","elements","newElements","animElements","replaceChild","animSvg","runSMILAnimation","svgElement","elementsToAnimate","animSvgElement","removeChild","REPLACE_ALL_NEW_DUR","downloadFile","filename","createElement","blob","Blob","url","URL","createObjectURL","href","download","click","revokeObjectURL","prepareForExport","svg","clone","classList","add","styleEl","create","CSSTEXT","firstChild","container","innerHTML","treatAsUtc","date","result","setMinutes","getMinutes","getTimezoneOffset","getYyyyMmDd","dd","getDate","mm","getMonth","getFullYear","getWeeksBetween","startDate","endDate","weekStartDate","setDayToSunday","ceil","getDaysBetween","NO_OF_DAYS_IN_WEEK","millisecondsPerDay","SEC_IN_DAY","NO_OF_MILLIS","areInSameMonth","getMonthName","short","monthName","MONTH_NAMES","getLastDateInMonth","month","year","newDate","day","getDay","addDays","numberOfDays","setDate","getComponent","name","constants","getData","Object","componentConfigs","filter","includes","k","config","assign","ChartComponent","normalize","mantissa","exponent","sig","exp","getChartRangeIntervals","max","min","upperBound","lowerBound","range","noOfParts","partSize","intervals","getChartIntervals","maxValue","minValue","normalMaxValue","normalMinValue","calcChartIntervals","values","getPositiveFirstIntervals","absMinValue","intervalSize","unshift","withMinimum","pseudoMaxValue","pseudoMinValue","getZeroIndex","yPts","interval","getIntervalSize","indexOf","orderedArray","getValueRange","scale","yAxis","scaleMultiplier","getClosestInArray","goal","arr","closest","prev","curr","calcDistribution","distributionSize","dataMaxValue","distributionStep","distribution","checkpoint","getMaxCheckpoint","dataPrep","labels","datasetLength","datasets","zeroArray","vals","chartType","AXIS_DATASET_CHART_TYPES","yRegions","end","zeroDataPrep","realData","zeroData","axisID","yMarkers","getShortenedLabels","chartWidth","isSeries","allowedSpace","allowedLetters","DEFAULT_CHAR_WIDTH","seriesMultiple","maxLabelLength","getChartByType","AxisChart","chartTypes","error","css","insertAt","head","getElementsByTagName","styleSheet","cssText","createTextNode","BASE_MEASURES","INIT_CHART_UPDATE_TIMEOUT","DEFAULT_CHART_COLORS","DEFAULT_COLORS","SvgTip","colors","titleName","titleValue","listValues","titleValueFirst","setup","makeTooltip","calcPosition","this","hideTip","dataPointList","addEventListener","set","_this2","formatted","li","offsetWidth","offsetHeight","maxLeft","pointer","pointerOffset","valueFirst","refresh","PRESET_COLOR_MAP","exec","c","ch","makeOverlay","transformValue","overlay","updateOverlay","attributes","attr","specified","nodeValue","BaseChart","HTMLElement","Error","rawChartArgs","prepareData","prepareFirstData","validateColors","isNavigable","animate","truncateLegends","measures","JSON","parse","stringify","setMeasures","showLegend","argHeight","baseHeight","state","initTimeout","overlays","configure","validColors","forEach","warn","boundDrawFn","_this","draw","ResizeObserver","resizeObserver","observe","disconnect","removeEventListener","makeContainer","updateWidth","independentWidth","tip","bindTooltip","onlyWidthChange","init","calc","makeChartArea","setupComponents","components","drawArea","render","update","renderLegend","setupNavigation","baseWidth","titleEL","titleFontSize","legendArea","updateTipOffset","Map","make","updateNav","bindUnits","bindOverlay","keyActions","onEnterKey","bind","onLeftArrow","onUpArrow","onRightArrow","onDownArrow","e","_this4","event","keyCode","chartSvg","AggregationChart","formatTooltipY","tooltipOptions","maxSlices","maxLegendPoints","s","sliceTotals","allTotals","total","totals","sort","sumOfRemaining","grandTotal","textContent","legendTotals","barWidth","divisor","_this3","DAY_NAMES_SHORT","layerClass","layerTransform","makeElements","animateElements","store","layer","oldData","sliceStrings","strokeWidth","transition","newData","xPositions","widths","barHeight","barDepth","item","positions","animateMultipleElements","newPos","newLabels","oldPos","oldLabels","calcLabels","_this5","_this6","newOptions","startPos","endPos","_this7","newStarts","oldStarts","colWidth","rowHeight","squareSize","xTranslate","serializedSubDomains","cols","week","weekNo","toUpperCase","yyyyMmDd","dataValue","square","unitType","units","yPositions","offsets","barsWidth","newXPos","newYPos","newOffsets","oldXPos","oldYPos","oldOffsets","hideLine","hideDots","valuesOverPoints","newValues","PercentageChart","barOptions","component","xPos","bars","get","gOff","pOff","formattedLabels","fraction","setValues","showTip","PieChart","mouseMove","mouseLeave","hoverRadio","startAngle","prevSlicesProperties","slicesProperties","curAngle","originDiffAngle","diffAngle","endAngle","prevProperty","curStart","curEnd","curPath","property","flag","calTranslateByAngle","g_off","pageX","pageY","formatted_labels","percent","slices","prevIndex","curActiveSliceIndex","prevAcitve","curActiveSlice","hoverSlice","Heatmap","countLabel","validStarts","startSubDomain","startSubDomainIndex","discreteDomains","ROW_HEIGHT","HEATMAP_SQUARE_SIZE","spacing","noOfWeeks","setFullYear","dataPoints","timestampSec","firstWeekStart","domainConfigs","getDomains","lessCol","dayName","dayText","daySquares","comp","daySquare","dateParts","lessText","COL_WIDTH","moreText","HEATMAP_DISTRIBUTION_SIZE","startMonth","startYear","noOfMonths","startOfMonth","getDomainConfig","startOfWeek","domainConfig","noOfMonthWeeks","getCol","empty","currentDate","currentDateWithinData","getSubDomainConfig","lineOptions","axisOptions","xAxis","xAxisMode","yAxisConfig","yAxisMode","id","xIsSeries","shortenYAxisNumbers","formatTooltipX","calcXPositions","calcYAxisParameters","getAllYValues","makeDataByIndex","unitWidth","xOffset","dataValues","intervalHeight","yAxisConfigObject","yAxisAlignment","yKeys","find","yPtsArray","firstArr","newYptsArr","shortest","Infinity","longest","calcDatasetPoints","calcYExtremes","calcYRegions","scaleAll","axis","barChartIndex","cumulativeYs","replace","char","stacked","yExtremes","cumulativeYPos","multiAxis","allValueLists","generateCumulative","cumulative","groupedDataSets","cur","barDatasets","lineDatasets","barsConfigs","barIndex","spaceRatio","lineConfigs","minLine","dotSize","markerConfigs","optionals","dataUnitComponents","dataByIndex","formatX","formatY","relX","relY","mapTooltipXPosition","dbi","yExtreme","formattedLabel","overlayGuides","currentIndex","currentUnit","_this8","setCurrentDataPoint","_this10","_this11","getDataPoint","datasetValues","splice","DonutChart","Chart","frappe","NAME","VERSION","Charts"],"mappings":"yDACwB,gBAATA,IAAoBC,GAAOC,UAAUC,cAAcH,GAAQA,GAAQ,KA4ClF,QAAgBI,GAAUC,MACrBC,GAAOD,EAAQE,mCAKbD,EAAKE,KAAON,SAASO,gBAAgBC,WAAaR,SAASS,KAAKD,gBAC/DJ,EAAKM,MAAQV,SAASO,gBAAgBI,YAAcX,SAASS,KAAKE,aAO1E,QAAgBC,GAASC,SACI,QAApBA,EAAGC,aAGZ,QAAgBC,GAAoBF,MAE/BT,GAAOS,EAAGR,8BAGbD,GAAKE,KAAO,GACNF,EAAKM,MAAQ,GACbN,EAAKY,SAAWC,OAAOC,aAAelB,SAASO,gBAAgBY,iBAC1DC,QAAUH,OAAOI,YAAcrB,SAASO,gBAAgBe,aAIrE,QAAgBC,GAAuBpB,MAClCqB,GAASP,OAAOQ,iBAAiBtB,GACjCuB,EAAUC,WAAWH,EAAOI,aAC/BD,WAAWH,EAAOK,oBAEZ1B,GAAQmB,YAAcI,EA2B9B,QAAgBI,GAAKC,EAAQC,EAAMC,MAC9BC,GAAMlC,SAASmC,YAAY,gBAE3BC,UAAUJ,GAAM,GAAM,OAErB,GAAIK,KAAKJ,KACTI,GAAKJ,EAAWI,SAGdN,GAAOO,cAAcJ,GC7E7B,QAAgBK,GAAaC,SACrBA,GAAEC,YAAcD,EAAEE,QAAQpC,IAAMkC,EAAEG,SAASrC,IAGnD,QAAgBsC,GAAcJ,SACtBA,GAAEE,QAAQhC,KAAO8B,EAAEG,SAASjC,KAGpC,QAAgBmC,GAAeL,SACPA,GAAEE,QAAQpC,IAAMkC,EAAEE,QAAQ1B,OAC9CwB,EAAEG,SAASrC,IAAMkC,EAAEG,SAAS3B,OAC5BwB,EAAEC,YAAcD,EAAEM,aAItB,QAAgBC,GAAcP,SACPA,GAAEE,QAAQhC,KAAO8B,EAAEE,QAAQtB,MAC9CoB,EAAEG,SAASjC,KAAO8B,EAAEG,SAASvB,MClD1B,QAAS4B,GAASC,SACjBtB,YAAWsB,EAAEC,QAAQ,IAyC7B,QAAgBC,GAAUC,EAAOC,EAAOlD,MAASmD,0DAC5CnD,OACOmD,EAAQF,EAAM,GAAKA,EAAMA,EAAMG,OAAS,OAE/CC,GAAc,GAAIC,OAAMC,KAAKC,IAAIN,IAAQO,KAAKzD,YAC1CmD,EAAQE,EAAYK,OAAOT,GAASA,EAAMS,OAAOL,GAS1D,QAAgBM,GAAeC,EAAQC,UAC9BD,EAAO,IAAIR,OAASS,EAyB7B,QAAgBC,GAAmBC,EAAOC,YAErCT,KAAKU,IAAIF,EAAQG,IAAeF,IAChCT,KAAKY,IAAIJ,EAAQG,IAAeF,GASrC,QAAgBI,GAAcC,MAAWC,kEACpCC,OAAOC,MAAMH,SACMI,KAAdJ,MACCE,OAAOG,SAASL,MACjBC,GAAeD,EAAY,KAQrC,QAAgBM,GAAM7B,SAGdyB,QAAOhB,KAAKoB,MAAM7B,EAAI,MAAQ,OAOrC,QAAgB8B,GAAUP,MACtBQ,UAAQC,SAAOC,YAEfV,YAAqBW,YAChB,IAAIA,MAAKX,EAAUY,cAGH,qBAAdZ,iBAAAA,KAAwC,OAAdA,QAC5BA,KAGAf,MAAM4B,QAAQb,aAElBU,IAAOV,KACFA,EAAUU,KAEXA,GAAOH,EAAUE,SAGnBD,GC3ID,QAASM,GAAqBC,EAAMC,MACtCC,UAAQC,eACRH,IAAQC,KACFA,EAAWD,IAChBA,MAEKA,EAAOC,IACZA,IAGGC,EAAQC,GAGjB,QAAgBC,GAAqBC,EAAQC,MAC5CC,0DAAaD,EAAOtC,OAASqC,EAAOrC,aAGjCuC,GAAa,IACN3C,EAAUyC,EAAQE,KAElB3C,EAAU0C,EAAQC,IAEpBF,EAAQC,GAGjB,QAAgBE,GAAeC,EAAKC,MAC9BD,QAGDA,GAAIzC,OAAS0C,EACTD,EAAIE,MAAM,EAAGD,EAAI,GAAK,MAEtBD,EAIT,QAAgBG,GAAmBC,MAC9BC,aACiB,gBAAVD,GAAoBC,EAASD,MACnC,IAAqB,gBAAVA,OACN1B,OAAO0B,GACZ1B,OAAOC,MAAM0B,IAAS,MAAOD,MAI9BE,GAAI5C,KAAK6C,MAAM7C,KAAK8C,MAAM9C,KAAKC,IAAI0C,QACnCC,GAAK,EAAG,MAAOD,MACfI,GAAI/C,KAAK6C,MAAMD,EAAI,GACnBI,EAAahD,KAAKiD,IAAI,GAAIL,EAAQ,EAAJG,KAAWJ,EAAS3C,KAAKiD,IAAI,GAAIL,IAAIpD,QAAQ,SAGxEQ,MAAKoB,MAAgB,IAAV4B,GAAe,IAAM,KAAO,GAAI,IAAK,IAAK,IAAK,KAAKD,GAIvE,QAAgBG,GAAwBC,EAAOC,OAG1C,GADAC,MACIC,EAAE,EAAEA,EAAEH,EAAMtD,OAAOyD,MACnBC,MAAMJ,EAAMG,GAAIF,EAAME,QAI1BE,GAAO,SAACC,EAAQC,MACfC,GAAUD,EAAO,GAAKD,EAAO,GAC7BG,EAAUF,EAAO,GAAKD,EAAO,iBAExBzD,KAAK6D,KAAK7D,KAAKiD,IAAIU,EAAS,GAAK3D,KAAKiD,IAAIW,EAAS,UACpD5D,KAAK8D,MAAMF,EAASD,KAIzBI,EAAe,SAACC,EAASC,EAAUC,EAAMC,MAGxCC,GAAIZ,EAFAS,GAAYD,EACZE,GAAQF,GAEZxD,EAAQ4D,EAAE5D,OAAS2D,EAAUnE,KAAKqE,GAAK,GACvCxE,EAfW,GAeFuE,EAAEvE,cACPmE,EAAQ,GAAKhE,KAAKY,IAAIJ,GAASX,EAC/BmE,EAAQ,GAAKhE,KAAKU,IAAIF,GAASX,UAUzB,UAACwD,EAAQiB,SAChBjB,GAAOkB,OAAO,SAACC,EAAKC,EAAOnB,EAAGoB,SAAY,KAANpB,EACrCmB,EAAM,OAAMA,EAAM,GAClBD,MAAOF,EAAQG,EAAOnB,EAAGoB,IAAM,KAGtBrB,EAZI,SAACoB,EAAOnB,EAAGoB,MAC1BC,GAAMZ,EAAaW,EAAEpB,EAAI,GAAIoB,EAAEpB,EAAI,GAAImB,GACvCG,EAAMb,EAAaU,EAAOC,EAAEpB,EAAI,GAAIoB,EAAEpB,EAAI,IAAI,cACtCqB,EAAI,OAAMA,EAAI,OAAMC,EAAI,OAAMA,EAAI,OAAMH,EAAM,OAAMA,EAAM,KCvExE,QAASI,GAAWC,SACfA,GAAI,IAAY,IACXA,EAAI,EAAU,EAChBA,EAGR,QAAgBC,GAAmBC,EAAOC,MACrCC,GAAMC,GAASH,GACfI,GAAW,CACD,MAAVF,EAAI,OACDA,EAAI1C,MAAM,MACL,MAER6C,GAAMC,SAASJ,EAAI,IACnBJ,EAAID,GAAYQ,GAAO,IAAMJ,GAC7BM,EAAIV,GAAaQ,GAAO,EAAK,KAAUJ,GACvCO,EAAIX,GAAkB,IAANQ,GAAkBJ,UAC9BG,EAAS,IAAI,KAAOI,EAAKD,GAAK,EAAMT,GAAK,IAAKW,SAAS,IAGhE,QAAgBC,GAAarF,MAGxBsF,GAAS,mHADA,uCAECC,KAAKvF,IAAWsF,EAAOC,KAAKvF,GC3B3C,QAASwF,GAAEzJ,EAAMC,SACO,gBAATD,IAAoBC,GAAOC,UAAUC,cAAcH,GAAQA,GAAQ,KAGlF,QAAgB0J,GAAUC,EAAK3B,MAC1B3H,GAAUH,SAAS0J,gBAAgB,6BAA8BD,OAEhE,GAAIzC,KAAKc,GAAG,IACZ6B,GAAM7B,EAAEd,MAEF,WAANA,IACD2C,GAAKC,YAAYzJ,OAEf,IAAU,WAAN6G,EAAgB,IACpB6C,GAAMN,EAAEI,KACRG,WAAWC,aAAa5J,EAAS0J,KAC7BD,YAAYC,OAEJ,WAAN7C,EACQ,qBAAR2C,iBAAAA,YACFK,KAAKL,GAAKM,IAAI,cACZC,MAAMC,GAAQR,EAAIQ,MAInB,cAANnD,MAAyB,SACnB,cAANA,IACF,YAAyB2C,IAEjBS,aAAapD,EAAG2C,UAKpBxJ,GAGR,QAASkK,GAAuBC,EAAYC,SACpCf,GAAU,yBACRc,KACJC,KACA,KACA,KACA,KACA,IAIN,QAASC,GAAgBC,EAAUC,EAAQhC,EAAOiC,SAC1CnB,GAAU,eACNiB,uBACc/B,SACdgC,iBACMC,IAIlB,QAAgBC,GAAiBC,EAAQC,EAAWC,EAAOtF,SACnD+D,GAAU,iBACLsB,SACHD,QACDE,SACCtF,IAIV,QAAgBuF,GAAYC,SACpBzB,GAAU,eACRyB,IAIV,QAAgBC,GAAaJ,MAAWK,0DAAU,GAAIN,6DAAOjG,GACxDwG,aACQN,YACAK,SAETN,KAAQO,EAAKC,OAASR,GAClBrB,EAAU,IAAK4B,GAWvB,QAAgBE,GAASC,SACjB/B,GAAU,yEAD0B,KAGvC+B,wEAHkD,mEAAa,6EAAoB,KAYxF,QAAgBC,GAAeC,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EAC3FC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAAqBN,EAAOI,EAAIL,EAAYK,EAAnCG,EAAsCP,EAAOjG,EAAIgG,EAAYhG,YAChEiG,EAAOI,MAAKJ,EAAOjG,YAC1BoG,MAAaE,aACZ7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,OAGf,QAAgBC,GAAcV,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EAC1FC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAA6BN,EAAOI,EAAIL,EAAYK,EAA3CK,EAAyD,EAAXT,EAAOjG,EAA7CwG,EAAoDP,EAAOjG,EAAIgG,EAAYhG,YACtFiG,EAAOI,MAAKJ,EAAOjG,YAC1BoG,MAAaE,aACZ7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWG,cACVN,MAAaM,aACZjI,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,OAGf,QAAgBG,GAAqBZ,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EACjGC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAAqBN,EAAOI,EAAIL,EAAYK,EAAnCG,EAAsCP,EAAOjG,EAAIgG,EAAYhG,YAEhEoG,MAAaE,aACnB7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,EAGf,QAAgBI,GAAoBb,EAAeC,EAAaC,EAAQxH,MAAQyH,0DAAU,EAAGC,yDAAS,EAChGC,EAAyBH,EAAOI,EAAIN,EAAcM,EAAvCC,EAA0CL,EAAOjG,EAAI+F,EAAc/F,EAC9EuG,EAA6BN,EAAOI,EAAIL,EAAYK,EAA3CK,EAAuD,EAATjI,EAAa6H,EAAnDE,EAA8DP,EAAOjG,EAAI+F,EAAc/F,YAElGoG,MAAaE,aACnB7H,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWG,YACVN,MAAaM,aACZjI,MAAUA,QAAY0H,OAAYD,EAAY,EAAI,YACpDK,MAAWC,EAGf,QAAgBK,GAAajC,EAAY5B,MAAO8D,2DAC3CjC,EAAY,sBAA6B7B,EAAQ,KAAM8D,EAAU,UAAY,WAC7EC,EAAcpC,EAAuBC,EAAYC,GACjDmC,GAAa,EAAG,GAAK,UACtBF,QACW,GAAK,GAAK,MAGRC,EAAa,KAAM/D,EAAOgE,EAAU,MACpCD,EAAa,MAAO/D,EAAOgE,EAAU,MACrCD,EAAa,OAAQ/D,EAAOgE,EAAU,IAE/CnC,EAGR,QAAgBoC,GAAcZ,EAAGrG,EAAGqF,EAAOtF,MAC1CmH,0DAAMC,GAA8BjJ,yDAAK,aAkBlC4F,GAAU,kBAfL,mBACRuC,IACArG,QACIqF,SACCtF,OACF7B,iBAEK6E,EAAmB7E,GAAO,8BAGV6B,EAASsF,QAAUA,OAAUtF,iBACvCmH,KAOnB,QAAgBE,GAAWhC,EAAWiB,EAAGrG,EAAGqH,EAAM5I,MAAQP,0DAAK,OAAQoJ,4DAClE5B,aACQN,IACRiB,IACArG,QACIqH,SACCA,KACJ5I,OACEP,iBAGAoG,KAAKgD,GAAM/C,IAAI,cAChB/E,GAAO8H,EAAK9H,KAGXsE,EAAU,OAAQ4B,GAG1B,QAAgB6B,GAAUlB,EAAGrG,EAAGqH,MAAMnJ,0DAAK,OAAQwC,yEAC/BL,EAAeK,EAAO8G,IAAmB9G,KAExDgF,cACQ,eACR,IACA,QACI2B,SACC,WACFnJ,GAEHuJ,EAAO3D,EAAU,kBACT,wBACR,IACA,KACc,EAAZ4D,GAAiB,iBACI,IAAZA,GAAmB,mBAClB,aACTC,aACKjH,IAGRkH,EAAQ9D,EAAU,4BACGuC,OAAMrG,iBAEzBkE,YAAYJ,EAAU,OAAQ4B,MAC9BxB,YAAYuD,GAEXG,EAGR,QAAgBC,GAAUxB,EAAGrG,EAAGqH,MAAMnJ,0DAAK,OAAQwC,yEAC/BL,EAAeK,EAAO8G,IAAmB9G,KAExDgF,cACQ,gBACP,KACA,IACD2B,OACGnJ,GAEHuJ,EAAO3D,EAAU,kBACT,wBACR,IACA,KACE4D,GAAa,QACbA,GAAU,EAAK,iBACM,IAAZA,GAAmB,mBAClB,aACTC,aACKjH,IAGRkH,EAAQ9D,EAAU,4BACGuC,OAAMrG,iBAEzBkE,YAAYJ,EAAU,SAAU4B,MAChCxB,YAAYuD,GAEXG,EAGR,QAAgBE,GAAS1C,EAAWiB,EAAGrG,EAAG+H,MAASC,6DAC9CC,EAAWD,EAAQC,UAAYP,SAI5B5D,GAAU,kBACLsB,IACRiB,IACArG,UANoBd,KAAf8I,EAAQE,GAAmBF,EAAQE,GAAMD,EAAW,GAOnD,iBACIA,EAAW,UAPdD,EAAQ9J,MAAQyJ,iBACVK,EAAQG,YAAc,kBAS3BJ,IAIb,QAASK,GAAa/B,EAAG3F,EAAO2H,EAAIC,MAAIN,4DACnCA,GAAQO,SAAQP,EAAQO,OAASC,OACjCzH,GAAI+C,EAAU,kBACN,iBAAmBkE,EAAQ5C,aAClC,KACA,KACAiD,KACAC,iBAEKN,EAAQO,UAIdd,EAAO3D,EAAU,UACjB,IACAuE,EAAKC,EAAKD,EAAKI,GAAeJ,EAAKI,GAAef,MACjDA,GAAY,iBACHA,GAAY,mBACV,mBACJhH,EAAQ,KAGhBc,EAAOsC,EAAU,4BACKuC,oBAGrBnC,YAAYnD,KACZmD,YAAYuD,GAEVjG,EAGR,QAASkH,GAAa1I,EAAGU,EAAOiI,EAAIC,MAAIZ,4DAC/BA,GAAQO,SAAQP,EAAQO,OAASC,IACjCR,EAAQa,WAAUb,EAAQa,SAAW,IACrCb,EAAQc,YAAWd,EAAQc,UAAY,QACxCd,EAAQe,iBAAgBrI,EAAQD,EAAmBC,OAEnD0E,GACA,mBACA4C,EAAQ5C,WACc,WAArB4C,EAAQa,SAAwB,SAAW,IAE7CG,EAAiC,SAAtBhB,EAAQc,UACxBd,EAAQiB,MAASN,EAAKF,GAAgBS,GAAcP,EAAKF,GACzDT,EAAQiB,MAASL,EAAoB,EAAfH,GAAoBS,GAAcN,EAAoB,EAAfH,GAIvD1H,EAAI+C,EAAU,kBACHsB,KAJC4C,EAAQiB,MAAQN,EAAKO,GAAcP,KACnCX,EAAQiB,MAAQL,EAAKM,GAAcN,KAM3C,KACA,iBAEQZ,EAAQO,UAIpBd,EAAO3D,EAAU,UACdkF,IACA,KACCtB,GAAY,EAAI,EAAI,iBACXA,GAAY,mBACViB,EAAKC,EAAK,MAAQ,kBACtBlI,EAAQ,KAGnBc,EAAOsC,EAAU,+BACU9D,uBACT,UAGT,KAATyH,GAAuB,MAATA,MACTjD,MAAM+D,OAAS,2BAGnBrE,YAAYnD,KACZmD,YAAYuD,GAEVjG,EAGX,QAAgB2H,GAAkBnB,MACzBA,EAAQiB,UAEPjJ,GAAyB,SAArBgI,EAAQoB,UACnBpB,EAAQjI,OAASsJ,IAAiB,EAAKjL,EAAe4J,EAAQiB,MAAO,GAAK,GAC1EjB,EAAQjI,OAASsJ,IAAiB,EAAKjL,EAAe4J,EAAQiB,MAAO,GAAK,EACtE5C,EAAyB,SAArB2B,EAAQoB,SAAsB,EAAIpB,EAAQ3C,MAC9CiD,EAA0B,SAArBN,EAAQoB,SAAsB1B,GAAYwB,GAAcxB,IAA2B,EAAfwB,GAEtEI,EACmB,UAArBtB,EAAQoB,oCAING,EAAWzF,EAAU,kBACZ,gBACR,IACA,KACIwE,mBACSZ,sBACD,kBACDM,EAAQiB,YAGzBO,EAAU1F,EAAU,OACpB,IACA,eACW,kCACUuC,OAAMrG,OAAMsJ,oBACjBtB,EAAQoB,oBAGpBlF,YAAYqF,GAEVC,GAGX,QAAgBC,GAAMzJ,EAAGU,EAAO2E,MAAO2C,4DAC9BnJ,GAAcmB,KAAIA,EAAI,GAEtBgI,EAAQ0B,MAAK1B,EAAQ0B,IAAM,QAC3B1B,EAAQhD,SAAQgD,EAAQhD,OAAS,GACjCgD,EAAQ2B,OAAM3B,EAAQ2B,KAAO,QAC7B3B,EAAQO,SAAQP,EAAQO,OAASC,IACjCR,EAAQ5C,YAAW4C,EAAQ5C,UAAY,OAExCuD,IAAM,EAAIiB,GACVhB,EAAsB,SAAjBZ,EAAQ2B,KAAkBtE,EAAQuE,GAAmB,CAEzC,UAAjB5B,EAAQ2B,MAAmC,UAAhB3B,EAAQ0B,QAC9BrE,EAAQuE,KACRvE,MAGLL,GAAyB,SAAhBgD,EAAQ0B,KAAkB,EAAI1B,EAAQhD,OAASgD,EAAQhD,iBAE9DA,KACAA,EAEC0D,EAAa1I,EAAGU,EAAOiI,EAAIC,UACtBZ,EAAQO,iBACLP,EAAQ5C,mBACT4C,EAAQa,mBACPb,EAAQ0B,UAClB1B,EAAQiB,qBACOjB,EAAQe,iBAIhC,QAAgBc,GAAMxD,EAAG3F,EAAOX,MAAQiI,4DAClCnJ,GAAcwH,KAAIA,EAAI,GAEvB2B,EAAQ0B,MAAK1B,EAAQ0B,IAAM,UAC3B1B,EAAQhD,SAAQgD,EAAQhD,OAAS,GACjCgD,EAAQ2B,OAAM3B,EAAQ2B,KAAO,QAC7B3B,EAAQO,SAAQP,EAAQO,OAASC,IACjCR,EAAQ5C,YAAW4C,EAAQ5C,UAAY,OAavCiD,GAAKtI,EAAS6J,GACdtB,EAAsB,SAAjBN,EAAQ2B,MAAmB,EAAIC,GAAmB7J,QAEvC,SAAjBiI,EAAQ2B,MAAmC,QAAhB3B,EAAQ0B,SAE/B,EAAIE,KACL,GAGCxB,EAAa/B,EAAG3F,EAAO2H,EAAIC,UACzBN,EAAQO,iBACLP,EAAQ5C,mBACT4C,EAAQa,WAIpB,QAAgBiB,GAAQ9J,EAAGU,EAAO2E,MAAO2C,4DACpCA,GAAQ+B,WAAU/B,EAAQ+B,SAAW,YAIrCR,GAAWzF,EAAU,kBACb,gBAJiB,SAArBkE,EAAQ+B,SAAsBtB,GACnCpD,EAAQjH,EAAesC,EAAO,GAAK+H,KAKlC,KACEf,IAAa,EAAK,iBACVA,GAAY,mBACV,kBACJhH,EAAM,KAGdc,EAAOkH,EAAa1I,EAAG,GAAI,EAAGqF,UACzB2C,EAAQO,QAAUC,aACfR,EAAQ5C,WAAa,YACtB4C,EAAQa,oBAGd3E,YAAYqF,GAEV/H,EAGR,QAAgBwI,GAAQ3B,EAAIC,EAAIjD,EAAO3E,MAAOsH,6DAEzCjI,EAASsI,EAAKC,EAEd5N,EAAOoJ,EAAU,6EAIX0E,sBACenD,OAAUtF,KAG/B,IACA,QACIsF,SACCtF,GAGLiI,GAAQ+B,WAAU/B,EAAQ+B,SAAW,YAIrCR,GAAWzF,EAAU,kBACb,gBAJiB,SAArBkE,EAAQ+B,SAAsBtB,GACnCpD,EAAQjH,EAAesC,EAAM,GAAI,KAAO+H,KAKvC,KACEf,IAAa,EAAK,iBACVA,GAAY,mBACV,kBACJhH,EAAM,KAGduJ,EAASnG,EAAU,+BACKwE,iBAGrBpE,YAAYxJ,KACZwJ,YAAYqF,GAEZU,EAGR,QAAgBC,GAAW7D,EAAGxG,EAAMwF,EAAOrC,MAAOtC,0DAAM,GAAIyJ,yDAAM,EAAGnF,yDAAO,EAAGoF,8DAC5DxK,EAAqBC,EAAMuK,EAAKtK,oBAA7CC,OAAQC,UACRgF,EAES,IAAXjF,MACOqK,EAAKC,aACTD,EAAKC,WAINxL,EAAcwH,KAAIA,EAAI,GACtBxH,EAAcmB,KAAIA,EAAI,GACtBnB,EAAckB,GAAQ,KAAOA,EAAS,GACtClB,EAAcwG,GAAO,KAAOA,EAAQ,MAErC3K,GAAOoJ,EAAU,4CAEJd,qBACImH,IACjB9D,IACArG,QACIqF,SACCtF,WAGA,KAEKW,EAAM7C,OAEb,GACD6G,aAAa,IAAK,KAClBA,aAAa,IAAK,MACnB+C,GAAO3D,EAAU,kBACT,qBACRuB,EAAM,IACN,KACEqC,GAAY,GAAK,EAAK,iBACdA,GAAY,mBACV,mBACJhH,IAGRkH,EAAQ9D,EAAU,wBACDqG,yBACI9D,OAAMrG,iBAEzBkE,YAAYxJ,KACZwJ,YAAYuD,GAEXG,QArBAlN,GAyBT,QAAgB4P,GAAWjE,EAAGrG,EAAGvB,EAAQuE,MAAOtC,0DAAM,GAAIyJ,yDAAM,EAC3DI,EAAMzG,EAAU,yBACHd,qBACImH,KAChB9D,KACArG,IACDvB,WAGK,KAEKiC,EAAM7C,OAEb,GACF6G,aAAa,KAAM,KACnBA,aAAa,KAAM,MAEnB+C,GAAO3D,EAAU,kBACT,qBACR,IACA,KACE4D,GAAY,GAAK,EAAIjJ,EAAU,iBACvBiJ,GAAY,mBACV,mBACJhH,IAGRkH,EAAQ9D,EAAU,wBACDqG,yBACI9D,OAAMrG,iBAEzBkE,YAAYqG,KACZrG,YAAYuD,GAEXG,QAtBA2C,GA0BT,QAAgBC,GAASrJ,EAAOC,EAAO4B,MAAOgF,6DAAYoC,4DAErDK,EADarJ,EAAMmD,IAAI,SAACvE,EAAGsB,SAAOH,GAAMG,GAAK,IAAMtB,IAC5B0K,KAAK,IAG5B1C,GAAQ2C,SACXF,EAAYvJ,EAAwBC,EAAOC,OAExCwJ,GAAOhF,EAAS,IAAI6E,EAAW,kBAAmBzH,MAGnDgF,EAAQ6C,SAAU,IAChBC,GAAcjE,EAAauD,EAAKW,QAAS/H,KACxCwB,MAAM+D,eAAiBuC,SAGzBE,SACGJ,MAIJ5C,EAAQiD,WAAY,IAClBC,GAAqBrE,EAAauD,EAAKW,QAAS/H,GAAO,GAEvD6C,EAAU,IAAS1E,EAAM,OAAMiJ,EAAKtK,aAAc2K,MAAgBtJ,EAAMX,OAAO,GAAG,OAAM4J,EAAKtK,WAC3FmK,OAASrE,EAASC,gBAAwB,eAAgBqF,aAG1DF,GClpBR,QAAgBG,GAAUC,EAAMC,EAAUC,EAAUC,MAC/CC,GAA0B,gBAAbH,GAAwBA,EAAWA,EAASX,KAAK,aAEjEU,GACC3F,UAAW6F,EAASZ,KAAK,OAC1Ba,EACAE,GACA,aACChG,UAAW+F,IAId,QAAgBE,IAAkB7B,EAAO8B,EAAMC,SACvCT,GAAUtB,GAAQ+B,EAAM,IAAKD,EAAM,GAAIE,IAG/C,QAAgBC,IAAkBrC,EAAOsC,EAAMC,SACvCb,GAAU1B,GAAQ,EAAGuC,IAAQ,EAAGD,GAAOF,IAG/C,QAAgBI,IAAcC,EAAWC,EAAOC,EAAOC,MAClDC,GAAYH,EAAQC,EACpB1R,EAAOwR,EAAUK,WAAW,WAG/B7R,GACEqF,OAAQuM,EAAWE,mBAHV9R,EAAK+R,aAAa,cAGyBH,GACtDT,GACAJ,IAGeN,EAAUe,GAAY,EAAGG,IAAS,EAAGD,GAAQP,KAI9D,QAAgBa,IAAWC,EAAKtG,EAAGxG,EAAMwF,MAAOL,0DAAO,IACpCpF,EAAqBC,8DAAWC,oBAA7CC,OAAQC,iBACRgF,EACe,SAAjB2H,EAAIC,WACKD,EAAIJ,WAAW,IAGxBlH,MAAOA,EAAOtF,OAAQA,GACvB8M,GACApB,IAIeN,EAAUwB,EADRA,EAAIF,aAAa,aAAaK,MAAM,KAAK,GAAGtM,MAAM,GAAI,IAC3B6F,EAAGrG,GAAI6L,OAG3Cc,GAAMtH,MAAOA,EAAOtF,OAAQA,EAAQsG,EAAGA,EAAGrG,EAAGA,GAAI6M,GAAepB,KAK3E,QAAgBsB,IAAWxC,EAAKlE,EAAGrG,SACd,WAAjBuK,EAAIqC,UAEUzB,EAAUZ,EADRA,EAAIkC,aAAa,aAAaK,MAAM,KAAK,GAAGtM,MAAM,GAAI,IAC3B6F,EAAGrG,GAAI6L,OAG3CtB,GAAMyC,GAAI3G,EAAG4G,GAAIjN,GAAI6M,GAAepB,KAK/C,QAAgByB,IAAYlC,EAAOmC,EAAUC,EAAUtN,EAAU6K,MAC5D0C,MACA5C,EAAY2C,EAAS7I,IAAI,SAACvE,EAAGsB,SAAO6L,GAAS7L,GAAK,IAAMtB,IAAI0K,KAAK,IAEjEC,KACHF,EAAYvJ,EAAwBiM,EAAUC,OAEzCE,IAAYtC,EAAMJ,MAAOrN,EAAE,IAAMkN,GAAY8C,GAAe9B,SACnDlK,KAAK+L,GAEjBtC,EAAMf,OAAQ,IACZuD,GAAgBL,EAAS,OAAMrN,MAC/B2N,MAAeN,EAAS3M,OAAO,GAAG,QAAOV,EAEvC4N,GACL1C,EAAMf,QACL1M,EAAE,IAAMiQ,EAAa/C,EAAYgD,GAClCF,GACA9B,MAEclK,KAAKmM,SAGdL,GAGR,QAAgBM,IAAeC,EAAS/H,UAC/B+H,GAAUrQ,EAAGsI,GAAUgH,GAAepB,IC1F/C,QAASoC,IAAkBpT,EAASqT,EAAOC,MAAKC,0DAAW,SAAU1R,6DAAK4C,GAAW+O,4DAEhFC,EAAczT,EAAQ0T,WAAU,GAChCC,EAAa3T,EAAQ0T,WAAU,OAE/B,GAAIE,KAAiBP,GAAO,IAC3BQ,YACiB,cAAlBD,EACe/T,SAAS0J,gBAAgB,6BAA8B,oBAEvD1J,SAAS0J,gBAAgB,6BAA8B,cAErEuK,GAAeN,EAAUI,IAAkB5T,EAAQgS,aAAa4B,GAChE9O,EAAQuO,EAAMO,GAEdG,iBACYH,OACTE,KACFhP,QACG,SACFwO,EAAI,IAAO,WACRQ,EAAe,IAAMhP,aACjBkP,GAAOT,YACT,eACA,cACJ,SAGJ1R,OACF,KAAmBA,OAGf,GAAIgF,KAAKkN,KACE9J,aAAapD,EAAGkN,EAASlN,MAG7B4C,YAAYoK,GAErBhS,IACSoI,aAAa2J,eAA4B9O,SAEzCmF,aAAa2J,EAAe9O,UAIjC2O,EAAaE,GAGtB,QAAgB3I,IAAUhL,EAAS+J,KAC1BA,MAAMiB,UAAYjB,IAClBA,MAAMkK,gBAAkBlK,IACxBA,MAAMmK,YAAcnK,IACpBA,MAAMoK,aAAepK,IACrBA,MAAMqK,WAAarK,EAG5B,QAASsK,IAAWvJ,EAAcwJ,MAC7BC,MACAC,OAEK1K,IAAI,eACR6G,GAAO3Q,EAAQ,GACf0K,EAASiG,EAAKhH,WAEd8J,SAAaE,WAET,GAAKhD,QACeyC,mBAAqBpT,8BAErC8G,KAAK6M,KACJ7M,MAAM2M,EAAa/I,IAE5BA,KACI+J,aAAahB,EAAa9C,QAI/B+D,GAAU5J,EAAa4I,WAAU,YAExB5J,IAAI,SAAC2J,EAAa5M,GAC1B4M,EAAY,OACH,GAAGgB,aAAaF,EAAY1N,GAAI4M,EAAY,MAC/C5M,GAAG,GAAK0N,EAAY1N,MAIxB6N,EAGR,QAAgBC,IAAiBjK,EAAQkK,EAAYC,MACpB,IAA7BA,EAAkBzR,WAEjB0R,GAAiBT,GAAWO,EAAYC,EACzCD,GAAWjL,YAAce,MACpBqK,YAAYH,KACZnL,YAAYqL,eAKT,WACPA,EAAenL,YAAce,MACxBqK,YAAYD,KACZrL,YAAYmL,KAElBI,KCnHG,QAASC,IAAaC,EAAUrI,MAClC5E,GAAIpI,SAASsV,cAAc,OAC7BpL,MAAQ,mBACNqL,GAAO,GAAIC,MAAKxI,GAAOhL,KAAM,iCAC7ByT,EAAMxU,OAAOyU,IAAIC,gBAAgBJ,KACnCK,KAAOH,IACPI,SAAWR,WACJ5U,KAAKmJ,YAAYxB,KACxB0N,mBACS,oBACDrV,KAAKyU,YAAY9M,UACnBsN,IAAIK,gBAAgBN,IACzB,KAGJ,QAAgBO,IAAiBC,MAC5BC,GAAQD,EAAIpC,WAAU,KACpBsC,UAAUC,IAAI,qBACdhM,aAAa,QAAS,gCACtBA,aAAa,cAAe,mCAC9BiM,GAAU9M,EAAE+M,OAAO,mBACTC,OAERxM,aAAasM,EAASH,EAAMM,eAE9BC,GAAYlN,EAAE+M,OAAO,gBACf1M,YAAYsM,GAEfO,EAAUC,UCblB,QAASC,IAAWC,MACfC,GAAS,GAAI1R,MAAKyR,YACfE,WAAWD,EAAOE,aAAeF,EAAOG,qBACxCH,EAGR,QAAgBI,IAAYL,MACvBM,GAAKN,EAAKO,UACVC,EAAKR,EAAKS,WAAa,SAE1BT,EAAKU,eACJF,EAAG,EAAI,GAAK,KAAOA,GACnBF,EAAG,EAAI,GAAK,KAAOA,GACnB9G,KAAK,KAGR,QAAgB8F,IAAMU,SACd,IAAIzR,MAAKyR,EAAKxR,WAiBtB,QAAgBmS,IAAgBC,EAAWC,MACtCC,GAAgBC,GAAeH,SAC5B9T,MAAKkU,KAAKC,GAAeH,EAAeD,GAAWK,IAG3D,QAAgBD,IAAeL,EAAWC,MACrCM,GAAqBC,GAAaC,UAC9BtB,GAAWc,GAAWd,GAAWa,IAAcO,EAGxD,QAAgBG,IAAeV,EAAWC,SAClCD,GAAUH,aAAeI,EAAQJ,YACpCG,EAAUF,gBAAkBG,EAAQH,cAGzC,QAAgBa,IAAanR,MAAGoR,2DAC3BC,EAAYC,GAAYtR,SACrBoR,GAAQC,EAAUnS,MAAM,EAAG,GAAKmS,EAGxC,QAAgBE,IAAoBC,EAAOC,SACnC,IAAItT,MAAKsT,EAAMD,EAAQ,EAAG,GAIlC,QAAgBb,IAAef,MAC1B8B,GAAUxC,GAAMU,GACd+B,EAAMD,EAAQE,eACT,KAARD,MACMD,GAAW,EAAKC,GAElBD,EAIR,QAAgBG,IAAQjC,EAAMkC,KACxBC,QAAQnC,EAAKO,UAAY2B,GC0c/B,QAAgBE,IAAaC,EAAMC,EAAWC,MACzCnP,GAAOoP,OAAOpP,KAAKqP,IAAkBC,OAAO,kBAAKL,GAAKM,SAASC,KAC/DC,EAASJ,GAAiBrP,EAAK,kBAC5B0P,OAAOD,aACFP,UACFC,IAEH,GAAIQ,IAAeF,GCviB3B,QAASG,IAAU7N,MAKX,IAAJA,SACM,EAAG,MAETpH,MAAMoH,UACA8N,UAAW,iBAAkBC,SAAU,QAE5CC,GAAMhO,EAAI,EAAI,GAAK,MACnBlH,SAASkH,UACJ8N,SAAgB,iBAANE,EAAwBD,SAAU,OAGjDpW,KAAKC,IAAIoI,MACTiO,GAAMtW,KAAK6C,MAAM7C,KAAK8C,MAAMuF,WAGxBgO,GAFEhO,EAAErI,KAAKiD,IAAI,GAAIqT,IAENA,GAGpB,QAASC,IAAuBC,MAAKC,0DAAI,EACpCC,EAAa1W,KAAKkU,KAAKsC,GACvBG,EAAa3W,KAAK6C,MAAM4T,GACxBG,EAAQF,EAAaC,EAErBE,EAAYD,EACZE,EAAW,CAGZF,GAAQ,IACPA,EAAQ,GAAM,UAGKD,KAEVC,EAAM,IACP,GAITA,GAAS,MAEAA,KADC,IAKA,IAAVA,MACU,IACD,OAIR,GADAG,MACIzT,EAAI,EAAGA,GAAKuT,EAAWvT,MACpBC,KAAKoT,EAAaG,EAAWxT,SAEjCyT,GAGR,QAASC,IAAkBC,MAAUC,0DAAS,IACZhB,GAAUe,aAAtCE,OAAgBf,OACjBgB,EAAiBF,EAAWA,EAASlX,KAAKiD,IAAI,GAAImT,GAAW,EAK7DW,EAAYR,KAFCY,EAAe3X,QAAQ,GAEe4X,YAC3CL,EAAUxQ,IAAI,kBAIrB6P,GAAW,EACP7U,EAAQvB,KAAKiD,IAAI,IAAKmT,GAEvB7U,EAAQvB,KAAKiD,IAAI,GAAImT,KAK9B,QAAgBiB,IAAmBC,WAYzBC,GAA0BN,EAAUO,OAOxC,GANAT,GAAYC,GAAkBC,GAE9BQ,EAAeV,EAAU,GAAKA,EAAU,GAGxCxV,EAAQ,EACJ+B,EAAI,EAAG/B,EAAQiW,EAAalU,OAC1BmU,IACCC,SAAU,EAAKnW,SAEnBwV,MAvBkCY,2DAMtCV,EAAWjX,KAAKwW,kBAAOc,IACvBJ,EAAWlX,KAAKyW,kBAAOa,IAGTP,QAkBfE,GAAY,GAAKC,GAAY,EACpBhB,GAAUe,GAAU,KAC3BU,EAGSX,GAAkBC,EAAUC,GAF5BF,GAAkBC,OAQ3B,IAAGA,EAAW,GAAKC,EAAW,EAAG,IAOjCM,GAAcxX,KAAKC,IAAIiX,EAExBD,IAAYO,GACHtB,GAAUe,GAAU,KACnBM,EAA0BN,EAAUO,KAGrCtB,GAAUsB,GAAa,KACfD,EAA0BC,EAAaP,GACjC9S,UAAUoC,IAAI,mBAAW,EAANhH,SAOzC,IAAG0X,GAAY,GAAKC,GAAY,EAAG,IAInCU,GAAiB5X,KAAKC,IAAIiX,GAC1BW,EAAiB7X,KAAKC,IAAIgX,EAEnBf,IAAU0B,GAAgB,QACjCD,EAGSX,GAAkBY,EAAgBC,GAFlCb,GAAkBY,IAKTzT,UAAUoC,IAAI,mBAAW,EAANhH,UAGnCwX,GAGR,QAAgBe,IAAaC,MAExBC,GAAWC,GAAgBF,SAC5BA,GAAKG,QAAQ,IAAM,EAGTH,EAAKG,QAAQ,GAChBH,EAAK,GAAK,GAIL,EADJA,EAAK,GACUC,GAKX,EADJD,EAAKA,EAAKlY,OAAS,GACJmY,GAAYD,EAAKlY,OAAS,GAiBrD,QAAgBoY,IAAgBE,SACxBA,GAAa,GAAKA,EAAa,GAGvC,QAAgBC,IAAcD,SACtBA,GAAaA,EAAatY,OAAO,GAAKsY,EAAa,GAG3D,QAAgBE,IAAMpS,EAAKqS,SACnBhZ,GAASgZ,EAAMxW,SAAWmE,EAAMqS,EAAMC,iBAY9C,QAAgBC,IAAkBC,EAAMC,MAAKvM,2DACxCwM,EAAUD,EAAInU,OAAO,SAASqU,EAAMC,SAC/B7Y,MAAKC,IAAI4Y,EAAOJ,GAAQzY,KAAKC,IAAI2Y,EAAOH,GAAQI,EAAOD,aAGzDzM,GAAQuM,EAAIR,QAAQS,GAAWA,EAGvC,QAAgBG,IAAiBxB,EAAQyB,OASpC,GALAC,GAAehZ,KAAKwW,kBAAOc,IAE3B2B,EAAmB,GAAKF,EAAmB,GAC3CG,KAEI5V,EAAI,EAAGA,EAAIyV,EAAkBzV,IAAK,IACrC6V,GAAaH,GAAgBC,EAAmB3V,KACvCC,KAAK4V,SAGZD,GAGR,QAAgBE,IAAiB7X,EAAO2X,SAChCA,GAAatD,OAAO,kBAAKrW,GAAIgC,IAAO1B,OClPrC,QAASwZ,IAAS/P,EAAMhL,KACzBgb,OAAShQ,EAAKgQ,cAEfC,GAAgBjQ,EAAKgQ,OAAOzZ,OAG5B2Z,EAAWlQ,EAAKkQ,SAChBC,EAAY,GAAI1Z,OAAMwZ,GAAerZ,KAAK,SAC1CsZ,gBAGMC,OAIDlT,IAAI,eAERhH,EAAE+X,OAEC,IAEFoC,GAAOna,EAAE+X,YACNoC,EAAKnT,IAAI,kBAAStF,OAAMgF,GAAa,EAANA,KAG9BpG,OAAS0Z,EACTG,EAAKlX,MAAM,EAAG+W,GAEd9Z,EAAUia,EAAMH,EAAgBG,EAAK7Z,OAAQ,KAEnDyX,OAASoC,SAZTpC,OAASmC,CAgBRla,GAAEoa,YACDC,GAAyB/D,SAASvX,KACpCqb,UAAYrb,KASbgL,EAAKuQ,YACFA,SAAStT,IAAI,eACdhH,EAAEua,IAAMva,EAAEK,MAAO,QACCL,EAAEua,IAAKva,EAAEK,SAA1BA,aAASka,YAKRxQ,EAGR,QAAgByQ,IAAaC,MACxBT,GAAgBS,EAASV,OAAOzZ,OAChC4Z,EAAY,GAAI1Z,OAAMwZ,GAAerZ,KAAK,GAEvC+Z,UACQD,EAASV,OAAO9W,MAAM,GAAI,YACxBwX,EAASR,SAASjT,IAAI,SAAChH,iBACVA,EAAX2a,YAGE,UACET,EAAUjX,MAAM,GAAI,aACjBjD,EAAEoa,oBAKzBK,GAASG,aACFA,iBAEA,QACA,MAKPH,EAASH,aACFA,iBAEA,MACF,QACE,MAKHI,EAGR,QAAgBG,IAAmBC,MAAYf,6DAAWgB,6DACrDC,EAAeF,EAAaf,EAAOzZ,MACpC0a,IAAgB,IAAGA,EAAe,MACjCC,GAAiBD,EAAeE,GAEhCC,YACDJ,EAAU,IAERK,GAAiB3a,KAAKwW,kBAAO8C,EAAO/S,IAAI,kBAAS7D,GAAM7C,aAC1CG,KAAKkU,KAAKyG,EAAeH,SAG1BlB,GAAO/S,IAAI,SAAC7D,EAAOY,aAC1B,IACAzD,OAAS2a,IAEbF,EAOAhX,EAAIoX,GAAmB,MACjB,MAPNF,EAAe,EAAI,EACb9X,EAAMF,MAAM,EAAGgY,EAAe,GAAK,OAEnC9X,EAAMF,MAAM,EAAGgY,GAAkB,MAQrC9X,IC3GT,QAASkY,SAAejB,0DAAY,OAAQxS,eAAQ6C,qBACjC,eAAd2P,KACKrb,KAAO,OACR,GAAIuc,IAAU1T,EAAQ6C,IAGzB8Q,GAAWnB,GAKT,GAAImB,IAAWnB,GAAWxS,EAAQ6C,gBAJhC+Q,MAAM,yBAA2BpB,IC1B3C,SAAqBqB,EAAK7U,OACX,KAARA,IAAiBA,KACtB,IAAI8U,GAAW9U,EAAI8U,QAEnB,IAAKD,GAA2B,mBAAb1e,UAAnB,CAEA,GAAI4e,GAAO5e,SAAS4e,MAAQ5e,SAAS6e,qBAAqB,QAAQ,GAC9D3U,EAAQlK,SAASsV,cAAc,QACnCpL,GAAMlI,KAAO,WAEI,QAAb2c,GACEC,EAAKpI,WACPoI,EAAK7U,aAAaG,EAAO0U,EAAKpI,YAKhCoI,EAAKhV,YAAYM,GAGfA,EAAM4U,WACR5U,EAAM4U,WAAWC,QAAUL,EAE3BxU,EAAMN,YAAY5J,SAASgf,eAAeN,46IdT9CnV,GAAE+M,OAAS,SAAC7M,EAAK3B,MACZ3H,GAAUH,SAASsV,cAAc7L,OAEhC,GAAIzC,KAAKc,GAAG,IACZ6B,GAAM7B,EAAEd,MAEF,WAANA,IACD2C,GAAKC,YAAYzJ,OAEf,IAAU,WAAN6G,EAAgB,IACpB6C,GAAMN,EAAEI,KACRG,WAAWC,aAAa5J,EAAS0J,KAC7BD,YAAYC,OAEJ,WAAN7C,EACQ,qBAAR2C,iBAAAA,YACFK,KAAKL,GAAKM,IAAI,cACZC,MAAMC,GAAQR,EAAIQ,KAGlBnD,IAAK7G,KACP6G,GAAK2C,IAGLS,aAAapD,EAAG2C,SAInBxJ,GCxBD,IAAM8e,kBAEN,UACG,QACF,SACC,kBAGF,UACG,QACF,SACC,eAGI,gBACC,gBACC,iBAEC,IAyBHC,GAA4B,IAI5B5B,IAA4B,OAAQ,OAWpCzQ,GAA+B,EAS/BsR,GAAqB,EAI5BgB,IAAwB,aAAc,OAAQ,SAAU,MAAO,SACpE,SAAU,QAAS,cAAe,SAAU,UAAW,aAAc,aAKzDC,QACPD,QACCA,OACDA,cACOA,YARiB,UAAW,UAAW,UAAW,UAAW,iBAUlEA,IAIK9a,GAAcX,KAAKqE,GAAK,IctGhBsX,oCAEnBxU,OAAAA,aAAS,WACTyU,OAAAA,kCAEKzU,OAASA,OACTyU,OAASA,OACTC,UAAY,QACZC,WAAa,QACbC,mBACAC,gBAAkB,OAElB3T,EAAI,OACJrG,EAAI,OAEJpF,IAAM,OACNI,KAAO,OAEPif,wDAIAC,qDAIAhc,YACAic,qEAIApJ,UAAYlN,EAAE+M,OAAO,cACjBwJ,KAAKjV,iBACF,8JAKPkV,eAEApR,MAAQmR,KAAKrJ,UAAUxW,cAAc,eACrC+f,cAAgBF,KAAKrJ,UAAUxW,cAAc,yBAE7C4K,OAAOoV,iBAAiB,aAAc,aACrCF,sDAKFpR,QACDmR,MAAKjQ,YACF4G,UAAUrM,aAAa,mBAAoB0V,KAAKjQ,SAEnDiQ,KAAKJ,2BACYI,KAAKN,uBAAsBM,KAAKP,UAExCO,KAAKP,qBAAoBO,KAAKN,4BAErC7Q,MAAM+H,UAAY/H,OAClBqR,cAActJ,UAAY,QAE1B+I,WAAWxV,IAAI,SAACiW,EAAKlZ,MACnB0B,GAAQyX,EAAKb,OAAOtY,IAAM,QAC5B/B,EAA0B,IAAlBib,EAAIE,WAAmBF,EAAIE,UAAYF,EAAIE,UAAYF,EAAIjb,MAEnEob,EAAK9W,EAAE+M,OAAO,wCAEW5N,iDAE6B,IAAVzD,GAAeA,EAAQA,EAAQ,6BAC3Eib,EAAIvR,MAAQuR,EAAIvR,MAAQ,QAGvBqR,cAAcpW,YAAYyW,+CAK5BtV,GAAQ+U,KAAKrJ,UAAU6J,iBAEtBhgB,IAAMwf,KAAKpa,EAAIoa,KAAKrJ,UAAU8J,adIU,OcFxC7f,KAAOof,KAAK/T,EAAIhB,EAAM,KACvByV,GAAUV,KAAKjV,OAAOyV,YAAcvV,EAEpC0V,EAAUX,KAAKrJ,UAAUxW,cAAc,mBAExC6f,KAAKpf,KAAO,IACNwJ,MAAMxJ,oBAAsB,EAAIof,KAAKpf,gBACxCA,KAAO,MACN,IAAGof,KAAKpf,KAAO8f,EAAS,IAE1BE,kBADQZ,KAAKpf,KAAO8f,WAEhBtW,MAAMxJ,KAAOggB,OAEhBhgB,KAAO8f,SAEJtW,MAAMxJ,6CAINqL,EAAGrG,MAAGiJ,6DAAY8Q,4DAAiB5P,0DAAS,OAChD0P,UAAY5Q,EAAMsK,UAClBuG,WAAa7Q,EAAM1J,WACnBwa,WAAaA,OACb1T,EAAIA,OACJrG,EAAIA,OACJga,gBAAkB/Q,EAAMgS,YAAc,OACtC9Q,MAAQA,OACR+Q,iDAIAnK,UAAUvM,MAAM5J,IAAM,WACtBmW,UAAUvM,MAAMxJ,KAAO,WACvB+V,UAAUvM,MAAMS,QAAU,2CAI1B8L,UAAUvM,MAAM5J,IAAMwf,KAAKxf,IAAM,UACjCmW,UAAUvM,MAAMxJ,KAAOof,KAAKpf,KAAO,UACnC+V,UAAUvM,MAAMS,QAAU,aX5H3BkW,iBACS,eACN,iBACE,cACH,iBACG,iBACA,gBACD,wBACM,iBACL,kBACC,gBACF,eACD,uBACM,sBACD,WA8BDhY,GAAW,SAACH,SAEpB,4BAA6BY,KAAKZ,iCACEoY,KAAKpY,GAC1CuB,IAAI,SAAC8B,EAAG/E,SAAa,KAANA,EAAUtC,OAAOqH,GAAG5C,SAAS,IAAM,MAClDlB,OAAO,SAAC8Y,EAAGC,YAAUD,EAAIC,IAErBH,GAAiBnY,IAAUA,GC9CtB4G,GAAmB,EAC1BnB,GAAe,EACfS,GAAc,GACd1B,GAAkB,GAClB6B,GAAgB,IACT3B,GAAY,GACnBc,GAAkB,UAClBb,GAAY,UAkpBP4T,QACH,SAACnQ,MACHoQ,SACiB,UAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkP,GAAUrQ,EAAK+C,qBACX3J,MAAMtG,KAAO,YACbsG,MAAMS,QAAU,MAErBuW,KACM9W,aAAa,YAAa8W,GAE5BC,OAGD,SAACrQ,MACHoQ,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkP,GAAUrQ,EAAK+C,YACf1P,EAAS2M,EAAKqB,aAAa,KAC3BvO,EAAOkN,EAAKqB,aAAa,iBACrB/H,aAAa,IAAKpB,SAAS7E,GJ/mBA,KIgnB3BiG,aAAa,OAAQxG,KACrBsG,MAAMS,QAAU,MAErBuW,KACM9W,aAAa,YAAa8W,GAE5BC,eAGO,SAACrQ,MACXoQ,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBkP,GAAUrQ,EAAK+C,YACf1P,EAAS2M,EAAKqB,aAAa,KAC3BvO,EAAOkN,EAAKqB,aAAa,iBACrB/H,aAAa,IAAKpB,SAAS7E,GJloBA,KImoB3BiG,aAAa,OAAQxG,KACrBsG,MAAMS,QAAU,MAErBuW,KACM9W,aAAa,YAAa8W,GAE5BC,IAIEC,QACH,SAACtQ,EAAMqQ,MACTD,SACiB,UAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoP,IAAc,IAAK,IAAK,QAAS,iBAC9BrG,OAAOlK,EAAKuQ,YACjB/H,OAAO,kBAAQ+H,GAAW9H,SAAS+H,EAAKrI,OAASqI,EAAKC,YACtDtX,IAAI,cACIG,aAAakX,EAAKrI,KAAMqI,EAAKE,aAGpCN,KACM9W,aAAa,YAAa8W,QAI7B,SAACpQ,EAAMqQ,MACTD,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoP,IAAc,KAAM,aACjBrG,OAAOlK,EAAKuQ,YACjB/H,OAAO,kBAAQ+H,GAAW9H,SAAS+H,EAAKrI,OAASqI,EAAKC,YACtDtX,IAAI,cACIG,aAAakX,EAAKrI,KAAMqI,EAAKE,aAGpCN,KACM9W,aAAa,YAAa8W,gBAIrB,SAACpQ,EAAMqQ,MACjBD,SACiB,YAAlBpQ,EAAKwB,aACUxB,EAAKqB,aAAa,eAC5BrB,EAAKmB,WAAW,OAEpBoP,IAAc,KAAM,aACjBrG,OAAOlK,EAAKuQ,YACjB/H,OAAO,kBAAQ+H,GAAW9H,SAAS+H,EAAKrI,OAASqI,EAAKC,YACtDtX,IAAI,cACIG,aAAakX,EAAKrI,KAAMqI,EAAKE,aAGpCN,KACM9W,aAAa,YAAa8W,KCvwBxB3O,GAAgB,IAChBU,GAAgB,IAChB1B,GAAuBgB,GACvB4C,GAAsB,IAEtBhE,GAAa,SCHpBgD,SACC,yBACE,iBAEA,wBACC,uBACE,iBSVCoC,GAAU,0sDCUFkL,yBACR5W,EAAQ6C,mBAET3I,EAAU2I,QAEf7C,OAA2B,gBAAXA,GAClB7K,SAASC,cAAc4K,GACvBA,IAEGiV,KAAKjV,iBAAkB6W,mBACtB,IAAIC,OAAM,uDAGZC,aAAelU,OAEfiB,MAAQjB,EAAQiB,OAAS,QACzB3M,KAAO0L,EAAQ1L,MAAQ,QAEvB0b,SAAWoC,KAAK+B,YAAYnU,EAAQV,WACpCA,KAAO8S,KAAKgC,iBAAiBhC,KAAKpC,eAElC4B,OAASQ,KAAKiC,eAAerU,EAAQ4R,OAAQQ,KAAK9d,WAElDyX,oBACS,aACD,cACC/L,EAAQsU,aAAe,cACC,KAApBtU,EAAQuU,QAA2BvU,EAAQuU,QAAU,kBACrDvU,EAAQwU,iBAAmB,QAGxCC,SAAWC,KAAKC,MAAMD,KAAKE,UAAUrD,QACtCzc,GAAIsd,KAAKqC,cACRI,YAAY7U,GACboS,KAAKnR,MAAMpL,WAAYd,YAAc,GACrCqd,KAAKrG,OAAO+I,aAAYhgB,EAAEM,aAAe,QACxC2f,UAAY/U,EAAQjI,QAAUjD,EAAEkgB,gBAEhCC,cACAjV,gBAEAkV,YAAc1D,GAEhBY,KAAKrG,OAAOuI,mBACTa,kBAGDC,UAAUpV,kDAGJV,SACJA,4CAGSA,SACTA,0CAGOsS,EAAQtd,MAChB+gB,gBACIzD,OAAczb,OAAOub,GAAepd,KACvCghB,QAAQ,SAACjf,MACT2E,GAAQG,GAAS9E,EACnBqF,GAAaV,KAGJzB,KAAKyB,WAFTua,KAAK,IAAMlf,EAAS,6BAKvBgf,wFASHtd,EAASqa,KAAK2C,eACbC,WAAajd,OACbA,OAASA,EAAS5C,EAAeid,KAAKqC,eAGtCe,YAAc,iBAAMC,GAAKC,MAAK,IAC/BC,sBACEC,eAAiB,GAAID,gBAAevD,KAAKoD,kBACzCI,eAAeC,QAAQzD,KAAKjV,gBAE3BoV,iBAAiB,SAAUH,KAAKoD,oBAChCjD,iBAAiB,oBAAqBH,KAAKoD,+CAI9CpD,KAAKwD,gBAAgBxD,KAAKwD,eAAeE,oBACtCC,oBAAoB,SAAU3D,KAAKoD,oBACnCO,oBAAoB,oBAAqB3D,KAAKoD,kDAKhDQ,qBACAC,mBACA/D,mBAEAwD,MAAK,GAAO,gDAKZvY,OAAO6L,UAAY,MAEpBtL,WACK0U,KAAKjV,iBACF,kBAGTiV,MAAK8D,qBACFpiB,QAAWuJ,MAAO+U,KAAK8D,iBAAmB,YAG3CnN,UAAYlN,EAAE+M,OAAO,MAAOlL,8CAI5ByY,IAAM,GAAIxE,YACNS,KAAKrJ,iBACLqJ,KAAKR,cAETwE,+FAKDC,0DAAuBC,yDACvBD,IAAmBnjB,EAASkf,KAAKjV,eAIhC8Y,mBAEAM,KAAKF,QACLG,qBACAC,uBAEAC,WAAWpB,QAAQ,kBAAKjC,GAAEpB,MAAMQ,EAAKkE,iBAErCC,OAAOxE,KAAKsE,YAAY,GAE1BJ,SACGhX,KAAO8S,KAAKpC,oBACN,aAAY6G,OAAOpE,EAAKnT,OAAS8S,KAAK8C,mBAG7C4B,oBAEAC,gBAAgBT,+EAMhBU,UAAYnjB,EAAuBue,KAAKjV,aACxCE,MAAQ+U,KAAK4E,UAAY3hB,EAAc+c,KAAKqC,kDAI9CrC,KAAK7J,UACFQ,UAAUvB,YAAY4K,KAAK7J,QAE7BzT,GAAIsd,KAAKqC,cAERlM,IAAMrL,EACVkV,KAAKrJ,UACL,qBACAqJ,KAAK4E,UACL5E,KAAK4C,iBAEDjS,QAAUzF,EAAY8U,KAAK7J,KAE7B6J,KAAKnR,MAAMpL,cACRohB,QAAUnX,EACd,QACAhL,EAAEE,QAAQhC,KACV8B,EAAEE,QAAQpC,IACVwf,KAAKnR,gBAEMnM,EAAEoiB,mBACN,aACFpiB,EAAEoiB,oBAKLtkB,GAAMiC,EAAaC,QAClB6hB,SAAWnZ,EACf4U,KAAK9d,KAAO,sCACCY,EAAcJ,QAAOlC,OAGhCwf,KAAKrG,OAAO+I,gBACP1C,KAAKra,OAASjD,EAAEG,SAAS3B,YAC3B6jB,WAAa3Z,EACjB,4BACatI,EAAcJ,QAAOlC,QAIjCwf,KAAKnR,MAAMpL,aAAe0S,IAAIrM,YAAYkW,KAAK6E,cAC7C1O,IAAIrM,YAAYkW,KAAKuE,UACvBvE,KAAKrG,OAAO+I,iBAAmBvM,IAAIrM,YAAYkW,KAAK+E,iBAElDC,gBAAgBliB,EAAcJ,GAAID,EAAaC,4CAGrCuJ,EAAGrG,QACbme,IAAInZ,UACLqB,IACArG,kDAIoB0e,WAAa,GAAIW,oCAEnC/X,GACFA,WACKyR,MAAM,2BAEVzR,KAAO8S,KAAK+B,YAAY7U,QACxBiX,YACAK,OAAOxE,KAAKsE,WAAYtE,KAAKrG,OAAOwI,cACpCuC,2DAGCJ,yDAAWtE,KAAKsE,WAAYnC,4DAC/BnC,MAAKrG,OAAOuI,kBAETa,SAAS5Y,IAAI,kBAAKnC,GAAEgC,WAAWoL,YAAYpN,QAG7CkN,QAEOgO,QAAQ,cACEhO,EAAkBnR,OAAOkd,EAAEwD,OAAOtC,MAEpDjN,EAAkBzR,OAAS,MACZuc,KAAKrJ,UAAWqJ,KAAK7J,IAAKjB,cAChC,aACCgO,QAAQ,kBAAKjC,GAAEiE,WACrBC,ahBpMiC,SgBuM5BjC,QAAQ,kBAAKjC,GAAEiE,cACrBC,iDAKHnF,KAAKrG,OAAOuI,mBACTf,mBACAiE,0GAMSlB,yDACXlE,MAAKrG,OAAOuI,aAEbgC,SACGmB,mBAEAC,eACEtF,KAAKuF,WAAWC,KAAKxF,SACrBA,KAAKyF,YAAYD,KAAKxF,SACtBA,KAAK0F,UAAUF,KAAKxF,SACpBA,KAAK2F,aAAaH,KAAKxF,SACvBA,KAAK4F,YAAYJ,KAAKxF,gBAGpBG,iBAAiB,UAAW,SAAC0F,GAClC5kB,EAAoB6kB,EAAKnP,eACvBkP,GAAK1kB,OAAO4kB,MACbD,EAAKR,WAAWO,EAAEG,YACfV,WAAWO,EAAEG,mmBA2BlBC,GAAW/P,GAAiB8J,KAAK7J,QACxB6J,KAAKnR,OAAS,SAAUoX,aC3TlBC,0BACRnb,EAAQO,+EACbP,EAAQO,yDAGLA,4FACOA,QAEXqO,OAAOwM,gBAAkB7a,EAAK8a,oBAAsBD,oBACpDxM,OAAO0M,UAAY/a,EAAK+a,WAAa,QACrC1M,OAAO2M,gBAAkBhb,EAAKgb,iBAAmB,6CAIlDC,EAAIvG,KAAK6C,MACTwD,EAAYrG,KAAKrG,OAAO0M,YAC1BG,kBAEEC,GAAYzG,KAAK9S,KAAKgQ,OAAO/S,IAAI,SAAC7D,EAAOY,MACxCwf,GAAQ,WACPxZ,KAAKkQ,SAASjT,IAAI,eACb0b,EAAE3K,OAAOhU,MAEXwf,EAAOpgB,KACbkT,OAAO,kBAAcrW,GAAE,IAAM,IAE5BwjB,EAASF,KACVA,EAAUhjB,OAAS4iB,EAAW,GAEtBO,KAAK,SAACte,EAAGa,SAAeA,GAAE,GAAKb,EAAE,OAElCme,EAAUrgB,MAAM,EAAGigB,EAAU,MAGlCQ,GAAiB,CAFLJ,GAAUrgB,MAAMigB,EAAU,GAGhClc,IAAI,eAAwBhH,EAAE,OACjCgE,MAAM0f,EAAgB,cACxBrH,OAAO6G,EAAU,GAAK,SAG1BnJ,YACK/S,IAAI,cACRqc,YAAYrf,KAAKnC,EAAM7B,EAAE,OACzB+Z,OAAO/V,KAAKhE,EAAE,QAGf2jB,WAAaP,EAAEC,YAAYre,OAAO,SAACG,EAAGa,SAAMb,GAAIa,GAAG,QAEhD0C,UACDmU,KAAK/U,MAAQ,IACb+U,KAAKra,OAAS,qDAKd4gB,EAAIvG,KAAK6C,WACRkC,WAAWgC,YAAc,QACzBC,aAAeT,EAAEC,YAAYpgB,MAAM,EAAG4Z,KAAKrG,OAAO2M,oBAEnD/iB,GAAQ,EACRqC,EAAI,OACHohB,aAAa7c,IAAI,SAAChH,EAAG+D,MACrB+f,GAAW,IACXC,EAAUtjB,KAAK6C,OACjB0gB,EAAKlc,MAAQhI,EAAckkB,EAAK9E,WAAW4E,EAEzCE,GAAKH,aAAavjB,OAASyjB,MACnBC,EAAKlc,MAAMkc,EAAKH,aAAavjB,QAEtCF,EAAQ2jB,MACF,KACH,OAEFjb,GAAIgb,EAAW1jB,EAAQ,EACvB+C,EAAQ6gB,EAAKxN,OAAOyI,gBAAkBnc,EAAesgB,EAAErJ,OAAOhW,GAAI+f,EAAS,IAAMV,EAAErJ,OAAOhW,GAC1FoZ,EAAY6G,EAAKxN,OAAOwM,eAAiBgB,EAAKxN,OAAOwM,eAAehjB,GAAKA,EACzEgN,EAAM1C,EACTxB,EACArG,EACA,EACAuhB,EAAK3H,OAAOtY,GACTZ,OAAUga,GACb,KAEIyE,WAAWjb,YAAYqG,gBApFewR,ITHjC3J,GAAqB,EAErBG,GAAe,IACfD,GAAa,MAEbM,IAAe,UAAW,WAAY,QAAS,QAAS,MACpE,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAIlD4O,IAAmB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OCcpEvN,oCAEEwN,WAAAA,aAAa,SACbC,eAAAA,aAAiB,KACjBlO,IAAAA,UAEAC,IAAAA,QACAkO,IAAAA,aACAC,IAAAA,gCAEKF,eAAiBA,OACjBlO,UAAYA,OAEZmO,aAAeA,OACflO,QAAUA,OAEVmO,gBAAkBA,OAElBC,cACAvK,eAEAmK,WAAaA,OACbA,WAC0B,kBAApBrH,MAAKqH,WAA4BrH,KAAKqH,aAAerH,KAAKqH,gBAEhEvG,qDAGD5T,QACCA,KAAOA,GAAQ8S,KAAK3G,wCAGvBtO,QACG2c,MAAQtc,EAAa4U,KAAKqH,WAAYrH,KAAKsH,eAAgBvc,uCAI3DyZ,OAAOxE,KAAK9S,WACZya,QAAU3H,KAAK9S,oCAGjBA,mBACEua,MAAQzH,KAAKuH,aAAara,QAE1Bwa,MAAMX,YAAc,QACpBU,MAAMvE,QAAQ,SAAC7iB,KACRoD,OACFpD,EAAQ6iB,QAAQ,SAACniB,KACR2mB,MAAM5d,YAAY/I,KAE3BsiB,EAAKqE,MAAM5d,YAAYzJ,UAE5B6c,OAAOgG,QAAQ,SAAC7iB,KACZqnB,MAAM5d,YAAYzJ,yCAIxB8hB,mEACJrB,aACD0G,YACDrF,OACgBnC,KAAKwH,gBAAgBxH,KAAK9S,WAEtCsa,WAILjO,4BAEU,qCACCrM,SACLA,GAAK0a,aAAazd,IAAI,SAACoc,EAAGrf,MAC5Bd,GAAQoF,EAAS+a,EAAG,aAAcrZ,EAAKsS,OAAOtY,GAAI,OAAQgG,EAAK2a,sBAC7Dzd,MAAM0d,WAAa,iBAClB1hB,8BAIO2hB,SACR/H,MAAKyH,MAAMtd,IAAI,SAAC/D,EAAOc,SAAMqM,IAAenN,EAAO2hB,EAAQH,aAAa1gB,8BAIpE,mCACCgG,SACLA,GAAK0a,aAAazd,IAAI,SAACoc,EAAGrf,MAC5Bd,GAAQoF,EAAS+a,EAAG,WAAY,OAAQrZ,EAAKsS,OAAOtY,aAClDkD,MAAM0d,WAAa,iBAClB1hB,8BAIO2hB,SACR/H,MAAKyH,MAAMtd,IAAI,SAAC/D,EAAOc,SAC7BqM,IAAenN,EAAO2hB,EAAQH,aAAa1gB,mCAKjC,wCACCgG,oBACLA,GAAK8a,WAAW7d,IAAI,SAAC8B,EAAG/E,SAEpB2F,GAAcZ,EADhB,EACsBiB,EAAK+a,OAAO/gB,GACzCmZ,EAAKjH,UAAU8O,UAAW7H,EAAKjH,UAAU+O,SAAUjb,EAAKsS,OAAOtY,gCAKlD6gB,MACZA,EAAS,6BAIK,+BACC7a,cACLyH,WAEAzH,GAAKzJ,UACAyf,QAAQ,SAACkF,EAAMlhB,KACXmhB,UAAUle,IAAI,SAAC6E,EAAU9H,KACjBC,KACLkI,EAAML,EAAUoZ,EAAKlL,OAAOhW,GAAIigB,EAAK/N,UAAUnO,YACrCkc,EAAK/N,UAAU7J,SAChB6Y,EAAK9Y,KAAO6X,EAAK/N,UAAU9J,mBAChB6X,EAAK/N,UAAUzK,qBAChDyZ,EAAKvZ,WAKIuZ,EAAKvZ,SACI1H,KACL4H,SACWqZ,EAAKvZ,eACFuZ,EAAK9Y,WAC/B6X,EAAK/N,UAAUzT,QAAUuH,EAAKxH,eACPyhB,EAAK/N,UAAUnO,WAM/B0J,MAGN0T,UAAUnF,QAAQ,SAAClU,EAAU9H,KACrBC,KAAKkI,EAAML,EAAU9B,EAAKgQ,OAAOhW,GAAIigB,EAAK/N,UAAUnO,YACnDkc,EAAK/N,UAAU7J,SAChBrC,EAAKoC,KAAO6X,EAAK/N,UAAU9J,mBAChB6X,EAAK/N,UAAUzK,oBAI5CzB,EAAK2B,SACC1H,KACR4H,SACQ7B,EAAK2B,eACF3B,EAAKoC,WACP0Q,KAAK5G,UAAUzT,QAAUuH,EAAKxH,eAC/Bsa,KAAK5G,UAAUnO,SAKlB0J,6BAGcoT,cACNO,EAA0B,SAACX,EAASI,MAClCQ,GAASR,EAAQM,UACjBG,EAAYT,EAAQ7K,OACpBuL,EAASd,EAAQU,UACjBK,EAAYf,EAAQzK,SAELrX,EAAqB4iB,EAAQF,iCACvB1iB,EAAqB6iB,EAAWF,oCAEpDhE,kBACUiE,SACHD,IAGL1C,EAAK2B,MAAMtd,IAAI,SAAC/C,EAAMF,SAClBwK,IAAkBtK,EAAMmhB,EAAOrhB,GAAIuhB,EAAOvhB,UAMrD8Y,KAAK2H,kBAAmBhkB,aACjBqc,MAAK2H,QAAQzE,QAAQ,SAAC9R,EAAKlK,KACNkK,EAAK2W,EAAQ7gB,SAIzCqhB,GAASR,EAAQM,UACjBG,EAAYT,EAAQ7K,OACpBuL,EAASzI,KAAK2H,QAAQU,UACtBK,EAAY1I,KAAK2H,QAAQzK,SAEVrX,EAAqB4iB,EAAQF,iCACvB1iB,EAAqB6iB,EAAWF,uCAEpDhE,kBACUiE,SACHD,IAGLxI,KAAKyH,MAAMtd,IAAI,SAAC/C,EAAMF,SAClBwK,IAAkBtK,EAAMmhB,EAAOrhB,GAAIuhB,EAAOvhB,0BAMnD,+BACCgG,oBACLA,GAAKmb,UAAUle,IAAI,SAAC6E,EAAU9H,SACpCuI,GAAMT,EAAU9B,EAAKyb,WAAWzhB,GAAI0hB,EAAKxP,UAAUzT,QACjD4J,KAAMqZ,EAAKxP,UAAU7J,KAAMD,IAAKsZ,EAAKxP,UAAU9J,kCAInCyY,MACXQ,GAASR,EAAQM,UACjBG,EAAYT,EAAQY,WACpBF,EAASzI,KAAK2H,QAAQU,UACtBK,EAAY1I,KAAK2H,QAAQgB,aAEV9iB,EAAqB4iB,EAAQF,iCACvB1iB,EAAqB6iB,EAAWF,uCAEpDhE,kBACOiE,aACCD,IAGNxI,KAAKyH,MAAMtd,IAAI,SAAC/C,EAAMF,SACrBoK,IACNlK,EAAMmhB,EAAOrhB,GAAIuhB,EAAOvhB,6BAOf,kCACCgG,oBACLA,GAAK/C,IAAI,SAACzH,SAChBgN,GAAQhN,EAAEsM,SAAUtM,EAAE4D,MAAOuiB,EAAKzP,UAAUnO,gBACjCvI,EAAEkL,QAAQ+B,cACd,gBACI,uCAIGoY,SACWliB,EAAqBma,KAAK2H,QAASI,kBAAvDJ,gBAEFY,YAAiBpe,IAAI,kBAAKhH,GAAE6L,WAC5BwZ,EAAYT,EAAQ5d,IAAI,kBAAKhH,GAAEmD,QAC/BwiB,EAAaf,EAAQ5d,IAAI,kBAAKhH,GAAEyK,UAEhC6a,EAASzI,KAAK2H,QAAQxd,IAAI,kBAAKhH,GAAE6L,uBAEhCwV,OAAOiE,EAAOte,IAAI,SAACmF,EAAKpI,mBAEjBuhB,EAAOvhB,SACVshB,EAAUthB,WACR4hB,EAAW5hB,OAIf8Y,KAAKyH,MAAMtd,IAAI,SAAC/C,EAAMF,SACrBwK,IACNtK,EAAMmhB,EAAOrhB,GAAIuhB,EAAOvhB,6BAOf,kCACCgG,oBACLA,GAAK/C,IAAI,kBACfyF,GAAQlH,EAAEqgB,SAAUrgB,EAAEsgB,OAAQC,EAAK7P,UAAUnO,MAC5CvC,EAAEpC,OAAQqJ,SAAUjH,EAAEkF,QAAQ+B,uCAGjBoY,SACWliB,EAAqBma,KAAK2H,QAASI,kBAAvDJ,gBAEFY,YAAiBpe,IAAI,kBAAKhH,GAAE6lB,SAC5BR,EAAYT,EAAQ5d,IAAI,kBAAKhH,GAAEmD,QAC/B4iB,EAAYnB,EAAQ5d,IAAI,kBAAKhH,GAAE4lB,WAC/BD,EAAaf,EAAQ5d,IAAI,kBAAKhH,GAAEyK,UAEhC6a,EAASzI,KAAK2H,QAAQxd,IAAI,kBAAKhH,GAAE6lB,SACjCG,EAAYnJ,KAAK2H,QAAQxd,IAAI,kBAAKhH,GAAE4lB,gBAEnCvE,OAAOiE,EAAOte,IAAI,SAACmF,EAAKpI,mBAEjBiiB,EAAUjiB,UACZuhB,EAAOvhB,SACRshB,EAAUthB,WACR4hB,EAAW5hB,UAIlBsgB,kBAECC,MAAMtd,IAAI,SAAC2H,EAAW5K,KACRsgB,EAAgBzjB,OAAO8N,GACxCC,EAAWoX,EAAUhiB,GAAIqhB,EAAOrhB,GAAIuhB,EAAOvhB,OAItCsgB,2BAKI,iBAAoB,sBAAwBxH,KAAK5G,UAAUrJ,6BAC1D7C,gBACuD8S,KAAK5G,UAAnErJ,IAAAA,MAAOqZ,IAAAA,SAAUC,IAAAA,UAAWC,IAAAA,WAAYjlB,IAAAA,OAEzC4H,IAFiDsd,WAEjC3jB,EAAI,cAEnB4jB,0BAEAC,KAAKtf,IAAI,SAACuf,EAAMC,GACN,IAAXA,KACGzM,OAAO/V,KACXuG,EAAS,cAAezB,GARL,GAQyBoM,GAAatI,GAAO,GAAM6Z,wBAE1D,OAKTzf,IAAI,SAAC0O,EAAK3R,MACX2R,EAAI/U,KAAM,IACRoJ,gBACU2L,EAAIgR,sBACHhR,EAAIiR,qBACN5iB,GAET6iB,EAAS/c,EAAW,MAAOf,EAAGrG,EAAG0jB,EAAYjlB,EAAQwU,EAAI/U,KAAMoJ,KAC9Dsc,qBAAqBriB,KAAK4iB,MAE3BV,MAEF,KACCD,IAGCpJ,KAAKwJ,+CAGGzB,MACZA,EAAS,gCAKD,iBAAoB,sCAAwC/H,KAAK5G,UAAUrJ,6BAC1E7C,MACR+T,GAAIjB,KAAK5G,sBACR4Q,SAAW,WACXC,MAAQ/c,EAAKgd,WAAW/f,IAAI,SAACvE,EAAGrD,SAC7BuN,GACN5C,EAAK8a,WAAWzlB,GAChBqD,EACAsH,EAAK+Z,SACLhG,EAAErY,MACFsE,EAAKgQ,OAAO3a,GACZA,EACA2K,EAAKid,QAAQ5nB,aAEF2K,EAAKxH,mBACJwH,EAAKkd,oBACLnJ,EAAEhR,cAIT+P,KAAKiK,gCAEGlC,MACXsC,GAAUtC,EAAQC,WAClBsC,EAAUvC,EAAQmC,WAClBK,EAAaxC,EAAQoC,QACrB3B,EAAYT,EAAQ7K,OAEpBsN,EAAUxK,KAAK2H,QAAQK,WACvByC,EAAUzK,KAAK2H,QAAQuC,WACvBQ,EAAa1K,KAAK2H,QAAQwC,QAC1BzB,EAAY1I,KAAK2H,QAAQzK,SAERrX,EAAqB2kB,EAASH,iCAC9BxkB,EAAqB4kB,EAASH,iCACxBzkB,EAAqB6kB,EAAYH,iCACnC1kB,EAAqB6iB,EAAWF,gCAEpDhE,mBACQgG,aACAC,UACHC,SACDlC,WAEExI,KAAK2H,QAAQjiB,mBACZsa,KAAK2H,QAAQyC,mBACdpK,KAAK2H,QAAQV,cAGpBO,kBAECC,MAAMtd,IAAI,SAACoI,EAAKrL,KACFsgB,EAAgBzjB,OAAOuO,GACxCC,EAAK8X,EAAQnjB,GAAIojB,EAAQpjB,GAAI6gB,EAAQd,SAAUsD,EAAWrjB,IACzDxB,SAAUqiB,EAAQriB,cAId8hB,0BAKU,iBACD,sCAAwCxH,KAAK5G,UAAUrJ,6BAErD7C,MACL+T,GAAIjB,KAAK5G,sBACR4Q,SAAW,WACXpZ,SACAqQ,EAAE0J,gBACE/Z,MAAQR,EACTlD,EAAK8a,WACL9a,EAAKgd,WACLjJ,EAAErY,gBAEYqY,EAAExQ,oBACAwQ,EAAEpQ,kBACNoQ,EAAE1Q,iBAGD0Q,EAAEtQ,iBACDzD,EAAKxH,iBAKtBukB,SAEAhJ,EAAE2J,gBACEX,MAAQ/c,EAAKgd,WAAW/f,IAAI,SAACvE,EAAGrD,SAC1B2N,GACHhD,EAAK8a,WAAWzlB,GAChBqD,EACAsH,EAAK7I,OACL4c,EAAErY,MACFqY,EAAE4J,iBAAmB3d,EAAKgO,OAAO3Y,GAAK,GACtCA,MAKL+W,OAAO4B,OAAO8E,KAAKpP,OAAO7M,OAAOic,KAAKiK,iCAEjClC,MACRsC,GAAUtC,EAAQC,WAClBsC,EAAUvC,EAAQmC,WAClBY,EAAY/C,EAAQ7M,OAEpBsP,EAAUxK,KAAK2H,QAAQK,WACvByC,EAAUzK,KAAK2H,QAAQuC,WACvBrW,EAAYmM,KAAK2H,QAAQzM,SAERrV,EAAqB2kB,EAASH,iCAC9BxkB,EAAqB4kB,EAASH,iCAC1BzkB,EAAqBgO,EAAWiX,gCAEpDtG,mBACWgG,aACAC,SACJK,WAEE9K,KAAK2H,QAAQjiB,gBACfsa,KAAK2H,QAAQtjB,YAGrBmjB,YAEAlO,QAAOpP,KAAK8V,KAAKpP,OAAOnN,WACN+jB,EAAgBzjB,OAC9B+O,GACIkN,KAAKpP,MACLyZ,EACAC,EACAvC,EAAQriB,SACRsa,KAAK5G,UAAU7I,UAKvByP,KAAKiK,MAAMxmB,aACNwmB,MAAM9f,IAAI,SAACgG,EAAKjJ,KACCsgB,EAAgBzjB,OAC9B4O,GAAWxC,EAAKka,EAAQnjB,GAAIojB,EAAQpjB,OAKzCsgB,KSxhBEuD,0BACRhgB,EAAQO,8EACbP,EAAQO,aACTpJ,KAAO,eACP2d,iEAGMjS,MACPlL,GAAIsd,KAAKqC,cACR2I,WAAapd,EAAQod,kBAEtB7hB,GAAI6W,KAAKgL,aACXrlB,OAASwD,EAAExD,QlB0D8B,KkBzDzCmH,MAAQ3D,EAAE2D,OAASC,KAEnBlK,SAASvB,MAAQ,KACjB0B,aAAe,KACf4f,WAA0C,GAA5BzZ,EAAExD,OAAmB,GAAVwD,EAAE2D,oDAIzByZ,GAAIvG,KAAK6C,MAETtJ,IAEF,4BAEYyG,KAAKgL,WAAWrlB,gBACjBqa,KAAKgL,WAAWle,OAE3B,6BAEcyZ,EAAEyB,kBACNzB,EAAE0B,cACFjI,KAAKR,SAEbgG,KAAKxF,aAIJsE,WAAa,GAAIW,KAAI1L,EACxBpP,IAAI,eACA8gB,GAAY/R,mBAAgB5N,WACxBA,EAAK,GAAI2f,wIAMf1E,GAAIvG,KAAK6C,QAEXmF,gBACAC,aAEEiD,GAAO,IACT1E,YAAYrc,IAAI,SAAChF,MACd8F,GAAQoV,EAAKpV,MAAQ9F,EAAQohB,EAAEO,aACjCmB,OAAO9gB,KAAK8D,KACZ+c,WAAW7gB,KAAK+jB,MACVjgB,gGAOLsb,EAAIvG,KAAK6C,WACRlM,UAAUwJ,iBAAiB,YAAa,SAAC0F,MACzCsF,GAAOhE,EAAK7C,WAAW8G,IAAI,kBAAkB3D,MAC7ClV,EAAMsT,EAAE5jB,UACTkpB,EAAK1R,SAASlH,GAAM,IAElBrL,GAAIikB,EAAKrP,QAAQvJ,GACjB8Y,EAAOjrB,EAAU+mB,EAAKxQ,WAAY2U,EAAOlrB,EAAUmS,GAEnDtG,EAAIqf,EAAK1qB,KAAOyqB,EAAKzqB,KAAOsI,SAASqJ,EAAIF,aAAa,UAAU,EAChEzM,EAAI0lB,EAAK9qB,IAAM6qB,EAAK7qB,IACpBqO,GAASsY,EAAKoE,iBAAmBpE,EAAKoE,gBAAgB9nB,OAAO,EAC9D0jB,EAAKoE,gBAAgBrkB,GAAKigB,EAAKtE,MAAM3F,OAAOhW,IAAM,KACjDskB,EAAWjF,EAAEC,YAAYtf,GAAGqf,EAAEO,aAE7B/C,IAAI0H,UAAUxf,EAAGrG,GAAIuT,KAAMtK,EAAO1J,OAAiB,IAATqmB,GAAcpoB,QAAQ,GAAK,QACrE2gB,IAAI2H,oBAlFgCxF,ICIxByF,0BACR5gB,EAAQO,8EACbP,EAAQO,aACTpJ,KAAO,QACP4gB,YAAc,IACdoB,KAAO,IAEPrE,+DAGIvU,4FACOA,QACXsgB,UAAY5L,KAAK4L,UAAUpG,KAAKxF,WAChC6L,WAAa7L,KAAK6L,WAAWrG,KAAKxF,WAElC8L,WAAaxgB,EAAKwgB,YAAc,QAChCnS,OAAOoS,WAAazgB,EAAKygB,YAAc,OAEvCjgB,UAAYR,EAAKQ,YAAa,oIAK/Bya,GAAIvG,KAAK6C,WACRxe,OAAU2b,KAAKra,OAASqa,KAAK/U,MAAQ+U,KAAKnU,OAAOI,EAAI+T,KAAKnU,OAAOjG,KAE9DvB,GAAsB2b,KAAtB3b,OAAQyH,EAAckU,KAAdlU,UAEVkgB,EAAuBzF,EAAE0F,uBAC7BrE,kBACAqE,uBACEC,GAAW,IAAMlM,KAAKrG,OAAOoS,aAC/BvF,YAAYrc,IAAI,SAACuc,EAAOxf,MACnB6kB,GAAaG,EACbC,EAAmBzF,EAAQH,EAAEO,WnB+DZ,ImB9DjB/a,EAAWogB,EAAkB,IAAM,EAAG,EACtCC,EAAYtgB,GAAaqgB,EAAkBA,EAC3CE,EAAWH,GAAsBE,EACjCzgB,EAAgBxH,EAAmB4nB,EAAY1nB,GAC/CuH,EAAczH,EAAmBkoB,EAAUhoB,GAE3CioB,EAAejM,EAAK6D,MAAQ8H,EAAqB9kB,GAEnDqlB,SAASC,QACVnM,GAAK6D,QACIoI,EAAeA,EAAa3gB,cAAgBA,IAC9C2gB,EAAeA,EAAa1gB,YAAcD,MAExCA,IACFC,MAEJ6gB,GACe,MAApBN,EACG9f,EAAckgB,EAAUC,EAAQnM,EAAKxU,OAAQwU,EAAKhc,OAAQyH,EAAWC,GACrEL,EAAe6gB,EAAUC,EAAQnM,EAAKxU,OAAQwU,EAAKhc,OAAQyH,EAAWC,KAExE6b,aAAazgB,KAAKslB,KAClBR,iBAAiB9kB,0CAGXuf,QACAH,EAAEO,yCAGFsF,WAIJlI,KAAO,+CAIRqC,GAAIvG,KAAK6C,MAETtJ,IAEF,eAEA,+BAEgBgN,EAAEqB,oBACR5H,KAAKR,SAEbgG,KAAKxF,aAIJsE,WAAa,GAAIW,KAAI1L,EACxBpP,IAAI,eACA8gB,GAAY/R,mBAAgB5N,WACxBA,EAAK,GAAI2f,kDAIAyB,MACbroB,GAAqB2b,KAArB3b,OAAOynB,EAAc9L,KAAd8L,WACP9c,EAAW7K,EAAmBuoB,EAASX,WAAYW,EAAStoB,MAAQ,EAAGC,wBACtD2K,EAAS/C,EAAK6f,QAAiB9c,EAASpJ,EAAKkmB,6CAG1Dtb,EAAKtJ,EAAEylB,EAAK9G,MAClBrV,MACE5H,GAAQoX,KAAKR,OAAOtY,MACvBylB,EAAM,IACEnc,EAAMwP,KAAK4M,oBAAoB5M,KAAK6C,MAAMoJ,iBAAiB/kB,OAChEkD,MAAMtG,KAAO6E,EAAmBC,EAAO,OACxCikB,GAAQzsB,EAAU4f,KAAK7J,KACvBlK,EAAI4Z,EAAEiH,MAAQD,EAAMjsB,KAAO,GAC3BgF,EAAIigB,EAAEkH,MAAQF,EAAMrsB,IAAM,GAC1BqO,GAASmR,KAAKgN,kBAAoBhN,KAAKgN,iBAAiBvpB,OAAS,EAClEuc,KAAKgN,iBAAiB9lB,GAAK8Y,KAAK6C,MAAM3F,OAAOhW,IAAM,KAClD+lB,GAAuC,IAA5BjN,KAAK6C,MAAM2D,YAAYtf,GAAW8Y,KAAK6C,MAAMiE,YAAY1jB,QAAQ,QAC3E2gB,IAAI0H,UAAUxf,EAAGrG,GAAIuT,KAAMtK,EAAO1J,MAAO8nB,EAAU,WACnDlJ,IAAI2H,kBAEClb,EAAK,2BACVuT,IAAI9D,YACJ7V,MAAMtG,KAAO8E,8CAKd+N,UAAUwJ,iBAAiB,YAAaH,KAAK4L,gBAC7CjV,UAAUwJ,iBAAiB,aAAcH,KAAK6L,8CAG1ChG,MACH5jB,GAAS4jB,EAAE5jB,OACbirB,EAASlN,KAAKsE,WAAW8G,IAAI,aAAa3D,MAC1C0F,EAAYnN,KAAKoN,oBACjBC,EAAarN,KAAKsN,kBACnBJ,EAAOzT,SAASxX,GAAS,IACvBiF,GAAIgmB,EAAOpR,QAAQ7Z,QAClBsrB,WAAWF,EAAYF,GAAU,QACjCG,eAAiBrrB,OACjBmrB,oBAAsBlmB,OACtBqmB,WAAWtrB,EAAQiF,GAAG,EAAM2e,aAE5BgG,uDAKD0B,WAAWvN,KAAKsN,eAAetN,KAAKoN,qBAAoB,UA/IzBlH,ICIjBsH,0BACRziB,EAAQ6C,8EACb7C,EAAQ6C,MACT1L,KAAO,YAEPurB,WAAa7f,EAAQ6f,YAAc,MAEpCC,IAAe,SAAU,UACzBC,EAAiBD,EAAYjU,SAAS7L,EAAQ+f,gBAC/C/f,EAAQ+f,eAAiB,kBACvBC,oBAAsBF,EAAY5R,QAAQ6R,KAE1C9N,iEAGMjS,MACPlL,GAAIsd,KAAKqC,cACRwL,gBAA8C,IAA5BjgB,EAAQigB,gBAAwB,EAAI,IAEzDhrB,SAASrC,IAAMstB,KACfjrB,SAAS3B,OAAS,IAClB8B,aAAe8qB,KACflL,WA1BcmL,GA0BY/V,GACzBjV,EAAeL,MAEdS,GAAI6c,KAAK9S,KACT8gB,EAAUhO,KAAK6N,gBZrCY,GYqC0B,OACpD/J,iBA/BWiK,IA+BStW,GAAgBtU,EAAEK,MAAOL,EAAEua,KACjDsQ,GAAuB/qB,EAAcP,4CAIpCsrB,GAAUhO,KAAK6N,gBZ3CY,GY2C0B,EACrDI,EAAYjO,KAAK6C,MAAMoL,UAAYjO,KAAK6C,MAAMoL,UAAY,QACzDrJ,UAtCWmJ,IAsCEE,EAAYD,GAC3B/qB,EAAc+c,KAAKqC,mDAGXnV,0DAAK8S,KAAK9S,QAClBA,EAAK1J,OAAS0J,EAAKwQ,KAAOxQ,EAAK1J,MAAQ0J,EAAKwQ,SACxC,IAAImE,OAAM,kDAGb3U,EAAK1J,UACHA,MAAQ,GAAI6B,QACZ7B,MAAM0qB,YAAahhB,EAAK1J,MAAMgU,cAAgB,IAEhDtK,EAAKwQ,QAAYA,IAAM,GAAIrY,SAC1B8oB,WAAajhB,EAAKihB,eAEpBjlB,SAASoQ,OAAOpP,KAAKgD,EAAKihB,YAAY,IAAM,IAAQ,IAClDlnB,aACGiD,KAAKgD,EAAKihB,YAAYjL,QAAQ,eAChCpM,GAAO,GAAIzR,MAAK+oB,EAAejW,MAC5BhB,GAAYL,IAAS5J,EAAKihB,WAAWC,OAExCD,WAAalnB,QAGZiG,qCAIHqZ,GAAIvG,KAAK6C,QAEXrf,MAAQ4S,GAAM4J,KAAK9S,KAAK1J,SACxBka,IAAMtH,GAAM4J,KAAK9S,KAAKwQ,OAEtB2Q,eAAiBjY,GAAMmQ,EAAE/iB,SACzByqB,UAAYxW,GAAgB8O,EAAE/iB,MAAO+iB,EAAE7I,OACvCZ,aAAeJ,GAChBpD,OAAO4B,OAAO8E,KAAK9S,KAAKihB,YpBJc,KoBMrCG,cAAgBtO,KAAKuO,kEAInBhI,EAAIvG,KAAK6C,MACT2L,EAAUxO,KAAK6N,gBAAkB,EAAI,EAErCtU,EAAmBgN,EAAE+H,cAAcnkB,IAAI,SAACwP,EAAQzS,UACnD,oBAEQyS,EAAO5J,eAvFAge,aAAAA,cpByEiB,UoBkBvB1N,EAAKyB,aAAazd,QAAU,aA3FtB0pB,GA4FFxH,EAAE+H,cACZ9U,OAAO,SAACG,EAAQpX,SAAMA,GAAI2E,IAC1BiD,IAAI,kBAAUwP,GAAO8P,KAAKhmB,OAAS+qB,IACnCrmB,OAAO,SAACG,EAAGa,SAAMb,GAAIa,GAAG,IAG3B,iBACQod,GAAE+H,cAAcpnB,IACtBse,KAAKnF,WAIHiE,WAAa,GAAIW,KAAI1L,EACxBpP,IAAI,SAACmB,EAAMpE,MACP+jB,GAAY/R,mBAAgB5N,WACxBA,EAAK,GAAK,IAAMpE,EAAG+jB,SAIzBrlB,GAAI,KACQsd,QAAQ,SAACuL,EAASvnB,OAC7B,EAAG,EAAG,GAAGuS,SAASvS,GAAI,IACrBwnB,GAAUhhB,EAAS,kBAAkB,EAAc9H,EAAG6oB,YpBzC3B,MoB4CzB,aACQ,UAGTlK,SAASza,YAAY4kB,MAzHZX,oCA+HV7gB,GACFA,WACKyR,MAAM,2BAGVzR,KAAO8S,KAAK+B,YAAY7U,QACxBoW,YACAU,oEAIArN,UAAUwJ,iBAAiB,YAAa,SAAC0F,KACxCvB,WAAWpB,QAAQ,eACnByL,GAAaC,EAAKnH,MAClBoH,EAAYhJ,EAAE5jB,UACf0sB,EAAWlV,SAASoV,GAAY,IAE9BtrB,GAAQsrB,EAAUxc,aAAa,cAC/Byc,EAAYD,EAAUxc,aAAa,aAAaK,MAAM,KAEtDgG,EAAQL,GAAanP,SAAS4lB,EAAU,IAAI,GAAG,GAE/CzD,EAAOlE,EAAKxQ,UAAUpW,wBAAyB+qB,EAAOuD,EAAUtuB,wBAEhE0K,EAAQ/B,SAAS2c,EAAE5jB,OAAOoQ,aAAa,UACvCpG,EAAIqf,EAAK1qB,KAAOyqB,EAAKzqB,KAAOqK,EAAM,EAClCrF,EAAI0lB,EAAK9qB,IAAM6qB,EAAK7qB,IACpB2E,EAAQ5B,EAAQ,IAAM4jB,EAAKsG,WAC3BtU,EAAO,OAAST,EAAQ,IAAMoW,EAAU,GAAK,KAAOA,EAAU,KAE7D/K,IAAI0H,UAAUxf,EAAGrG,GAAIuT,KAAMA,EAAMhU,MAAOA,EAAO0b,WAAY,SAC3DkD,IAAI2H,sEAOP3G,WAAWgC,YAAc,MAC1B9a,GAAI,EAEJ5H,EAAS2b,KAAK8B,aAAazd,QAAU,EAErC0qB,EAAWrhB,EAAS,iBAAkBzB,EA1K1B8hB,GA0KgC,iBAEpCA,MACN,MAGDiB,QACAjK,WAAWjb,YAAYilB,QAEvBvP,OAAOpZ,MAAM,EpB5GqB,GoB4GS+D,IAAI,SAACvB,EAAO1B,MACrD6iB,GAAS/c,EAAW,sBAAuBf,EAAI,GAAkB/E,EApLxD6mB,GpByEiB,GoB4GP1pB,EAAQuE,KAC5Bmc,WAAWjb,YAAYigB,QAIzBkF,GAAWvhB,EAAS,iBADRzB,EAAIijB,GAA8CF,EAzLlDjB,GA0LwC,iBAE5CA,MACN,SAGDhJ,WAAWjb,YAAYmlB,4CAaxB,GATA1I,GAAIvG,KAAK6C,SACoB0D,EAAE/iB,MAAM+T,WAAYgP,EAAE/iB,MAAMgU,eAAtD2X,OAAYC,UACU7I,EAAE7I,IAAInG,WAAYgP,EAAE7I,IAAIlG,eAE/C6X,OAAyBF,EAAa,EAA6B,SAAbC,GAExDd,KAEAgB,EAAelZ,GAAMmQ,EAAE/iB,OACnB0D,EAAI,EAAGA,EAAImoB,EAAYnoB,IAAK,IAC/ByQ,GAAU4O,EAAE7I,QACZtF,GAAekX,EAAc/I,EAAE7I,KAAM,QACnB4R,EAAa/X,WAAY+X,EAAa9X,iBACjDiB,gBAEGtR,KAAK6Y,KAAKuP,gBAAgBD,EAAc3X,OAE9CA,EAAS,KACFA,QAGT2W,2CAGQ5W,MAAWC,0DAAQ,MACbD,EAAUH,WAAYG,EAAUF,eAAhDkB,OAAOC,OACR6W,EAAc3X,GAAeH,GAG7B+X,SACI/W,gBAHEtC,GAAMuB,IAAYc,GAAmBC,EAAOC,GAOrC,OAIb,GAHA+W,GAAiBjY,GAAgB+X,EAAa7X,GAE9C8R,KAAW3gB,SACP5B,EAAI,EAAGA,EAAIwoB,EAAgBxoB,MAC5B8Y,KAAK2P,OAAOH,EAAa9W,KAC1BvR,KAAK2B,QAEI,GAAIzD,MAAKyD,EAAIkP,GAAqB,GAAG6R,UAC9B,cAGuB/kB,KAA1CgE,EAAIkP,GAAqB,GAAG8R,eACtB0F,EAAa,KAChBroB,KAAK6Y,KAAK2P,OAAOH,EAAa9W,GAAO,OAG9B+Q,KAAOA,EAEbgG,iCAGD/X,EAAWgB,OAOb,GAPoBkX,2DACpBrJ,EAAIvG,KAAK6C,MAGTgN,EAAczZ,GAAMsB,GACpB5O,KAEI5B,EAAI,EAAGA,EAAI8Q,GAAoB9Q,IAAK6R,GAAQ8W,EAAa,GAAI,IAChElW,MAGAmW,EAAwBD,GAAetJ,EAAE/iB,OAASqsB,GAAetJ,EAAE7I,GAEpEkS,IAASC,EAAYtY,aAAemB,IAAUoX,IACzCjG,SAAW1S,GAAY0Y,KAErB7P,KAAK+P,mBAAmBF,KAE9B1oB,KAAKwS,SAGH7Q,8CAGWgO,MACd+S,GAAW1S,GAAYL,GACvBgT,EAAY9J,KAAK9S,KAAKihB,WAAWtE,mBAE1BA,YACCC,GAAa,OAClB9J,KAAKR,OAAOxC,GAAiB8M,EAAW9J,KAAK6C,MAAM/F,uBAtRvB6E,ICFhBlD,0BACR1T,EAAQO,8EACbP,EAAQO,aAET0f,WAAa1f,EAAK0f,iBAClBgF,YAAc1kB,EAAK0kB,kBAEnB9tB,KAAOoJ,EAAKpJ,MAAQ,SACpBgiB,KAAO,IAEPrE,mEAIFG,KAAK9S,KAAKkQ,SAAS3Z,QAAU,SAC1BkW,OAAO+I,WAAa,OACpBL,SAASxf,SAAS3B,OAAS,sCAIxB0M,4FACaA,SACaA,EAArBqiB,YAAAA,oBACiBA,MAAjBC,IAAAA,MAAOhU,IAAAA,QAEPkK,eAAiBxY,EAAQwY,wBAE5BzM,OAAOwW,UAAYD,EAAQA,EAAMC,UAAYF,EAAYE,WAAa,OAKvEjU,GAASA,EAAMzY,YACVkW,OAAOyW,YAAclU,EAAM/R,IAAI,SAACie,oBAElBA,EAAKiI,aACZjI,EAAKkI,YACClI,EAAKpZ,eACRoZ,EAAKvZ,eAIf8K,OAAO0W,UAAYnU,EAAQA,EAAMmU,UAAYJ,EAAYI,WAAa,OAGhFnU,GAASA,EAAMoU,IAAMpU,EAAMlN,gBACzB2K,OAAOyW,aAAelU,UAIlBvC,OAAO4W,UAAYN,EAAYM,WAAa,OAC5C5W,OAAO6W,oBAAsBP,EAAYO,qBAAuB,OAEhE7W,OAAO8W,eAAiB7iB,EAAQwY,eAAeqK,oBAC/C9W,OAAOwM,eAAiBvY,EAAQwY,eAAeD,oBAE/CxM,OAAOkR,iBAAmBjd,EAAQid,6DAItC5N,2DADS+C,KAAK9S,KACC8S,KAAK9d,uDAIpByb,2DADcqC,KAAK9S,wCAItB+W,gEACCyM,iBACDzM,QACE0M,oBAAoB3Q,KAAK4Q,gBAA+B,SAAd5Q,KAAK9d,WAEhD2uB,8DAIDtK,GAAIvG,KAAK6C,MACT3F,EAAS8C,KAAK9S,KAAKgQ,SACrBC,cAAgBD,EAAOzZ,SAEvBqtB,UAAY9Q,KAAK/U,MAAOsb,EAAEpJ,gBAE1B4T,QAAUxK,EAAEuK,UAAU,IAMtBZ,cACOhT,YACGA,EAAO/S,IAAI,SAAChH,EAAG+D,SACzBhE,GAASqjB,EAAEwK,QAAU7pB,EAAIqf,EAAEuK,0DAMPE,cAAYzV,yDAAc,QACtCI,SAAMQ,SAAiB8U,SAAgBvrB,SAAU2iB,SAAW6I,SAAmBC,SAAgBC,mBAErFpR,KAAKrG,OAAO0W,gBACfa,EAAkBliB,SAAWkiB,EAAkBliB,SAAW,OAGjEgiB,YAAsBrtB,SACfsX,GAAmB+V,EAAYzV,KACpByE,KAAKra,OAASqW,GAAcL,KAC7BE,GAAgBF,GAAQQ,IAC9B6D,KAAKra,OAAS+V,GAAaC,GAAQsV,OAEzCpO,MAAM3G,cACCP,YACGA,EAAKxR,IAAI,SAAChH,SAAMuC,GAAWvC,EAAIgZ,UAC/C+U,EAAkBriB,OAAS,SAC7BsiB,kBACwBhV,WACPzW,OAEX,MACEmd,MAAM3G,aACN,GAAI9W,KAAO4rB,aAAP5rB,MACC0kB,GAAYkH,EAAW5rB,QACrBib,EAAK1G,OAAOyW,YAAYiB,KAAK,SAACjJ,SAAShjB,KAAQgjB,EAAKkI,WACvDY,EAAkBliB,SAAWkiB,EAAkBliB,SAAW,SACxDiM,GAAmB6O,EAAWvO,KACnB8E,EAAK1a,OAASqW,GAAcL,KAC7BE,GAAgBF,GAAQQ,IAC9BkE,EAAK1a,OAAS+V,GAAaC,GAAQsV,IAClCtV,EAAKxR,IAAI,SAAChH,SAAMuC,GAAWvC,EAAIgZ,MACjDhV,KAAK/B,GAEKib,EAAKwC,MAAM3G,MAAMzY,OAAS,EAAG,IACvB6tB,MACAC,EAAWlR,EAAKwC,MAAM3G,MAAM,KAM/BmE,EAAK1a,OAASqW,GAAcL,KACtB0M,UAAUnF,QAAQ,SAAC5T,KACdnI,KAAKvD,KAAKkU,KAAKxI,EAAM6M,QAE5BmV,EAAUvpB,YACNsY,EAAK1a,OAAS+V,GAAaC,GAAQsV,IAClCM,EAASlJ,YAGpBxF,MAAM3G,MAAM/U,aACL/B,GAAO,mBACPuW,QACDuV,EAAkBriB,UACpBsiB,8CAhCJ/rB,MAyCd4a,KAAK6C,MAAM3G,MAAM,IAAM8D,KAAK6C,MAAM3G,MAAM,GAAGgB,OAAOzZ,SAAWuc,KAAK6C,MAAM3G,MAAM,GAAGgB,OAAOzZ,OAAQ,IAC7F+tB,MAEAC,EAAWzR,KAAK6C,MAAM3G,MAAM/T,OAAO,SAAC3B,EAAEya,SACpCza,GAAE/C,OAASwd,EAAE/D,OAAOzZ,OAASwd,EAAIza,IAEvC/C,OAAQiuB,EAAAA,IAEJC,EAAU3R,KAAK6C,MAAM3G,MAAM/T,OAAO,SAAC3B,EAAEya,SACnCza,GAAE/C,OAASwd,EAAE/D,OAAOzZ,OAAS+C,EAAIya,IAEvCxd,OAAQiuB,EAAAA,MAIFrJ,UAAUnF,QAAQ,SAAC5T,KAEfnI,KAAKvD,KAAKkU,KAAKxI,EAAMmiB,EAAStV,sBAGjCe,OAASsU,EAAWzpB,YACpBsgB,UAAYsJ,EAAQtJ,gBAKpBuJ,yBACAC,qBACAC,8DAIDvL,GAAIvG,KAAK6C,MACTkP,EAAW,SAAC7W,EAAQoV,SACbpV,GAAO/Q,IAAI,SAACN,MACTqS,GAAUqK,EAAVrK,YAEFA,aAAiBvY,WACxBuY,EAAMzY,OAAS,EAAIyY,EAAMmV,KAAK,SAACW,SAAS1B,KAAO0B,EAAKlU,SAAUyI,EAAErK,MAAM,IAG5DD,GAAMpS,EAAKqS,QAIxB+V,cAAgB,IAChB7U,SAAW4C,KAAK9S,KAAKkQ,SAASjT,IAAI,SAAChH,EAAG+D,MAChCgU,GAAS/X,EAAE+X,OACXgX,EAAe/uB,EAAE+uB,6BAIb/uB,EAAEgW,MACFhW,EAAEgW,KAAKgZ,QAAQ,SAAU,SAACC,SACd,KAARA,EAAc,QAAkB,KAARA,EAAc,OAAS,eAEhDlrB,WACmB,QAAhB/D,EAAEoa,UAAsBgJ,EAAE0L,gBAAkB1L,EAAE0L,wBAC7C9uB,EAAEoa,iBAELrC,aACI6W,EAAS7W,EAAQ/X,EAAE2a,WAC3B3a,EAAE2a,oBAEQoU,iBACEH,EAASG,EAAc/uB,EAAE2a,sDAMnDyI,GAAIvG,KAAK6C,SACV7C,KAAKgL,WAAWqH,sBAChBC,UAAY/L,EAAEnJ,SAASmJ,EAAEnJ,SAAS3Z,OAAS,GAAG8uB,kBAG/CD,UAAY,GAAI3uB,OAAM4iB,EAAEpJ,eAAerZ,KAAK,QAC5CsZ,SAASjT,IAAI,cACZ+f,WAAW/f,IAAI,SAACmF,EAAK/M,GACnB+M,EAAMiX,EAAE+L,UAAU/vB,OAClB+vB,UAAU/vB,GAAK+M,iDAOhBiX,GAAIvG,KAAK6C,KACV7C,MAAK9S,KAAK6Q,gBACP8E,MAAM9E,SAAWiC,KAAK9S,KAAK6Q,SAAS5T,IAAI,qBAC1C6E,SAAWiN,GAAM9Y,EAAEgC,MAAOohB,EAAErK,OAC1B/Y,EAAEyK,UAASzK,EAAEyK,YAIVzK,KAGN6c,KAAK9S,KAAKuQ,gBACPoF,MAAMpF,SAAWuC,KAAK9S,KAAKuQ,SAAStT,IAAI,qBAC1C4e,SAAW9M,GAAM9Y,EAAEK,MAAO+iB,EAAErK,SAC5B8M,OAAS/M,GAAM9Y,EAAEua,IAAK6I,EAAErK,OACtB/Y,EAAEyK,UAASzK,EAAEyK,YACVzK,0DAMCiC,EAAM,SACNotB,IAAYxS,KAAKrG,OAAOyW,YACxBqC,EAAgBD,QAShBE,EAAqB,SAACpW,MAClBqW,GAAa,GAAIhvB,OAAMwjB,EAAKtE,MAAM1F,eAAerZ,KAAK,KACtDof,QAAQ,SAAC/f,EAAG+D,MACRgU,GAASoB,EAAIpV,GAAGgU,SAClB9V,GAAOutB,EAAaA,EAAWxoB,IAAI,SAAC8W,EAAG/Z,SAC9B+Z,GAAI/F,EAAOhU,WAK1B8Y,KAAKgL,WAAWqH,aACV,eAEFG,EAAW,IACLI,GArBA,SAACtW,EAAKoQ,SACTpQ,GAAInU,OAAO,SAACC,EAAKyqB,YAChBA,EAAInG,iBAAkBtkB,EAAIyqB,EAAInG,UAAmBmG,IAC9CzqB,QAkByB4X,KAAK9S,KAAKkQ,SAAU,cAE/C,GAAIU,KAAU8U,KACIA,EAAgB9U,WAGpBkC,KAAK9S,KAAKkQ,gBAMjCoV,QACKtlB,KAAKkQ,SAAS8F,QAAQ,SAAC/f,WAGVA,EAAE2a,QAAU1Y,QACNjC,EAAE2a,QAAU1Y,IAAK+B,gBAAQhE,EAAEiC,KACxCqtB,EAActvB,EAAE2a,QAAU1Y,gBAAWjC,EAAEiC,SAGlC4a,KAAK9S,KAAKkQ,SAASjT,IAAI,SAAChH,SAC7BA,GAAEiC,KAIb4a,KAAK9S,KAAK6Q,WAAayU,KACTrrB,KAAK6Y,KAAK9S,KAAK6Q,SAAS5T,IAAI,SAAChH,SAAMA,GAAEgC,SAGnD6a,KAAK9S,KAAKuQ,WAAa+U,QAClBtlB,KAAKuQ,SAAStT,IAAI,SAAChH,KACNgE,MAAMhE,EAAEua,IAAKva,EAAEK,UAI9BgvB,EAAYC,SAAmB1uB,kBAAU0uB,yDAIlDlZ,IAEF,cAEOyG,KAAKrG,OAAOwW,iBACVnQ,KAAKra,QAGd,cACK4gB,GAAIvG,KAAK6C,eACXqN,MAAMvH,WAAa3K,GAAmBgC,KAAK/U,MAC5Csb,EAAE2J,MAAMhT,OAAQ8C,KAAKrG,OAAO4W,WAEtBhK,EAAE2J,OACR1K,KAAKxF,QAIP,kBAEQA,KAAK/U,UACP,SAEN,iBACQ+U,MAAK6C,MAAMpF,UACjB+H,KAAKxF,OAMCA,MAAKrG,OAAOyW,aAAepQ,KAAKrG,OAAOyW,YAAY3sB,YAC9CkW,OAAOyW,YAAYlN,QAAQ,SAAChH,KACZ/U,MACb,cAEU+U,EAAMmU,WAAa,aAClBvK,EAAK7a,aACtB6a,EAAKlD,0BACqBkD,EAAKnM,OAAO6W,wBACvBtU,EAAMlN,UAAY,QAE3B,iBACWgR,MAAK6C,MAAM3G,OACpBsJ,KAAKM,SAIE3e,MACb,cAEU6Y,KAAKrG,OAAO0W,gBACXrQ,KAAK/U,aACnB+U,KAAK4C,0BACkB5C,KAAKrG,OAAO6W,qBAEhC,iBACWxQ,MAAK6C,MAAM3G,OACpBsJ,KAAKxF,WAIjB8S,GAAc9S,KAAK6C,MAAMzF,SAAS5D,OAAO,kBAAqB,QAAhBrW,EAAEoa,YAChDwV,EAAe/S,KAAK6C,MAAMzF,SAAS5D,OAAO,kBAAqB,SAAhBrW,EAAEoa,YAEjDyV,EAAcF,EAAY3oB,IAAI,eACpB4F,GAAQ5M,EAAE4M,MACVkjB,EAAW9vB,EAAE8vB,UAAYljB,SAErC,YAAmB5M,EAAE4M,aAEbA,QACA+V,EAAKtG,OAAOzP,WACV+V,EAAKkF,WAAWqH,yBAGPvM,EAAKnM,OAAOkR,2BrBhWG,EqBiWtB/E,EAAKngB,QAEjB,cACoB4gB,GAAIvG,KAAK6C,MACP3G,EAAUqK,EAAVrK,MACF/Y,EAAIojB,EAAEnJ,SAASrN,KACQ5M,EAArBmtB,GAAAA,aAAK,cACP+B,EAAUrS,KAAKgL,WAAWqH,QAE1Ba,EAAalT,KAAKgL,WAAWkI,YrB3WhB,GqB4Wb9I,EAAY7D,EAAEuK,WAAa,EAAIoC,GAC/BjM,EAAWmD,GAAaiI,EAAU,EAAIS,EAAYrvB,OAIjEyY,aAAiBvY,WAEZuY,EAAMzY,OAAS,EAAIyY,EAAMmV,KAAK,SAACW,SAAS1B,KAAO0B,EAAKlU,SAAUyI,EAAErK,MAAM,OAI5D8L,GAAazB,EAAE2J,MAAM7H,UAAUle,IAAI,SAAC8B,SAAMA,GAAIme,EAAY,GAEzDiI,OACYrK,EAAW7d,IAAI,SAAC3D,SAClBA,GAAIygB,EAAWgM,EAAWhM,QAIrC/J,GAAS,GAAIvZ,OAAM4iB,EAAEpJ,eAAerZ,KAAK,GACzCkc,MAAKrG,OAAOkR,qBACRwH,GAAWlvB,EAAE4M,QAAUwW,EAAEnJ,SAAS3Z,OAAS,EAClCN,EAAE+uB,aAEF/uB,EAAE+X,WAGfiP,GAAU,GAAIxmB,OAAM4iB,EAAEpJ,eAAerZ,KAAK,SAC1CuuB,OACUlvB,EAAE+mB,WAAW/f,IAAI,SAACvE,EAAGrD,SAAMqD,GAAIzC,EAAEovB,eAAehwB,kBAIhEylB,aACA7kB,EAAE+mB,mBACLC,SAEDjN,WAEEhB,EAAMxW,mBACL0kB,WACDnD,IAEVzB,KAAKM,MAICqN,EAAcJ,EAAa5oB,IAAI,SAAChH,MAC5B4M,GAAQ5M,EAAE4M,aAEV,aAAoB5M,EAAE4M,aAEXA,QACA+V,EAAKtG,OAAOzP,WACV+V,EAAKnV,iBACJmV,EAAKkK,YAAYvf,oBACfqV,EAAKkK,YAAYnf,kBACrBiV,EAAKkK,YAAYzf,gBACfuV,EAAKkK,YAAYpF,kBACjB9E,EAAKkK,YAAYrF,0BAGT7E,EAAKnM,OAAOkR,kBAElC,cACQtE,GAAIvG,KAAK6C,MACT1f,EAAIojB,EAAEnJ,SAASrN,GAGbmM,EAAQqK,EAAErK,MAAMzY,OAChB8iB,EAAErK,MAAMmV,KAAK,SAACW,SAAS7uB,GAAEmtB,KAAO0B,EAAKlU,UAAWyI,EAAErK,MAAM,GACxDqK,EAAErK,MAEJkX,EACAlX,EAAMmM,UAAU,GAAKnM,EAAMxW,SACrBwW,EAAMmM,UAAU,GAChBnM,EAAMxW,2BAGA6gB,EAAE2J,MAAM7H,qBACRllB,EAAE+mB,kBAEN/mB,EAAE+X,gBAEAkY,SACFpT,KAAKgQ,YAAYqD,SrB9bd,IqBgcjB7N,KAAKM,MAIjBwN,IAEF,kBAEQtT,KAAK/U,UACP,SAEN,iBACQ+U,MAAK6C,MAAM9E,UACjByH,KAAKxF,UAIUzG,EAAiBxV,OAAOivB,EAAaG,EAAaG,MAEjEC,IAAa,WAAY,iBACxBC,2BAEAlP,WAAa,GAAIW,KAAI1L,EACxBC,OAAO,mBAAS+Z,EAAU9Z,SAASnO,EAAK,KAAOwa,EAAKjD,MAAMvX,EAAK,MAC/DnB,IAAI,eACA8gB,GAAY/R,mBAAgB5N,WAC7BA,EAAK,GAAGmO,SAAS,cAAgBnO,EAAK,GAAGmO,SAAS,gBAC/C+Z,mBAAmBrsB,KAAK8jB,IAEtB3f,EAAK,GAAI2f,gEAKdwI,kBAEDlN,GAAIvG,KAAK6C,MACT6Q,EAAU1T,KAAKrG,OAAO8W,eACtBkD,EAAU3T,KAAKrG,OAAOwM,cACbI,GAAE2J,MAAMhT,OAEd/S,IAAI,SAAC7D,EAAOyJ,MACdmL,GAAS0N,EAAK/F,MAAMzF,SAASjT,IAAI,SAACiW,EAAKlZ,MACtC/B,GAAQib,EAAIlF,OAAOnL,gBAEfqQ,EAAIjH,WACJhU,OACDib,EAAI8J,WAAWna,SACd6Y,EAAKpJ,OAAOtY,aACRysB,EAAUA,EAAQxuB,GAASA,OAInCsuB,YAAY1jB,UACTzJ,iBACSotB,EAAUA,EAAQptB,GAASA,OACrCigB,EAAE2J,MAAM7H,UAAUtY,UAChBmL,WACEqL,EAAE+L,UAAUviB,4DAOnB4G,UAAUwJ,iBAAiB,YAAa,SAAC0F,MACzCnjB,GAAImmB,EAAKxG,SACTra,EAAI5H,EAAUyoB,EAAKlS,WACnBid,EAAO/N,EAAEiH,MAAQ9kB,EAAEpH,KAAOkC,EAAcJ,GACxCmxB,EAAOhO,EAAEkH,MAAQ/kB,EAAExH,GAEpBqzB,GAAOhL,EAAKljB,OAASlD,EAAaC,IACjCmxB,EAAQpxB,EAAaC,KACnBoxB,oBAAoBF,KAEpB7P,IAAI9D,wDAKQ2T,MACfrN,GAAIvG,KAAK6C,SACT0D,EAAE+L,cAEFviB,GAAQqM,GAAkBwX,EAAMrN,EAAE2J,MAAM7H,WAAW,MACnDtY,GAAS,EAAG,IACXgkB,GAAM/T,KAAKyT,YAAY1jB,QAEtBgU,IAAI0H,UACRsI,EAAI7I,KAAOlL,KAAK+D,IAAInZ,OAAOqB,EAC3B8nB,EAAIC,SAAWhU,KAAK+D,IAAInZ,OAAOhF,GAC9BuT,KAAM4a,EAAIE,eAAgB9uB,MAAO,IAClC4uB,EAAI7Y,OACJnL,QAGIgU,IAAI2H,8DAKNnF,EAAIvG,KAAK9S,IACVqZ,GAAEnJ,SAAS3Z,OAAS,SACjBshB,WAAWgC,YAAc,KAC5B3J,SAASjT,IAAI,SAAChH,EAAG+D,MAId5G,GAAO6M,ErBjjBqB,IqBmjBpBjG,EACX,IrBpjB+B,IqBsjB/B+hB,EAAKzJ,OAAOtY,GACZ/D,EAAEgW,KACF8P,EAAKtP,OAAOyI,mBACR2C,WAAWjb,YAAYxJ,0DAS3B0f,KAAKkE,sBACFA,KAAO,EAGVlE,MAAKkU,oBACFA,cAAchR,QAAQ,eACtBlb,GAAIoB,EAAEiY,UACRrX,WAAWoL,YAAYpN,UAItBksB,cAAgBlU,KAAKwT,mBAAmBrpB,IAAI,wBAEzC8W,EAAE+I,qBACCllB,SACFmc,EAAEgJ,aAIoBnlB,KAA5Bkb,KAAK6C,MAAMsR,oBACRtR,MAAMsR,aAAenU,KAAK6C,MAAM1F,cAAgB,QAIjD+W,cAAc/pB,IAAI,eAClBiqB,GAAcjxB,EAAE8mB,MAAMoK,EAAKxR,MAAMsR,gBAEnC9S,QAAUF,GAAYhe,EAAEjB,MAAMkyB,KAC3B7P,SAASza,YAAY3G,EAAEke,yDAK1BrB,KAAKkU,oBACFA,cAAchR,QAAQ,eACtBlb,GAAIoB,EAAEiY,UACRrX,WAAWoL,YAAYpN,2DAMtB+C,OAAOoV,iBAAiB,cAAe,aACtCmB,sEAKDkS,mBAAmBrpB,IAAI,cACzB8f,MAAM9f,IAAI,cACNgW,iBAAiB,QAAS,cAC1BpQ,GAAQiB,EAAKqB,aAAa,sBACzBiiB,oBAAoBvkB,cAMvBgU,IAAIpN,UAAUwJ,iBAAiB,QAAS,cACxCpQ,GAAQwkB,EAAKxQ,IAAIpN,UAAUtE,aAAa,sBACvCiiB,oBAAoBvkB,6DAKrBmkB,cAAc/pB,IAAI,eAClBiqB,GAAcjxB,EAAE8mB,MAAMuK,EAAK3R,MAAMsR,iBACvBhxB,EAAEjB,MAAMkyB,EAAajxB,EAAEke,sDAKjCiT,oBAAoBtU,KAAK6C,MAAMsR,aAAe,+CAI9CG,oBAAoBtU,KAAK6C,MAAMsR,aAAe,6CAGvCpkB,0DAAMiQ,KAAK6C,MAAMsR,aACzB5N,EAAIvG,KAAK6C,mBAEL9S,QACAwW,EAAE2J,MAAMhT,OAAOnN,UACdwW,EAAEnJ,SAASjT,IAAI,kBAAKhH,GAAE+X,OAAOnL,kDAKnBA,MACfwW,GAAIvG,KAAK6C,SACL3Z,SAAS6G,IACN,IAAGA,EAAQ,GACnBA,GAASwW,EAAE2J,MAAMhT,OAAOzZ,SAAQsM,EAAQwW,EAAE2J,MAAMhT,OAAOzZ,OAAS,GAChEsM,IAAUwW,EAAE4N,iBACbA,aAAepkB,IACZiQ,KAAKjV,OAAQ,cAAeiV,KAAKyU,sDAM1BnuB,EAAOouB,MAAe3kB,0DAAMiQ,KAAK6C,MAAM1F,0GAChC7W,EAAOouB,EAAe3kB,QACpC7C,KAAKgQ,OAAOyX,OAAO5kB,EAAO,EAAGzJ,QAC7B4G,KAAKkQ,SAASjT,IAAI,SAAChH,EAAG+D,KACxBgU,OAAOyZ,OAAO5kB,EAAO,EAAG2kB,EAAcxtB,WAEpCud,OAAOzE,KAAK9S,mDAGF6C,0DAAQiQ,KAAK6C,MAAM1F,cAAc,CAC5C6C,MAAK9S,KAAKgQ,OAAOzZ,QAAU,mGAGTsM,QACjB7C,KAAKgQ,OAAOyX,OAAO5kB,EAAO,QAC1B7C,KAAKkQ,SAASjT,IAAI,cACpB+Q,OAAOyZ,OAAO5kB,EAAO,UAEnB0U,OAAOzE,KAAK9S,6CAGJwnB,MAAe3kB,0DAAM,OAC7B7C,KAAKkQ,SAASrN,GAAOmL,OAASwZ,OAC9BjQ,OAAOzE,KAAK9S,6CAKHkQ,QACTlQ,KAAKkQ,SAASjT,IAAI,SAAChH,EAAG+D,GACvBkW,EAASlW,OACTgU,OAASkC,EAASlW,WAGjBud,OAAOzE,KAAK9S,aAlwBoByU,ICFlBiT,0BACR7pB,EAAQO,8EACbP,EAAQO,aACTpJ,KAAO,UACP4gB,YAAc,IACdoB,KAAO,IAEPrE,+DAGIvU,4FACOA,QACXsgB,UAAY5L,KAAK4L,UAAUpG,KAAKxF,WAChC6L,WAAa7L,KAAK6L,WAAWrG,KAAKxF,WAElC8L,WAAaxgB,EAAKwgB,YAAc,QAChCnS,OAAOoS,WAAazgB,EAAKygB,YAAc,OAEvCjgB,UAAYR,EAAKQ,YAAa,OAC9B+b,YAAcvc,EAAKuc,aAAe,qIAKnCtB,GAAIvG,KAAK6C,WACRxe,OACJ2b,KAAKra,OAASqa,KAAK/U,MAChB+U,KAAKnU,OAAOI,EAAI+T,KAAK6H,YAAc,EACnC7H,KAAKnU,OAAOjG,EAAIoa,KAAK6H,YAAc,KAE/BxjB,GAAsB2b,KAAtB3b,OAAQyH,EAAckU,KAAdlU,UAEVkgB,EAAuBzF,EAAE0F,uBAC7BrE,kBACAqE,uBACEC,GAAW,IAAMlM,KAAKrG,OAAOoS,aAE/BvF,YAAYrc,IAAI,SAACuc,EAAOxf,MACnB6kB,GAAaG,EACbC,EAAmBzF,EAAQH,EAAEO,WtB0DZ,IsBzDjB/a,EAAWogB,EAAkB,IAAM,EAAG,EACtCC,EAAYtgB,GAAaqgB,EAAkBA,EAC3CE,EAAWH,GAAsBE,EACjCzgB,EAAgBxH,EAAmB4nB,EAAY1nB,GAC/CuH,EAAczH,EAAmBkoB,EAAUhoB,GAE3CioB,EAAejM,EAAK6D,MAAQ8H,EAAqB9kB,GAEnDqlB,SAASC,QACVnM,GAAK6D,QACIoI,EAAeA,EAAa3gB,cAAgBA,IAC9C2gB,EAAeA,EAAa1gB,YAAcD,MAExCA,IACFC,MAEJ6gB,GACe,MAApBN,EACG3f,EAAoB+f,EAAUC,EAAQnM,EAAKxU,OAAQwU,EAAKhc,OAAQgc,EAAKvU,UAAWC,GAChFQ,EAAqBggB,EAAUC,EAAQnM,EAAKxU,OAAQwU,EAAKhc,OAAQgc,EAAKvU,UAAWC,KAEnF6b,aAAazgB,KAAKslB,KAClBR,iBAAiB9kB,0CAGXuf,QACAH,EAAEO,yCAGFsF,WAIJlI,KAAO,+CAIRqC,GAAIvG,KAAK6C,MAETtJ,IAEF,iBAEA,+BAEgBgN,EAAEqB,oBACR5H,KAAKR,mBACAQ,KAAK6H,cAElBrC,KAAKxF,aAIJsE,WAAa,GAAIW,KAAI1L,EACxBpP,IAAI,eACA8gB,GAAY/R,mBAAgB5N,WACxBA,EAAK,GAAI2f,kDAIAyB,MACZroB,GAAuB2b,KAAvB3b,OAAQynB,EAAe9L,KAAf8L,WACT9c,EAAW7K,EAAmBuoB,EAASX,WAAYW,EAAStoB,MAAQ,EAAGC,wBACtD2K,EAAS/C,EAAK6f,QAAiB9c,EAASpJ,EAAKkmB,6CAG1Dtb,EAAKtJ,EAAEylB,EAAK9G,MAClBrV,MACE5H,GAAQoX,KAAKR,OAAOtY,MACvBylB,EAAM,IACEnc,EAAMwP,KAAK4M,oBAAoB5M,KAAK6C,MAAMoJ,iBAAiB/kB,OAChEkD,MAAM+D,OAASxF,EAAmBC,EAAO,OAC1CikB,GAAQzsB,EAAU4f,KAAK7J,KACvBlK,EAAI4Z,EAAEiH,MAAQD,EAAMjsB,KAAO,GAC3BgF,EAAIigB,EAAEkH,MAAQF,EAAMrsB,IAAM,GAC1BqO,GAASmR,KAAKgN,kBAAoBhN,KAAKgN,iBAAiBvpB,OAAS,EAClEuc,KAAKgN,iBAAiB9lB,GAAK8Y,KAAK6C,MAAM3F,OAAOhW,IAAM,KAClD+lB,GAAuC,IAA5BjN,KAAK6C,MAAM2D,YAAYtf,GAAW8Y,KAAK6C,MAAMiE,YAAY1jB,QAAQ,QAC3E2gB,IAAI0H,UAAUxf,EAAGrG,GAAIuT,KAAMtK,EAAO1J,MAAO8nB,EAAU,WACnDlJ,IAAI2H,kBAEClb,EAAK,2BACVuT,IAAI9D,YACJ7V,MAAM+D,OAASvF,8CAKhB+N,UAAUwJ,iBAAiB,YAAaH,KAAK4L,gBAC7CjV,UAAUwJ,iBAAiB,aAAcH,KAAK6L,8CAG1ChG,MACH5jB,GAAS4jB,EAAE5jB,OACbirB,EAASlN,KAAKsE,WAAW8G,IAAI,eAAe3D,MAC5C0F,EAAYnN,KAAKoN,oBACjBC,EAAarN,KAAKsN,kBACnBJ,EAAOzT,SAASxX,GAAS,IACvBiF,GAAIgmB,EAAOpR,QAAQ7Z,QAClBsrB,WAAWF,EAAYF,GAAU,QACjCG,eAAiBrrB,OACjBmrB,oBAAsBlmB,OACtBqmB,WAAWtrB,EAAQiF,GAAG,EAAM2e,aAE5BgG,uDAKD0B,WAAWvN,KAAKsN,eAAetN,KAAKoN,qBAAoB,UArJvBlH,IVAlCxH,QACAD,QACCA,cAEMsM,WACHyC,OACJ7B,SACEiJ,IAiBFC,GACL,WAAY9pB,EAAQ6C,qBACZ4Q,GAAe5Q,EAAQ1L,KAAM6I,EAAQ6C,wFWjC1CknB,YAEJA,IAAOC,KAAU,gBACjBD,GAAOE,QAAU,QAEjBF,GAAiBxb,OAAOM,UAAYkb,GAAQG"} \ No newline at end of file diff --git a/src/js/objects/ChartComponents.js b/src/js/objects/ChartComponents.js index 5f64ec7..7add696 100644 --- a/src/js/objects/ChartComponents.js +++ b/src/js/objects/ChartComponents.js @@ -150,7 +150,8 @@ let componentConfigs = { yLine(position, item.labels[i], this.constants.width, { mode: this.constants.mode, pos: item.pos || this.constants.pos, - shortenNumbers: this.constants.shortenNumbers + shortenNumbers: this.constants.shortenNumbers, + title: item.title }) ); }); diff --git a/src/js/utils/draw.js b/src/js/utils/draw.js index bbf2e77..ba5e78f 100644 --- a/src/js/utils/draw.js +++ b/src/js/utils/draw.js @@ -5,6 +5,7 @@ import { lightenDarkenColor } from './colors'; export const AXIS_TICK_LENGTH = 6; const LABEL_MARGIN = 4; +const LABEL_WIDTH = 25; const LABEL_MAX_CHARS = 15; const TOTAL_PADDING = 120; export const FONT_SIZE = 10; @@ -331,19 +332,25 @@ function makeHoriLine(y, label, x1, x2, options = {}) { options.className + (options.lineType === 'dashed' ? 'dashed' : ''); + const textXPos = options.alignment === 'left' ? + options.title ? (x1 - LABEL_MARGIN) + LABEL_WIDTH : x1 - LABEL_MARGIN : + options.title ? (x2 + LABEL_MARGIN * 4) - LABEL_WIDTH : x2 + LABEL_MARGIN * 4; + const lineX1Post = options.title ? x1 + LABEL_WIDTH : x1; + const lineX2Post = options.title ? x2 - LABEL_WIDTH : x2; + let l = createSVG('line', { className: className, - x1: x1, - x2: x2, + x1: lineX1Post, + x2: lineX2Post, y1: 0, y2: 0, styles: { stroke: options.stroke } }); - + let text = createSVG('text', { - x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4, + x: textXPos, y: 0, dy: FONT_SIZE / 2 - 2 + 'px', 'font-size': FONT_SIZE + 'px', @@ -373,7 +380,7 @@ export function generateAxisLabel(options) { (options.height - TOTAL_PADDING) / 2 + (getStringWidth(options.title, 5) / 2) : (options.height - TOTAL_PADDING) / 2 - (getStringWidth(options.title, 5) / 2) ; const x = options.position === 'left' ? 0 : options.width; - const y2 = options.position === 'left' ? FONT_SIZE / 3 : FONT_SIZE / 3 * -1; + const y2 = options.position === 'left' ? FONT_SIZE - LABEL_WIDTH : FONT_SIZE + LABEL_WIDTH * -1; const rotation = options.position === 'right' @@ -430,6 +437,7 @@ export function yLine(y, label, width, options = {}) { className: options.className, lineType: options.lineType, alignment: options.pos, + title: options.title, shortenNumbers: options.shortenNumbers }); }